start_command(), .in/.out/.err = -1: Callers must close the file descriptor
By setting .in, .out, or .err members of struct child_process to -1, the callers of start_command() can request that a pipe is allocated that talks to the child process and one end is returned by replacing -1 with the file descriptor. Previously, a flag was set (for .in and .out, but not .err) to signal finish_command() to close the pipe end that start_command() had handed out, so it was optional for callers to close the pipe, and many already do so. Now we make it mandatory to close the pipe. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
923d44aeb7
commit
e72ae28895
@ -538,8 +538,10 @@ static int get_pack(int xd[2], char **pack_lockfile)
|
||||
cmd.git_cmd = 1;
|
||||
if (start_command(&cmd))
|
||||
die("fetch-pack: unable to fork off %s", argv[0]);
|
||||
if (do_keep && pack_lockfile)
|
||||
if (do_keep && pack_lockfile) {
|
||||
*pack_lockfile = index_pack_lockfile(cmd.out);
|
||||
close(cmd.out);
|
||||
}
|
||||
|
||||
if (finish_command(&cmd))
|
||||
die("%s failed", argv[0]);
|
||||
|
@ -71,6 +71,7 @@ static int pack_objects(int fd, struct ref *refs)
|
||||
refs = refs->next;
|
||||
}
|
||||
|
||||
close(po.in);
|
||||
if (finish_command(&po))
|
||||
return error("pack-objects died with strange error");
|
||||
return 0;
|
||||
|
@ -226,12 +226,13 @@ static int do_sign(struct strbuf *buffer)
|
||||
|
||||
if (write_in_full(gpg.in, buffer->buf, buffer->len) != buffer->len) {
|
||||
close(gpg.in);
|
||||
close(gpg.out);
|
||||
finish_command(&gpg);
|
||||
return error("gpg did not accept the tag data");
|
||||
}
|
||||
close(gpg.in);
|
||||
gpg.close_in = 0;
|
||||
len = strbuf_read(buffer, gpg.out, 1024);
|
||||
close(gpg.out);
|
||||
|
||||
if (finish_command(&gpg) || !len || len < 0)
|
||||
return error("gpg failed to sign the tag");
|
||||
|
@ -52,7 +52,6 @@ static int run_gpg_verify(const char *buf, unsigned long size, int verbose)
|
||||
|
||||
write_in_full(gpg.in, buf, len);
|
||||
close(gpg.in);
|
||||
gpg.close_in = 0;
|
||||
ret = finish_command(&gpg);
|
||||
|
||||
unlink(path);
|
||||
|
1
bundle.c
1
bundle.c
@ -333,6 +333,7 @@ int create_bundle(struct bundle_header *header, const char *path,
|
||||
write_or_die(rls.in, sha1_to_hex(object->sha1), 40);
|
||||
write_or_die(rls.in, "\n", 1);
|
||||
}
|
||||
close(rls.in);
|
||||
if (finish_command(&rls))
|
||||
return error ("pack-objects died");
|
||||
|
||||
|
@ -132,6 +132,7 @@ static int run_hook(const char *hook_name)
|
||||
break;
|
||||
}
|
||||
}
|
||||
close(proc.in);
|
||||
return hook_status(finish_command(&proc), hook_name);
|
||||
}
|
||||
|
||||
@ -414,6 +415,7 @@ static const char *unpack(void)
|
||||
if (start_command(&ip))
|
||||
return "index-pack fork failed";
|
||||
pack_lockfile = index_pack_lockfile(ip.out);
|
||||
close(ip.out);
|
||||
status = finish_command(&ip);
|
||||
if (!status) {
|
||||
reprepare_packed_git();
|
||||
|
@ -25,7 +25,6 @@ int start_command(struct child_process *cmd)
|
||||
if (pipe(fdin) < 0)
|
||||
return -ERR_RUN_COMMAND_PIPE;
|
||||
cmd->in = fdin[1];
|
||||
cmd->close_in = 1;
|
||||
}
|
||||
|
||||
need_out = !cmd->no_stdout
|
||||
@ -38,7 +37,6 @@ int start_command(struct child_process *cmd)
|
||||
return -ERR_RUN_COMMAND_PIPE;
|
||||
}
|
||||
cmd->out = fdout[0];
|
||||
cmd->close_out = 1;
|
||||
}
|
||||
|
||||
need_err = !cmd->no_stderr && cmd->err < 0;
|
||||
@ -157,10 +155,6 @@ static int wait_or_whine(pid_t pid)
|
||||
|
||||
int finish_command(struct child_process *cmd)
|
||||
{
|
||||
if (cmd->close_in)
|
||||
close(cmd->in);
|
||||
if (cmd->close_out)
|
||||
close(cmd->out);
|
||||
return wait_or_whine(cmd->pid);
|
||||
}
|
||||
|
||||
|
@ -19,8 +19,6 @@ struct child_process {
|
||||
int err;
|
||||
const char *dir;
|
||||
const char *const *env;
|
||||
unsigned close_in:1;
|
||||
unsigned close_out:1;
|
||||
unsigned no_stdin:1;
|
||||
unsigned no_stdout:1;
|
||||
unsigned no_stderr:1;
|
||||
|
Loading…
Reference in New Issue
Block a user