gpg-interface: fix leak of strbufs in get_ssh_key_fingerprint()

We read stdout from gpg into a strbuf, then split it into a list of strbufs, pull out one element, and return it. But we don't free either the original stdout buffer, nor the list returned from strbuf_split(). This patch fixes both. Note that we have to detach the returned string from its strbuf before calling strbuf_list_free(), as that would otherwise throw it away. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Oct 18, 2021 at 13:15 UTC f3af71c947cdf2e5acd16cacf50586b829a68f6e
1 file changed +5 -1
gpg-interface.c
+5 -1
@@ -711,6 +711,7 @@ static char *get_ssh_key_fingerprint(const char *signing_key)
711 int ret = -1;
712 struct strbuf fingerprint_stdout = STRBUF_INIT;
713 struct strbuf **fingerprint;
714 + char *fingerprint_ret;
715
716 /*
717 * With SSH Signing this can contain a filename or a public key
@@ -737,7 +738,10 @@ static char *get_ssh_key_fingerprint(const char *signing_key)
738 die_errno(_("failed to get the ssh fingerprint for key '%s'"),
739 signing_key);
740
740 - return strbuf_detach(fingerprint[1], NULL);
741 + fingerprint_ret = strbuf_detach(fingerprint[1], NULL);
742 + strbuf_list_free(fingerprint);
743 + strbuf_release(&fingerprint_stdout);
744 + return fingerprint_ret;
745 }
746
747 /* Returns the first public key from an ssh-agent to use for signing */