git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/3] gpg: Close stderr once finished with it in verify_signed_buffer()

From
Jeff King <peff@peff.net>
Date
Jan 31, 2013, 05:50 UTC
Message-ID
<20130131055053.GA11912@sigill.intra.peff.net>
In-Reply-To
<1359597666-10108-2-git-send-email-sboyd@codeaurora.org>
On Wed, Jan 30, 2013 at 06:01:04PM -0800, Stephen Boyd wrote:
Show 12 quoted lines
> Failing to close the stderr pipe in verify_signed_buffer() causes
> git to run out of file descriptors if there are many calls to
> verify_signed_buffer(). An easy way to trigger this is to run
> 
>  git log --show-signature --merges | grep "key"
> 
> on the linux kernel git repo. Eventually it will fail with
> 
>  error: cannot create pipe for gpg: Too many open files
>  error: could not run gpg.
> 
> Close the stderr pipe so that this can't happen.
I was able to easily reproduce the bug and verify your fix here.
Show 10 quoted lines
> diff --git a/gpg-interface.c b/gpg-interface.c
> index 0863c61..2c0bed3 100644
> --- a/gpg-interface.c
> +++ b/gpg-interface.c
> @@ -133,6 +133,8 @@ int verify_signed_buffer(const char *payload, size_t payload_size,
>  	if (gpg_output)
>  		strbuf_read(gpg_output, gpg.err, 0);
>  	ret = finish_command(&gpg);
> +	if (gpg_output)
> +		close(gpg.err);

The strbuf_read above will read to EOF, so it should be equivalent (and IMHO slightly more readable) to do:

diff --git a/gpg-interface.c b/gpg-interface.c
index 0863c61..5f142f6 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -130,8 +130,10 @@ int verify_signed_buffer(const char *payload, size_t payload_size,
 	write_in_full(gpg.in, payload, payload_size);
 	close(gpg.in);
 
-	if (gpg_output)
+	if (gpg_output) {
 		strbuf_read(gpg_output, gpg.err, 0);
+		close(gpg.err);
+	}
 	ret = finish_command(&gpg);
 
 	unlink_or_warn(path);

But that is a minor nit; either way, the patch looks good to me.

-Peff
Previous: Stephen BoydNext: Stephen Boyd
Message 3 of 13 in “GPG running out of pipes fixes”
  1. 0/3 GPG running out of pipes fixesStephen Boyd, Jan 31, 2013
  2. 1/3 gpg: Close stderr once finished with it in verify_signed_buffer()Stephen Boyd, Jan 31, 2013
  3. Jeff KingJan 31, 2013
  4. Stephen BoydJan 31, 2013
  5. 1/3 gpg: Close stderr once finished with it in verify_signed_buffer()Stephen Boyd, Jan 31, 2013
  6. Jeff KingJan 31, 2013
  7. 2/3 run-command: Be more informative about what failedStephen Boyd, Jan 31, 2013
  8. Junio C HamanoJan 31, 2013
  9. Stephen BoydJan 31, 2013
  10. Jeff KingJan 31, 2013
  11. Junio C HamanoJan 31, 2013
  12. 3/3 gpg: Allow translation of more error messagesStephen Boyd, Jan 31, 2013
  13. Jonathan NiederJan 31, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.