diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c index 02b6a1530bda802aa7a3fe753b58a7a88202e552..6c4b789eb252a3668020a87bdb0d55b0987b4faa 100755 --- a/src/signal/sigaction.c +++ b/src/signal/sigaction.c @@ -183,7 +183,19 @@ static void __sig_operation(unsigned int receivedSigno) void arm_signal_process(unsigned int receivedSig) { + sigset_t mask, oldmask; + + sigemptyset(&mask); + sigemptyset(&oldmask); + + sigaddset(&mask, receivedSig); + sigprocmask(SIG_BLOCK, &mask, NULL); + __sig_operation(receivedSig); + + sigprocmask(SIG_BLOCK, NULL, &oldmask); + sigdelset(&oldmask, receivedSig); + sigprocmask(SIG_SETMASK, &oldmask, NULL); } static void __sig_add_def_action() @@ -255,6 +267,7 @@ static int __sig_action_opr(int sig, const sigaction_t *act, sigaction_t *oact) sigact->act.sa_mask = act->sa_mask; sigact->act.sa_flags = act->sa_flags; } + sigprocmask(SIG_SETMASK, &act->sa_mask, NULL); pthread_spin_unlock(&sig_lite_lock); return ret; } diff --git a/src/signal/sigsuspend.c b/src/signal/sigsuspend.c index 36e0602c60bf516ea2675a56ca911e1e94c52c7d..ab1f0bda4076fc984f55c1c610fc5b7d7f999ca3 100644 --- a/src/signal/sigsuspend.c +++ b/src/signal/sigsuspend.c @@ -3,5 +3,22 @@ int sigsuspend(const sigset_t *mask) { - return syscall_cp(SYS_rt_sigsuspend, mask, _NSIG/8); -} + int ret,retval; + sigset_t oldset; + + retval = sigprocmask(SIG_BLOCK, 0, &oldset); + if (retval != 0){ + return retval; + } + + ret = syscall_cp(SYS_rt_sigsuspend, mask, _NSIG/8); + + if (ret == -1){ + retval = sigprocmask(SIG_SETMASK, &oldset, 0); + if (retval != 0){ + return retval; + } + } + + return ret; +} \ No newline at end of file