summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2019-04-13 17:05:16 -0700
committerMark Adler <madler@alumni.caltech.edu>2019-04-13 17:08:50 -0700
commit79baebe50e4d6b73ae1f8b603f0ef41300110aa3 (patch)
treece453518c642755fafd819d8e36ba0b79ceff069
parent0e96d8e7c7079ab9f07cc7b57ae3ca9de8c80742 (diff)
downloadzlib-79baebe50e4d6b73ae1f8b603f0ef41300110aa3.tar.gz
zlib-79baebe50e4d6b73ae1f8b603f0ef41300110aa3.tar.bz2
zlib-79baebe50e4d6b73ae1f8b603f0ef41300110aa3.zip
Avoid adding empty gzip member after gzflush with Z_FINISH.
-rw-r--r--gzguts.h1
-rw-r--r--gzlib.c2
-rw-r--r--gzwrite.c11
3 files changed, 13 insertions, 1 deletions
diff --git a/gzguts.h b/gzguts.h
index 6378d46..fc712dc 100644
--- a/gzguts.h
+++ b/gzguts.h
@@ -190,6 +190,7 @@ typedef struct {
190 /* just for writing */ 190 /* just for writing */
191 int level; /* compression level */ 191 int level; /* compression level */
192 int strategy; /* compression strategy */ 192 int strategy; /* compression strategy */
193 int reset; /* true if a reset is pending after a Z_FINISH */
193 /* seek request */ 194 /* seek request */
194 z_off64_t skip; /* amount to skip (already rewound if backwards) */ 195 z_off64_t skip; /* amount to skip (already rewound if backwards) */
195 int seek; /* true if seek request pending */ 196 int seek; /* true if seek request pending */
diff --git a/gzlib.c b/gzlib.c
index 4838bf0..f6b3b40 100644
--- a/gzlib.c
+++ b/gzlib.c
@@ -81,6 +81,8 @@ local void gz_reset(state)
81 state->past = 0; /* have not read past end yet */ 81 state->past = 0; /* have not read past end yet */
82 state->how = LOOK; /* look for gzip header */ 82 state->how = LOOK; /* look for gzip header */
83 } 83 }
84 else /* for writing ... */
85 state->reset = 0; /* no deflateReset pending */
84 state->seek = 0; /* no seek request pending */ 86 state->seek = 0; /* no seek request pending */
85 gz_error(state, Z_OK, NULL); /* clear error */ 87 gz_error(state, Z_OK, NULL); /* clear error */
86 state->x.pos = 0; /* no uncompressed data yet */ 88 state->x.pos = 0; /* no uncompressed data yet */
diff --git a/gzwrite.c b/gzwrite.c
index 5238133..85b576b 100644
--- a/gzwrite.c
+++ b/gzwrite.c
@@ -97,6 +97,15 @@ local int gz_comp(state, flush)
97 return 0; 97 return 0;
98 } 98 }
99 99
100 /* check for a pending reset */
101 if (state->reset) {
102 /* don't start a new gzip member unless there is data to write */
103 if (strm->avail_in == 0)
104 return 0;
105 deflateReset(strm);
106 state->reset = 0;
107 }
108
100 /* run deflate() on provided input until it produces no more output */ 109 /* run deflate() on provided input until it produces no more output */
101 ret = Z_OK; 110 ret = Z_OK;
102 do { 111 do {
@@ -134,7 +143,7 @@ local int gz_comp(state, flush)
134 143
135 /* if that completed a deflate stream, allow another to start */ 144 /* if that completed a deflate stream, allow another to start */
136 if (flush == Z_FINISH) 145 if (flush == Z_FINISH)
137 deflateReset(strm); 146 state->reset = 1;
138 147
139 /* all done, no errors */ 148 /* all done, no errors */
140 return 0; 149 return 0;