From 96ee7f1650e6096561599f069d18c052412d7506 Mon Sep 17 00:00:00 2001 From: LorenzoPegorari Date: Mon, 1 Jun 2026 15:52:01 +0200 Subject: [PATCH 1/2] http: cleanup function fetch_and_setup_pack_index() Cleanup the function `fetch_and_setup_pack_index()` by removing the useless call to the function `unlink()`. This is not necessary anymore since 63aca3f7f1 (dumb-http: store downloaded pack idx as tempfile, 2024-10-25), when `fetch_pack_index()` started registering its return value (in this case `tmp_idx`) as a tempfile to be deleted at process exit. Signed-off-by: LorenzoPegorari Signed-off-by: Junio C Hamano --- http.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/http.c b/http.c index ea9b16861b..55dd856a27 100644 --- a/http.c +++ b/http.c @@ -2609,9 +2609,7 @@ static int fetch_and_setup_pack_index(struct packfile_list *packs, new_pack = parse_pack_index(the_repository, sha1, tmp_idx); if (!new_pack) { - unlink(tmp_idx); free(tmp_idx); - return -1; /* parse_pack_index() already issued error message */ } From 18decad922884a69ea39c0332f7a94ce82cf99cc Mon Sep 17 00:00:00 2001 From: LorenzoPegorari Date: Mon, 1 Jun 2026 15:52:12 +0200 Subject: [PATCH 2/2] http: fix memory leak in fetch_and_setup_pack_index() Inside the function `fetch_and_setup_pack_index()`, when the pack obtained using `parse_pack_index()` fails to be verified by `verify_pack_index()`, the function returns without closing and freeing said pack. Fix this by calling `close_pack_index()` to munmap the index file for the leaking pack (which might have been mmapped by `fetch_pack_index()` or `verify_pack_index()`), and then free it, when the verification fails. Signed-off-by: LorenzoPegorari Signed-off-by: Junio C Hamano --- http.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/http.c b/http.c index 55dd856a27..d50a34e446 100644 --- a/http.c +++ b/http.c @@ -2614,11 +2614,13 @@ static int fetch_and_setup_pack_index(struct packfile_list *packs, } ret = verify_pack_index(new_pack); - if (!ret) - close_pack_index(new_pack); + + close_pack_index(new_pack); free(tmp_idx); - if (ret) + if (ret) { + free(new_pack); return -1; + } packfile_list_prepend(packs, new_pack); return 0;