X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=sha1_file.c;h=8d189d4919f83c243c306973285cefb5b55e2f19;hb=b8c20680c863379a7089091a4f1cd6ece20fd9e6;hp=a17a6d13b27630aec40a5e7ee48a7b2d1874d05a;hpb=3f81fc82743ccd4fd7157f1f1db41605eb018fb9;p=git.git diff --git a/sha1_file.c b/sha1_file.c index a17a6d13..8d189d49 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1165,6 +1165,7 @@ void *read_object_with_reference(const unsigned char *sha1, free(buffer); return NULL; } + free(buffer); /* Now we have the ID of the referred-to object in * actual_sha1. Check again. */ } @@ -1296,8 +1297,11 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) 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; @@ -1313,7 +1317,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) 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; @@ -1331,6 +1335,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) while (deflate(&stream, Z_FINISH) == Z_OK) /* nothing */; deflateEnd(&stream); + free(unpacked); objsize = stream.total_out; } @@ -1347,6 +1352,12 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) } posn += size; } while (posn < objsize); + + if (map) + munmap(map, objsize); + if (temp_obj) + free(temp_obj); + return 0; } @@ -1377,7 +1388,7 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer, ssize_t size; if (*bufposn) { stream.avail_in = *bufposn; - stream.next_in = buffer; + stream.next_in = (unsigned char *) buffer; do { stream.next_out = discard; stream.avail_out = sizeof(discard);