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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to