Skip to content

Commit

Permalink
trailer: use capture_command
Browse files Browse the repository at this point in the history
When we read from a trailer.*.command sub-program, the
current code uses run_command followed by a pipe read, which
can result in deadlock (though in practice you would have to
have a large trailer for this to be a problem). The current
code also leaks the file descriptor for the pipe to the
sub-command.

Instead, let's use capture_command, which makes this simpler
(and we can get rid of our custom helper).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Mar 23, 2015
1 parent 1d4974c commit c5eadca
Showing 1 changed file with 5 additions and 13 deletions.
18 changes: 5 additions & 13 deletions trailer.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,16 +214,6 @@ static struct trailer_item *remove_first(struct trailer_item **first)
return item;
}

static int read_from_command(struct child_process *cp, struct strbuf *buf)
{
if (run_command(cp))
return error("running trailer command '%s' failed", cp->argv[0]);
if (strbuf_read(buf, cp->out, 1024) < 1)
return error("reading from trailer command '%s' failed", cp->argv[0]);
strbuf_trim(buf);
return 0;
}

static const char *apply_command(const char *command, const char *arg)
{
struct strbuf cmd = STRBUF_INIT;
Expand All @@ -240,14 +230,16 @@ static const char *apply_command(const char *command, const char *arg)
cp.argv = argv;
cp.env = local_repo_env;
cp.no_stdin = 1;
cp.out = -1;
cp.use_shell = 1;

if (read_from_command(&cp, &buf)) {
if (capture_command(&cp, &buf, 1024)) {
error("running trailer command '%s' failed", cmd.buf);
strbuf_release(&buf);
result = xstrdup("");
} else
} else {
strbuf_trim(&buf);
result = strbuf_detach(&buf, NULL);
}

strbuf_release(&cmd);
return result;
Expand Down

0 comments on commit c5eadca

Please sign in to comment.