1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-05-29 21:58:04 +02:00

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) if (!dir || !*dir)
{ {
char *tmp; char *tmp, *p;
tmp = read_w32_registry_string (NULL, tmp = read_w32_registry_string (NULL,
GNUPG_REGISTRY_DIR, GNUPG_REGISTRY_DIR,
@ -258,7 +258,13 @@ default_homedir (void)
tmp = NULL; tmp = NULL;
} }
if (tmp) 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) if (!saved_dir)
@ -267,10 +273,27 @@ default_homedir (void)
dir = saved_dir; dir = saved_dir;
} }
#endif /*HAVE_W32_SYSTEM*/ #endif /*HAVE_W32_SYSTEM*/
if (!dir || !*dir) if (!dir || !*dir)
dir = GNUPG_DEFAULT_HOMEDIR; dir = GNUPG_DEFAULT_HOMEDIR;
else if (!is_gnupg_default_homedir (dir)) else
non_default_homedir = 1; {
/* 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; return dir;
} }
@ -403,12 +426,40 @@ w32_commondir (void)
void void
gnupg_set_homedir (const char *newdir) gnupg_set_homedir (const char *newdir)
{ {
char *tmp = NULL;
if (!newdir || !*newdir) if (!newdir || !*newdir)
newdir = default_homedir (); newdir = default_homedir ();
else if (!is_gnupg_default_homedir (newdir)) else
non_default_homedir = 1; {
/* 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); xfree (the_gnupg_homedir);
the_gnupg_homedir = make_absfilename (newdir, NULL);; the_gnupg_homedir = make_absfilename (newdir, NULL);;
xfree (tmp);
} }

View File

@ -486,7 +486,8 @@ AH_BOTTOM([
#define SAFE_VERSION_DOT '.' #define SAFE_VERSION_DOT '.'
#define SAFE_VERSION_DASH '-' #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_DOSISH_SYSTEM
# ifdef HAVE_DRIVE_LETTERS # ifdef HAVE_DRIVE_LETTERS
# define GNUPG_DEFAULT_HOMEDIR "c:/gnupg" # define GNUPG_DEFAULT_HOMEDIR "c:/gnupg"