From d3d640b9cc98dd0d06b49a2e4d46eb67af96fe29 Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Tue, 30 May 2017 10:22:35 +0200 Subject: [PATCH] gpg: Disable keydb handle caching * g10/getkey.c (getkey_end): Disable caching of the open keydb handle. -- This created a big regression for Windows because the keyring is only released after the global ctrl is released. So if an operation does a getkey and then tries to modify the keyring it will fail on Windows with a sharing violation. We need to modify all keyring write operations to also take the ctrl and close the cached_getkey_kdb handle to make writing work. See: https://dev.gnupg.org/T3097 GnuPG-Bug-Id: T3097 Signed-off-by: Andre Heinecke --- g10/getkey.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/g10/getkey.c b/g10/getkey.c index 04ecf4fc8..ac6b9a307 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -2219,10 +2219,20 @@ getkey_end (ctrl_t ctrl, getkey_ctx_t ctx) { if (ctx) { +/* +XXX: This creates a big regression for Windows because the keyring +* is only released after the global ctrl is released. So if an operation +* does a getkey and then tries to modify the keyring it will fail on +* Windows with a sharing violation. We need to modify all +* keyring write operations to also take the ctrl and close the +* cached_getkey_kdb handle to make writing work. See: +* https://dev.gnupg.org/T3097 + if (ctrl && !ctrl->cached_getkey_kdb) ctrl->cached_getkey_kdb = ctx->kr_handle; else - keydb_release (ctx->kr_handle); +*/ + keydb_release (ctx->kr_handle); free_strlist (ctx->extra_list); if (!ctx->not_allocated) xfree (ctx);