summaryrefslogtreecommitdiffstats
path: root/common/homedir.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2017-07-25 15:22:48 +0200
committerWerner Koch <wk@gnupg.org>2017-07-25 15:22:48 +0200
commit24c7aa0d58e3768690dd8ebef0e8e01af7e80f83 (patch)
treec27759daa763eff5f4539533ccde5dea3dc22ff3 /common/homedir.c
parentw32: Also change the directory on daemon startup. (diff)
downloadgnupg2-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.c63
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);
}