commit: fix leaking parents when calling commit_tree_extended()
When creating commits via `commit_tree_extended()`, the caller passes in a string list of parents. This call implicitly transfers ownership of that list to the function, which is quite surprising to begin with. But to make matters worse, `commit_tree_extended()` doesn't even bother to free the list of parents in error cases. The result is a memory leak, and one that the caller cannot fix by themselves because they do not know whether parts of the string list have already been released. Refactor the code such that callers can keep ownership of the list of parents, which is getting indicated by parameter being a constant pointer now. Free the lists at the calling site and add a common exit path to those sites as required. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
c6eb58bfb1
commit
63c9bd372e
@ -111,6 +111,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
|
||||
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
|
||||
OPT_END()
|
||||
};
|
||||
int ret;
|
||||
|
||||
git_config(git_default_config, NULL);
|
||||
|
||||
@ -132,11 +133,15 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (commit_tree(buffer.buf, buffer.len, &tree_oid, parents, &commit_oid,
|
||||
NULL, sign_commit)) {
|
||||
strbuf_release(&buffer);
|
||||
return 1;
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
printf("%s\n", oid_to_hex(&commit_oid));
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
free_commit_list(parents);
|
||||
strbuf_release(&buffer);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user