[v6,5/7] tests: replace fgets by xfgets

Message ID 20230602152812.108497-6-fberat@redhat.com
State Superseded
Delegated to: Siddhesh Poyarekar
Headers
Series Fix warn unused result |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm pending Patch applied
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 pending Patch applied

Commit Message

Frederic Berat June 2, 2023, 3:28 p.m. UTC
  With fortification enabled, fgets calls return result needs to be checked,
has it gets the __wur macro enabled.
---
Changes since v4/v5:
 - Rebased

 assert/test-assert-perr.c     |  8 +++++---
 assert/test-assert.c          |  8 +++++---
 stdio-common/test_rdwr.c      | 11 ++++-------
 support/Makefile              |  1 +
 support/xfgets.c              | 32 ++++++++++++++++++++++++++++++++
 support/xstdio.h              |  1 +
 sysdeps/pthread/tst-cancel6.c |  3 ++-
 7 files changed, 50 insertions(+), 14 deletions(-)
 create mode 100644 support/xfgets.c
  

Comments

Siddhesh Poyarekar June 6, 2023, 12:20 p.m. UTC | #1
On 2023-06-02 11:28, Frédéric Bérat wrote:
> With fortification enabled, fgets calls return result needs to be checked,
> has it gets the __wur macro enabled.
> ---
> Changes since v4/v5:
>   - Rebased
> 
>   assert/test-assert-perr.c     |  8 +++++---
>   assert/test-assert.c          |  8 +++++---
>   stdio-common/test_rdwr.c      | 11 ++++-------
>   support/Makefile              |  1 +
>   support/xfgets.c              | 32 ++++++++++++++++++++++++++++++++
>   support/xstdio.h              |  1 +
>   sysdeps/pthread/tst-cancel6.c |  3 ++-
>   7 files changed, 50 insertions(+), 14 deletions(-)
>   create mode 100644 support/xfgets.c
> 
> diff --git a/assert/test-assert-perr.c b/assert/test-assert-perr.c
> index 8496db6ffd..09a4fcb6ef 100644
> --- a/assert/test-assert-perr.c
> +++ b/assert/test-assert-perr.c
> @@ -11,6 +11,8 @@
>   #include <string.h>
>   #include <setjmp.h>
>   
> +#include <support/xstdio.h>
> +
>   jmp_buf rec;
>   char buf[160];
>   
> @@ -70,15 +72,15 @@ main(void)
>       failed = 1; /* should not happen */
>   
>     rewind (stderr);
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>     if (!strstr(buf, strerror (1)))
>       failed = 1;
>   
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>     if (strstr (buf, strerror (0)))
>       failed = 1;
>   
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>     if (strstr (buf, strerror (2)))
>       failed = 1;
>   
> diff --git a/assert/test-assert.c b/assert/test-assert.c
> index 26b58d4dd3..25e264543b 100644
> --- a/assert/test-assert.c
> +++ b/assert/test-assert.c
> @@ -11,6 +11,8 @@
>   #include <string.h>
>   #include <setjmp.h>
>   
> +#include <support/xstdio.h>
> +
>   jmp_buf rec;
>   char buf[160];
>   
> @@ -72,15 +74,15 @@ main (void)
>       failed = 1; /* should not happen */
>   
>     rewind (stderr);
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>     if (!strstr (buf, "1 == 2"))
>       failed = 1;
>   
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>     if (strstr (buf, "1 == 1"))
>       failed = 1;
>   
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>     if (strstr (buf, "2 == 3"))
>       failed = 1;
>   
> diff --git a/stdio-common/test_rdwr.c b/stdio-common/test_rdwr.c
> index 7825ca9358..0544916eb1 100644
> --- a/stdio-common/test_rdwr.c
> +++ b/stdio-common/test_rdwr.c
> @@ -20,6 +20,7 @@
>   #include <stdlib.h>
>   #include <string.h>
>   
> +#include <support/xstdio.h>
>   
>   int
>   main (int argc, char **argv)
> @@ -49,7 +50,7 @@ main (int argc, char **argv)
>   
>     (void) fputs (hello, f);
>     rewind (f);
> -  (void) fgets (buf, sizeof (buf), f);
> +  xfgets (buf, sizeof (buf), f);
>     rewind (f);
>     (void) fputs (buf, f);
>     rewind (f);
> @@ -104,12 +105,8 @@ main (int argc, char **argv)
>     if (!lose)
>       {
>         rewind (f);
> -      if (fgets (buf, sizeof (buf), f) == NULL)
> -	{
> -	  printf ("fgets got %s.\n", strerror(errno));
> -	  lose = 1;
> -	}
> -      else if (strcmp (buf, replace))
> +      xfgets (buf, sizeof (buf), f);
> +      if (strcmp (buf, replace))
>   	{
>   	  printf ("Read \"%s\" instead of \"%s\".\n", buf, replace);
>   	  lose = 1;
> diff --git a/support/Makefile b/support/Makefile
> index 3eed2deb1a..bbd3465d04 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -123,6 +123,7 @@ libsupport-routines = \
>     xdup2 \
>     xfchmod \
>     xfclose \
> +  xfgets \
>     xfopen \
>     xfork \
>     xfreopen \
> diff --git a/support/xfgets.c b/support/xfgets.c
> new file mode 100644
> index 0000000000..e2db19cf53
> --- /dev/null
> +++ b/support/xfgets.c
> @@ -0,0 +1,32 @@
> +/* fgets with error checking.
> +   Copyright (C) 2016-2023 Free Software Foundation, Inc.

Only 2023.

> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <support/xstdio.h>
> +
> +#include <support/check.h>
> +#include <stdlib.h>
> +
> +char *
> +xfgets (char *s, int size, FILE *stream)
> +{
> +  char *ret = fgets (s, size, stream);
> +  if (!ret && ferror(stream))
> +    FAIL_EXIT1 ("fgets failed: %m");
> +
> +  return ret;
> +}
> diff --git a/support/xstdio.h b/support/xstdio.h
> index 633c342c82..f30bee6a20 100644
> --- a/support/xstdio.h
> +++ b/support/xstdio.h
> @@ -28,6 +28,7 @@ FILE *xfopen (const char *path, const char *mode);
>   void xfclose (FILE *);
>   FILE *xfreopen (const char *path, const char *mode, FILE *stream);
>   void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
> +char *xfgets (char *s, int size, FILE *stream);
>   
>   /* Read a line from FP, using getline.  *BUFFER must be NULL, or a
>      heap-allocated pointer of *LENGTH bytes.  Return the number of
> diff --git a/sysdeps/pthread/tst-cancel6.c b/sysdeps/pthread/tst-cancel6.c
> index 63e6d49707..49b7399353 100644
> --- a/sysdeps/pthread/tst-cancel6.c
> +++ b/sysdeps/pthread/tst-cancel6.c
> @@ -20,12 +20,13 @@
>   #include <stdlib.h>
>   #include <unistd.h>
>   
> +#include <support/xstdio.h>
>   
>   static void *
>   tf (void *arg)
>   {
>     char buf[100];
> -  fgets (buf, sizeof (buf), arg);
> +  xfgets (buf, sizeof (buf), arg);
>     /* This call should never return.  */
>     return NULL;
>   }
  
Maxim Kuvyrkov June 8, 2023, 5:50 a.m. UTC | #2
Hi Frédéric,

One of the patches in this series fails lint-makefile test [1].  Let me know if you need any assistance in reproducing this.

===
--- /home/maxim.kuvyrkov/tcwg_gnu/glibc/support/Makefile.expected
+++ /home/maxim.kuvyrkov/tcwg_gnu/glibc/support/Makefile	2023-06-08 05:41:24.238665318 +0000
@@ -126,8 +126,8 @@
   xfgets \
   xfopen \
   xfork \
-  xfread \
   xfreopen \
+  xfread \
   xftruncate \
   xgetline \
   xgetsockname \
@@ -197,8 +197,8 @@
   xpthread_spin_lock \
   xpthread_spin_unlock \
   xraise \
-  xread \
   xreadlink \
+  xread \
   xrealloc \
   xrecvfrom \
   xsendto \
@@ -211,8 +211,8 @@
   xstrdup \
   xstrndup \
   xsymlink \
-  xsysconf \
   xsystem \
+  xsysconf \
   xunlink \
   xuselocale \
   xwaitpid \
---
Tested 200 Makefiles and 1 were incorrectly sorted
Please use `patch -R -pN` and the output above to correct the sorting
===

[1] https://ci.linaro.org/job/tcwg_glibc_check--master-aarch64-build/321/artifact/artifacts/artifacts.precommit/07-check_regression/fails.sum/*view*/

--
Maxim Kuvyrkov
https://www.linaro.org




> On Jun 2, 2023, at 19:28, Frédéric Bérat via Libc-alpha <libc-alpha@sourceware.org> wrote:
> 
> With fortification enabled, fgets calls return result needs to be checked,
> has it gets the __wur macro enabled.
> ---
> Changes since v4/v5:
> - Rebased
> 
> assert/test-assert-perr.c     |  8 +++++---
> assert/test-assert.c          |  8 +++++---
> stdio-common/test_rdwr.c      | 11 ++++-------
> support/Makefile              |  1 +
> support/xfgets.c              | 32 ++++++++++++++++++++++++++++++++
> support/xstdio.h              |  1 +
> sysdeps/pthread/tst-cancel6.c |  3 ++-
> 7 files changed, 50 insertions(+), 14 deletions(-)
> create mode 100644 support/xfgets.c
> 
> diff --git a/assert/test-assert-perr.c b/assert/test-assert-perr.c
> index 8496db6ffd..09a4fcb6ef 100644
> --- a/assert/test-assert-perr.c
> +++ b/assert/test-assert-perr.c
> @@ -11,6 +11,8 @@
> #include <string.h>
> #include <setjmp.h>
> 
> +#include <support/xstdio.h>
> +
> jmp_buf rec;
> char buf[160];
> 
> @@ -70,15 +72,15 @@ main(void)
>     failed = 1; /* should not happen */
> 
>   rewind (stderr);
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>   if (!strstr(buf, strerror (1)))
>     failed = 1;
> 
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>   if (strstr (buf, strerror (0)))
>     failed = 1;
> 
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>   if (strstr (buf, strerror (2)))
>     failed = 1;
> 
> diff --git a/assert/test-assert.c b/assert/test-assert.c
> index 26b58d4dd3..25e264543b 100644
> --- a/assert/test-assert.c
> +++ b/assert/test-assert.c
> @@ -11,6 +11,8 @@
> #include <string.h>
> #include <setjmp.h>
> 
> +#include <support/xstdio.h>
> +
> jmp_buf rec;
> char buf[160];
> 
> @@ -72,15 +74,15 @@ main (void)
>     failed = 1; /* should not happen */
> 
>   rewind (stderr);
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>   if (!strstr (buf, "1 == 2"))
>     failed = 1;
> 
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>   if (strstr (buf, "1 == 1"))
>     failed = 1;
> 
> -  fgets (buf, 160, stderr);
> +  xfgets (buf, 160, stderr);
>   if (strstr (buf, "2 == 3"))
>     failed = 1;
> 
> diff --git a/stdio-common/test_rdwr.c b/stdio-common/test_rdwr.c
> index 7825ca9358..0544916eb1 100644
> --- a/stdio-common/test_rdwr.c
> +++ b/stdio-common/test_rdwr.c
> @@ -20,6 +20,7 @@
> #include <stdlib.h>
> #include <string.h>
> 
> +#include <support/xstdio.h>
> 
> int
> main (int argc, char **argv)
> @@ -49,7 +50,7 @@ main (int argc, char **argv)
> 
>   (void) fputs (hello, f);
>   rewind (f);
> -  (void) fgets (buf, sizeof (buf), f);
> +  xfgets (buf, sizeof (buf), f);
>   rewind (f);
>   (void) fputs (buf, f);
>   rewind (f);
> @@ -104,12 +105,8 @@ main (int argc, char **argv)
>   if (!lose)
>     {
>       rewind (f);
> -      if (fgets (buf, sizeof (buf), f) == NULL)
> - {
> -  printf ("fgets got %s.\n", strerror(errno));
> -  lose = 1;
> - }
> -      else if (strcmp (buf, replace))
> +      xfgets (buf, sizeof (buf), f);
> +      if (strcmp (buf, replace))
> {
>  printf ("Read \"%s\" instead of \"%s\".\n", buf, replace);
>  lose = 1;
> diff --git a/support/Makefile b/support/Makefile
> index 3eed2deb1a..bbd3465d04 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -123,6 +123,7 @@ libsupport-routines = \
>   xdup2 \
>   xfchmod \
>   xfclose \
> +  xfgets \
>   xfopen \
>   xfork \
>   xfreopen \
> diff --git a/support/xfgets.c b/support/xfgets.c
> new file mode 100644
> index 0000000000..e2db19cf53
> --- /dev/null
> +++ b/support/xfgets.c
> @@ -0,0 +1,32 @@
> +/* fgets with error checking.
> +   Copyright (C) 2016-2023 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <support/xstdio.h>
> +
> +#include <support/check.h>
> +#include <stdlib.h>
> +
> +char *
> +xfgets (char *s, int size, FILE *stream)
> +{
> +  char *ret = fgets (s, size, stream);
> +  if (!ret && ferror(stream))
> +    FAIL_EXIT1 ("fgets failed: %m");
> +
> +  return ret;
> +}
> diff --git a/support/xstdio.h b/support/xstdio.h
> index 633c342c82..f30bee6a20 100644
> --- a/support/xstdio.h
> +++ b/support/xstdio.h
> @@ -28,6 +28,7 @@ FILE *xfopen (const char *path, const char *mode);
> void xfclose (FILE *);
> FILE *xfreopen (const char *path, const char *mode, FILE *stream);
> void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
> +char *xfgets (char *s, int size, FILE *stream);
> 
> /* Read a line from FP, using getline.  *BUFFER must be NULL, or a
>    heap-allocated pointer of *LENGTH bytes.  Return the number of
> diff --git a/sysdeps/pthread/tst-cancel6.c b/sysdeps/pthread/tst-cancel6.c
> index 63e6d49707..49b7399353 100644
> --- a/sysdeps/pthread/tst-cancel6.c
> +++ b/sysdeps/pthread/tst-cancel6.c
> @@ -20,12 +20,13 @@
> #include <stdlib.h>
> #include <unistd.h>
> 
> +#include <support/xstdio.h>
> 
> static void *
> tf (void *arg)
> {
>   char buf[100];
> -  fgets (buf, sizeof (buf), arg);
> +  xfgets (buf, sizeof (buf), arg);
>   /* This call should never return.  */
>   return NULL;
> }
> -- 
> 2.40.1
>
  
Frederic Berat June 8, 2023, 6:57 a.m. UTC | #3
On Thu, Jun 8, 2023 at 7:51 AM Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org> wrote:
>
> Hi Frédéric,
>
> One of the patches in this series fails lint-makefile test [1].  Let me know if you need any assistance in reproducing this.

Thanks, yes I noticed that yesterday on patch 2 and 4. Interestingly
the patch 3 didn't but I'll fix it too.

There is another version pending already, I'll send it soon hopefully.

>
> ===
> --- /home/maxim.kuvyrkov/tcwg_gnu/glibc/support/Makefile.expected
> +++ /home/maxim.kuvyrkov/tcwg_gnu/glibc/support/Makefile        2023-06-08 05:41:24.238665318 +0000
> @@ -126,8 +126,8 @@
>    xfgets \
>    xfopen \
>    xfork \
> -  xfread \
>    xfreopen \
> +  xfread \
>    xftruncate \
>    xgetline \
>    xgetsockname \
> @@ -197,8 +197,8 @@
>    xpthread_spin_lock \
>    xpthread_spin_unlock \
>    xraise \
> -  xread \
>    xreadlink \
> +  xread \
>    xrealloc \
>    xrecvfrom \
>    xsendto \
> @@ -211,8 +211,8 @@
>    xstrdup \
>    xstrndup \
>    xsymlink \
> -  xsysconf \
>    xsystem \
> +  xsysconf \
>    xunlink \
>    xuselocale \
>    xwaitpid \
> ---
> Tested 200 Makefiles and 1 were incorrectly sorted
> Please use `patch -R -pN` and the output above to correct the sorting
> ===
>
> [1] https://ci.linaro.org/job/tcwg_glibc_check--master-aarch64-build/321/artifact/artifacts/artifacts.precommit/07-check_regression/fails.sum/*view*/
>
> --
> Maxim Kuvyrkov
> https://www.linaro.org
>
>
>
>
> > On Jun 2, 2023, at 19:28, Frédéric Bérat via Libc-alpha <libc-alpha@sourceware.org> wrote:
> >
> > With fortification enabled, fgets calls return result needs to be checked,
> > has it gets the __wur macro enabled.
> > ---
> > Changes since v4/v5:
> > - Rebased
> >
> > assert/test-assert-perr.c     |  8 +++++---
> > assert/test-assert.c          |  8 +++++---
> > stdio-common/test_rdwr.c      | 11 ++++-------
> > support/Makefile              |  1 +
> > support/xfgets.c              | 32 ++++++++++++++++++++++++++++++++
> > support/xstdio.h              |  1 +
> > sysdeps/pthread/tst-cancel6.c |  3 ++-
> > 7 files changed, 50 insertions(+), 14 deletions(-)
> > create mode 100644 support/xfgets.c
> >
> > diff --git a/assert/test-assert-perr.c b/assert/test-assert-perr.c
> > index 8496db6ffd..09a4fcb6ef 100644
> > --- a/assert/test-assert-perr.c
> > +++ b/assert/test-assert-perr.c
> > @@ -11,6 +11,8 @@
> > #include <string.h>
> > #include <setjmp.h>
> >
> > +#include <support/xstdio.h>
> > +
> > jmp_buf rec;
> > char buf[160];
> >
> > @@ -70,15 +72,15 @@ main(void)
> >     failed = 1; /* should not happen */
> >
> >   rewind (stderr);
> > -  fgets (buf, 160, stderr);
> > +  xfgets (buf, 160, stderr);
> >   if (!strstr(buf, strerror (1)))
> >     failed = 1;
> >
> > -  fgets (buf, 160, stderr);
> > +  xfgets (buf, 160, stderr);
> >   if (strstr (buf, strerror (0)))
> >     failed = 1;
> >
> > -  fgets (buf, 160, stderr);
> > +  xfgets (buf, 160, stderr);
> >   if (strstr (buf, strerror (2)))
> >     failed = 1;
> >
> > diff --git a/assert/test-assert.c b/assert/test-assert.c
> > index 26b58d4dd3..25e264543b 100644
> > --- a/assert/test-assert.c
> > +++ b/assert/test-assert.c
> > @@ -11,6 +11,8 @@
> > #include <string.h>
> > #include <setjmp.h>
> >
> > +#include <support/xstdio.h>
> > +
> > jmp_buf rec;
> > char buf[160];
> >
> > @@ -72,15 +74,15 @@ main (void)
> >     failed = 1; /* should not happen */
> >
> >   rewind (stderr);
> > -  fgets (buf, 160, stderr);
> > +  xfgets (buf, 160, stderr);
> >   if (!strstr (buf, "1 == 2"))
> >     failed = 1;
> >
> > -  fgets (buf, 160, stderr);
> > +  xfgets (buf, 160, stderr);
> >   if (strstr (buf, "1 == 1"))
> >     failed = 1;
> >
> > -  fgets (buf, 160, stderr);
> > +  xfgets (buf, 160, stderr);
> >   if (strstr (buf, "2 == 3"))
> >     failed = 1;
> >
> > diff --git a/stdio-common/test_rdwr.c b/stdio-common/test_rdwr.c
> > index 7825ca9358..0544916eb1 100644
> > --- a/stdio-common/test_rdwr.c
> > +++ b/stdio-common/test_rdwr.c
> > @@ -20,6 +20,7 @@
> > #include <stdlib.h>
> > #include <string.h>
> >
> > +#include <support/xstdio.h>
> >
> > int
> > main (int argc, char **argv)
> > @@ -49,7 +50,7 @@ main (int argc, char **argv)
> >
> >   (void) fputs (hello, f);
> >   rewind (f);
> > -  (void) fgets (buf, sizeof (buf), f);
> > +  xfgets (buf, sizeof (buf), f);
> >   rewind (f);
> >   (void) fputs (buf, f);
> >   rewind (f);
> > @@ -104,12 +105,8 @@ main (int argc, char **argv)
> >   if (!lose)
> >     {
> >       rewind (f);
> > -      if (fgets (buf, sizeof (buf), f) == NULL)
> > - {
> > -  printf ("fgets got %s.\n", strerror(errno));
> > -  lose = 1;
> > - }
> > -      else if (strcmp (buf, replace))
> > +      xfgets (buf, sizeof (buf), f);
> > +      if (strcmp (buf, replace))
> > {
> >  printf ("Read \"%s\" instead of \"%s\".\n", buf, replace);
> >  lose = 1;
> > diff --git a/support/Makefile b/support/Makefile
> > index 3eed2deb1a..bbd3465d04 100644
> > --- a/support/Makefile
> > +++ b/support/Makefile
> > @@ -123,6 +123,7 @@ libsupport-routines = \
> >   xdup2 \
> >   xfchmod \
> >   xfclose \
> > +  xfgets \
> >   xfopen \
> >   xfork \
> >   xfreopen \
> > diff --git a/support/xfgets.c b/support/xfgets.c
> > new file mode 100644
> > index 0000000000..e2db19cf53
> > --- /dev/null
> > +++ b/support/xfgets.c
> > @@ -0,0 +1,32 @@
> > +/* fgets with error checking.
> > +   Copyright (C) 2016-2023 Free Software Foundation, Inc.
> > +   This file is part of the GNU C Library.
> > +
> > +   The GNU C Library is free software; you can redistribute it and/or
> > +   modify it under the terms of the GNU Lesser General Public
> > +   License as published by the Free Software Foundation; either
> > +   version 2.1 of the License, or (at your option) any later version.
> > +
> > +   The GNU C Library is distributed in the hope that it will be useful,
> > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > +   Lesser General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Lesser General Public
> > +   License along with the GNU C Library; if not, see
> > +   <https://www.gnu.org/licenses/>.  */
> > +
> > +#include <support/xstdio.h>
> > +
> > +#include <support/check.h>
> > +#include <stdlib.h>
> > +
> > +char *
> > +xfgets (char *s, int size, FILE *stream)
> > +{
> > +  char *ret = fgets (s, size, stream);
> > +  if (!ret && ferror(stream))
> > +    FAIL_EXIT1 ("fgets failed: %m");
> > +
> > +  return ret;
> > +}
> > diff --git a/support/xstdio.h b/support/xstdio.h
> > index 633c342c82..f30bee6a20 100644
> > --- a/support/xstdio.h
> > +++ b/support/xstdio.h
> > @@ -28,6 +28,7 @@ FILE *xfopen (const char *path, const char *mode);
> > void xfclose (FILE *);
> > FILE *xfreopen (const char *path, const char *mode, FILE *stream);
> > void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
> > +char *xfgets (char *s, int size, FILE *stream);
> >
> > /* Read a line from FP, using getline.  *BUFFER must be NULL, or a
> >    heap-allocated pointer of *LENGTH bytes.  Return the number of
> > diff --git a/sysdeps/pthread/tst-cancel6.c b/sysdeps/pthread/tst-cancel6.c
> > index 63e6d49707..49b7399353 100644
> > --- a/sysdeps/pthread/tst-cancel6.c
> > +++ b/sysdeps/pthread/tst-cancel6.c
> > @@ -20,12 +20,13 @@
> > #include <stdlib.h>
> > #include <unistd.h>
> >
> > +#include <support/xstdio.h>
> >
> > static void *
> > tf (void *arg)
> > {
> >   char buf[100];
> > -  fgets (buf, sizeof (buf), arg);
> > +  xfgets (buf, sizeof (buf), arg);
> >   /* This call should never return.  */
> >   return NULL;
> > }
> > --
> > 2.40.1
> >
>
  

Patch

diff --git a/assert/test-assert-perr.c b/assert/test-assert-perr.c
index 8496db6ffd..09a4fcb6ef 100644
--- a/assert/test-assert-perr.c
+++ b/assert/test-assert-perr.c
@@ -11,6 +11,8 @@ 
 #include <string.h>
 #include <setjmp.h>
 
+#include <support/xstdio.h>
+
 jmp_buf rec;
 char buf[160];
 
@@ -70,15 +72,15 @@  main(void)
     failed = 1; /* should not happen */
 
   rewind (stderr);
-  fgets (buf, 160, stderr);
+  xfgets (buf, 160, stderr);
   if (!strstr(buf, strerror (1)))
     failed = 1;
 
-  fgets (buf, 160, stderr);
+  xfgets (buf, 160, stderr);
   if (strstr (buf, strerror (0)))
     failed = 1;
 
-  fgets (buf, 160, stderr);
+  xfgets (buf, 160, stderr);
   if (strstr (buf, strerror (2)))
     failed = 1;
 
diff --git a/assert/test-assert.c b/assert/test-assert.c
index 26b58d4dd3..25e264543b 100644
--- a/assert/test-assert.c
+++ b/assert/test-assert.c
@@ -11,6 +11,8 @@ 
 #include <string.h>
 #include <setjmp.h>
 
+#include <support/xstdio.h>
+
 jmp_buf rec;
 char buf[160];
 
@@ -72,15 +74,15 @@  main (void)
     failed = 1; /* should not happen */
 
   rewind (stderr);
-  fgets (buf, 160, stderr);
+  xfgets (buf, 160, stderr);
   if (!strstr (buf, "1 == 2"))
     failed = 1;
 
-  fgets (buf, 160, stderr);
+  xfgets (buf, 160, stderr);
   if (strstr (buf, "1 == 1"))
     failed = 1;
 
-  fgets (buf, 160, stderr);
+  xfgets (buf, 160, stderr);
   if (strstr (buf, "2 == 3"))
     failed = 1;
 
diff --git a/stdio-common/test_rdwr.c b/stdio-common/test_rdwr.c
index 7825ca9358..0544916eb1 100644
--- a/stdio-common/test_rdwr.c
+++ b/stdio-common/test_rdwr.c
@@ -20,6 +20,7 @@ 
 #include <stdlib.h>
 #include <string.h>
 
+#include <support/xstdio.h>
 
 int
 main (int argc, char **argv)
@@ -49,7 +50,7 @@  main (int argc, char **argv)
 
   (void) fputs (hello, f);
   rewind (f);
-  (void) fgets (buf, sizeof (buf), f);
+  xfgets (buf, sizeof (buf), f);
   rewind (f);
   (void) fputs (buf, f);
   rewind (f);
@@ -104,12 +105,8 @@  main (int argc, char **argv)
   if (!lose)
     {
       rewind (f);
-      if (fgets (buf, sizeof (buf), f) == NULL)
-	{
-	  printf ("fgets got %s.\n", strerror(errno));
-	  lose = 1;
-	}
-      else if (strcmp (buf, replace))
+      xfgets (buf, sizeof (buf), f);
+      if (strcmp (buf, replace))
 	{
 	  printf ("Read \"%s\" instead of \"%s\".\n", buf, replace);
 	  lose = 1;
diff --git a/support/Makefile b/support/Makefile
index 3eed2deb1a..bbd3465d04 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -123,6 +123,7 @@  libsupport-routines = \
   xdup2 \
   xfchmod \
   xfclose \
+  xfgets \
   xfopen \
   xfork \
   xfreopen \
diff --git a/support/xfgets.c b/support/xfgets.c
new file mode 100644
index 0000000000..e2db19cf53
--- /dev/null
+++ b/support/xfgets.c
@@ -0,0 +1,32 @@ 
+/* fgets with error checking.
+   Copyright (C) 2016-2023 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <support/xstdio.h>
+
+#include <support/check.h>
+#include <stdlib.h>
+
+char *
+xfgets (char *s, int size, FILE *stream)
+{
+  char *ret = fgets (s, size, stream);
+  if (!ret && ferror(stream))
+    FAIL_EXIT1 ("fgets failed: %m");
+
+  return ret;
+}
diff --git a/support/xstdio.h b/support/xstdio.h
index 633c342c82..f30bee6a20 100644
--- a/support/xstdio.h
+++ b/support/xstdio.h
@@ -28,6 +28,7 @@  FILE *xfopen (const char *path, const char *mode);
 void xfclose (FILE *);
 FILE *xfreopen (const char *path, const char *mode, FILE *stream);
 void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
+char *xfgets (char *s, int size, FILE *stream);
 
 /* Read a line from FP, using getline.  *BUFFER must be NULL, or a
    heap-allocated pointer of *LENGTH bytes.  Return the number of
diff --git a/sysdeps/pthread/tst-cancel6.c b/sysdeps/pthread/tst-cancel6.c
index 63e6d49707..49b7399353 100644
--- a/sysdeps/pthread/tst-cancel6.c
+++ b/sysdeps/pthread/tst-cancel6.c
@@ -20,12 +20,13 @@ 
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <support/xstdio.h>
 
 static void *
 tf (void *arg)
 {
   char buf[100];
-  fgets (buf, sizeof (buf), arg);
+  xfgets (buf, sizeof (buf), arg);
   /* This call should never return.  */
   return NULL;
 }