split: fix reporting of read errors

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.
This commit is contained in:
Pádraig Brady 2010-10-07 13:12:36 +01:00
parent 6483f0e1bd
commit 758916b49e
3 changed files with 14 additions and 6 deletions

3
NEWS
View File

@ -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]

View 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;

View File

@ -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