From: Oleg Nesterov <oleg@redhat.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Dmitry Vyukov <dvyukov@google.com>,
Alexander Potapenko <glider@google.com>,
Denys Vlasenko <dvlasenk@redhat.com>,
Eric Dumazet <edumazet@google.com>,
Jan Kratochvil <jan.kratochvil@redhat.com>,
Julien Tinnes <jln@google.com>, Kees Cook <keescook@google.com>,
Kostya Serebryany <kcc@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
"Michael Kerrisk (man-pages)" <mtk.manpages@gmail.com>,
Pedro Alves <palves@redhat.com>,
Robert Swiecki <swiecki@google.com>,
Roland McGrath <roland@hack.frob.com>,
syzkaller@googlegroups.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] wait/ptrace: always assume __WALL if the child is traced
Date: Wed, 21 Oct 2015 22:44:19 +0200 [thread overview]
Message-ID: <20151021204419.GA31402@redhat.com> (raw)
In-Reply-To: <20151021124737.53825611940d7a353fee2bca@linux-foundation.org>
On 10/21, Andrew Morton wrote:
>
> On Wed, 21 Oct 2015 19:41:50 +0200 Oleg Nesterov <oleg@redhat.com> wrote:
>
> > On 10/20, Andrew Morton wrote:
> > >
> > > On Tue, 20 Oct 2015 19:17:54 +0200 Oleg Nesterov <oleg@redhat.com> wrote:
> > >
> > > > This is not a kernel bug, at least in a sense that everything works as
> > > > expected: debugger should reap a traced sub-thread before it can reap
> > > > the leader, but without __WALL/__WCLONE do_wait() ignores sub-threads.
> > > >
> > > > Unfortunately, it seems that /sbin/init in most (all?) distributions
> > > > doesn't use it and we have to change the kernel to avoid the problem.
> > >
> > > Well, to fix this a distro needs to roll out a new kernel. Or a new
> > > init(8). Is there any reason to believe that distributing/deploying a
> > > new kernel is significantly easier for everyone? Because fixing init
> > > sounds like a much preferable solution to this problem.
> >
> > I will be happy if we decide that this is userpace problem and we should
> > not fix the kernel. I simply do not know.
>
> The kernel patch sounds pretty sketchy - something we should avoid
> doing if at all possible.
Yes, I agree.
> > However, please look at 2/2 which imho makes sense regardless and looks
> > "obviously safe". Without this patch waitid() can not use __WALL, so if
> > /sbin/init uses waitid() then the userspace fix won't be one-liner. And
> > at least Fedora22 and Ubuntu use waitid().
>
> 2/2 does look sensible (needs a better changelog if it's to be a
> standalone thing),
Yes. Without 1/2 the changlelog should menetion that at least __WALL
makes sense because /sbin/init has a good reason to use waitid(WALL).
Plus it should cc -stable.
> but if we're expecting distros to fix this with an
> updated init(8) only, then they can't assume that the kernel's waitid()
> has been altered.
Well, 2/2 looks safe for every kernel version... starting from git
history at least.
> So init will need the not-one-liner version of the
> fix.
Then I think this fix will stay forever ;)
> > So personally I'd prefer 2/2 + fix-init, not sure if this can work...
>
> I'm just guessing here. Are you (or someone) able to find out which
> approach the distros will prefer, and why?
No, I have no idea, sorry.
> And what has to be done to init(8) to fix this bug when running current
> kernels?
Say, http://git.busybox.net/busybox/tree/init/init.c
at first glance it just needs
- wpid = waitpid(-1, NULL, maybe_WNOHANG);
+ wpid = waitpid(-1, NULL, maybe_WNOHANG | __WALL);
I have a testing machine running Fedora22, according to strace
/bin/systemd does
waitid(P_ALL, 0, {}, WNOHANG|WEXITED|WNOWAIT, NULL);
...
waitid(P_PID, 25558, {INFO}, WEXITED, NULL)
so it probably wants siginfo and thus it can't use waitpid. Without
2/2 systemd can probably just do something like
while (waitpid(-1, NULL, __WCLONE | WNOHANG) != ESRCH) {
log("Dmitry Vyukov detected");
}
every time it does waitid() to reap the traced subthreads.
Unless of course systemd itself uses ptrace or forks a child with
(clone_flags & CSIGNAL) != SIGCHLD. Unlikely, but who knows.
In any case I think the fix should be simple. 2/2 can help, most
probably systemd can too just add __WALL to wait options.
Oleg.
next prev parent reply other threads:[~2015-10-21 20:47 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-20 17:17 [PATCH 0/2] wait/ptrace: always assume __WALL if the child is traced Oleg Nesterov
2015-10-20 17:17 ` [PATCH 1/2] " Oleg Nesterov
2015-10-20 22:31 ` Andrew Morton
2015-10-21 3:27 ` Vasily Averin
2015-10-21 17:41 ` Oleg Nesterov
2015-10-21 19:47 ` Andrew Morton
2015-10-21 20:44 ` Oleg Nesterov [this message]
2015-10-21 19:59 ` Denys Vlasenko
2015-10-21 20:31 ` Denys Vlasenko
2015-10-21 21:47 ` Oleg Nesterov
2015-10-21 23:27 ` Denys Vlasenko
2015-10-25 15:54 ` Oleg Nesterov
2015-10-26 12:08 ` Pedro Alves
2015-10-28 16:11 ` Oleg Nesterov
2015-10-28 15:43 ` Pedro Alves
2015-10-28 19:02 ` Oleg Nesterov
2015-10-22 13:51 ` Denys Vlasenko
2015-10-20 17:17 ` [PATCH 2/2] wait: allow sys_waitid() to use __WNOTHREAD/__WCLONE/__WALL Oleg Nesterov
2015-10-20 17:36 ` [PATCH 0/2] wait/ptrace: always assume __WALL if the child is traced Oleg Nesterov
2015-10-22 14:40 ` Pedro Alves
2015-10-25 15:42 ` Oleg Nesterov
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=20151021204419.GA31402@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=dvlasenk@redhat.com \
--cc=dvyukov@google.com \
--cc=edumazet@google.com \
--cc=glider@google.com \
--cc=jan.kratochvil@redhat.com \
--cc=jln@google.com \
--cc=kcc@google.com \
--cc=keescook@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mtk.manpages@gmail.com \
--cc=palves@redhat.com \
--cc=roland@hack.frob.com \
--cc=swiecki@google.com \
--cc=syzkaller@googlegroups.com \
--cc=torvalds@linux-foundation.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.