summaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2016-02-12 02:10:33 +0100
committerNIIBE Yutaka <gniibe@fsij.org>2016-02-12 02:10:33 +0100
commitd9f9b3be036747c9f55060aed47896f951bfb853 (patch)
treed24f99f522d370978776b83a6b5f6c5a0faa3226 /g10
parentdoc: Note that rngd can also be used to quickly generate insecure keys. (diff)
downloadgnupg2-d9f9b3be036747c9f55060aed47896f951bfb853.tar.xz
gnupg2-d9f9b3be036747c9f55060aed47896f951bfb853.zip
g10: Make sure to have the directory for trustdb.
* g10/tdbio.c (tdbio_set_dbname): Return earlier if !CREATE. Check the directory and create it if none before calling take_write_lock. -- Thanks to Marc Deslauriers for the bug report and his patch. GnuPG-bug-id: 2246 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to 'g10')
-rw-r--r--g10/tdbio.c118
1 files changed, 62 insertions, 56 deletions
diff --git a/g10/tdbio.c b/g10/tdbio.c
index 3cc8bd3ff..79e1e8323 100644
--- a/g10/tdbio.c
+++ b/g10/tdbio.c
@@ -603,9 +603,10 @@ create_version_record (void)
int
tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
{
- char *fname;
+ char *fname, *p;
struct stat statbuf;
static int initialized = 0;
+ int save_slash;
if (!initialized)
{
@@ -643,11 +644,48 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
/* OK, we have the valid trustdb.gpg already. */
return 0;
}
+ else if (!create)
+ {
+ *r_nofile = 1;
+ return 0;
+ }
+
+ /* Here comes: No valid trustdb.gpg AND CREATE==1 */
+
+ /*
+ * Make sure the directory exists. This should be done before
+ * acquiring the lock, which assumes the existence of the directory.
+ */
+ p = strrchr (fname, DIRSEP_C);
+#if HAVE_W32_SYSTEM
+ {
+ /* Windows may either have a slash or a backslash. Take
+ care of it. */
+ char *pp = strrchr (fname, '/');
+ if (!p || pp > p)
+ p = pp;
+ }
+#endif /*HAVE_W32_SYSTEM*/
+ assert (p);
+ save_slash = *p;
+ *p = 0;
+ if (access (fname, F_OK))
+ {
+ try_make_homedir (fname);
+ if (access (fname, F_OK))
+ log_fatal (_("%s: directory does not exist!\n"), fname);
+ }
+ *p = save_slash;
take_write_lock ();
if (access (fname, R_OK))
{
+ FILE *fp;
+ TRUSTREC rec;
+ int rc;
+ mode_t oldmask;
+
#ifdef HAVE_W32CE_SYSTEM
/* We know how the cegcc implementation of access works ;-). */
if (GetLastError () == ERROR_FILE_NOT_FOUND)
@@ -658,66 +696,34 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
if (errno != ENOENT)
log_fatal ( _("can't access '%s': %s\n"), fname, strerror (errno));
- if (!create)
- *r_nofile = 1;
- else
+ oldmask = umask (077);
+ if (is_secured_filename (fname))
{
- FILE *fp;
- TRUSTREC rec;
- int rc;
- char *p = strrchr (fname, DIRSEP_C);
- mode_t oldmask;
- int save_slash;
-
-#if HAVE_W32_SYSTEM
- {
- /* Windows may either have a slash or a backslash. Take
- care of it. */
- char *pp = strrchr (fname, '/');
- if (!p || pp > p)
- p = pp;
- }
-#endif /*HAVE_W32_SYSTEM*/
- assert (p);
- save_slash = *p;
- *p = 0;
- if (access (fname, F_OK))
- {
- try_make_homedir (fname);
- if (access (fname, F_OK))
- log_fatal (_("%s: directory does not exist!\n"), fname);
- }
- *p = save_slash;
-
- oldmask = umask (077);
- if (is_secured_filename (fname))
- {
- fp = NULL;
- gpg_err_set_errno (EPERM);
- }
- else
- fp = fopen (fname, "wb");
- umask(oldmask);
- if (!fp)
- log_fatal (_("can't create '%s': %s\n"), fname, strerror (errno));
- fclose (fp);
+ fp = NULL;
+ gpg_err_set_errno (EPERM);
+ }
+ else
+ fp = fopen (fname, "wb");
+ umask(oldmask);
+ if (!fp)
+ log_fatal (_("can't create '%s': %s\n"), fname, strerror (errno));
+ fclose (fp);
- db_fd = open (db_name, O_RDWR | MY_O_BINARY);
- if (db_fd == -1)
- log_fatal (_("can't open '%s': %s\n"), db_name, strerror (errno));
+ db_fd = open (db_name, O_RDWR | MY_O_BINARY);
+ if (db_fd == -1)
+ log_fatal (_("can't open '%s': %s\n"), db_name, strerror (errno));
- rc = create_version_record ();
- if (rc)
- log_fatal (_("%s: failed to create version record: %s"),
- fname, gpg_strerror (rc));
+ rc = create_version_record ();
+ if (rc)
+ log_fatal (_("%s: failed to create version record: %s"),
+ fname, gpg_strerror (rc));
- /* Read again to check that we are okay. */
- if (tdbio_read_record (0, &rec, RECTYPE_VER))
- log_fatal (_("%s: invalid trustdb created\n"), db_name);
+ /* Read again to check that we are okay. */
+ if (tdbio_read_record (0, &rec, RECTYPE_VER))
+ log_fatal (_("%s: invalid trustdb created\n"), db_name);
- if (!opt.quiet)
- log_info (_("%s: trustdb created\n"), db_name);
- }
+ if (!opt.quiet)
+ log_info (_("%s: trustdb created\n"), db_name);
}
release_write_lock ();