common: Strip trailing slashes from the homedir.

* common/homedir.c (default_homedir): Strip trailing slashes.
(gnupg_set_homedir): Ditto.

--

is_gnupg_default_homedir() does not ignore trailing slashes when
comparing directory names.  This can lead to multiple agents started
on the same directory if the homedir was specified with --homedir or
GNUPGHOME without or with a number of slashes.

We now make sure that the home directory name never ends in a
slash (except for the roo of course).

GnuPG-bug-id: 3295
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2017-07-25 15:22:48 +02:00
parent 0ef50340ef
commit 24c7aa0d58
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 59 additions and 7 deletions

View File

@ -247,7 +247,7 @@ default_homedir (void)
{
if (!dir || !*dir)
{
char *tmp;
char *tmp, *p;
tmp = read_w32_registry_string (NULL,
GNUPG_REGISTRY_DIR,
@ -258,7 +258,13 @@ default_homedir (void)
tmp = NULL;
}
if (tmp)
saved_dir = tmp;
{
/* Strip trailing backslashes. */
p = tmp + strlen (tmp) - 1;
while (p > tmp && *p == '\\')
*p-- = 0;
saved_dir = tmp;
}
}
if (!saved_dir)
@ -267,10 +273,27 @@ default_homedir (void)
dir = saved_dir;
}
#endif /*HAVE_W32_SYSTEM*/
if (!dir || !*dir)
dir = GNUPG_DEFAULT_HOMEDIR;
else if (!is_gnupg_default_homedir (dir))
non_default_homedir = 1;
else
{
/* Strip trailing slashes if any. */
if (dir[strlen (dir)-1] == '/')
{
char *tmp, *p;
tmp = xstrdup (dir);
p = tmp + strlen (tmp) - 1;
while (p > tmp && *p == '/')
*p-- = 0;
dir = tmp;
}
if (!is_gnupg_default_homedir (dir))
non_default_homedir = 1;
}
return dir;
}
@ -403,12 +426,40 @@ w32_commondir (void)
void
gnupg_set_homedir (const char *newdir)
{
char *tmp = NULL;
if (!newdir || !*newdir)
newdir = default_homedir ();
else if (!is_gnupg_default_homedir (newdir))
non_default_homedir = 1;
else
{
/* Remove trailing slashes from NEWSDIR. */
if (newdir[strlen (newdir)-1] == '/'
#ifdef HAVE_W32_SYSTEM
|| newdir[strlen (newdir)-1] == '\\'
#endif
)
{
char *p;
tmp = xstrdup (newdir);
p = tmp + strlen (tmp) - 1;
while (p > tmp
&& (*p == '/'
#ifdef HAVE_W32_SYSTEM
|| *p == '\\'
#endif
)
)
*p-- = 0;
newdir = tmp;
}
if (!is_gnupg_default_homedir (newdir))
non_default_homedir = 1;
}
xfree (the_gnupg_homedir);
the_gnupg_homedir = make_absfilename (newdir, NULL);;
xfree (tmp);
}

View File

@ -486,7 +486,8 @@ AH_BOTTOM([
#define SAFE_VERSION_DOT '.'
#define SAFE_VERSION_DASH '-'
/* Some global constants. */
/* Some global constants.
* Note that the homedir must not end in a slash. */
#ifdef HAVE_DOSISH_SYSTEM
# ifdef HAVE_DRIVE_LETTERS
# define GNUPG_DEFAULT_HOMEDIR "c:/gnupg"