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
This commit is contained in:
commit
01a30a5a58
15
packfile.c
15
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;
|
||||
|
@ -49,6 +49,13 @@ test_expect_success 'do partial clone 1' '
|
||||
test "$(git -C pc1 config --local remote.origin.partialclonefilter)" = "blob:none"
|
||||
'
|
||||
|
||||
test_expect_success 'rev-list --missing=allow-promisor on partial clone' '
|
||||
git -C pc1 rev-list --objects --missing=allow-promisor HEAD >actual &&
|
||||
git -C pc1 rev-list --objects --missing=print HEAD >expect.raw &&
|
||||
grep -v "^?" expect.raw >expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'verify that .promisor file contains refs fetched' '
|
||||
ls pc1/.git/objects/pack/pack-*.promisor >promisorlist &&
|
||||
test_line_count = 1 promisorlist &&
|
||||
|
Loading…
Reference in New Issue
Block a user