On 10/12/2015 05:14 AM, Daniel P. Berrange wrote: > When using regular fork() the child process of course inherits > all the parents' signal handlers. If the child then proceeds > to close() any open file descriptors, it may break some of those > registered signal handlers. The child generally does not want to > ever run any of the signal handlers tha parent may have installed
s/tha/that the/ > in the short time before it exec's. The parent may also have blocked > various signals which the child process will want enabled. > > This introduces a wrapper qemu_fork() that takes care to sanitize > signal handling across fork. Before forking it blocks all signals > in the parent thread. After fork returns, the parent unblocks the > signals and carries on as usual. The child, however, resets all the > signal handlers back to their defaults before it unblocks signals. > The child process can now exec the binary in a "clean" signal > environment. > > Signed-off-by: Daniel P. Berrange <berra...@redhat.com> > --- > include/qemu/osdep.h | 16 ++++++++++++ > util/oslib-posix.c | 71 > ++++++++++++++++++++++++++++++++++++++++++++++++++++ > util/oslib-win32.c | 9 +++++++ > 3 files changed, 96 insertions(+) Looks very similar to libvirt's fork() wrapper :) > + for (i = 1; i < NSIG; i++) { > + /* Only possible errors are EFAULT or EINVAL The former > + * won't happen, the latter we expect, so no need to check > + * return value */ > + (void)sigaction(i, &sig_action, NULL); > + } Libvirt gets to rely on gnulib for a guaranteed definition of NSIG. But POSIX doesn't document it, and I'm not sure whether it is present on all platforms qemu targets. I guess we'll find out soon enough. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature