]> git.ipfire.org Git - thirdparty/git.git/commitdiff
load_one_loose_object_map(): fix resource leak
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Sun, 5 Jul 2026 08:24:18 +0000 (08:24 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 5 Jul 2026 16:12:09 +0000 (09:12 -0700)
Pointed out by Coverity.

While at it, reduce near-duplicate clean-up code at the end of the
function.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
loose.c

diff --git a/loose.c b/loose.c
index 0b626c1b85464209cc7b2be796ab8c8b012ac997..940a9e0dfee879dd66ee54ef5abcd282c0a76d9a 100644 (file)
--- a/loose.c
+++ b/loose.c
@@ -65,6 +65,7 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
 {
        struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
        FILE *fp;
+       int ret = -1;
 
        if (!loose->map)
                loose_object_map_init(&loose->map);
@@ -84,7 +85,6 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
                return 0;
        }
 
-       errno = 0;
        if (strbuf_getwholeline(&buf, fp, '\n') || strcmp(buf.buf, loose_object_header))
                goto err;
        while (!strbuf_getline_lf(&buf, fp)) {
@@ -98,13 +98,12 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
                insert_loose_map(loose, &oid, &compat_oid);
        }
 
-       strbuf_release(&buf);
-       strbuf_release(&path);
-       return errno ? -1 : 0;
+       ret = ferror(fp) ? -1 : 0;
 err:
+       fclose(fp);
        strbuf_release(&buf);
        strbuf_release(&path);
-       return -1;
+       return ret;
 }
 
 int repo_read_loose_object_map(struct repository *repo)