aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2014-04-24 19:45:36 -0400
committerMark Adler <madler@alumni.caltech.edu>2014-04-24 19:45:36 -0400
commit72c70060d8312cff06754779188d8adeb974f18c (patch)
tree09f276cf9d3c3c33ce91fec1807c29b3891010ec
parent799c87c0d8fc5af306f8c7a160dfd3d75746c2ce (diff)
downloadzlib-72c70060d8312cff06754779188d8adeb974f18c.tar.gz
zlib-72c70060d8312cff06754779188d8adeb974f18c.tar.bz2
zlib-72c70060d8312cff06754779188d8adeb974f18c.zip
Assure that gzoffset() is correct when appending.
An open() with O_APPEND followed by an lseek() to determine the position will return zero for a non-empty file, even though the next write will start at the end of the file. This commit works around that by doing an lseek() to the end when appending.
-rw-r--r--gzlib.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gzlib.c b/gzlib.c
index fae202e..ced2cb8 100644
--- a/gzlib.c
+++ b/gzlib.c
@@ -248,8 +248,10 @@ local gzFile gz_open(path, fd, mode)
248 free(state); 248 free(state);
249 return NULL; 249 return NULL;
250 } 250 }
251 if (state->mode == GZ_APPEND) 251 if (state->mode == GZ_APPEND) {
252 LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */
252 state->mode = GZ_WRITE; /* simplify later checks */ 253 state->mode = GZ_WRITE; /* simplify later checks */
254 }
253 255
254 /* save the current position for rewinding (only if reading) */ 256 /* save the current position for rewinding (only if reading) */
255 if (state->mode == GZ_READ) { 257 if (state->mode == GZ_READ) {