]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sequencer: fix memory leak if `todo_list_rearrange_squash()` failed
authorLidong Yan <502024330056@smail.nju.edu.cn>
Wed, 14 May 2025 13:53:28 +0000 (13:53 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 15 May 2025 20:53:33 +0000 (13:53 -0700)
In sequencer.c:todo_list_rearrange_squash, if it fails, memory
allocated in `next`, `tail`, `subjects` and `subject2item` will leak.
Jump to cleanup label before return could fix this leak problem.

Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sequencer.c

index b5c4043757e948aedaad0782dff947373e2f45ea..5fb7b68a7abb087039d741c1cd2ef544df14c06d 100644 (file)
@@ -6596,6 +6596,7 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
        char **subjects;
        struct commit_todo_item commit_todo;
        struct todo_item *items = NULL;
+       int ret = 0;
 
        init_commit_todo_item(&commit_todo);
        /*
@@ -6626,8 +6627,8 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
                }
 
                if (is_fixup(item->command)) {
-                       clear_commit_todo_item(&commit_todo);
-                       return error(_("the script was already rearranged."));
+                       ret = error(_("the script was already rearranged."));
+                       goto cleanup;
                }
 
                repo_parse_commit(the_repository, item->commit);
@@ -6729,6 +6730,7 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
                todo_list->items = items;
        }
 
+cleanup:
        free(next);
        free(tail);
        for (i = 0; i < todo_list->nr; i++)
@@ -6738,7 +6740,7 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
 
        clear_commit_todo_item(&commit_todo);
 
-       return 0;
+       return ret;
 }
 
 int sequencer_determine_whence(struct repository *r, enum commit_whence *whence)