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 buffermaint
						commit
						72869e750b
					
				
							
								
								
									
										15
									
								
								packfile.c
								
								
								
								
							
							
						
						
									
										15
									
								
								packfile.c
								
								
								
								
							|  | @ -2229,7 +2229,17 @@ static int add_promisor_object(const struct object_id *oid, | ||||||
| 			       void *set_) | 			       void *set_) | ||||||
| { | { | ||||||
| 	struct oidset *set = 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) | 	if (!obj) | ||||||
| 		return 1; | 		return 1; | ||||||
|  |  | ||||||
|  | @ -2251,7 +2261,8 @@ static int add_promisor_object(const struct object_id *oid, | ||||||
| 			return 0; | 			return 0; | ||||||
| 		while (tree_entry_gently(&desc, &entry)) | 		while (tree_entry_gently(&desc, &entry)) | ||||||
| 			oidset_insert(set, &entry.oid); | 			oidset_insert(set, &entry.oid); | ||||||
| 		free_tree_buffer(tree); | 		if (we_parsed_object) | ||||||
|  | 			free_tree_buffer(tree); | ||||||
| 	} else if (obj->type == OBJ_COMMIT) { | 	} else if (obj->type == OBJ_COMMIT) { | ||||||
| 		struct commit *commit = (struct commit *) obj; | 		struct commit *commit = (struct commit *) obj; | ||||||
| 		struct commit_list *parents = commit->parents; | 		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 "$(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' ' | test_expect_success 'verify that .promisor file contains refs fetched' ' | ||||||
| 	ls pc1/.git/objects/pack/pack-*.promisor >promisorlist && | 	ls pc1/.git/objects/pack/pack-*.promisor >promisorlist && | ||||||
| 	test_line_count = 1 promisorlist && | 	test_line_count = 1 promisorlist && | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano