[PATCH] Plug memory leak in write_sha1_to_fd()

If the object to write was packed, both its uncompressed and compressed
data were leaked.  If the object was not packed, its file was not unmapped.

Signed-off-by: Sergey Vlasov <[EMAIL PROTECTED]>
---

 sha1_file.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

683b9e4bb090c115242392a1f1dc7b1a7c76c4be
diff --git a/sha1_file.c b/sha1_file.c
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1297,8 +1297,11 @@ int write_sha1_to_fd(int fd, const unsig
        ssize_t size;
        unsigned long objsize;
        int posn = 0;
-       void *buf = map_sha1_file_internal(sha1, &objsize);
+       void *map = map_sha1_file_internal(sha1, &objsize);
+       void *buf = map;
+       void *temp_obj = NULL;
        z_stream stream;
+
        if (!buf) {
                unsigned char *unpacked;
                unsigned long len;
@@ -1314,7 +1317,7 @@ int write_sha1_to_fd(int fd, const unsig
                memset(&stream, 0, sizeof(stream));
                deflateInit(&stream, Z_BEST_COMPRESSION);
                size = deflateBound(&stream, len + hdrlen);
-               buf = xmalloc(size);
+               temp_obj = buf = xmalloc(size);
 
                /* Compress it */
                stream.next_out = buf;
@@ -1332,6 +1335,7 @@ int write_sha1_to_fd(int fd, const unsig
                while (deflate(&stream, Z_FINISH) == Z_OK)
                        /* nothing */;
                deflateEnd(&stream);
+               free(unpacked);
                
                objsize = stream.total_out;
        }
@@ -1348,6 +1352,12 @@ int write_sha1_to_fd(int fd, const unsig
                }
                posn += size;
        } while (posn < objsize);
+
+       if (map)
+               munmap(map, objsize);
+       if (temp_obj)
+               free(temp_obj);
+
        return 0;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to