diff options
| -rw-r--r-- | g10/keydb.c | 25 | ||||
| -rw-r--r-- | g10/keyring.c | 10 | ||||
| -rw-r--r-- | g10/keyring.h | 1 | ||||
| -rw-r--r-- | kbx/backend-kbx.c | 1 | ||||
| -rw-r--r-- | kbx/keybox-init.c | 17 | ||||
| -rw-r--r-- | kbx/keybox-update.c | 5 | ||||
| -rw-r--r-- | kbx/keybox.h | 1 | ||||
| -rw-r--r-- | sm/keydb.c | 26 |
8 files changed, 71 insertions, 15 deletions
diff --git a/g10/keydb.c b/g10/keydb.c index 06c78f048..cdad8a450 100644 --- a/g10/keydb.c +++ b/g10/keydb.c @@ -1059,11 +1059,34 @@ lock_all (KEYDB_HANDLE hd) static void +do_fp_close (KEYDB_HANDLE hd) +{ + int i; + + for (i=0; i < hd->used; i++) + { + switch (hd->active[i].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + break; + case KEYDB_RESOURCE_TYPE_KEYRING: + keyring_fp_close (hd->active[i].u.kr); + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + keybox_fp_close (hd->active[i].u.kb); + break; + } + } +} + +static void unlock_all (KEYDB_HANDLE hd) { int i; - if (!hd->locked || hd->keep_lock) + do_fp_close (hd); + + if (!hd->locked) return; for (i=hd->used-1; i >= 0; i--) diff --git a/g10/keyring.c b/g10/keyring.c index fd0b83521..f52bb7aea 100644 --- a/g10/keyring.c +++ b/g10/keyring.c @@ -253,6 +253,14 @@ keyring_new (void *token) } void +keyring_fp_close (KEYRING_HANDLE hd) +{ + if (!hd) + return; + iobuf_close (hd->current.iobuf); +} + +void keyring_release (KEYRING_HANDLE hd) { if (!hd) @@ -261,7 +269,6 @@ keyring_release (KEYRING_HANDLE hd) active_handles--; xfree (hd->word_match.name); xfree (hd->word_match.pattern); - iobuf_close (hd->current.iobuf); xfree (hd); } @@ -1594,6 +1601,7 @@ keyring_rebuild_cache (ctrl_t ctrl, void *token, int noisy) xfree (tmpfilename); xfree (bakfilename); release_kbnode (keyblock); + keyring_fp_close (hd); keyring_lock (hd, 0); keyring_release (hd); return rc; diff --git a/g10/keyring.h b/g10/keyring.h index 7155d1d4a..b3609edf4 100644 --- a/g10/keyring.h +++ b/g10/keyring.h @@ -28,6 +28,7 @@ int keyring_register_filename (const char *fname, int read_only, void **ptr); int keyring_is_writable (void *token); KEYRING_HANDLE keyring_new (void *token); +void keyring_fp_close (KEYRING_HANDLE hd); void keyring_release (KEYRING_HANDLE hd); void keyring_push_found_state (KEYRING_HANDLE hd); void keyring_pop_found_state (KEYRING_HANDLE hd); diff --git a/kbx/backend-kbx.c b/kbx/backend-kbx.c index 7674cdf2c..2d9685b3c 100644 --- a/kbx/backend-kbx.c +++ b/kbx/backend-kbx.c @@ -222,6 +222,7 @@ be_kbx_release_resource (ctrl_t ctrl, backend_handle_t hd) void be_kbx_release_kbx_hd (KEYBOX_HANDLE kbx_hd) { + keybox_fp_close (kbx_hd); keybox_release (kbx_hd); } diff --git a/kbx/keybox-init.c b/kbx/keybox-init.c index 53c716833..47b44909e 100644 --- a/kbx/keybox-init.c +++ b/kbx/keybox-init.c @@ -193,6 +193,18 @@ keybox_new_x509 (void *token, int secret) void +keybox_fp_close (KEYBOX_HANDLE hd) +{ + if (!hd) + return; + if (hd->fp) + { + _keybox_ll_close (hd->fp); + hd->fp = NULL; + } +} + +void keybox_release (KEYBOX_HANDLE hd) { if (!hd) @@ -206,11 +218,6 @@ keybox_release (KEYBOX_HANDLE hd) } _keybox_release_blob (hd->found.blob); _keybox_release_blob (hd->saved_found.blob); - if (hd->fp) - { - _keybox_ll_close (hd->fp); - hd->fp = NULL; - } xfree (hd->word_match.name); xfree (hd->word_match.pattern); xfree (hd); diff --git a/kbx/keybox-update.c b/kbx/keybox-update.c index a712a6bf2..f037485da 100644 --- a/kbx/keybox-update.c +++ b/kbx/keybox-update.c @@ -654,12 +654,14 @@ keybox_compress_when_no_other_users (void *token, int for_openpgp) fname = hd->kb->fname; if (!fname) { + keybox_fp_close (hd); keybox_release (hd); return; } if (keybox_lock (hd, 1, 0)) { + keybox_fp_close (hd); keybox_release (hd); return; } @@ -828,8 +830,7 @@ keybox_compress_when_no_other_users (void *token, int for_openpgp) fname, gpg_strerror (err)); leave: - /* Here, we unlock before the release of HD. It's safe because - references to the resource are all closed. */ + keybox_fp_close (hd); keybox_lock (hd, 0, 0); keybox_release (hd); return; diff --git a/kbx/keybox.h b/kbx/keybox.h index 2812c06df..9746d4675 100644 --- a/kbx/keybox.h +++ b/kbx/keybox.h @@ -70,6 +70,7 @@ int keybox_is_writable (void *token); KEYBOX_HANDLE keybox_new_openpgp (void *token, int secret); KEYBOX_HANDLE keybox_new_x509 (void *token, int secret); +void keybox_fp_close (KEYBOX_HANDLE hd); void keybox_release (KEYBOX_HANDLE hd); void keybox_push_found_state (KEYBOX_HANDLE hd); void keybox_pop_found_state (KEYBOX_HANDLE hd); diff --git a/sm/keydb.c b/sm/keydb.c index 68325113a..3048de44c 100644 --- a/sm/keydb.c +++ b/sm/keydb.c @@ -808,9 +808,6 @@ lock_all (KEYDB_HANDLE hd) { int i, rc = 0; - if (hd->use_keyboxd) - return 0; - if (hd->keep_lock) return 0; @@ -853,14 +850,31 @@ lock_all (KEYDB_HANDLE hd) } static void +do_fp_close (KEYDB_HANDLE hd) +{ + int i; + + for (i=0; i < hd->used; i++) + { + switch (hd->active[i].type) + { + case KEYDB_RESOURCE_TYPE_NONE: + break; + case KEYDB_RESOURCE_TYPE_KEYBOX: + keybox_fp_close (hd->active[i].u.kr); + break; + } + } +} + +static void unlock_all (KEYDB_HANDLE hd) { int i; - if (hd->use_keyboxd) - return; + do_fp_close (hd); - if (!hd->locked || hd->keep_lock) + if (!hd->locked) return; for (i=hd->used-1; i >= 0; i--) |
