]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
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 22f257ba6d37ea533727776c30cc64d6405b90ac..7ee18cdd1b5d7c4423c32e68e1e5cfc48f02d6a4 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 5be720795e3e7f9ae6c3dea47a98ddd9ca685d8f..61ae265d83a63e905c0386f12faf63bc7b1ff5fd 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 e36c86dc93ec467a04685e57e72cbbade06535d0..68c9d733400a8ab22a143800e09858aa7087f2af 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