1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-10-29 19:48:43 +01:00

common: Fix a race condition in creating socketdir.

* common/homedir.c (_gnupg_socketdir_internal): Check return code
of gnupg_mkdir and handle the case of GPG_ERR_EEXIST.

--

GnuPG-bug-id: 7332
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2024-10-16 10:04:18 +09:00
parent 374195e741
commit 71840b57f4
No known key found for this signature in database
GPG Key ID: 640114AF89DE6054

View File

@ -1124,6 +1124,7 @@ _gnupg_socketdir_internal (int skip_checks, unsigned *r_info)
{ {
#if defined(HAVE_W32_SYSTEM) #if defined(HAVE_W32_SYSTEM)
char *name; char *name;
gpg_err_code_t ec;
(void)skip_checks; (void)skip_checks;
@ -1201,7 +1202,8 @@ _gnupg_socketdir_internal (int skip_checks, unsigned *r_info)
else if (!skip_checks) else if (!skip_checks)
{ {
/* Try to create the directory and check again. */ /* Try to create the directory and check again. */
if (gnupg_mkdir (name, "-rwx")) ec = gnupg_mkdir (name, "-rwx");
if (ec && ec != GPG_ERR_EEXIST)
*r_info |= 16; /* mkdir failed. */ *r_info |= 16; /* mkdir failed. */
else if (gnupg_stat (name, &sb)) else if (gnupg_stat (name, &sb))
{ {
@ -1259,6 +1261,7 @@ _gnupg_socketdir_internal (int skip_checks, unsigned *r_info)
const char *s; const char *s;
char *name = NULL; char *name = NULL;
const char *gnupgname = my_gnupg_dirname (); const char *gnupgname = my_gnupg_dirname ();
gpg_err_code_t ec;
*r_info = 0; *r_info = 0;
@ -1316,8 +1319,14 @@ _gnupg_socketdir_internal (int skip_checks, unsigned *r_info)
goto leave; goto leave;
} }
/* Try to create the directory and check again. */ /* Try to create the directory and check again.
if (gnupg_mkdir (prefix, "-rwx")) * Here comes a possible race condition:
* stat(2) above failed by ENOENT, but another process does
* mkdir(2) before we do mkdir(2)
* So, an error with EEXIST should be handled.
*/
ec = gnupg_mkdir (prefix, "-rwx");
if (ec && ec != GPG_ERR_EEXIST)
{ {
*r_info |= 16; /* mkdir failed. */ *r_info |= 16; /* mkdir failed. */
goto leave; goto leave;
@ -1376,7 +1385,8 @@ _gnupg_socketdir_internal (int skip_checks, unsigned *r_info)
else if (!skip_checks) else if (!skip_checks)
{ {
/* Try to create the directory and check again. */ /* Try to create the directory and check again. */
if (gnupg_mkdir (name, "-rwx")) ec = gnupg_mkdir (name, "-rwx");
if (ec && ec != GPG_ERR_EEXIST)
*r_info |= 16; /* mkdir failed. */ *r_info |= 16; /* mkdir failed. */
else if (stat (prefix, &sb)) else if (stat (prefix, &sb))
{ {