1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-17 00:39:50 +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>

(backport from master
 commit 2f3e42047d17313eeb38d354048f343158402a8d)
This commit is contained in:
NIIBE Yutaka 2016-02-12 10:15:52 +09:00
parent 776bee6d37
commit eb7806d63d

View File

@ -479,9 +479,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 ) {
atexit( cleanup );
@ -514,23 +515,19 @@ tdbio_set_dbname( const char *new_dbname, int create, int *r_nofile)
if (stat (fname, &statbuf) == 0 && statbuf.st_size > 0)
/* OK, we have the valid trustdb.gpg already. */
return 0;
take_write_lock ();
if( access( fname, R_OK ) ) {
if( errno != ENOENT )
log_fatal( _("can't access `%s': %s\n"), fname, strerror(errno) );
if (!create)
else if (!create)
{
*r_nofile = 1;
else {
FILE *fp;
TRUSTREC rec;
int rc;
char *p = strrchr( fname, DIRSEP_C );
mode_t oldmask;
int save_slash;
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
@ -550,6 +547,18 @@ tdbio_set_dbname( const char *new_dbname, int create, int *r_nofile)
}
*p = save_slash;
take_write_lock ();
if( access( fname, R_OK ) ) {
FILE *fp;
TRUSTREC rec;
int rc;
mode_t oldmask;
if( errno != ENOENT )
log_fatal( _("can't access `%s': %s\n"), fname, strerror(errno) );
oldmask=umask(077);
if (is_secured_filename (fname)) {
fp = NULL;
@ -576,7 +585,6 @@ tdbio_set_dbname( const char *new_dbname, int create, int *r_nofile)
if( !opt.quiet )
log_info(_("%s: trustdb created\n"), db_name);
}
}
release_write_lock ();
return 0;