summaryrefslogtreecommitdiff
path: root/gzwrite.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2012-10-01 22:42:35 -0700
committerMark Adler <madler@alumni.caltech.edu>2012-10-01 22:52:16 -0700
commitc4888637eaee189c0e21259cb87ab7e5e1d4ce76 (patch)
tree8a07d3885317a18a6411d907bdddcbd3a96b5039 /gzwrite.c
parent0cf495a1ca941428c0b11e2307cad760ae44993e (diff)
downloadzlib-c4888637eaee189c0e21259cb87ab7e5e1d4ce76.tar.gz
Fix bug in gzclose() when gzwrite() runs out of memory.
If the deflateInit2() called for the first gzwrite() failed with a Z_MEM_ERROR, then a subsequent gzclose() would try to free an already freed pointer. This fixes that.
Diffstat (limited to 'gzwrite.c')
-rw-r--r--gzwrite.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/gzwrite.c b/gzwrite.c
index 79a69a5..1b06cdd 100644
--- a/gzwrite.c
+++ b/gzwrite.c
@@ -556,12 +556,13 @@ int ZEXPORT gzclose_w(file)
/* flush, free memory, and close file */
if (gz_comp(state, Z_FINISH) == -1)
ret = state->err;
- if (!state->direct) {
- (void)deflateEnd(&(state->strm));
- free(state->out);
- }
- if (state->size)
+ if (state->size) {
+ if (!state->direct) {
+ (void)deflateEnd(&(state->strm));
+ free(state->out);
+ }
free(state->in);
+ }
gz_error(state, Z_OK, NULL);
free(state->path);
if (close(state->fd) == -1)