Skip to content

Commit 0921da1

Browse files
peffgitster
authored andcommitted
check_connected(): fix leak of pack-index mmap
Since c6807a4 (clone: open a shortcut for connectivity check, 2013-05-26), we may open a one-off packed_git struct to check what's in the pack we just received. At the end of the function we throw away the struct (rather than linking it into the repository struct as usual). We used to leak the struct until dd4143e (connected.c: free the "struct packed_git", 2022-11-08), which calls free(). But that's not sufficient; inside the struct we'll have mmap'd the pack idx data from disk, which needs an munmap() call. Building with SANITIZE=leak doesn't detect this, because we are leaking our own mmap(), and it only finds heap allocations from malloc(). But if we use our compat mmap implementation like this: make NO_MMAP=MapsBecomeMallocs SANITIZE=leak then LSan will notice the leak, because now it's a regular heap buffer allocated by malloc(). We can fix it by calling close_pack(), which will free any associated memory. Note that we need to check for NULL ourselves; unlike free(), it is not safe to pass a NULL pointer to close_pack(). Signed-off-by: Jeff King <peff@peff.net> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 26b974b commit 0921da1

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

connected.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
159159
err = error_errno(_("failed to close rev-list's stdin"));
160160

161161
sigchain_pop(SIGPIPE);
162-
free(new_pack);
162+
if (new_pack) {
163+
close_pack(new_pack);
164+
free(new_pack);
165+
}
163166
return finish_command(&rev_list) || err;
164167
}

0 commit comments

Comments
 (0)