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 <wk@gnupg.org>
This commit is contained in:
Werner Koch 2016-11-10 17:13:02 +01:00
parent d0030efb45
commit 2a39bd6c30
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -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);