[v6,5/7] tests: replace fgets by xfgets
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
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
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
> >
>
@@ -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;
@@ -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;
@@ -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;
@@ -123,6 +123,7 @@ libsupport-routines = \
xdup2 \
xfchmod \
xfclose \
+ xfgets \
xfopen \
xfork \
xfreopen \
new file mode 100644
@@ -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;
+}
@@ -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
@@ -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;
}