Subject: bug#50129: -f - option doesn't respond to single EOF from TTY.

From: Paul Eggert <[email-masked]>
Date: Sat, 21 Aug 2021 10:50:30 -0700

On 8/20/21 8:25 AM, Paul Eggert wrote:

> (Not that anyone would ever want to *use* plain "grep -f -", except 
> perhaps to file bug reports....)

I discovered a more-artificial case where grep messes up even on modern 
platforms, namely 'grep -f - -f -' where grep essentially ignores the 
second '-f -'. I installed the attached to fix that, along with another 
bug where grep wasn't reporting fclose errors.

I think these bugs are so unlikely and artificial that they're not worth 
mentioning in NEWS.

As a side effect, this patch might fix the bug#50129 problem on your old 
platform. Hard to say.
From 5649624925c421427cd4ec0f8a7e332c94532b33 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Sat, 21 Aug 2021 10:44:17 -0700
Subject: [PATCH] =?UTF-8?q?grep:=20avoid=20sticky=20problem=20with=20?=
 =?UTF-8?q?=E2=80=98-f=20-=20-f=20-=E2=80=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Inspired by bug#50129 even though this is a different bug.
* src/grep.c (main): For ‘-f -’, use clearerr (stdin) after
reading, so that ‘grep -f - -f -’ reads stdin twice even
when stdin is a tty.  Also, for ‘-f FILE’, report any
I/O error when closing FILE.
---
 src/grep.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/grep.c b/src/grep.c
index 7a33686..b2a0566 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -2477,7 +2477,6 @@ main (int argc, char **argv)
   int matcher = -1;
   int opt;
   int prev_optind, last_recursive;
-  int fread_errno;
   intmax_t default_context;
   FILE *fp;
   exit_failure = EXIT_TROUBLE;
@@ -2648,11 +2647,17 @@ main (int argc, char **argv)
               if (cc == 0)
                 break;
             }
-          fread_errno = errno;
-          if (ferror (fp))
-            die (EXIT_TROUBLE, fread_errno, "%s", optarg);
-          if (fp != stdin)
-            fclose (fp);
+          int err = errno;
+          if (!ferror (fp))
+            {
+              err = 0;
+              if (fp == stdin)
+                clearerr (fp);
+              else if (fclose (fp) != 0)
+                err = errno;
+            }
+          if (err)
+            die (EXIT_TROUBLE, err, "%s", optarg);
           /* Append final newline if file ended in non-newline. */
           if (newkeycc != keycc && keys[newkeycc - 1] != '\n')
             keys[newkeycc++] = '\n';
-- 
2.30.2