[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. [jc: I think it still leaks on the write error path of write_sha1_to_fd(), but that should be fixable in a small separate patch.] Signed-off-by: Sergey Vlasov <vsu@altlinux.ru> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
1cf58e7222
commit
bfc66daf5c
14
sha1_file.c
14
sha1_file.c
@ -1297,8 +1297,11 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1)
|
|||||||
ssize_t size;
|
ssize_t size;
|
||||||
unsigned long objsize;
|
unsigned long objsize;
|
||||||
int posn = 0;
|
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;
|
z_stream stream;
|
||||||
|
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
unsigned char *unpacked;
|
unsigned char *unpacked;
|
||||||
unsigned long len;
|
unsigned long len;
|
||||||
@ -1314,7 +1317,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1)
|
|||||||
memset(&stream, 0, sizeof(stream));
|
memset(&stream, 0, sizeof(stream));
|
||||||
deflateInit(&stream, Z_BEST_COMPRESSION);
|
deflateInit(&stream, Z_BEST_COMPRESSION);
|
||||||
size = deflateBound(&stream, len + hdrlen);
|
size = deflateBound(&stream, len + hdrlen);
|
||||||
buf = xmalloc(size);
|
temp_obj = buf = xmalloc(size);
|
||||||
|
|
||||||
/* Compress it */
|
/* Compress it */
|
||||||
stream.next_out = buf;
|
stream.next_out = buf;
|
||||||
@ -1332,6 +1335,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1)
|
|||||||
while (deflate(&stream, Z_FINISH) == Z_OK)
|
while (deflate(&stream, Z_FINISH) == Z_OK)
|
||||||
/* nothing */;
|
/* nothing */;
|
||||||
deflateEnd(&stream);
|
deflateEnd(&stream);
|
||||||
|
free(unpacked);
|
||||||
|
|
||||||
objsize = stream.total_out;
|
objsize = stream.total_out;
|
||||||
}
|
}
|
||||||
@ -1348,6 +1352,12 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1)
|
|||||||
}
|
}
|
||||||
posn += size;
|
posn += size;
|
||||||
} while (posn < objsize);
|
} while (posn < objsize);
|
||||||
|
|
||||||
|
if (map)
|
||||||
|
munmap(map, objsize);
|
||||||
|
if (temp_obj)
|
||||||
|
free(temp_obj);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user