mirror of
https://github.com/coreutils/coreutils.git
synced 2024-11-24 10:23:31 +08:00
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:
parent
6483f0e1bd
commit
758916b49e
3
NEWS
3
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]
|
||||
|
||||
|
11
src/split.c
11
src/split.c
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user