Commit c94eb4aa by Ramsay Jones Committed by Shawn O. Pearce

Fix a potential memory leak

In particular, neglecting to call inflateEnd() along various
codepaths in the inflate_tail() routine, would result in the
failure to release zlib internal state.

Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
parent 357bf823
...@@ -341,8 +341,10 @@ static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr) ...@@ -341,8 +341,10 @@ static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr)
* initial sequence of inflated data from the tail of the * initial sequence of inflated data from the tail of the
* head buffer, if any. * head buffer, if any.
*/ */
if ((buf = git__malloc(hdr->size + 1)) == NULL) if ((buf = git__malloc(hdr->size + 1)) == NULL) {
inflateEnd(s);
return NULL; return NULL;
}
tail = s->total_out - used; tail = s->total_out - used;
if (used > 0 && tail > 0) { if (used > 0 && tail > 0) {
if (tail > hdr->size) if (tail > hdr->size)
...@@ -354,7 +356,9 @@ static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr) ...@@ -354,7 +356,9 @@ static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr)
/* /*
* inflate the remainder of the object data, if any * inflate the remainder of the object data, if any
*/ */
if (hdr->size >= used) { if (hdr->size < used)
inflateEnd(s);
else {
set_stream_output(s, buf + used, hdr->size - used); set_stream_output(s, buf + used, hdr->size - used);
if (finish_inflate(s)) { if (finish_inflate(s)) {
free(buf); free(buf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment