aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/keydb.c25
-rw-r--r--g10/keyring.c10
-rw-r--r--g10/keyring.h1
-rw-r--r--kbx/backend-kbx.c1
-rw-r--r--kbx/keybox-init.c17
-rw-r--r--kbx/keybox-update.c5
-rw-r--r--kbx/keybox.h1
-rw-r--r--sm/keydb.c26
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--)