diff options
author | Andre Heinecke <[email protected]> | 2018-08-28 06:35:06 +0000 |
---|---|---|
committer | Andre Heinecke <[email protected]> | 2018-08-28 06:35:06 +0000 |
commit | 3bdf8be6d2c57319399fe14e27e52b323a17750a (patch) | |
tree | 3a96860b22273de90d5e2ce2b33ebf81a78227c9 /src/gpgme-json.c | |
parent | json: Allow NULL request in encode and chunk (diff) | |
download | gpgme-3bdf8be6d2c57319399fe14e27e52b323a17750a.tar.gz gpgme-3bdf8be6d2c57319399fe14e27e52b323a17750a.zip |
json: Delete primary key if subkey gen fails
* src/gpgme-json.c (op_delete): Delete primary key on
subkey gen error.
--
This can happen for example if the user cancels the
pinentry to unlock the primary key when adding the
subkey. To avoid an artifact of a pimary key without
an encryption capable subkey we delete the created
key and treat the whole operation as failed.
Diffstat (limited to 'src/gpgme-json.c')
-rw-r--r-- | src/gpgme-json.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/gpgme-json.c b/src/gpgme-json.c index 0d1ec508..5c670eb3 100644 --- a/src/gpgme-json.c +++ b/src/gpgme-json.c @@ -3084,7 +3084,7 @@ op_createkey (cjson_t request, cjson_t result) err = gpgme_get_key (keylistctx, new_fpr, &new_key, 1); release_onetime_context (keylistctx); - if (err) + if (err || !new_key) { gpg_error_object (result, err, "Error finding created key: %s", gpg_strerror (err)); @@ -3096,7 +3096,27 @@ op_createkey (cjson_t request, cjson_t result) 0, expires, flags |= GPGME_CREATE_ENCR); xfree (subkey_algo); if (err) - goto leave; + { + /* This can happen for example if the user cancels the + * pinentry to unlock the primary key when adding the + * subkey. To avoid an artifact of a pimary key without + * an encryption capable subkey we delete the created + * key and treat the whole operation as failed. */ + gpgme_error_t err2; + gpg_error_object (result, err, "Error creating subkey: %s", + gpg_strerror (err)); + log_info ("Deleting primary key after keygen failure.\n"); + err2 = gpgme_op_delete_ext (ctx, new_key, GPGME_DELETE_FORCE | + GPGME_DELETE_ALLOW_SECRET); + if (err2) + { + log_error ("Error deleting primary key: %s", + gpg_strerror (err)); + } + gpgme_key_unref (new_key); + goto leave; + } + gpgme_key_unref (new_key); } xjson_AddStringToObject0 (result, "fingerprint", new_fpr); |