From 7f09126e068015db54c56bb982b8f91065375700 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 3 Aug 2012 15:36:34 +1000 Subject: os: don't unconditionally unblock SIGIO in OsReleaseSignals() Calling OsReleaseSignal() inside the signal handler releases SIGIO, causing the signal handler to be called again from within the handler. Practical use-case: when synaptics calls TimerSet in the signal handler, this causes the signals to be released, eventually hanging the server. Regression introduced in 08962951de. Signed-off-by: Peter Hutterer Reviewed-by: Jeremy Huddleston --- os/utils.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'os') diff --git a/os/utils.c b/os/utils.c index cdf5fd82e..947f8673a 100644 --- a/os/utils.c +++ b/os/utils.c @@ -1186,6 +1186,7 @@ OsBlockSignals(void) #ifdef SIG_BLOCK static sig_atomic_t sigio_blocked; +static sigset_t PreviousSigIOMask; #endif /** @@ -1198,13 +1199,13 @@ OsBlockSIGIO(void) #ifdef SIGIO #ifdef SIG_BLOCK if (sigio_blocked++ == 0) { - sigset_t set, old; + sigset_t set; int ret; sigemptyset(&set); sigaddset(&set, SIGIO); - sigprocmask(SIG_BLOCK, &set, &old); - ret = sigismember(&old, SIGIO); + sigprocmask(SIG_BLOCK, &set, &PreviousSigIOMask); + ret = sigismember(&PreviousSigIOMask, SIGIO); return ret; } else return 1; @@ -1218,11 +1219,7 @@ OsReleaseSIGIO(void) #ifdef SIGIO #ifdef SIG_BLOCK if (--sigio_blocked == 0) { - sigset_t set; - - sigemptyset(&set); - sigaddset(&set, SIGIO); - sigprocmask(SIG_UNBLOCK, &set, NULL); + sigprocmask(SIG_SETMASK, &PreviousSigIOMask, 0); } else if (sigio_blocked < 0) { BUG_WARN(sigio_blocked < 0); sigio_blocked = 0; -- cgit v1.2.3