commit:     47bf10b77b8f94bfeea06e6cd8c9c81958c5584f
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Thu Jan 22 09:45:26 2026 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Thu Jan 22 09:51:41 2026 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=47bf10b7

qmanifest: cleanup gpgme stuff on errors

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 qmanifest.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/qmanifest.c b/qmanifest.c
index be9cdbb..a674d9e 100644
--- a/qmanifest.c
+++ b/qmanifest.c
@@ -766,10 +766,17 @@ process_dir_gen(void)
 
                gerr = gpgme_get_key(gctx, gpg_sign_key, &gkey, 0);
                if (gerr != GPG_ERR_NO_ERROR)
+               {
+                       gpgme_release(gctx);
                        return "failed to get GPG key";
+               }
                gerr = gpgme_signers_add(gctx, gkey);
                if (gerr != GPG_ERR_NO_ERROR)
+               {
+                       gpgme_key_unref(gkey);
+                       gpgme_release(gctx);
                        return "failed to add GPG key to sign list, is it a 
suitable key?";
+               }
                gpgme_key_unref(gkey);
 
                gpg_pass = NULL;
@@ -802,18 +809,29 @@ process_dir_gen(void)
                }
 
                if ((f = fopen(str_manifest, "r+")) == NULL)
+               {
+                       gpgme_release(gctx);
                        return "could not open top-level Manifest file";
+               }
 
                /* finally, sign the Manifest */
                if (gpgme_data_new_from_stream(&manifest, f) != 
GPG_ERR_NO_ERROR)
+               {
+                       gpgme_release(gctx);
                        return "failed to create GPG data from Manifest";
+               }
 
                if (gpgme_data_new(&out) != GPG_ERR_NO_ERROR)
+               {
+                       gpgme_release(gctx);
                        return "failed to create GPG output buffer";
+               }
 
                gerr = gpgme_op_sign(gctx, manifest, out, GPGME_SIG_MODE_CLEAR);
                if (gerr != GPG_ERR_NO_ERROR) {
                        warn("%s: %s", gpgme_strsource(gerr), 
gpgme_strerror(gerr));
+                       gpgme_data_release(out);
+                       gpgme_release(gctx);
                        return "failed to GPG sign Manifest";
                }
 

Reply via email to