public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Frederic Berat <fberat@redhat.com>
To: Siddhesh Poyarekar <siddhesh@gotplt.org>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH v6 2/7] tests: replace read by xread
Date: Tue, 6 Jun 2023 10:00:57 +0200	[thread overview]
Message-ID: <CAObJKZrByQa-jnvzp8e9YW-PTh-kyEM62+LoW0SfWLPZGgKh_Q@mail.gmail.com> (raw)
In-Reply-To: <a3eb41bb-d7e7-2d2d-1b12-9a33dca088f4@gotplt.org>

On Tue, Jun 6, 2023 at 8:21 AM Siddhesh Poyarekar <siddhesh@gotplt.org> wrote:
>
>
>
> On 2023-06-02 11:28, Frédéric Bérat wrote:
> > With fortification enabled, read calls return result needs to be checked,
> > has it gets the __wur macro enabled.
> > ---
> > Changes since v4/v5:
> >   - Rebased
> >
> >   dirent/tst-fdopendir.c         |  3 ++-
> >   nptl/tst-cleanup4.c            |  4 +++-
> >   support/Makefile               |  1 +
> >   support/test-container.c       |  3 ++-
> >   support/xread.c                | 36 ++++++++++++++++++++++++++++++++++
> >   support/xunistd.h              |  3 +++
> >   sysdeps/pthread/Makefile       |  2 +-
> >   sysdeps/pthread/tst-cancel11.c |  4 +++-
> >   sysdeps/pthread/tst-cancel20.c | 10 +++-------
> >   sysdeps/pthread/tst-cancel21.c |  9 ++-------
> >   sysdeps/pthread/tst-fini1mod.c |  4 +++-
> >   11 files changed, 59 insertions(+), 20 deletions(-)
> >   create mode 100644 support/xread.c
> >
> > diff --git a/dirent/tst-fdopendir.c b/dirent/tst-fdopendir.c
> > index 2c9520574d..d6a24f47db 100644
> > --- a/dirent/tst-fdopendir.c
> > +++ b/dirent/tst-fdopendir.c
> > @@ -45,7 +45,8 @@ do_test (void)
> >       }
> >
> >     char buf[5];
> > -  read(fd, buf, sizeof (buf));
> > +  xread(fd, buf, sizeof (buf));
> > +
> >     close(fd);
> >
> >     struct stat64 st2;
> > diff --git a/nptl/tst-cleanup4.c b/nptl/tst-cleanup4.c
> > index 1d3d53fb5f..f2e9f263e5 100644
> > --- a/nptl/tst-cleanup4.c
> > +++ b/nptl/tst-cleanup4.c
> > @@ -21,6 +21,8 @@
> >   #include <stdlib.h>
> >   #include <unistd.h>
> >
> > +#include <support/xunistd.h>
> > +
> >   /* LinuxThreads pthread_cleanup_{push,pop} helpers.  */
> >   extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
> >                                      void (*__routine) (void *),
> > @@ -64,7 +66,7 @@ fn_read (void)
> >       }
> >
> >     char c;
> > -  read (fds[0], &c, 1);
> > +  xread (fds[0], &c, 1);
> >   }
> >
> >
> > diff --git a/support/Makefile b/support/Makefile
> > index 130de4a985..e39001ef24 100644
> > --- a/support/Makefile
> > +++ b/support/Makefile
> > @@ -196,6 +196,7 @@ libsupport-routines = \
> >     xpthread_spin_unlock \
> >     xraise \
> >     xreadlink \
> > +  xread \
> >     xrealloc \
> >     xrecvfrom \
> >     xsendto \
> > diff --git a/support/test-container.c b/support/test-container.c
> > index 20ea19af37..788b091ea0 100644
> > --- a/support/test-container.c
> > +++ b/support/test-container.c
> > @@ -1217,7 +1217,8 @@ main (int argc, char **argv)
> >
> >     /* Get our "outside" pid from our parent.  We use this to help with
> >        debugging from outside the container.  */
> > -  read (pipes[0], &child, sizeof(child));
> > +  xread (pipes[0], &child, sizeof(child));
> > +
> >     close (pipes[0]);
> >     close (pipes[1]);
> >     sprintf (pid_buf, "%lu", (long unsigned)child);
> > diff --git a/support/xread.c b/support/xread.c
> > new file mode 100644
> > index 0000000000..215f9b4f00
> > --- /dev/null
> > +++ b/support/xread.c
> > @@ -0,0 +1,36 @@
> > +/* read with error checking and retries.
> > +   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/xunistd.h>
> > +
> > +#include <support/check.h>
> > +
> > +void
> > +xread (int fd, void *buffer, size_t length)
> > +{
> > +  char *p = buffer;
> > +  char *end = p + length;
> > +  while (p < end)
> > +    {
> > +      ssize_t ret = read (fd, p, end - p);
> > +      if (ret < 0)
> > +        FAIL_EXIT1 ("read of %zu bytes failed after %td: %m",
> > +                    length, p - (char *) buffer);
> > +      p += ret;
> > +    }
> > +}
> > diff --git a/support/xunistd.h b/support/xunistd.h
> > index 43a1e69fcb..0aa2638a8d 100644
> > --- a/support/xunistd.h
> > +++ b/support/xunistd.h
> > @@ -77,6 +77,9 @@ void xclose (int);
> >   /* Write the buffer.  Retry on short writes.  */
> >   void xwrite (int, const void *, size_t);
> >
> > +/* Read to buffer.  Retry on short reads.  */
> > +void xread (int, void *, size_t);
> > +
> >   /* Invoke mmap with a zero file offset.  */
> >   void *xmmap (void *addr, size_t length, int prot, int flags, int fd);
> >   void xmprotect (void *addr, size_t length, int prot);
> > diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
> > index 5df1109dd3..32cf4eb119 100644
> > --- a/sysdeps/pthread/Makefile
> > +++ b/sysdeps/pthread/Makefile
> > @@ -464,7 +464,7 @@ $(objpfx)tst-cancel28: $(librt)
> >
> >   $(objpfx)tst-fini1: $(shared-thread-library) $(objpfx)tst-fini1mod.so
> >
> > -$(objpfx)tst-fini1mod.so: $(shared-thread-library)
> > +$(objpfx)tst-fini1mod.so: $(libsupport) $(shared-thread-library)
> >
> >   $(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so
> >   LDFLAGS-tst-_res1mod1.so = -Wl,-soname,tst-_res1mod1.so
> > diff --git a/sysdeps/pthread/tst-cancel11.c b/sysdeps/pthread/tst-cancel11.c
> > index 4dd84d6673..449f3b9b63 100644
> > --- a/sysdeps/pthread/tst-cancel11.c
> > +++ b/sysdeps/pthread/tst-cancel11.c
> > @@ -22,6 +22,8 @@
> >   #include <string.h>
> >   #include <unistd.h>
> >
> > +#include <support/xunistd.h>
> > +
> >
> >   static pthread_barrier_t bar;
> >   static int fd[2];
> > @@ -56,7 +58,7 @@ tf (void *arg)
> >
> >     /* This call should block and be cancelable.  */
> >     char buf[20];
> > -  read (fd[0], buf, sizeof (buf));
> > +  xread (fd[0], buf, sizeof (buf));
> >
> >     pthread_cleanup_pop (0);
> >
> > diff --git a/sysdeps/pthread/tst-cancel20.c b/sysdeps/pthread/tst-cancel20.c
> > index 1d5c53049b..0f1ada3742 100644
> > --- a/sysdeps/pthread/tst-cancel20.c
> > +++ b/sysdeps/pthread/tst-cancel20.c
> > @@ -22,6 +22,8 @@
> >   #include <stdlib.h>
> >   #include <unistd.h>
> >
> > +#include <support/xunistd.h>
> > +
> >
> >   static int fd[4];
> >   static pthread_barrier_t b;
> > @@ -43,11 +45,7 @@ sh_body (void)
> >     pthread_cleanup_push (cl, (void *) 1L);
> >
> >     in_sh_body = 1;
> > -  if (read (fd[2], &c, 1) == 1)
> > -    {
> > -      puts ("read succeeded");
> > -      exit (1);
> > -    }
> > +  xread (fd[2], &c, 1);
>
> Uhmm, isn't read success a failure here?

Yep, I went too far on v2 when starting to use xread.

>
> >
> >     pthread_cleanup_pop (0);
> >   }
> > @@ -84,8 +82,6 @@ tf_body (void)
> >         exit (1);
> >       }
> >
> > -  read (fd[0], &c, 1);
> > -
>
> No replacement for this read call?

On my original change, I couldn't find any reason for this call to exist.
As far as I understand, pipes are open blocking by default, which
means read(fd[2]) should block until anything is written to fd[3].
Since there is no write, "read(fd[0])" should never be executed, and
cancellation should hit on "read(fd[2])".

If the first read succeeds, the test should fail.
If the thread isn't marked as cancelled and simply continues its
execution, the test should fail.

Since the potential race between the close and the cancel got fixed by
d0e3ffb7a58854248f1d5e737610d50cd0a60f46, I assume the second read is
superfluous.

Yet, I may have misunderstood the intent on this second read, in which
case some comment would be useful.

>
> >     pthread_cleanup_pop (0);
> >   }
> >
> > diff --git a/sysdeps/pthread/tst-cancel21.c b/sysdeps/pthread/tst-cancel21.c
> > index bc4ff308f9..c14ed37d14 100644
> > --- a/sysdeps/pthread/tst-cancel21.c
> > +++ b/sysdeps/pthread/tst-cancel21.c
> > @@ -23,6 +23,7 @@
> >   #include <sys/wait.h>
> >   #include <unistd.h>
> >
> > +#include <support/xunistd.h>
> >
> >   static int fd[4];
> >   static pthread_barrier_t b;
> > @@ -44,11 +45,7 @@ sh_body (void)
> >     pthread_cleanup_push (cl, (void *) 1L);
> >
> >     in_sh_body = 1;
> > -  if (read (fd[2], &c, 1) == 1)
> > -    {
> > -      puts ("read succeeded");
> > -      exit (1);
> > -    }
> > +  xread (fd[2], &c, 1);
>
> Likewise, read success should be a failure?
>
> >
> >     pthread_cleanup_pop (0);
> >   }
> > @@ -85,8 +82,6 @@ tf_body (void)
> >         exit (1);
> >       }
> >
> > -  read (fd[0], &c, 1);
> > -
>
> Missing xread replacement.
>
> >     pthread_cleanup_pop (0);
> >   }
> >
> > diff --git a/sysdeps/pthread/tst-fini1mod.c b/sysdeps/pthread/tst-fini1mod.c
> > index cdadf034cd..0a45f6c5f2 100644
> > --- a/sysdeps/pthread/tst-fini1mod.c
> > +++ b/sysdeps/pthread/tst-fini1mod.c
> > @@ -20,6 +20,8 @@
> >   #include <stdlib.h>
> >   #include <unistd.h>
> >
> > +#include <support/xunistd.h>
> > +
> >
> >   static void *
> >   tf (void *arg)
> > @@ -32,7 +34,7 @@ tf (void *arg)
> >       }
> >
> >     char buf[10];
> > -  read (fds[0], buf, sizeof (buf));
> > +  xread (fds[0], buf, sizeof (buf));
> >
> >     puts ("read returned");
> >     exit (1);
>


  reply	other threads:[~2023-06-06  8:01 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-18 12:11 [PATCH 0/8] Fix warn unused result Frédéric Bérat
2023-04-18 12:11 ` [PATCH 1/8] tests: fix " Frédéric Bérat
2023-04-18 12:23   ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 07/15] tests: fix warn unused result on asprintf calls Frédéric Bérat
2023-05-25  1:07     ` Siddhesh Poyarekar
2023-05-31 14:36       ` Frederic Berat
2023-04-28 12:21   ` [PATCH v4 08/15] tests: replace write by xwrite Frédéric Bérat
2023-05-25  1:16     ` Siddhesh Poyarekar
2023-06-01 16:39       ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 09/15] tests: replace read by xread Frédéric Bérat
2023-04-28 12:21   ` [PATCH v4 10/15] tests: replace system by xsystem Frédéric Bérat
2023-05-25  1:22     ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 11/15] tests: replace fread by xfread Frédéric Bérat
2023-04-28 12:21   ` [PATCH v4 12/15] tests: replace ftruncate by xftruncate Frédéric Bérat
2023-05-25  1:25     ` Siddhesh Poyarekar
2023-06-01 16:42       ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 13/15] tests: replace fgets by xfgets Frédéric Bérat
2023-04-28 12:21   ` [PATCH v4 14/15] tests: Replace various function calls with their x variant Frédéric Bérat
2023-05-25  1:29     ` Siddhesh Poyarekar
2023-05-25 16:10       ` Frederic Berat
2023-04-28 12:21   ` [PATCH v4 15/15] tests: fix warn unused results Frédéric Bérat
2023-05-25  1:35     ` Siddhesh Poyarekar
2023-06-01 14:27   ` [PATCH v5 04/12] tests: fix warn unused result on asprintf calls Frédéric Bérat
2023-06-01 16:52     ` Siddhesh Poyarekar
2023-06-01 14:27   ` [PATCH v5 07/12] tests: replace system by xsystem Frédéric Bérat
2023-06-01 16:56     ` Siddhesh Poyarekar
2023-06-01 14:27   ` [PATCH v5 12/12] tests: fix warn unused results Frédéric Bérat
2023-06-01 16:57     ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 2/8] catgets/gencat.c: fix warn unused result Frédéric Bérat
2023-04-18 12:36   ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 01/15] " Frédéric Bérat
2023-05-24 22:47     ` Siddhesh Poyarekar
2023-06-01 14:27   ` [PATCH v5 01/12] " Frédéric Bérat
2023-06-01 16:47     ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 3/8] inet/rcmd.c: " Frédéric Bérat
2023-04-18 12:37   ` Siddhesh Poyarekar
2023-04-18 13:40   ` Andreas Schwab
2023-04-18 13:50     ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 4/8] locale/programs/locarchive.c: " Frédéric Bérat
2023-04-18 12:43   ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 02/15] " Frédéric Bérat
2023-05-24 22:49     ` Siddhesh Poyarekar
2023-06-01 14:27   ` [PATCH v5 02/12] malloc/{memusage.c,memusagestat.c}: " Frédéric Bérat
2023-06-01 16:49     ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 5/8] " Frédéric Bérat
2023-04-18 12:47   ` [PATCH 5/8] malloc/{memusage.c, memusagestat.c}: " Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 03/15] malloc/{memusage.c,memusagestat.c}: " Frédéric Bérat
2023-05-25  0:50     ` Siddhesh Poyarekar
2023-06-01 15:55       ` [PATCH] Move {read,write}_all functions to a dedicated header Frédéric Bérat
2023-06-01 17:07         ` Siddhesh Poyarekar
2023-06-02  6:10           ` Frederic Berat
2023-06-02 10:01             ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 6/8] nptl_db/thread_dbP.h: fix warn unused result Frédéric Bérat
2023-04-18 12:49   ` Siddhesh Poyarekar
2023-04-18 12:51     ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 04/15] " Frédéric Bérat
2023-05-25  0:51     ` Siddhesh Poyarekar
2023-05-25  1:52       ` Siddhesh Poyarekar
2023-06-01 14:27   ` [PATCH v5 03/12] " Frédéric Bérat
2023-06-01 16:49     ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 7/8] sunrpc/netname.c: " Frédéric Bérat
2023-04-18 12:51   ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 05/15] " Frédéric Bérat
2023-05-25  0:53     ` Siddhesh Poyarekar
2023-04-18 12:11 ` [PATCH 8/8] sysdeps/pthread/eintr.c: " Frédéric Bérat
2023-04-18 12:54   ` Siddhesh Poyarekar
2023-04-28 12:21   ` [PATCH v4 06/15] " Frédéric Bérat
2023-05-25  0:59     ` Siddhesh Poyarekar
2023-04-28 12:21 ` [PATCH v4 00/15] Fix " Frédéric Bérat
2023-05-25  1:53   ` Siddhesh Poyarekar
2023-06-02 15:28 ` [PATCH v6 0/7] " Frédéric Bérat
2023-06-02 15:28   ` [PATCH v6 1/7] tests: fix warn unused result on asprintf calls Frédéric Bérat
2023-06-06  6:18     ` Siddhesh Poyarekar
2023-06-02 15:28   ` [PATCH v6 2/7] tests: replace read by xread Frédéric Bérat
2023-06-06  6:21     ` Siddhesh Poyarekar
2023-06-06  8:00       ` Frederic Berat [this message]
2023-06-12 14:22         ` Siddhesh Poyarekar
2023-06-07 19:04     ` Frederic Berat
2023-06-02 15:28   ` [PATCH v6 3/7] tests: replace system by xsystem Frédéric Bérat
2023-06-06 12:17     ` Siddhesh Poyarekar
2023-06-02 15:28   ` [PATCH v6 4/7] tests: replace fread by xfread Frédéric Bérat
2023-06-06 12:18     ` Siddhesh Poyarekar
2023-06-07 19:03     ` Frederic Berat
2023-06-02 15:28   ` [PATCH v6 5/7] tests: replace fgets by xfgets Frédéric Bérat
2023-06-06 12:20     ` Siddhesh Poyarekar
2023-06-08  5:50     ` Maxim Kuvyrkov
2023-06-08  6:57       ` Frederic Berat
2023-06-02 15:28   ` [PATCH v6 6/7] tests: Replace various function calls with their x variant Frédéric Bérat
2023-06-06 12:20     ` Siddhesh Poyarekar
2023-06-02 15:28   ` [PATCH v6 7/7] Move {read,write}_all functions to a dedicated header Frédéric Bérat
2023-06-06 12:21     ` Siddhesh Poyarekar
2023-06-12 15:18 ` [PATCH v7 0/4] Fix warn unused result Frédéric Bérat
2023-06-12 15:18   ` [PATCH v7 1/4] tests: replace read by xread Frédéric Bérat
2023-06-12 16:57     ` Joseph Myers
2023-06-13 14:22       ` Frederic Berat
2023-06-14  8:52     ` [PATCH v8 1/2] " Frédéric Bérat
2023-06-14 11:51       ` Siddhesh Poyarekar
2023-06-12 15:18   ` [PATCH v7 2/4] tests: replace system by xsystem Frédéric Bérat
2023-06-13 14:10     ` Siddhesh Poyarekar
2023-06-13 14:13     ` Adhemerval Zanella Netto
2023-06-13 14:16       ` Siddhesh Poyarekar
2023-06-14  8:52     ` [PATCH 2/2] " Frédéric Bérat
2023-06-14 11:53       ` Siddhesh Poyarekar
2023-06-12 15:18   ` [PATCH v7 3/4] tests: replace fread by xfread Frédéric Bérat
2023-06-13 23:57     ` Siddhesh Poyarekar
2023-06-12 15:18   ` [PATCH v7 4/4] tests: replace fgets by xfgets Frédéric Bérat
2023-06-13 12:23     ` Siddhesh Poyarekar
2023-06-13 18:25       ` Joseph Myers
2023-06-13 23:56         ` Siddhesh Poyarekar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAObJKZrByQa-jnvzp8e9YW-PTh-kyEM62+LoW0SfWLPZGgKh_Q@mail.gmail.com \
    --to=fberat@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=siddhesh@gotplt.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).