diff: fix textconv error zombies
To make the code simpler, run_textconv lumps all of its error checking into one conditional. However, the short-circuit means that an error in reading will prevent us from calling finish_command, leaving a zombie child. Clean up properly after errors. Based-on-work-by: Jeff King <peff@peff.net> Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
657ab61efa
commit
da1fbed3ff
17
diff.c
17
diff.c
@ -3865,6 +3865,7 @@ static char *run_textconv(const char *pgm, struct diff_filespec *spec,
|
|||||||
const char **arg = argv;
|
const char **arg = argv;
|
||||||
struct child_process child;
|
struct child_process child;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
temp = prepare_temp_file(spec->path, spec);
|
temp = prepare_temp_file(spec->path, spec);
|
||||||
*arg++ = pgm;
|
*arg++ = pgm;
|
||||||
@ -3875,16 +3876,20 @@ static char *run_textconv(const char *pgm, struct diff_filespec *spec,
|
|||||||
child.use_shell = 1;
|
child.use_shell = 1;
|
||||||
child.argv = argv;
|
child.argv = argv;
|
||||||
child.out = -1;
|
child.out = -1;
|
||||||
if (start_command(&child) != 0 ||
|
if (start_command(&child)) {
|
||||||
strbuf_read(&buf, child.out, 0) < 0 ||
|
|
||||||
finish_command(&child) != 0) {
|
|
||||||
close(child.out);
|
|
||||||
strbuf_release(&buf);
|
|
||||||
remove_tempfile();
|
remove_tempfile();
|
||||||
error("error running textconv command '%s'", pgm);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strbuf_read(&buf, child.out, 0) < 0)
|
||||||
|
err = error("error reading from textconv command '%s'", pgm);
|
||||||
close(child.out);
|
close(child.out);
|
||||||
|
|
||||||
|
if (finish_command(&child) || err) {
|
||||||
|
strbuf_release(&buf);
|
||||||
|
remove_tempfile();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
remove_tempfile();
|
remove_tempfile();
|
||||||
|
|
||||||
return strbuf_detach(&buf, outsize);
|
return strbuf_detach(&buf, outsize);
|
||||||
|
Loading…
Reference in New Issue
Block a user