]> git.lizzy.rs Git - zlib.git/commitdiff
Avoid the need for ssize_t.
authorMark Adler <madler@alumni.caltech.edu>
Sat, 31 Dec 2016 18:03:09 +0000 (10:03 -0800)
committerMark Adler <madler@alumni.caltech.edu>
Sat, 31 Dec 2016 18:06:40 +0000 (10:06 -0800)
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.

configure
gzread.c
gzwrite.c
zconf.h
zconf.h.cmakein
zconf.h.in

index e0c07b77743f33c0dfb67d35570363e7ba354249..e974d1fd799fbca5025393bcdfdcb8478067528d 100755 (executable)
--- a/configure
+++ b/configure
@@ -465,23 +465,8 @@ fi
 
 echo >> configure.log
 
-# check for ssize_t
-cat > $test.c <<EOF
-#include <sys/types.h>
-ssize_t dummy = 0;
-EOF
-if try $CC -c $CFLAGS $test.c; then
-  echo "Checking for ssize_t... Yes." | tee -a configure.log
-  need_ssizet=0
-else
-  echo "Checking for ssize_t... No." | tee -a configure.log
-  need_ssizet=1
-fi
-
-echo >> configure.log
-
 # find the size_t integer type, if needed
-if test $need_sizet -eq 1 -o $need_ssizet -eq 1; then
+if test $need_sizet -eq 1; then
   cat > $test.c <<EOF
 long long dummy = 0;
 EOF
@@ -521,11 +506,6 @@ if test $need_sizet -eq 1; then
   SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
 fi
 
-if test $need_ssizet -eq 1; then
-  CFLAGS="${CFLAGS} -DNO_SSIZE_T=${sizet}"
-  SFLAGS="${SFLAGS} -DNO_SSIZE_T=${sizet}"
-fi
-
 echo >> configure.log
 
 # check for large file support, and if none, check for fseeko()
index 38111578a8c228eb398e644d09e32f96a9754bf7..deea79bdb4f674c8a6c32880252253ef100bdc0d 100644 (file)
--- a/gzread.c
+++ b/gzread.c
@@ -24,11 +24,15 @@ local int gz_load(state, buf, len, have)
     unsigned len;
     unsigned *have;
 {
-    z_ssize_t ret;
+    int ret;
+    unsigned get, max = ((unsigned)-1 >> 2) + 1;
 
     *have = 0;
     do {
-        ret = read(state->fd, buf + *have, len - *have);
+        get = len - *have;
+        if (get > max)
+            get = max;
+        ret = read(state->fd, buf + *have, get);
         if (ret <= 0)
             break;
         *have += (unsigned)ret;
index c29308b75f0d5342672b3a999fb848cea09263dd..b86625146162766b67dddf32d698398ae286fca1 100644 (file)
--- 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;
diff --git a/zconf.h b/zconf.h
index f6481d1552b53e9f9a628f64b2f84284c0d13e46..dc7209a2a73a7ebca147642b6f07a7f59384f7a9 100644 (file)
--- a/zconf.h
+++ b/zconf.h
 #    include <stddef.h>
      typedef size_t z_size_t;
 #  endif
-#  ifdef NO_SSIZE_T
-     typedef NO_SSIZE_T z_ssize_t;
-#  else
-#    include <stddef.h>
-#    include <sys/types.h>
-#    ifdef _MSC_VER
-       typedef intptr_t z_ssize_t;
-#    else
-       typedef ssize_t z_ssize_t;
-#    endif
-#  endif
 #  undef z_longlong
 #endif
 
index 843aeb47cabe24bead30f06ef2a46cd1b869fb99..31619f30eca68f180ea8da76906806b1f768385e 100644 (file)
 #    include <stddef.h>
      typedef size_t z_size_t;
 #  endif
-#  ifdef NO_SSIZE_T
-     typedef NO_SSIZE_T z_ssize_t;
-#  else
-#    include <stddef.h>
-#    include <sys/types.h>
-#    ifdef _MSC_VER
-       typedef intptr_t z_ssize_t;
-#    else
-       typedef ssize_t z_ssize_t;
-#    endif
-#  endif
 #  undef z_longlong
 #endif
 
index f6481d1552b53e9f9a628f64b2f84284c0d13e46..dc7209a2a73a7ebca147642b6f07a7f59384f7a9 100644 (file)
 #    include <stddef.h>
      typedef size_t z_size_t;
 #  endif
-#  ifdef NO_SSIZE_T
-     typedef NO_SSIZE_T z_ssize_t;
-#  else
-#    include <stddef.h>
-#    include <sys/types.h>
-#    ifdef _MSC_VER
-       typedef intptr_t z_ssize_t;
-#    else
-       typedef ssize_t z_ssize_t;
-#    endif
-#  endif
 #  undef z_longlong
 #endif