From 6578c362fe7d1a18c6622c2ba4eb8ab9257cc45e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 5 Sep 2017 21:03:18 -0400 Subject: [PATCH] lib/gpg: Use nicer helper for gpg error messages The vast majority of invocations of `ot_gpgme_error_to_gio_error()` were paired with `g_prefix_error()`; let's combine them for the same reason we do `glnx_throw_errno_prefix()`. For the few cases that don't we might as well add some prefix. I also changed it to `return FALSE` in prep for more style porting. Closes: #1135 Approved by: jlebon --- src/libostree/ostree-gpg-verifier.c | 13 ++++----- src/libostree/ostree-gpg-verify-result.c | 3 +- src/libostree/ostree-repo.c | 35 ++++++++--------------- src/libotutil/ot-gpg-utils.c | 36 +++++++++++------------- src/libotutil/ot-gpg-utils.h | 3 +- 5 files changed, 37 insertions(+), 53 deletions(-) diff --git a/src/libostree/ostree-gpg-verifier.c b/src/libostree/ostree-gpg-verifier.c index 99756e2b..d7778cf0 100644 --- a/src/libostree/ostree-gpg-verifier.c +++ b/src/libostree/ostree-gpg-verifier.c @@ -187,14 +187,14 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self, gpg_error = gpgme_data_new_from_fd (&kdata, fd); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); + ot_gpgme_throw (gpg_error, error, "Loading data from fd %i", fd); goto out; } gpg_error = gpgme_op_import (result->context, kdata); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); + ot_gpgme_throw (gpg_error, error, "Failed to import key"); goto out; } } @@ -212,8 +212,7 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self, 0 /* do not copy */); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to read signed data: "); + ot_gpgme_throw (gpg_error, error, "Unable to read signed data"); goto out; } @@ -223,16 +222,14 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self, 0 /* do not copy */); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to read signature: "); + ot_gpgme_throw (gpg_error, error, "Unable to read signature"); goto out; } gpg_error = gpgme_op_verify (result->context, signature_buffer, data_buffer, NULL); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to complete signature verification: "); + ot_gpgme_throw (gpg_error, error, "Unable to complete signature verification"); goto out; } diff --git a/src/libostree/ostree-gpg-verify-result.c b/src/libostree/ostree-gpg-verify-result.c index f6689e63..8b0c0b17 100644 --- a/src/libostree/ostree-gpg-verify-result.c +++ b/src/libostree/ostree-gpg-verify-result.c @@ -133,8 +133,7 @@ ostree_gpg_verify_result_initable_init (GInitable *initable, gpg_error = gpgme_new (&result->context); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to create context: "); + ot_gpgme_throw (gpg_error, error, "Unable to create context"); goto out; } diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 70672ae0..d9fc65b1 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -1465,8 +1465,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, gpg_error = gpgme_op_import (source_context, data_buffer); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to import keys: "); + ot_gpgme_throw (gpg_error, error, "Unable to import keys"); goto out; } @@ -1491,8 +1490,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, gpg_error = gpgme_get_key (source_context, key_ids[ii], &key, 0); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to find key \"%s\": ", key_ids[ii]); + ot_gpgme_throw (gpg_error, error, "Unable to find key \"%s\"", key_ids[ii]); goto out; } @@ -1519,8 +1517,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, if (gpgme_err_code (gpg_error) != GPG_ERR_EOF) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to list keys: "); + ot_gpgme_throw (gpg_error, error, "Unable to list keys"); goto out; } } @@ -1592,8 +1589,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, gpg_error = gpgme_data_new (&data_buffer); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to create data buffer: "); + ot_gpgme_throw (gpg_error, error, "Unable to create data buffer"); goto out; } @@ -1602,8 +1598,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, data_buffer); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to export keys: "); + ot_gpgme_throw (gpg_error, error, "Unable to export keys"); goto out; } @@ -1612,8 +1607,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, gpg_error = gpgme_op_import (target_context, data_buffer); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to import keys: "); + ot_gpgme_throw (gpg_error, error, "Unable to import keys"); goto out; } @@ -1628,8 +1622,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, { if (import_status->result != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); - g_prefix_error (error, "Unable to import key \"%s\": ", + ot_gpgme_throw (gpg_error, error, "Unable to import key \"%s\"", import_status->fpr); goto out; } @@ -4179,26 +4172,23 @@ sign_data (OstreeRepo *self, } else if (err != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (err, error); - g_prefix_error (error, "Unable to lookup key ID %s: ", key_id); + ot_gpgme_throw (err, error, "Unable to lookup key ID %s", key_id); goto out; } /* Add the key to the context as a signer */ if ((err = gpgme_signers_add (context, key)) != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (err, error); - g_prefix_error (error, "Error signing commit: "); + ot_gpgme_throw (err, error, "Error signing commit"); goto out; } - + { gsize len; const char *buf = g_bytes_get_data (input_data, &len); if ((err = gpgme_data_new_from_mem (&commit_buffer, buf, len, FALSE)) != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (err, error); - g_prefix_error (error, "Failed to create buffer from commit file: "); + ot_gpgme_throw (err, error, "Failed to create buffer from commit file"); goto out; } } @@ -4208,8 +4198,7 @@ sign_data (OstreeRepo *self, if ((err = gpgme_op_sign (context, commit_buffer, signature_buffer, GPGME_SIG_MODE_DETACH)) != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (err, error); - g_prefix_error (error, "Failure signing commit file: "); + ot_gpgme_throw (err, error, "Failure signing commit file"); goto out; } diff --git a/src/libotutil/ot-gpg-utils.c b/src/libotutil/ot-gpg-utils.c index 99f4879e..f8a13269 100644 --- a/src/libotutil/ot-gpg-utils.c +++ b/src/libotutil/ot-gpg-utils.c @@ -26,20 +26,23 @@ #include "libglnx.h" -void -ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error, - GError **error) +/* Like glnx_throw_errno_prefix, but takes @gpg_error */ +gboolean +ot_gpgme_throw (gpgme_error_t gpg_error, GError **error, + const char *fmt, ...) { + if (error == NULL) + return FALSE; + GIOErrorEnum errcode; char errbuf[1024]; /* XXX This list is incomplete. Add cases as needed. */ - switch (gpgme_err_code (gpg_error)) { /* special case - shouldn't be here */ case GPG_ERR_NO_ERROR: - g_return_if_reached (); + g_assert_not_reached (); /* special case - abort on out-of-memory */ case GPG_ERR_ENOMEM: @@ -63,6 +66,12 @@ ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error, g_set_error (error, G_IO_ERROR, errcode, "%s: %s", gpgme_strsource (gpg_error), errbuf); + va_list args; + va_start (args, fmt); + glnx_real_set_prefix_error_va (*error, fmt, args); + va_end (args); + + return FALSE; } gboolean @@ -99,7 +108,7 @@ ot_gpgme_ctx_tmp_home_dir (gpgme_ctx_t gpgme_ctx, NULL, tmp_home_dir); if (gpg_error != GPG_ERR_NO_ERROR) { - ot_gpgme_error_to_gio_error (gpg_error, error); + ot_gpgme_throw (gpg_error, error, "gpgme_ctx_set_engine_info"); goto out; } @@ -376,7 +385,6 @@ ot_gpgme_data_input (GInputStream *input_stream) if (gpg_error != GPG_ERR_NO_ERROR) { g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM); - ot_gpgme_error_to_gio_error (gpg_error, NULL); g_assert_not_reached (); } @@ -399,7 +407,6 @@ ot_gpgme_data_output (GOutputStream *output_stream) if (gpg_error != GPG_ERR_NO_ERROR) { g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM); - ot_gpgme_error_to_gio_error (gpg_error, NULL); g_assert_not_reached (); } @@ -416,11 +423,7 @@ ot_gpgme_new_ctx (const char *homedir, g_auto(gpgme_ctx_t) context = NULL; if ((err = gpgme_new (&context)) != GPG_ERR_NO_ERROR) - { - ot_gpgme_error_to_gio_error (err, error); - g_prefix_error (error, "Unable to create gpg context: "); - return NULL; - } + return ot_gpgme_throw (err, error, "Unable to create gpg context"), NULL; if (homedir != NULL) { @@ -430,12 +433,7 @@ ot_gpgme_new_ctx (const char *homedir, if ((err = gpgme_ctx_set_engine_info (context, info->protocol, NULL, homedir)) != GPG_ERR_NO_ERROR) - { - ot_gpgme_error_to_gio_error (err, error); - g_prefix_error (error, "Unable to set gpg homedir to '%s': ", - homedir); - return NULL; - } + return ot_gpgme_throw (err, error, "Unable to set gpg homedir to '%s'", homedir), NULL; } return g_steal_pointer (&context); diff --git a/src/libotutil/ot-gpg-utils.h b/src/libotutil/ot-gpg-utils.h index b639e5ac..bd2810f8 100644 --- a/src/libotutil/ot-gpg-utils.h +++ b/src/libotutil/ot-gpg-utils.h @@ -30,7 +30,8 @@ G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_data_t, gpgme_data_release, NULL) G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_ctx_t, gpgme_release, NULL) G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_key_t, gpgme_key_unref, NULL) -void ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error, GError **error); +gboolean ot_gpgme_throw (gpgme_error_t gpg_error, GError **error, + const char *fmt, ...) G_GNUC_PRINTF (3, 4); gboolean ot_gpgme_ctx_tmp_home_dir (gpgme_ctx_t gpgme_ctx, char **out_tmp_home_dir,