split: fix reporting of read errors
authorPádraig Brady <P@draigBrady.com>
Thu, 7 Oct 2010 12:12:36 +0000 (13:12 +0100)
committerPádraig Brady <P@draigBrady.com>
Thu, 7 Oct 2010 19:08:16 +0000 (20:08 +0100)
The bug was introduced with commit 23f6d41f, 19-02-2003.

* src/split.c (bytes_split, lines_split, line_bytes_split):
Correctly check the return from full_read().
* tests/misc/split-fail: Ensure split fails when
it can't read its input.
* NEWS: Mention the fix.

NEWS
src/split.c
tests/misc/split-fail

diff --git a/NEWS b/NEWS
index 22f257b..7ee18cd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,9 @@ GNU coreutils NEWS                                    -*- outline -*-
   found to be part of a directory cycle.  Before, du would issue a
   "NOTIFY YOUR SYSTEM MANAGER" diagnostic and fail.
 
+  split now diagnoses read errors rather than silently exiting.
+  [bug introduced in coreutils-4.5.8]
+
   tac would perform a double-free when given an input line longer than 16KiB.
   [bug introduced in coreutils-8.3]
 
index 5be7207..61ae265 100644 (file)
@@ -33,7 +33,6 @@
 #include "full-read.h"
 #include "full-write.h"
 #include "quote.h"
-#include "safe-read.h"
 #include "xfreopen.h"
 #include "xstrtol.h"
 
@@ -229,7 +228,7 @@ bytes_split (uintmax_t n_bytes, char *buf, size_t bufsize)
   do
     {
       n_read = full_read (STDIN_FILENO, buf, bufsize);
-      if (n_read == SAFE_READ_ERROR)
+      if (n_read < bufsize && errno)
         error (EXIT_FAILURE, errno, "%s", infile);
       bp_out = buf;
       to_read = n_read;
@@ -273,7 +272,7 @@ lines_split (uintmax_t n_lines, char *buf, size_t bufsize)
   do
     {
       n_read = full_read (STDIN_FILENO, buf, bufsize);
-      if (n_read == SAFE_READ_ERROR)
+      if (n_read < bufsize && errno)
         error (EXIT_FAILURE, errno, "%s", infile);
       bp = bp_out = buf;
       eob = bp + n_read;
@@ -314,7 +313,6 @@ lines_split (uintmax_t n_lines, char *buf, size_t bufsize)
 static void
 line_bytes_split (size_t n_bytes)
 {
-  size_t n_read;
   char *bp;
   bool eof = false;
   size_t n_buffered = 0;
@@ -324,8 +322,9 @@ line_bytes_split (size_t n_bytes)
     {
       /* Fill up the full buffer size from the input file.  */
 
-      n_read = full_read (STDIN_FILENO, buf + n_buffered, n_bytes - n_buffered);
-      if (n_read == SAFE_READ_ERROR)
+      size_t to_read = n_bytes - n_buffered;
+      size_t n_read = full_read (STDIN_FILENO, buf + n_buffered, to_read);
+      if (n_read < to_read && errno)
         error (EXIT_FAILURE, errno, "%s", infile);
 
       n_buffered += n_read;
index e36c86d..68c9d73 100755 (executable)
@@ -64,5 +64,11 @@ split: line count option -99*... is too large
 EOF
 compare out exp || fail=1
 
+# Make sure split fails when it can't read input
+# (the current directory in this case)
+if ! cat . >/dev/null; then
+  # can't read() directories
+  split . && fail=1
+fi
 
 Exit $fail