mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-21 14:47:03 +01: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:
parent
75311cfe18
commit
d9f9b3be03
56
g10/tdbio.c
56
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,32 +644,19 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
|
||||
/* OK, we have the valid trustdb.gpg already. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
take_write_lock ();
|
||||
|
||||
if (access (fname, R_OK))
|
||||
else if (!create)
|
||||
{
|
||||
#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;
|
||||
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
|
||||
@ -689,6 +677,25 @@ 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;
|
||||
|
||||
#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);
|
||||
if (is_secured_filename (fname))
|
||||
{
|
||||
@ -718,7 +725,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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user