Fix a problem that could make cat misbehave on systems which
authorJim Meyering <jim@meyering.net>
Thu, 17 Oct 2002 15:06:36 +0000 (15:06 +0000)
committerJim Meyering <jim@meyering.net>
Thu, 17 Oct 2002 15:06:36 +0000 (15:06 +0000)
give invalid (unreasonably large) values for stat.st_blksize.
(ST_BLKSIZE): Ensure that the result is in [1..4MB].

src/system.h

index edf2421..5948117 100644 (file)
@@ -254,9 +254,15 @@ typedef enum {false = 0, true = 1} bool;
    ? st_blocks ((statbuf).st_size) : 0)
 # endif /* !_POSIX_SOURCE && BSIZE */
 #else /* HAVE_STRUCT_STAT_ST_BLOCKS */
-/* Some systems, like Sequents, return st_blksize of 0 on pipes. */
-# define ST_BLKSIZE(statbuf) ((statbuf).st_blksize > 0 \
-                              ? (statbuf).st_blksize : DEV_BSIZE)
+/* Some systems, like Sequents, return st_blksize of 0 on pipes.
+   Also, when running `cat large-file | rsh hp-ux-system', cat would
+   determine that the output stream had an st_blksize of 2147421096.
+   So here we arbitrarily limit the `optimal' block size to 4MB.
+   If anyone knows of a system for which the legitimate value for
+   st_blksize can exceed 4MB, please report it as a bug in this code.  */
+# define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
+                              && (statbuf).st_blksize <= (1 << 22)) /* 4MB */ \
+                             ? (statbuf).st_blksize : DEV_BSIZE)
 # if defined hpux || defined __hpux__ || defined __hpux
 /* HP-UX counts st_blocks in 1024-byte units.
    This loses when mixing HP-UX and BSD filesystems with NFS.  */