Man page for signal states: "The effects of signal() in a multithreaded process are unspecified." Switch signal() to sigaction in virsh console code. --- tools/virsh-console.c | 52 ++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/tools/virsh-console.c b/tools/virsh-console.c index cc9cc6a..135202f 100644 --- a/tools/virsh-console.c +++ b/tools/virsh-console.c @@ -312,32 +312,34 @@ vshRunConsole(vshControl *ctl, const char *escape_seq, unsigned int flags) { - int ret = -1; - void (*old_sigquit)(int); - void (*old_sigterm)(int); - void (*old_sigint)(int); - void (*old_sighup)(int); - void (*old_sigpipe)(int); virConsolePtr con = NULL; + int ret = -1; + + struct sigaction old_sigquit; + struct sigaction old_sigterm; + struct sigaction old_sigint; + struct sigaction old_sighup; + struct sigaction old_sigpipe; + struct sigaction sighandler = {.sa_handler = virConsoleHandleSignal, + .sa_flags = SA_SIGINFO }; + + sigemptyset(&sighandler.sa_mask); - /* Put STDIN into raw mode so that stuff typed - does not echo to the screen (the TTY reads will - result in it being echoed back already), and - also ensure Ctrl-C, etc is blocked, and misc - other bits */ + /* Put STDIN into raw mode so that stuff typed does not echo to the screen + * (the TTY reads will result in it being echoed back already), and also + * ensure Ctrl-C, etc is blocked, and misc other bits */ if (vshTTYMakeRaw(ctl, true) < 0) goto resettty; - /* Trap all common signals so that we can safely restore - the original terminal settings on STDIN before the - process exits - people don't like being left with a - messed up terminal ! */ - old_sigquit = signal(SIGQUIT, virConsoleHandleSignal); - old_sigterm = signal(SIGTERM, virConsoleHandleSignal); - old_sigint = signal(SIGINT, virConsoleHandleSignal); - old_sighup = signal(SIGHUP, virConsoleHandleSignal); - old_sigpipe = signal(SIGPIPE, virConsoleHandleSignal); + /* Trap all common signals so that we can safely restore the original + * terminal settings on STDIN before the process exits - people don't like + * being left with a messed up terminal ! */ got_signal = 0; + sigaction(SIGQUIT, &sighandler, &old_sigquit); + sigaction(SIGTERM, &sighandler, &old_sigterm); + sigaction(SIGINT, &sighandler, &old_sigint); + sigaction(SIGHUP, &sighandler, &old_sighup); + sigaction(SIGPIPE, &sighandler, &old_sigpipe); if (VIR_ALLOC(con) < 0) goto cleanup; @@ -384,11 +386,11 @@ cleanup: virConsoleFree(con); /* Restore original signal handlers */ - signal(SIGPIPE, old_sigpipe); - signal(SIGHUP, old_sighup); - signal(SIGINT, old_sigint); - signal(SIGTERM, old_sigterm); - signal(SIGQUIT, old_sigquit); + sigaction(SIGQUIT, &old_sigquit, NULL); + sigaction(SIGTERM, &old_sigterm, NULL); + sigaction(SIGINT, &old_sigint, NULL); + sigaction(SIGHUP, &old_sighup, NULL); + sigaction(SIGPIPE, &old_sigpipe, NULL); resettty: /* Put STDIN back into the (sane?) state we found -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list