Browse Source

[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>
maint
Sergey Vlasov 20 years ago committed by Junio C Hamano
parent
commit
bfc66daf5c
  1. 14
      sha1_file.c

14
sha1_file.c

@ -1297,8 +1297,11 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) @@ -1297,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;
@ -1314,7 +1317,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) @@ -1314,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;
@ -1332,6 +1335,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) @@ -1332,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;
}
@ -1348,6 +1352,12 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) @@ -1348,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;
}


Loading…
Cancel
Save