sub-process: do not borrow cmd pointer from caller

Teach subprocess_start() to use a copy of the passed `cmd` string
rather than borrowing the buffer from the caller.

Some callers of subprocess_start() pass the value returned from
find_hook() which points to a static buffer and therefore is only
good until the next call to find_hook().  This could cause problems
for the long-running background processes managed by sub-process.c
where later calls to subprocess_find_entry() to get an existing
process will fail.  This could cause more than 1 long-running
process to be created.

TODO Need to confirm, but if only read_object_hook() uses
TODO subprocess_start() in this manner, we could drop this
TODO commit when we drop support for read_object_hook().

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
This commit is contained in:
Jeff Hostetler 2019-09-18 10:35:45 -04:00 коммит произвёл Johannes Schindelin
Родитель b48ff407ee
Коммит b478675027
1 изменённых файлов: 8 добавлений и 1 удалений

Просмотреть файл

@ -80,7 +80,12 @@ int subprocess_start(struct hashmap *hashmap, struct subprocess_entry *entry, co
int err;
struct child_process *process;
entry->cmd = cmd;
// BUGBUG most callers to subprocess_start() pass in "cmd" the value
// BUGBUG of find_hook() which returns a static buffer (that's only
// BUGBUG good until the next call to find_hook()).
// BUGFIX Defer assignment until we copy the string in our argv.
// entry->cmd = cmd;
process = &entry->process;
child_process_init(process);
@ -92,6 +97,8 @@ int subprocess_start(struct hashmap *hashmap, struct subprocess_entry *entry, co
process->clean_on_exit_handler = subprocess_exit_handler;
process->trace2_child_class = "subprocess";
entry->cmd = process->args.v[0];
err = start_command(process);
if (err) {
error("cannot fork to run subprocess '%s'", cmd);