Aníbal Monsalve Salazar wrote: ... > Hello Jim, > > grep-2.11 introduced a regression related to the "-D skip" parameter > option. > > With grep-2.10 (or less than 2.10): > > $ echo foo | grep -D skip foo; echo $? > foo > 0 > > With grep-2.11: > > $ echo foo | grep -D skip foo; echo $? > 1 > > Timo suggests that the possible culprit is the code above. > > The Debian bug report is at http://bugs.debian.org/668585
Hi Aníbal Thanks for passing that along. Here's a lightly-tested patch: >From 415e4e69c8e8c0db288205b30ab2b6a337f62d38 Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Tue, 17 Apr 2012 13:37:10 +0200 Subject: [PATCH] grep: --devices=ACTION (-D) no longer affects stdin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * doc/grep.texi (File and Directory Selection): Clarify this point, documenting the stdin exemption. * src/main.c (grepdesc): Ignore skip-related options when reading from standard input. * tests/skip-device: New file. Test for the above. * tests/Makefile.am (TESTS): Add it. * NEWS (Bug fixes): Mention it, and add a few "[fixed in ...] notes. Reported by Sven Joachim in http://bugs.debian.org/668585, and forwarded to bug-grep by Aníbal Monsalve Salazar. --- NEWS | 7 ++++++- doc/grep.texi | 1 + src/main.c | 9 +++++---- tests/Makefile.am | 1 + tests/skip-device | 11 +++++++++++ 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100755 tests/skip-device diff --git a/NEWS b/NEWS index b219b65..a065394 100644 --- a/NEWS +++ b/NEWS @@ -4,13 +4,17 @@ GNU grep NEWS -*- outline -*- ** Bug fixes + "echo P|grep --devices=skip P" once again prints P, as it did in 2.10 + [bug introduced in grep-2.11] + grep no longer segfaults with -r --exclude-dir and no file operand. I.e., ":|grep -r --exclude-dir=D PAT" would segfault. + [bug introduced in grep-2.11] Recursive grep now uses fts for directory traversal, so it can handle much-larger directories without reporting things like "File name too long", and it can run much faster when dealing with large - directory hierarchies. + directory hierarchies. [bug present since the beginning] grep -E 'a{1000000000}' now reports an overflow error rather than silently acting like grep -E 'a\{1000000000}'. @@ -27,6 +31,7 @@ GNU grep NEWS -*- outline -*- use -R if you prefer the old behavior of following all symlinks and defaulting to reading all devices. + * Noteworthy changes in release 2.11 (2012-03-02) [stable] ** Bug fixes diff --git a/doc/grep.texi b/doc/grep.texi index 1840e21..000a844 100644 --- a/doc/grep.texi +++ b/doc/grep.texi @@ -614,6 +614,7 @@ By default, devices are read if they are on the command line or if the @option{-R} (@option{--dereference-recursive}) option is used, and are skipped if they are encountered recursively and the @option{-r} (@option{--recursive}) option is used. +This option has no effect on a file that is read via standard input. @item -d @var{action} @itemx --directories=@var{action} diff --git a/src/main.c b/src/main.c index 82cae33..c5a8489 100644 --- a/src/main.c +++ b/src/main.c @@ -1367,10 +1367,11 @@ grepdesc (int desc, int command_line) suppressible_error (filename, errno); return status; } - if ((directories == SKIP_DIRECTORIES && S_ISDIR (st.st_mode)) - || ((devices == SKIP_DEVICES - || (devices == READ_COMMAND_LINE_DEVICES && !command_line)) - && is_device_mode (st.st_mode))) + if (desc != STDIN_FILENO + && ((directories == SKIP_DIRECTORIES && S_ISDIR (st.st_mode)) + || ((devices == SKIP_DEVICES + || (devices == READ_COMMAND_LINE_DEVICES && !command_line)) + && is_device_mode (st.st_mode)))) goto closeout; /* If there is a regular file on stdout and the current file refers diff --git a/tests/Makefile.am b/tests/Makefile.am index 13061fe..d0d622b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -78,6 +78,7 @@ TESTS = \ r-dot \ repetition-overflow \ reversed-range-endpoints \ + skip-device \ sjis-mb \ spencer1 \ spencer1-locale \ diff --git a/tests/skip-device b/tests/skip-device new file mode 100755 index 0000000..efb529f --- /dev/null +++ b/tests/skip-device @@ -0,0 +1,11 @@ +#!/bin/sh +# grep must ignore --devices=ACTION (-D) when reading stdin +# For grep-2.11, this test would fail. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Test both with no file argument, and with "-". +echo foo | grep -q -D skip foo - || fail=1 +echo foo | grep -q --devices=skip foo || fail=1 + +Exit $fail -- 1.7.10.208.gb4267
