diff options
author | Tobias Stoeckmann <tobias@stoeckmann.org> | 2014-11-24 09:14:44 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2014-11-24 09:31:49 +0000 |
commit | 16e2347bd545057b04a97115563e606ad822ec33 (patch) | |
tree | d180631231f8877c253168b8f34288f208c3cc96 | |
parent | 2e81e62243409c5c574b899f52b08c000e4d99fd (diff) | |
download | coreutils-16e2347bd545057b04a97115563e606ad822ec33.tar.xz |
paste: fix possible truncated output with large files
If '\n' was present at the size_t boundary of a file,
then that and subsequent data would be discarded.
* src/paste.c (paste_parallel): Avoid the overflow issue
by changing the flag to a boolean rather than a count.
* NEWS: Mention the bug fix.
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | src/paste.c | 6 |
2 files changed, 8 insertions, 3 deletions
@@ -20,6 +20,11 @@ GNU coreutils NEWS -*- outline -*- head, od, split, tac, tail, and wc no longer mishandle input from files in /proc and /sys file systems that report somewhat-incorrect file sizes. + paste no longer truncates output for large input files. This would happen + for example with files larger than 4GiB on 32 bit systems with a '\n' + character at the 4GiB position. + [the bug dates back to the initial implementation] + ** New features chroot accepts the new --skip-chdir option to not change the working directory diff --git a/src/paste.c b/src/paste.c index 2ca75d065..64c4783e0 100644 --- a/src/paste.c +++ b/src/paste.c @@ -235,7 +235,7 @@ paste_parallel (size_t nfiles, char **fnamptr) { int chr IF_LINT ( = 0); /* Input character. */ int err IF_LINT ( = 0); /* Input errno value. */ - size_t line_length = 0; /* Number of chars in line. */ + bool sometodo = false; /* Input chars to process. */ if (fileptr[i]) { @@ -250,7 +250,7 @@ paste_parallel (size_t nfiles, char **fnamptr) while (chr != EOF) { - line_length++; + sometodo = true; if (chr == '\n') break; xputchar (chr); @@ -259,7 +259,7 @@ paste_parallel (size_t nfiles, char **fnamptr) } } - if (line_length == 0) + if (! sometodo) { /* EOF, read error, or closed file. If an EOF or error, close the file. */ |