git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Wincent Colaiuta <win@wincent.com>
Cc: git@vger.kernel.org
Subject: [PATCH 0/7] introduce strbuf_read_cmd to avoid deadlocks
Date: Sun, 22 Mar 2015 05:59:25 -0400	[thread overview]
Message-ID: <20150322095924.GA24651@peff.net> (raw)
In-Reply-To: <20150322074455.GA1303@peff.net>

On Sun, Mar 22, 2015 at 03:44:55AM -0400, Jeff King wrote:

> diff --git a/wt-status.c b/wt-status.c
> index 7036fa2..96f0033 100644
> --- a/wt-status.c
> +++ b/wt-status.c
> @@ -748,9 +748,9 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
>  	fflush(s->fp);
>  	sm_summary.out = -1;
>  
> -	run_command(&sm_summary);
> -
> +	start_command(&sm_summary);
>  	len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);
> +	finish_command(&sm_summary);

This isn't quite right. In both the original and the new one, if
start_command fails, we may call strbuf_read on whatever it happens to
have left in sm_summary.out. Worse, in the new one, we would call
finish_command on something that was never started.  And in both old and
new, we leak the sm_summary.out descriptor.

Furthermore, I found two other potential deadlocks (and one more
descriptor leak). I tried at first to fix them all up like I did with
the above patch, but I found that I was introducing similar problems in
each case. So instead, I pulled this pattern out into its own strbuf
helper.

So here's a replacement series.

  [1/7]: wt-status: don't flush before running "submodule status"
  [2/7]: wt_status: fix signedness mismatch in strbuf_read call
  [3/7]: strbuf: introduce strbuf_read_cmd helper
  [4/7]: wt-status: use strbuf_read_cmd
  [5/7]: submodule: use strbuf_read_cmd
  [6/7]: trailer: use strbuf_read_cmd
  [7/7]: run-command: forbid using run_command with piped output

-Peff

  parent reply	other threads:[~2015-03-22  9:59 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-22  5:56 status hangs trying to get submodule summary Wincent Colaiuta
2015-03-22  7:44 ` [PATCH] status: read submodule process output before calling wait() Jeff King
2015-03-22  8:07   ` Jeff King
2015-03-22  9:59   ` Jeff King [this message]
2015-03-22 10:00     ` [PATCH 1/7] wt-status: don't flush before running "submodule status" Jeff King
2015-03-22 10:00     ` [PATCH 2/7] wt_status: fix signedness mismatch in strbuf_read call Jeff King
2015-03-22 10:07     ` [PATCH 3/7] strbuf: introduce strbuf_read_cmd helper Jeff King
2015-03-22 19:36       ` Eric Sunshine
2015-03-22 22:54         ` Junio C Hamano
2015-03-22 23:40           ` Junio C Hamano
2015-03-23  3:53             ` [PATCH v2 0/7] introduce capture_command to avoid deadlocks Jeff King
2015-03-23  3:53               ` [PATCH v2 1/7] wt-status: don't flush before running "submodule status" Jeff King
2015-03-23  3:53               ` [PATCH v2 2/7] wt_status: fix signedness mismatch in strbuf_read call Jeff King
2015-03-23  3:53               ` [PATCH v2 3/7] run-command: introduce capture_command helper Jeff King
2015-03-23  3:53               ` [PATCH v2 4/7] wt-status: use capture_command Jeff King
2015-03-23  3:53               ` [PATCH v2 5/7] submodule: " Jeff King
2015-03-23  3:54               ` [PATCH v2 6/7] trailer: " Jeff King
2015-03-23  3:54               ` [PATCH v2 7/7] run-command: forbid using run_command with piped output Jeff King
2015-03-23  4:40               ` [PATCH v2 0/7] introduce capture_command to avoid deadlocks Junio C Hamano
2015-03-22 23:34         ` [PATCH 3/7] strbuf: introduce strbuf_read_cmd helper Jeff King
2015-03-22 23:22       ` Junio C Hamano
2015-03-22 23:36         ` Jeff King
2015-03-22 10:08     ` [PATCH 4/7] wt-status: use strbuf_read_cmd Jeff King
2015-03-22 10:08     ` [PATCH 5/7] submodule: " Jeff King
2015-03-22 10:09     ` [PATCH 6/7] trailer: " Jeff King
2015-03-22 10:10     ` [PATCH 7/7] run-command: forbid using run_command with piped output Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150322095924.GA24651@peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=win@wincent.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).