]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsck: do not reuse child_process structs
authorJeff King <peff@peff.net>
Mon, 12 Nov 2018 14:46:54 +0000 (09:46 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 05:22:02 +0000 (14:22 +0900)
The run-command API makes no promises about what is left in a struct
child_process after a command finishes, and it's not safe to simply
reuse it again for a similar command. In particular:

 - if you use child->args or child->env_array, they are cleared after
   finish_command()

 - likewise, start_command() may point child->argv at child->args->argv;
   reusing that would lead to accessing freed memory

 - the in/out/err may hold pipe descriptors from the previous run

These two calls are _probably_ OK because they do not use any of those
features. But it's only by chance, and may break in the future; let's
reinitialize our struct for each program we run.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fsck.c

index 06eb42172099a39e6f181d0dd7eab581595d9756..b10f2b154c4cc721abc23270d86ce0d62d3dbea1 100644 (file)
@@ -841,6 +841,9 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 
                prepare_alt_odb(the_repository);
                for (alt =  the_repository->objects->alt_odb_list; alt; alt = alt->next) {
+                       child_process_init(&commit_graph_verify);
+                       commit_graph_verify.argv = verify_argv;
+                       commit_graph_verify.git_cmd = 1;
                        verify_argv[2] = "--object-dir";
                        verify_argv[3] = alt->path;
                        if (run_command(&commit_graph_verify))
@@ -859,6 +862,9 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 
                prepare_alt_odb(the_repository);
                for (alt =  the_repository->objects->alt_odb_list; alt; alt = alt->next) {
+                       child_process_init(&midx_verify);
+                       midx_verify.argv = midx_argv;
+                       midx_verify.git_cmd = 1;
                        midx_argv[2] = "--object-dir";
                        midx_argv[3] = alt->path;
                        if (run_command(&midx_verify))