Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2022-08-26 00:42:31 +0300
committerJunio C Hamano <gitster@pobox.com>2022-08-26 00:42:31 +0300
commit01a30a5a58053ce74a551a42d9edb2cf4f95632b (patch)
tree2e0b0f23f952a50c74d36f55934824768fdf71bf /packfile.c
parentdf3c129e246dda2b43adcd7661d5aff42bbcf2e2 (diff)
parent1490d7d82d5bd504b095c4db030a98b8080c596a (diff)
Merge branch 'jk/is-promisor-object-keep-tree-in-use'
An earlier optimization discarded a tree-object buffer that is still in use, which has been corrected. * jk/is-promisor-object-keep-tree-in-use: is_promisor_object(): fix use-after-free of tree buffer
Diffstat (limited to 'packfile.c')
-rw-r--r--packfile.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/packfile.c b/packfile.c
index 5ae3ce8ea9..a41887c944 100644
--- a/packfile.c
+++ b/packfile.c
@@ -2217,7 +2217,17 @@ static int add_promisor_object(const struct object_id *oid,
void *set_)
{
struct oidset *set = set_;
- struct object *obj = parse_object(the_repository, oid);
+ struct object *obj;
+ int we_parsed_object;
+
+ obj = lookup_object(the_repository, oid);
+ if (obj && obj->parsed) {
+ we_parsed_object = 0;
+ } else {
+ we_parsed_object = 1;
+ obj = parse_object(the_repository, oid);
+ }
+
if (!obj)
return 1;
@@ -2239,7 +2249,8 @@ static int add_promisor_object(const struct object_id *oid,
return 0;
while (tree_entry_gently(&desc, &entry))
oidset_insert(set, &entry.oid);
- free_tree_buffer(tree);
+ if (we_parsed_object)
+ free_tree_buffer(tree);
} else if (obj->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *) obj;
struct commit_list *parents = commit->parents;