From c7ed171116c0d28bcca95438a8402542e136ad23 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 11 Dec 2006 18:54:39 +0000 Subject: [PATCH] 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 . * util.c: Likewise. * gzip.h: Don't include . (INBUFSIZ): Don't worry about SSIZE_MAX here. --- ChangeLog | 17 +++++++++++++++++ gzip.c | 4 ++++ gzip.h | 9 +-------- unlzw.c | 3 ++- util.c | 40 +++++++++++++++++++++++++++++++++++++--- zip.c | 2 +- 6 files changed, 62 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 956ef5a..1259454 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2006-12-11 Paul Eggert + + 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 . + * util.c: Likewise. + * gzip.h: Don't include . + (INBUFSIZ): Don't worry about SSIZE_MAX here. + 2006-12-08 Paul Eggert * NEWS, configure.ac (AC_INIT): diff --git a/gzip.c b/gzip.c index d1aeb78..96bbccd 100644 --- a/gzip.c +++ b/gzip.c @@ -85,6 +85,10 @@ static char rcsid[] = "$Id$"; # include #endif +#ifdef HAVE_LIMITS_H +# include +#endif + #ifdef HAVE_UNISTD_H # include #endif diff --git a/gzip.h b/gzip.h index d7e7cc0..dad0fcc 100644 --- a/gzip.h +++ b/gzip.h @@ -59,10 +59,6 @@ # define memzero(s, n) bzero((s), (n)) #endif -#ifdef HAVE_LIMITS_H -# include -#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 e24886b..207023a 100644 --- 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 32e24e7..434b376 100644 --- a/util.c +++ b/util.c @@ -28,6 +28,9 @@ static char rcsid[] = "$Id$"; #include "tailor.h" +#ifdef HAVE_LIMITS_H +# include +#endif #ifdef HAVE_UNISTD_H # include #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 4b2d538..4545009 100644 --- 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(); -- 2.47.2