diff options
author | Werner Koch <wk@gnupg.org> | 2017-07-25 15:22:48 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2017-07-25 15:22:48 +0200 |
commit | 24c7aa0d58e3768690dd8ebef0e8e01af7e80f83 (patch) | |
tree | c27759daa763eff5f4539533ccde5dea3dc22ff3 /common/homedir.c | |
parent | w32: Also change the directory on daemon startup. (diff) | |
download | gnupg2-24c7aa0d58e3768690dd8ebef0e8e01af7e80f83.tar.xz gnupg2-24c7aa0d58e3768690dd8ebef0e8e01af7e80f83.zip |
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>
Diffstat (limited to 'common/homedir.c')
-rw-r--r-- | common/homedir.c | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/common/homedir.c b/common/homedir.c index a30e8dc76..149e1ec62 100644 --- a/common/homedir.c +++ b/common/homedir.c @@ -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); } |