When prepare_cmd() fails for, e.g., pager process setup,
child_process_clear() frees the memory in pager_process.args, but .argv
still points to the previously location.
When setup_pager() is called a second time, from cmd_log_init_finish()
in this case, its strvec operations (i.e. using pager_process.argv) will
lead to a use-after-free.
This patch makes sure that further uses of the child_process cleared by
child_process_clear() gets a properly initialized struct.
Reproducer:
$ git config pager.show INVALID_PAGER
$ git show $VALID_COMMIT
error: cannot run INVALID_PAGER: No such file or directory
[1] 3619 segmentation fault (core dumped) git show $VALID_COMMIT
Signed-off-by: Enzo Matsumiya <redacted>
Reviewed-by: Jeff King <redacted>
---
Changes to v1:
* Implement all of Jeff's suggestions:
- remove double frees to .argv
- discard the idea of falling back to DEFAULT_PAGER
- replace memset() in child_process_clear() by child_process_init()
- update/improve commit message
run-command.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/run-command.c b/run-command.c
index f329391154ae..a7bf81025afb 100644
--- a/run-command.c
+++ b/run-command.c
@@ -19,6 +19,7 @@ void child_process_clear(struct child_process *child)
{
strvec_clear(&child->args);
strvec_clear(&child->env_array);
+ child_process_init(child);
}
struct child_to_clean {--
2.33.1