Don't leak file descriptors from unavailable pack files.
[gitweb.git] / sha1_file.c
index 2eff14ac87e3596194733086b94342a3112e2eee..45e410e8833024f471f9e2b3972963961de2bbba 100644 (file)
@@ -552,7 +552,11 @@ void unuse_pack(struct pack_window **w_cursor)
        }
 }
 
-static int open_packed_git(struct packed_git *p)
+/*
+ * Do not call this directly as this leaks p->pack_fd on error return;
+ * call open_packed_git() instead.
+ */
+static int open_packed_git_1(struct packed_git *p)
 {
        struct stat st;
        struct pack_header hdr;
@@ -608,6 +612,17 @@ static int open_packed_git(struct packed_git *p)
        return 0;
 }
 
+static int open_packed_git(struct packed_git *p)
+{
+       if (!open_packed_git_1(p))
+               return 0;
+       if (p->pack_fd != -1) {
+               close(p->pack_fd);
+               p->pack_fd = -1;
+       }
+       return -1;
+}
+
 static int in_window(struct pack_window *win, unsigned long offset)
 {
        /* We must promise at least 20 bytes (one hash) after the