gpg,sm: Implement keybox compression run and release lock in gpgsm

* g10/keydb.c (keydb_add_resource): Call keybox_compress.
* sm/keydb.c (keydb_add_resource): Release the lock after a compress.
--

Note that in gpgsm we already did the compress run but we didn't
released the lock on the file.  This might have been a reason for some
strange hangs.

GnuPG-bug-id: 4644
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2019-08-23 15:51:13 +02:00
parent 5ef0d7a795
commit e64f0dfd72
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 19 additions and 3 deletions

View File

@ -805,14 +805,27 @@ keydb_add_resource (const char *url, unsigned int flags)
err = gpg_error (GPG_ERR_RESOURCE_LIMIT); err = gpg_error (GPG_ERR_RESOURCE_LIMIT);
else else
{ {
KEYBOX_HANDLE kbxhd;
if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY)) if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY))
primary_keydb = token; primary_keydb = token;
all_resources[used_resources].type = rt; all_resources[used_resources].type = rt;
all_resources[used_resources].u.kb = NULL; /* Not used here */ all_resources[used_resources].u.kb = NULL; /* Not used here */
all_resources[used_resources].token = token; all_resources[used_resources].token = token;
/* FIXME: Do a compress run if needed and no other /* Do a compress run if needed and no other user is
user is currently using the keybox. */ * currently using the keybox. */
kbxhd = keybox_new_openpgp (token, 0);
if (kbxhd)
{
if (!keybox_lock (kbxhd, 1, 0))
{
keybox_compress (kbxhd);
keybox_lock (kbxhd, 0, 0);
}
keybox_release (kbxhd);
}
used_resources++; used_resources++;
} }

View File

@ -362,7 +362,10 @@ keydb_add_resource (ctrl_t ctrl, const char *url, int force, int *auto_created)
if (kbxhd) if (kbxhd)
{ {
if (!keybox_lock (kbxhd, 1, 0)) if (!keybox_lock (kbxhd, 1, 0))
keybox_compress (kbxhd); {
keybox_compress (kbxhd);
keybox_lock (kbxhd, 0, 0);
}
keybox_release (kbxhd); keybox_release (kbxhd);
} }