mirror of
https://github.com/git/git.git
synced 2024-11-27 12:03:55 +08:00
object-file: free(*contents) only in read_loose_object() caller
In the preceding commit a free() of uninitialized memory regression in96e41f58fe
(fsck: report invalid object type-path combinations, 2021-10-01) was fixed, but we'd still have an issue with leaking memory from fsck_loose(). Let's fix that issue too. That issue was introduced in my31deb28f5e
(fsck: don't hard die on invalid object types, 2021-10-01). It can be reproduced under SANITIZE=leak with the test I added in093fffdfbe
(fsck tests: add test for fsck-ing an unknown type, 2021-10-01): ./t1450-fsck.sh --run=84 -vixd In some sense it's not a problem, we lost the same amount of memory in terms of things malloc'd and not free'd. It just moved from the "still reachable" to "definitely lost" column in valgrind(1) nomenclature[1], since we'd have die()'d before. But now that we don't hard die() anymore in the library let's properly free() it. Doing so makes this code much easier to follow, since we'll now have one function owning the freeing of the "contents" variable, not two. For context on that memory management pattern the read_loose_object() function was added inf6371f9210
(sha1_file: add read_loose_object() function, 2017-01-13) and subsequently used inc68b489e56
(fsck: parse loose object paths directly, 2017-01-13). The pattern of it being the task of both sides to free() the memory has been there in this form since its inception. 1. https://valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
168a937bbc
commit
16235e3b14
@ -604,7 +604,7 @@ static int fsck_loose(const struct object_id *oid, const char *path, void *data)
|
||||
struct object *obj;
|
||||
enum object_type type = OBJ_NONE;
|
||||
unsigned long size;
|
||||
void *contents;
|
||||
void *contents = NULL;
|
||||
int eaten;
|
||||
struct object_info oi = OBJECT_INFO_INIT;
|
||||
struct object_id real_oid = *null_oid();
|
||||
@ -629,6 +629,7 @@ static int fsck_loose(const struct object_id *oid, const char *path, void *data)
|
||||
path);
|
||||
if (err < 0) {
|
||||
errors_found |= ERROR_OBJECT;
|
||||
free(contents);
|
||||
return 0; /* keep checking other objects */
|
||||
}
|
||||
|
||||
|
@ -2533,8 +2533,6 @@ int read_loose_object(const char *path,
|
||||
char hdr[MAX_HEADER_LEN];
|
||||
unsigned long *size = oi->sizep;
|
||||
|
||||
*contents = NULL;
|
||||
|
||||
map = map_loose_object_1(the_repository, path, NULL, &mapsize);
|
||||
if (!map) {
|
||||
error_errno(_("unable to mmap %s"), path);
|
||||
@ -2564,10 +2562,9 @@ int read_loose_object(const char *path,
|
||||
goto out;
|
||||
}
|
||||
if (check_object_signature(the_repository, expected_oid,
|
||||
*contents, *size, oi->type_name->buf, real_oid)) {
|
||||
free(*contents);
|
||||
*contents, *size,
|
||||
oi->type_name->buf, real_oid))
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0; /* everything checks out */
|
||||
|
Loading…
Reference in New Issue
Block a user