mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
gpg: Keep a lock during the read-update/insert cycle in import.
* g10/keydb.c (keydb_handle): New field 'keep_lock'. (keydb_release): Clear that flag. (keydb_lock): New function. (unlock_all): Skip if KEEP_LOCK is set. * g10/getkey.c (get_keyblock_byfprint_fast): Call keep_lock if requested. -- That change is straightforward. It helps to avoid the race condition that another gpg process inserts a key while the first process is between the search and the insert. A similar change is due for gpgsm. Note that the key edit operations may still suffer from a race. GnuPG-bug-id: 3446
This commit is contained in:
parent
8448347b5b
commit
7c73db3d31
3 changed files with 41 additions and 3 deletions
15
g10/getkey.c
15
g10/getkey.c
|
@ -1877,14 +1877,25 @@ get_keyblock_byfprint_fast (kbnode_t *r_keyblock, KEYDB_HANDLE *r_hd,
|
|||
hd = keydb_new ();
|
||||
if (!hd)
|
||||
return gpg_error_from_syserror ();
|
||||
if (r_hd)
|
||||
*r_hd = hd;
|
||||
|
||||
if (lock)
|
||||
{
|
||||
err = keydb_lock (hd);
|
||||
if (err)
|
||||
{
|
||||
/* If locking did not work, we better don't return a handle
|
||||
* at all - there was a reason that locking has been
|
||||
* requested. */
|
||||
keydb_release (hd);
|
||||
return err;
|
||||
}
|
||||
keydb_disable_caching (hd);
|
||||
}
|
||||
|
||||
/* Fo all other errors we return the handle. */
|
||||
if (r_hd)
|
||||
*r_hd = hd;
|
||||
|
||||
err = keydb_search_fpr (hd, fprbuf);
|
||||
if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue