diff options
| author | Werner Koch <[email protected]> | 2016-11-10 16:13:02 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2016-11-10 16:13:34 +0000 | 
| commit | 2a39bd6c30d21c43c86645a7908ce6c57dad5e20 (patch) | |
| tree | 44165ff7906b66c922b51821f6af2b9c7f488861 /src | |
| parent | tests: Fix additional memleaks in thread tests (diff) | |
| download | gpgme-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')
| -rw-r--r-- | src/keylist.c | 15 | 
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); | 
