The SSIZE_MAX fix didn't work on NSK, so fix it in a more-reliable
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 11 Dec 2006 18:54:39 +0000 (18:54 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 11 Dec 2006 18:54:39 +0000 (18:54 +0000)
(albeit more-complicated) way.  Problem reported by Matthew Woehlke.
* gzip.h (read_buffer): New decl.
* unlzw.c (unlzw): Use read_buffer rather than read.
* zip.c (file_read): Likewise.
* util.c (copy, fill_inbuf): Likewise.
(read_buffer, write_buffer): New functions.
(write_buf): Use write_buffer rather than write.

Undo the previous SSIZE_MAX-related change; it didn't work.
* gzip.c: Include <limits.h>.
* util.c: Likewise.
* gzip.h: Don't include <limits.h>.
(INBUFSIZ): Don't worry about SSIZE_MAX here.

ChangeLog
gzip.c
gzip.h
unlzw.c
util.c
zip.c

index 956ef5a2bbcce885df3412b65b0767c537591d2d..1259454c254ec98873a911607018413e80fea584 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2006-12-11  Paul Eggert  <eggert@cs.ucla.edu>
+
+       The SSIZE_MAX fix didn't work on NSK, so fix it in a more-reliable
+       (albeit more-complicated) way.  Problem reported by Matthew Woehlke.
+       * gzip.h (read_buffer): New decl.
+       * unlzw.c (unlzw): Use read_buffer rather than read.
+       * zip.c (file_read): Likewise.
+       * util.c (copy, fill_inbuf): Likewise.
+       (read_buffer, write_buffer): New functions.
+       (write_buf): Use write_buffer rather than write.
+
+       Undo the previous SSIZE_MAX-related change; it didn't work.
+       * gzip.c: Include <limits.h>.
+       * util.c: Likewise.
+       * gzip.h: Don't include <limits.h>.
+       (INBUFSIZ): Don't worry about SSIZE_MAX here.
+
 2006-12-08  Paul Eggert  <eggert@cs.ucla.edu>
 
        * NEWS, configure.ac (AC_INIT):
diff --git a/gzip.c b/gzip.c
index d1aeb78b517877a569fb4b056e873a33a4a03c4a..96bbccdb859970eea4fcdf28cd3ef479d6ee6c39 100644 (file)
--- a/gzip.c
+++ b/gzip.c
@@ -85,6 +85,10 @@ static char rcsid[] = "$Id$";
 #  include <fcntl.h>
 #endif
 
+#ifdef HAVE_LIMITS_H
+#  include <limits.h>
+#endif
+
 #ifdef HAVE_UNISTD_H
 #  include <unistd.h>
 #endif
diff --git a/gzip.h b/gzip.h
index d7e7cc072d5cda81737d8754860099af5a1f7e6e..dad0fcc31e5592b9572081d19fdb5442a962442a 100644 (file)
--- a/gzip.h
+++ b/gzip.h
 #  define memzero(s, n)     bzero((s), (n))
 #endif
 
-#ifdef HAVE_LIMITS_H
-# include <limits.h>
-#endif
-
 #ifndef RETSIGTYPE
 #  define RETSIGTYPE void
 #endif
@@ -105,10 +101,6 @@ extern int method;         /* compression method */
 #  else
 #    define INBUFSIZ  0x8000  /* input buffer size */
 #  endif
-#  if defined SSIZE_MAX && SSIZE_MAX < INBUFSIZ
-#    undef INBUFSIZ
-#    define INBUFSIZ SSIZE_MAX
-#  endif
 #endif
 #define INBUF_EXTRA  64     /* required by unlzw() */
 
@@ -329,6 +321,7 @@ extern int  fill_inbuf    OF((int eof_ok));
 extern void flush_outbuf  OF((void));
 extern void flush_window  OF((void));
 extern void write_buf     OF((int fd, voidp buf, unsigned cnt));
+extern int read_buffer    OF((int fd, voidp buf, unsigned int cnt));
 extern char *strlwr       OF((char *s));
 extern char *gzip_base_name OF((char *fname));
 extern int xunlink        OF((char *fname));
diff --git a/unlzw.c b/unlzw.c
index e24886bda4e15f1d5c9a39461ef2a0e5f6687fd9..207023a151c970454aa0b7a5304d8f0abe3fef30 100644 (file)
--- a/unlzw.c
+++ b/unlzw.c
@@ -257,7 +257,8 @@ int unlzw(in, out)
        posbits = 0;
 
        if (insize < INBUF_EXTRA) {
-           if ((rsize = read(in, (char*)inbuf+insize, INBUFSIZ)) == -1) {
+           rsize = read_buffer (in, (char *) inbuf + insize, INBUFSIZ);
+           if (rsize == -1) {
                read_error();
            }
            insize += rsize;
diff --git a/util.c b/util.c
index 32e24e7afc14ffdeba8ee7569851f68a3a242648..434b376fb01fe93b9d9f19f3322ab6a0bb78cc6d 100644 (file)
--- a/util.c
+++ b/util.c
@@ -28,6 +28,9 @@ static char rcsid[] = "$Id$";
 
 #include "tailor.h"
 
+#ifdef HAVE_LIMITS_H
+#  include <limits.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #  include <unistd.h>
 #endif
@@ -49,6 +52,8 @@ static char rcsid[] = "$Id$";
 #  define CHAR_BIT 8
 #endif
 
+static int write_buffer OF((int, voidp, unsigned int));
+
 extern ulg crc_32_tab[];   /* crc table, defined below */
 
 /* ===========================================================================
@@ -62,7 +67,7 @@ int copy(in, out)
     while (insize != 0 && (int)insize != -1) {
        write_buf(out, (char*)inbuf, insize);
        bytes_out += insize;
-       insize = read(in, (char*)inbuf, INBUFSIZ);
+       insize = read_buffer (in, (char *) inbuf, INBUFSIZ);
     }
     if ((int)insize == -1) {
        read_error();
@@ -117,7 +122,7 @@ int fill_inbuf(eof_ok)
     /* Read as much as possible */
     insize = 0;
     do {
-       len = read(ifd, (char*)inbuf+insize, INBUFSIZ-insize);
+       len = read_buffer (ifd, (char *) inbuf + insize, INBUFSIZ - insize);
        if (len == 0) break;
        if (len == -1) {
          read_error();
@@ -137,6 +142,35 @@ int fill_inbuf(eof_ok)
     return inbuf[0];
 }
 
+/* Like the standard read function, except do not attempt to read more
+   than SSIZE_MAX bytes at a time.  */
+int
+read_buffer (fd, buf, cnt)
+     int fd;
+     voidp buf;
+     unsigned int cnt;
+{
+#ifdef SSIZE_MAX
+  if (SSIZE_MAX < cnt)
+    cnt = SSIZE_MAX;
+#endif
+  return read (fd, buf, cnt);
+}
+
+/* Likewise for 'write'.  */
+static int
+write_buffer (fd, buf, cnt)
+     int fd;
+     voidp buf;
+     unsigned int cnt;
+{
+#ifdef SSIZE_MAX
+  if (SSIZE_MAX < cnt)
+    cnt = SSIZE_MAX;
+#endif
+  return write (fd, buf, cnt);
+}
+
 /* ===========================================================================
  * Write the output buffer outbuf[0..outcnt-1] and update bytes_out.
  * (used for the compressed data only)
@@ -177,7 +211,7 @@ void write_buf(fd, buf, cnt)
 {
     unsigned  n;
 
-    while ((n = write(fd, buf, cnt)) != cnt) {
+    while ((n = write_buffer (fd, buf, cnt)) != cnt) {
        if (n == (unsigned)(-1)) {
            write_error();
        }
diff --git a/zip.c b/zip.c
index 4b2d538053cc852842de823cc8fe0da0d0b29cc2..4545009fd1fac5e3459d4f901930dd65866665a2 100644 (file)
--- a/zip.c
+++ b/zip.c
@@ -126,7 +126,7 @@ int file_read(buf, size)
 
     Assert(insize == 0, "inbuf not empty");
 
-    len = read(ifd, buf, size);
+    len = read_buffer (ifd, buf, size);
     if (len == 0) return (int)len;
     if (len == (unsigned)-1) {
        read_error();