diff options
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | bootstrap.conf | 1 | ||||
-rw-r--r-- | src/main.c | 3 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/long-line-vs-2GiB-read | 22 |
5 files changed, 28 insertions, 1 deletions
@@ -20,6 +20,8 @@ GNU grep NEWS -*- outline -*- printf '\x82'|LC_ALL=en_US.UTF-8 grep -P y Now grep handles arbitrary PCRE errors. [bug introduced in grep-2.15] + Handle very long lines (2GiB and longer) on systems with a deficient + read system call. * Noteworthy changes in release 2.15 (2013-10-26) [stable] diff --git a/bootstrap.conf b/bootstrap.conf index 8f6f5a3d..580f01c2 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -68,6 +68,7 @@ quote readme-release realloc-gnu regex +safe-read same-inode ssize_t stddef @@ -44,6 +44,7 @@ #include "progname.h" #include "propername.h" #include "quote.h" +#include "safe-read.h" #include "version-etc.h" #include "xalloc.h" #include "xstrtol.h" @@ -641,7 +642,7 @@ fillbuf (size_t save, struct stat const *st) readsize = buffer + bufalloc - readbuf; readsize -= readsize % pagesize; - fillsize = read (bufdesc, readbuf, readsize); + fillsize = safe_read (bufdesc, readbuf, readsize); if (fillsize < 0) fillsize = cc = 0; bufoffset += fillsize; diff --git a/tests/Makefile.am b/tests/Makefile.am index 76b8c52b..72af1556 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -71,6 +71,7 @@ TESTS = \ inconsistent-range \ invalid-multibyte-infloop \ khadafy \ + long-line-vs-2GiB-read \ max-count-vs-context \ multibyte-white-space \ empty-line-mb \ diff --git a/tests/long-line-vs-2GiB-read b/tests/long-line-vs-2GiB-read new file mode 100755 index 00000000..773c542d --- /dev/null +++ b/tests/long-line-vs-2GiB-read @@ -0,0 +1,22 @@ +#!/bin/sh +# Ensure that grep can handle lines 2GiB long. +# Before grep-2.16, a line of length 2^31 or greater would provoke +# an "Invalid argument" (EINVAL) failure from the read syscall on +# systems like OS/X 10.8.5. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Searching 2GiB takes a while. +expensive_ + +echo big > exp || framework_failure_ + +MiB=1048576 +dd bs=$MiB seek=2048 of=big < /dev/null || framework_failure_ +echo x >> big || framework_failure_ +grep -l x big > out 2> err || fail=1 + +compare exp out || fail=1 +compare /dev/null err || fail=1 + +Exit $fail |