diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2015-08-28 14:40:01 +0100 |
---|---|---|
committer | Daniel P. Berrange <berrange@redhat.com> | 2015-10-20 14:40:49 +0100 |
commit | 57cb38b3833c5215131b983f181b26d6ba9b8d35 (patch) | |
tree | e277f087c5a7c2f9a4240637936a80e2b09f89be /util/oslib-win32.c | |
parent | e0d03b8ceb52e390b8b0a5db1762a8435dd8a44e (diff) |
osdep: add qemu_fork() wrapper for safely handling signals
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 that the parent may have
installed 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 <berrange@redhat.com>
Diffstat (limited to 'util/oslib-win32.c')
-rw-r--r-- | util/oslib-win32.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 08f5a9cda2..09f9e98a40 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -496,3 +496,12 @@ int qemu_read_password(char *buf, int buf_size) buf[i] = '\0'; return 0; } + + +pid_t qemu_fork(Error **errp) +{ + errno = ENOSYS; + error_setg_errno(errp, errno, + "cannot fork child process"); + return -1; +} |