bug-grep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bug#669084: grep does not match anything when reading from stdin


From: Jim Meyering
Subject: Re: Bug#669084: grep does not match anything when reading from stdin
Date: Tue, 17 Apr 2012 13:45:43 +0200

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]