aboutsummaryrefslogtreecommitdiffstats
path: root/src/keylist.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-11-10 16:13:02 +0000
committerWerner Koch <[email protected]>2016-11-10 16:13:34 +0000
commit2a39bd6c30d21c43c86645a7908ce6c57dad5e20 (patch)
tree44165ff7906b66c922b51821f6af2b9c7f488861 /src/keylist.c
parenttests: Fix additional memleaks in thread tests (diff)
downloadgpgme-2a39bd6c30d21c43c86645a7908ce6c57dad5e20.tar.gz
gpgme-2a39bd6c30d21c43c86645a7908ce6c57dad5e20.zip
core: Detect unreadable keyrings.
* src/keylist.c (op_data_t): Add field keydb_search_err. (keylist_status_handler): Parse STATUS_ERROR into that var. (gpgme_op_keylist_next): Use that err instead of GPG_ERR_EOF. -- With a recent GnuPG version this allows to detect a keyring with wrong permissions (i.e. no read access). GPG_ERR_OPEN_KEYRING will be returned instead of GPG_ERR_EOF. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/keylist.c')
-rw-r--r--src/keylist.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/keylist.c b/src/keylist.c
index 8a0c5a37..6e22e167 100644
--- a/src/keylist.c
+++ b/src/keylist.c
@@ -54,6 +54,9 @@ typedef struct
{
struct _gpgme_op_keylist_result result;
+ /* The error code from ERROR keydb_search. */
+ gpgme_error_t keydb_search_err;
+
gpgme_key_t tmp_key;
/* This points to the last uid in tmp_key. */
@@ -135,10 +138,17 @@ keylist_status_handler (void *priv, gpgme_status_code_t code, char *args)
opd->result.truncated = 1;
break;
+ case GPGME_STATUS_ERROR:
+ err = _gpgme_parse_failure (args);
+ if (!opd->keydb_search_err && !strcmp (args, "keydb_search"))
+ opd->keydb_search_err = err;
+ err = 0;
+ break;
+
default:
break;
}
- return 0;
+ return err;
}
@@ -1138,7 +1148,8 @@ gpgme_op_keylist_next (gpgme_ctx_t ctx, gpgme_key_t *r_key)
return TRACE_ERR (err);
if (!opd->key_cond)
- return TRACE_ERR (gpg_error (GPG_ERR_EOF));
+ return TRACE_ERR (opd->keydb_search_err? opd->keydb_search_err
+ /**/ : gpg_error (GPG_ERR_EOF));
opd->key_cond = 0;
assert (opd->key_queue);