From 2a39bd6c30d21c43c86645a7908ce6c57dad5e20 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 10 Nov 2016 17:13:02 +0100 Subject: [PATCH] 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 --- src/keylist.c | 15 +++++++++++++-- 1 file 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);