Message ID | 20230602152812.108497-6-fberat@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix warn unused result | expand |
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; > }
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 >
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 > > >
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; }