Signed-off-by: Rene Scharfe <l.s.r@xxxxxx> --- convert.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/convert.c b/convert.c index c5f0b21037..4a0ed8d3cb 100644 --- a/convert.c +++ b/convert.c @@ -393,63 +393,65 @@ struct filter_params { static int filter_buffer_or_fd(int in, int out, void *data) { /* * Spawn cmd and feed the buffer contents through its stdin. */ struct child_process child_process = CHILD_PROCESS_INIT; struct filter_params *params = (struct filter_params *)data; int write_err, status; const char *argv[] = { NULL, NULL }; /* apply % substitution to cmd */ struct strbuf cmd = STRBUF_INIT; struct strbuf path = STRBUF_INIT; struct strbuf_expand_dict_entry dict[] = { { "f", NULL, }, { NULL, NULL, }, }; /* quote the path to preserve spaces, etc. */ sq_quote_buf(&path, params->path); dict[0].value = path.buf; /* expand all %f with the quoted path */ strbuf_expand(&cmd, params->cmd, strbuf_expand_dict_cb, &dict); strbuf_release(&path); argv[0] = cmd.buf; child_process.argv = argv; child_process.use_shell = 1; child_process.in = -1; child_process.out = out; - if (start_command(&child_process)) + if (start_command(&child_process)) { + strbuf_release(&cmd); return error("cannot fork to run external filter '%s'", params->cmd); + } sigchain_push(SIGPIPE, SIG_IGN); if (params->src) { write_err = (write_in_full(child_process.in, params->src, params->size) < 0); if (errno == EPIPE) write_err = 0; } else { write_err = copy_fd(params->fd, child_process.in); if (write_err == COPY_WRITE_ERROR && errno == EPIPE) write_err = 0; } if (close(child_process.in)) write_err = 1; if (write_err) error("cannot feed the input to external filter '%s'", params->cmd); sigchain_pop(SIGPIPE); status = finish_command(&child_process); if (status) error("external filter '%s' failed %d", params->cmd, status); strbuf_release(&cmd); return (write_err || status); } -- 2.14.1