]> git.ipfire.org Git - thirdparty/systemd.git/commit - Makefile.am
nspawn: make nspawn robust to container failure
authorDjalal Harouni <tixxdz@opendz.org>
Sat, 24 May 2014 13:58:55 +0000 (14:58 +0100)
committerLennart Poettering <lennart@poettering.net>
Sun, 25 May 2014 03:23:35 +0000 (11:23 +0800)
commite866af3acc30fcd1183a028ea3ef552b7237cc55
treed13ad460ed1206420bb7e3e7dcbda67b30c052b9
parent113cea802db444beab4783538d39966f707be788
nspawn: make nspawn robust to container failure

nspawn and the container child use eventfd to wait and notify each other
that they are ready so the container setup can be completed.

However in its current form the wait/notify event ignore errors that
may especially affect the child (container).

On errors the child will jump to the "child_fail" label and terminate
with _exit(EXIT_FAILURE) without notifying the parent. Since the eventfd
is created without the "EFD_NONBLOCK" flag, this leaves the parent
blocking on the eventfd_read() call. The container can also be killed
at any moment before execv() and the parent will not receive
notifications.

We can fix this by using cheap mechanisms, the new high level eventfd
API and handle SIGCHLD signals:

* Keep the cheap eventfd and EFD_NONBLOCK flag.

* Introduce eventfd states for parent and child to sync.
Child notifies parent with EVENTFD_CHILD_SUCCEEDED on success or
EVENTFD_CHILD_FAILED on failure and before _exit(). This prevents the
parent from waiting on an event that will never come.

* If the child is killed before execv() or before notifying the parent,
we install a NOP handler for SIGCHLD which will interrupt blocking calls
with EINTR. This gives a chance to the parent to call wait() and
terminate in main().

* If there are no errors, parent will block SIGCHLD, restore default
handler and notify child which will do execv(), then parent will pass
control to process_pty() to do its magic.

This was exposed in part by:
https://bugs.freedesktop.org/show_bug.cgi?id=76193

Reported-by: Tobias Hunger tobias.hunger@gmail.com
Makefile.am
src/nspawn/nspawn.c
src/shared/eventfd-util.c [new file with mode: 0644]
src/shared/eventfd-util.h [new file with mode: 0644]