sequencer: fix memory leak if `todo_list_rearrange_squash()` failed

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>
maint
Lidong Yan 2025-05-14 13:53:28 +00:00 committed by Junio C Hamano
parent 1a8a4971cc
commit 044511f889
1 changed files with 5 additions and 3 deletions

View 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)