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:
parent
d0030efb45
commit
2a39bd6c30
@ -54,6 +54,9 @@ typedef struct
|
|||||||
{
|
{
|
||||||
struct _gpgme_op_keylist_result result;
|
struct _gpgme_op_keylist_result result;
|
||||||
|
|
||||||
|
/* The error code from ERROR keydb_search. */
|
||||||
|
gpgme_error_t keydb_search_err;
|
||||||
|
|
||||||
gpgme_key_t tmp_key;
|
gpgme_key_t tmp_key;
|
||||||
|
|
||||||
/* This points to the last uid in 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;
|
opd->result.truncated = 1;
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
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);
|
return TRACE_ERR (err);
|
||||||
|
|
||||||
if (!opd->key_cond)
|
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;
|
opd->key_cond = 0;
|
||||||
assert (opd->key_queue);
|
assert (opd->key_queue);
|
||||||
|
Loading…
Reference in New Issue
Block a user