unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: ebiederm@xmission.com (Eric W. Biederman)
To: Arnd Bergmann <arnd@arndb.de>
Cc: Rich Felker <dalias@libc.org>,
	 Alistair Francis <alistair.francis@wdc.com>,
	 GNU C Library <libc-alpha@sourceware.org>,
	 Adhemerval Zanella <adhemerval.zanella@linaro.org>,
	 Florian Weimer <fweimer@redhat.com>,
	 Palmer Dabbelt <palmer@sifive.com>,
	 macro@wdc.com,  Zong Li <zongbox@gmail.com>,
	 Alistair Francis <alistair23@gmail.com>,
	 Andrew Morton <akpm@linux-foundation.org>,
	 Linus Torvalds <torvalds@linux-foundation.org>,
	 Al Viro <viro@zeniv.linux.org.uk>,
	 Christian Brauner <christian@brauner.io>,
	 "H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [RFC v3 03/23] sysdeps/wait: Use waitid if avaliable
Date: Sun, 21 Jul 2019 10:45:13 -0500	[thread overview]
Message-ID: <87muh79yt2.fsf@xmission.com> (raw)
In-Reply-To: <CAK8P3a3wgavtarKxSYJGL0ME9KRZ8UsUAZw+Y5J8WpG1GQ+=mw@mail.gmail.com> (Arnd Bergmann's message of "Sun, 21 Jul 2019 16:30:55 +0200")

Arnd Bergmann <arnd@arndb.de> writes:

> On Sun, Jul 21, 2019 at 2:15 PM Eric W. Biederman <ebiederm@xmission.com> wrote:
>> Arnd Bergmann <arnd@arndb.de> writes:
>> > On Sun, Jul 21, 2019 at 6:03 AM Rich Felker <dalias@libc.org> wrote:
>> >> On Tue, Jul 16, 2019 at 05:08:48PM -0700, Alistair Francis wrote:
>> >> >  #ifdef __NR_waitpid
>> >> >    return SYSCALL_CANCEL (waitpid, pid, stat_loc, options);
>> >> > +#elif defined(__NR_waitid)
>> >> > +  __pid_t ret;
>> >> > +  idtype_t idtype = P_PID;
>> >> > +  siginfo_t infop;
>> >> > +
>> >> > +  if (pid < -1) {
>> >> > +    idtype = P_PGID;
>> >> > +    pid *= -1;
>> >> > +  } else if (pid == -1) {
>> >> > +    idtype = P_ALL;
>> >> > +  } else if (pid == 0) {
>> >> > +    idtype = P_PGID;
>> >> > +    pid = getpgrp();
>> >> > +  }
>> >> > +
>> >> > +  options |= WEXITED;
>> >> > +
>> >> > +  ret = SYSCALL_CANCEL (waitid, idtype, pid, &infop, options, NULL);
>> >>
>> >> This emulation has a fundamental race condition. Between getpgrp and
>> >> waitid, a signal handler may perform setpgrp, setsid, and/or fork in
>> >> ways that cause the wrong pgid to be passed to the waitid syscall.
>> >> There is no way around this because you cannot block signals for the
>> >> interval, since signals must be able to interrupt the waitid syscall.
>> >
>> > Interesting, I don't think anyone ever considered this race, as waitid()
>> > was clearly always /intended/ as a superset of wait(), waitpid(), wait3()
>> > and wait4(), as Roland McGrath described in the initial creation
>> > of the waitid() syscall, see
>> > https://lore.kernel.org/lkml/200408152303.i7FN3Vc3021030@magilla.sf.frob.com/
>> >
>>
>> It is definitley a problem as setpid and setpgrp and setsid are all
>> required to be signal safe, and this waitpid emulation is clearly not.
>
> Ok.
>
>> Would adding wait4 to riscv allow us to get rid of the rusage parameter
>> of the kernel's waitid?
>
> No, the kernel waitid() behavior is widely documented, and there are
> likely to be applications that rely on it across architectures.
>
> The only downside I can think of for adding wait4() is that it also
> uses 32-bit time_t in its rusage, so if we create a time64 version
> of rusage, we now have to add three more system calls (waitid,
> getrusage, and wait4) instead of just two.
>
>> I don't oppose a new syscall to take advantage of pidfd but I don't
>> think there is any need to tie the two fixes together so I would rather
>> keep them separate.  Just so we don't rush through fixing one to deal
>> with the other.
>
> I see at multiple independent issues with the current waitid():
>
> - The race that Rich pointed out
> - The lack of pidfd support
> - The usage of a 32-bit timeval structure that is incompatible with
>   the libc definition on rv32 and other 32-bit architectures with
>   a y2038-safe libc (there is no y2038 overflow in rusage itself, but
>   it requires an ugly wrapper to convert the structure)
> - The lack of nanosecond resolution in rusage that someone asked for
> - When we last talked about it, there was some debate over replacing
>   siginfo_t with a different structure.
>
> We don't have to address each one of those in a single new syscall
> (or even at all), but addressing them one at a time would risk adding
> even more system calls to do essentially just one thing that already
> has at least five versions at the libc level (wait, waitpid, wait3, wait4
> and waitid).

For the particular issue of 32bit riscv needing a working wait4 I see
one of two possibilities.

We either add P_PROCESS_PGID to the kernel's waitid or we add wait4.

I am leaning towards P_PROCESS_PGID as this is the tiny little bit
needed to make the kernel's waitid the one call that combines them all,
that it already tries to be.  Plus P_PROCESS_PGID or the equivalent in
the kernel internal version is needed if we choose to have wait4 handle
the process group id changing while wait4 is running.

Eric

  reply	other threads:[~2019-07-21 15:45 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-17  0:08 [RFC v3 00/23] RISC-V glibc port for the 32-bit Alistair Francis
2019-07-17  0:08 ` [RFC v3 01/23] sysdeps/nanosleep: Use clock_nanosleep_time64 if avaliable Alistair Francis
2019-07-17  5:16   ` Florian Weimer
2019-07-19 17:25     ` Alistair Francis
2019-07-20 14:24       ` Stepan Golosunov
2019-07-22 21:14         ` Alistair Francis
2019-07-17  0:08 ` [RFC v3 02/23] sysdeps/gettimeofday: Use clock_gettime64 " Alistair Francis
2019-07-17  7:09   ` Florian Weimer
2019-07-20  3:20     ` Rich Felker
2019-07-25 20:54       ` Joseph Myers
2019-07-17 12:43   ` Lukasz Majewski
2019-07-17 12:48     ` Lukasz Majewski
2019-07-19 22:26     ` Alistair Francis
2019-07-17  0:08 ` [RFC v3 03/23] sysdeps/wait: Use waitid " Alistair Francis
2019-07-17  5:31   ` Florian Weimer
2019-07-19 17:49     ` Alistair Francis
2019-07-22 15:58       ` Florian Weimer
2019-07-22 21:02         ` Alistair Francis
2019-07-21  4:03   ` Rich Felker
2019-07-21  4:20     ` Rich Felker
2019-07-21 11:59       ` Eric W. Biederman
2019-07-21 22:59         ` Rich Felker
2019-07-21  7:57     ` Arnd Bergmann
2019-07-21 12:15       ` Eric W. Biederman
2019-07-21 12:28         ` Christian Brauner
2019-07-21 14:30         ` Arnd Bergmann
2019-07-21 15:45           ` Eric W. Biederman [this message]
2019-07-21 17:05             ` Arnd Bergmann
2019-07-21 17:16             ` Linus Torvalds
2019-07-21 21:40               ` Eric W. Biederman
2019-07-21 23:23                 ` Rich Felker
2019-07-23  0:00                   ` Eric W. Biederman
2019-07-23  8:12                     ` Arnd Bergmann
2019-07-23  8:28                       ` Christian Brauner
2019-07-23  8:45                         ` Arnd Bergmann
2019-07-25  0:04                           ` Alistair Francis
2019-07-25  4:40                             ` Rich Felker
2019-07-25 13:15                               ` Arnd Bergmann
2019-07-25 16:06                                 ` Christian Brauner
2019-07-25 17:14                                 ` Eric W. Biederman
2019-07-25 17:30                                   ` Christian Brauner
2019-08-13 22:22                                     ` Alistair Francis
2019-08-13 23:11                                       ` Rich Felker
2019-08-14  5:07                                         ` Christian Brauner
2019-08-14 11:38                                       ` [PATCH v1 0/1] waitid: process group enhancement christian.brauner
2019-08-14 11:38                                         ` [PATCH v1 1/1] waitid: Add support for waiting for the current process group christian.brauner
2019-08-14 12:29                                           ` Oleg Nesterov
2019-08-14 12:45                                             ` Christian Brauner
2019-08-14 12:50                                               ` Oleg Nesterov
2019-08-14 12:53                                                 ` Christian Brauner
2019-08-14 13:07                                       ` [PATCH v2 0/1] waitid: process group enhancement Christian Brauner
2019-08-14 13:07                                         ` [PATCH v2 1/1] waitid: Add support for waiting for the current process group Christian Brauner
2019-08-14 14:19                                           ` Oleg Nesterov
2019-08-14 14:35                                             ` Christian Brauner
2019-08-14 15:27                                               ` Oleg Nesterov
2019-08-14 15:30                                                 ` Christian Brauner
2019-08-14 15:43                                       ` [PATCH v3 0/1] waitid: process group enhancement Christian Brauner
2019-08-14 15:44                                         ` [PATCH v3 1/1] waitid: Add support for waiting for the current process group Christian Brauner
2019-08-14 16:09                                           ` Oleg Nesterov
2019-08-14 16:15                                             ` Christian Brauner
2019-08-14 16:34                                               ` Christian Brauner
2019-08-14 16:55                                                 ` Rich Felker
2019-08-14 17:02                                                   ` Christian Brauner
2019-08-14 17:06                                                   ` Linus Torvalds
2019-08-14 18:00                                                     ` Rich Felker
2019-08-14 20:50                                             ` Christian Brauner
2019-08-14 15:58                                         ` [PATCH v3 0/1] waitid: process group enhancement Rich Felker
2019-08-14 16:13                                           ` Christian Brauner
2019-07-26 23:35                                   ` [RFC v3 03/23] sysdeps/wait: Use waitid if avaliable Alistair Francis
2019-07-17  0:08 ` [RFC v3 04/23] sysdeps/clock_gettime: Use clock_gettime64 " Alistair Francis
2019-07-17  5:38   ` Florian Weimer
2019-07-17  8:04     ` Arnd Bergmann
2019-07-17  8:44       ` Florian Weimer
2019-07-17  9:10         ` Arnd Bergmann
2019-07-17 15:16           ` Florian Weimer
2019-07-18  7:38             ` Arnd Bergmann
2019-07-18  8:18               ` Florian Weimer
2019-07-18  9:14                 ` Arnd Bergmann
2019-07-18 18:10                 ` Adhemerval Zanella
2019-07-19 21:03     ` Alistair Francis
2019-07-17  7:03   ` Andreas Schwab
2019-07-17 12:37   ` Lukasz Majewski
2019-07-17  0:08 ` [RFC v3 05/23] sysdeps/timespec_get: " Alistair Francis
2019-07-17  5:08   ` Florian Weimer
2019-07-17  7:59     ` Arnd Bergmann
2019-07-17  8:11       ` Florian Weimer
2019-07-17  8:23         ` Arnd Bergmann
2019-07-17  8:41           ` Florian Weimer
2019-07-17  8:54             ` Arnd Bergmann
2019-07-25 20:14       ` Joseph Myers
2019-07-17 12:22   ` Lukasz Majewski
2019-07-17  0:08 ` [RFC v3 06/23] Documentation for the RISC-V 32-bit port Alistair Francis
2019-07-17  0:08 ` [RFC v3 07/23] RISC-V: Use 64-bit time_t and off_t for RV32 and RV64 Alistair Francis
2019-07-17  8:27   ` Arnd Bergmann
2019-07-17 22:39     ` Alistair Francis
2019-07-18  7:41       ` Arnd Bergmann
2019-07-18 17:36         ` Alistair Francis
2019-07-19  6:44           ` Arnd Bergmann
2019-07-19 17:02             ` Alistair Francis
2019-07-17  0:09 ` [RFC v3 08/23] RISC-V: define __NR_futex as __NR_futex_time64 for 32-bit Alistair Francis
2019-07-17  0:09 ` [RFC v3 09/23] RISC-V: define __NR_* as __NR_*_time64/64 " Alistair Francis
2019-07-17  0:09 ` [RFC v3 10/23] RISC-V: define __NR_clock_getres as __NR_*_time64 " Alistair Francis
2019-07-17  0:09 ` [RFC v3 11/23] RISC-V: define __vdso_clock_getres as __vdso_clock_getres_time64 " Alistair Francis
2019-07-17  0:09 ` [RFC v3 12/23] RISC-V: define __vdso_clock_gettime as __vdso_clock_gettime64 " Alistair Francis
2019-07-17  8:16   ` Arnd Bergmann
2019-07-19 17:15     ` Alistair Francis
2019-07-17  0:09 ` [RFC v3 13/23] RISC-V: Use 64-bit timespec in clock_gettime vdso calls Alistair Francis
2019-07-17  8:13   ` Arnd Bergmann
2019-07-17  0:09 ` [RFC v3 14/23] RISC-V: Support dynamic loader for the 32-bit Alistair Francis
2019-07-17  0:09 ` [RFC v3 15/23] RISC-V: Add path of library directories " Alistair Francis
2019-07-17 12:20   ` Florian Weimer
2019-07-17  0:09 ` [RFC v3 16/23] RISC-V: The ABI implementation " Alistair Francis
2019-07-17  0:09 ` [RFC v3 17/23] RISC-V: Hard float support for the 32 bit Alistair Francis
2019-07-17  0:09 ` [RFC v3 18/23] RISC-V: Regenerate ULPs of RISC-V Alistair Francis
2019-07-17  0:09 ` [RFC v3 19/23] RISC-V: Add ABI lists Alistair Francis
2019-07-17  0:09 ` [RFC v3 20/23] RISC-V: Build Infastructure for the 32-bit Alistair Francis
2019-07-17  0:09 ` [RFC v3 21/23] RISC-V: Fix llrint and llround missing exceptions on RV32 Alistair Francis
2019-07-17 12:22   ` Florian Weimer
2019-07-17 22:32     ` Alistair Francis
2019-07-17  0:09 ` [RFC v3 22/23] Add RISC-V 32-bit target to build-many-glibcs.py Alistair Francis
2019-07-17  0:09 ` [RFC v3 23/23] RISC-V: Use 64-bit vdso syscalls Alistair Francis
2019-07-17  5:33   ` Florian Weimer
2019-07-17  8:02     ` Arnd Bergmann
2019-07-17 22:23       ` Alistair Francis
2019-07-17 23:42         ` Alistair Francis
2019-07-18  0:01           ` Alistair Francis
2019-07-19 17:14 ` [RFC v3 00/23] RISC-V glibc port for the 32-bit Alistair Francis

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

  List information: https://www.gnu.org/software/libc/involved.html

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

  git send-email \
    --in-reply-to=87muh79yt2.fsf@xmission.com \
    --to=ebiederm@xmission.com \
    --cc=adhemerval.zanella@linaro.org \
    --cc=akpm@linux-foundation.org \
    --cc=alistair.francis@wdc.com \
    --cc=alistair23@gmail.com \
    --cc=arnd@arndb.de \
    --cc=christian@brauner.io \
    --cc=dalias@libc.org \
    --cc=fweimer@redhat.com \
    --cc=hpa@zytor.com \
    --cc=libc-alpha@sourceware.org \
    --cc=macro@wdc.com \
    --cc=palmer@sifive.com \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@zeniv.linux.org.uk \
    --cc=zongbox@gmail.com \
    /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).