From cca27e95cf2bf057b2bbea93702135da3ca7be45 Mon Sep 17 00:00:00 2001 From: Mark Adler Date: Sat, 31 Dec 2016 10:03:09 -0800 Subject: Avoid the need for ssize_t. Limit read() and write() requests to sizes that fit in an int. This allows storing the return value in an int, and avoiding the need to use or construct an ssize_t type. This is required for Microsoft C, whose _read and _write functions take an unsigned request and return an int. --- gzwrite.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'gzwrite.c') diff --git a/gzwrite.c b/gzwrite.c index c29308b..b866251 100644 --- a/gzwrite.c +++ b/gzwrite.c @@ -74,9 +74,8 @@ local int gz_comp(state, flush) gz_statep state; int flush; { - int ret; - z_ssize_t got; - unsigned have; + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); /* allocate memory if this is the first time through */ @@ -86,13 +85,14 @@ local int gz_comp(state, flush) /* write directly if requested */ if (state->direct) { while (strm->avail_in) { - got = write(state->fd, strm->next_in, strm->avail_in); - if (got < 0) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } - strm->avail_in -= (unsigned)got; - strm->next_in += got; + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; } return 0; } @@ -105,13 +105,14 @@ local int gz_comp(state, flush) if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { while (strm->next_out > state->x.next) { - got = write(state->fd, state->x.next, - (unsigned long)(strm->next_out - state->x.next)); - if (got < 0) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } - state->x.next += got; + state->x.next += writ; } if (strm->avail_out == 0) { strm->avail_out = state->size; -- cgit v1.2.3-55-g6feb