[v7,4/4] tests: replace fgets by xfgets

Message ID 20230612151821.199003-5-fberat@redhat.com
State Committed
Commit 7ba426a1115318fc11f4355f3161f35817a06ba4
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
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed

Commit Message

Frederic Berat June 12, 2023, 3:18 p.m. UTC
  With fortification enabled, fgets calls return result needs to be checked,
has it gets the __wur macro enabled.
---
Changes since v6:
 - Fixed support/Makefile ordering
 - Fixed header copyright date

 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 13, 2023, 12:23 p.m. UTC | #1
On 2023-06-12 11:18, 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 v6:
>   - Fixed support/Makefile ordering
>   - Fixed header copyright date
> 
>   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);

Joseph, would you apply the same rationale for these tests too, i.e. 
since the test involves interaction with stdio and signals, would you 
avoid adding an xstdio abstraction here to test stdio directly?

Likewise for the stdio-common test here and in patch 3/4, what do you think?

Thanks,
Sid

>     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 994639a915..c81e3c928c 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -123,6 +123,7 @@ libsupport-routines = \
>     xdup2 \
>     xfchmod \
>     xfclose \
> +  xfgets \
>     xfopen \
>     xfork \
>     xfread \
> diff --git a/support/xfgets.c b/support/xfgets.c
> new file mode 100644
> index 0000000000..14f98dee1b
> --- /dev/null
> +++ b/support/xfgets.c
> @@ -0,0 +1,32 @@
> +/* fgets with error checking.
> +   Copyright (C) 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;
>   }
  
Joseph Myers June 13, 2023, 6:25 p.m. UTC | #2
On Tue, 13 Jun 2023, Siddhesh Poyarekar wrote:

> > 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);
> 
> Joseph, would you apply the same rationale for these tests too, i.e. since the
> test involves interaction with stdio and signals, would you avoid adding an
> xstdio abstraction here to test stdio directly?

I think this test is using fgets to check file contents rather than 
testing particular things about how fgets behaves.

> Likewise for the stdio-common test here and in patch 3/4, what do you think?

And those look they are using fread to check contents while testing some 
other stdio functions.
  
Siddhesh Poyarekar June 13, 2023, 11:56 p.m. UTC | #3
On 2023-06-13 14:25, Joseph Myers wrote:
> On Tue, 13 Jun 2023, Siddhesh Poyarekar wrote:
> 
>>> 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);
>>
>> Joseph, would you apply the same rationale for these tests too, i.e. since the
>> test involves interaction with stdio and signals, would you avoid adding an
>> xstdio abstraction here to test stdio directly?
> 
> I think this test is using fgets to check file contents rather than
> testing particular things about how fgets behaves.
> 
>> Likewise for the stdio-common test here and in patch 3/4, what do you think?
> 
> And those look they are using fread to check contents while testing some
> other stdio functions.

OK, in that case, LGTM.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
  

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 994639a915..c81e3c928c 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -123,6 +123,7 @@  libsupport-routines = \
   xdup2 \
   xfchmod \
   xfclose \
+  xfgets \
   xfopen \
   xfork \
   xfread \
diff --git a/support/xfgets.c b/support/xfgets.c
new file mode 100644
index 0000000000..14f98dee1b
--- /dev/null
+++ b/support/xfgets.c
@@ -0,0 +1,32 @@ 
+/* fgets with error checking.
+   Copyright (C) 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;
 }