Merge branch 'jk/is-promisor-object-keep-tree-in-use' into maint

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:
Junio C Hamano 2022-09-13 12:21:07 -07:00
Родитель ac8035a2af 1490d7d82d
Коммит 72869e750b
2 изменённых файлов: 20 добавлений и 2 удалений

Просмотреть файл

@ -2229,7 +2229,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;
@ -2251,7 +2261,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 &&