1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-05-24 16:43:28 +02:00

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>
This commit is contained in:
NIIBE Yutaka 2016-02-12 10:10:33 +09:00
parent 75311cfe18
commit d9f9b3be03

View File

@ -603,9 +603,10 @@ create_version_record (void)
int int
tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile) tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
{ {
char *fname; char *fname, *p;
struct stat statbuf; struct stat statbuf;
static int initialized = 0; static int initialized = 0;
int save_slash;
if (!initialized) if (!initialized)
{ {
@ -643,32 +644,19 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
/* OK, we have the valid trustdb.gpg already. */ /* OK, we have the valid trustdb.gpg already. */
return 0; return 0;
} }
else if (!create)
take_write_lock ();
if (access (fname, R_OK))
{ {
#ifdef HAVE_W32CE_SYSTEM
/* We know how the cegcc implementation of access works ;-). */
if (GetLastError () == ERROR_FILE_NOT_FOUND)
gpg_err_set_errno (ENOENT);
else
gpg_err_set_errno (EIO);
#endif /*HAVE_W32CE_SYSTEM*/
if (errno != ENOENT)
log_fatal ( _("can't access '%s': %s\n"), fname, strerror (errno));
if (!create)
*r_nofile = 1; *r_nofile = 1;
else return 0;
{ }
FILE *fp;
TRUSTREC rec;
int rc;
char *p = strrchr (fname, DIRSEP_C);
mode_t oldmask;
int save_slash;
/* 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 #if HAVE_W32_SYSTEM
{ {
/* Windows may either have a slash or a backslash. Take /* Windows may either have a slash or a backslash. Take
@ -689,6 +677,25 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
} }
*p = save_slash; *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)
gpg_err_set_errno (ENOENT);
else
gpg_err_set_errno (EIO);
#endif /*HAVE_W32CE_SYSTEM*/
if (errno != ENOENT)
log_fatal ( _("can't access '%s': %s\n"), fname, strerror (errno));
oldmask = umask (077); oldmask = umask (077);
if (is_secured_filename (fname)) if (is_secured_filename (fname))
{ {
@ -718,7 +725,6 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
if (!opt.quiet) if (!opt.quiet)
log_info (_("%s: trustdb created\n"), db_name); log_info (_("%s: trustdb created\n"), db_name);
} }
}
release_write_lock (); release_write_lock ();
return 0; return 0;