From 8f78b3085c2968f91fdacca2c4f6b1e3340b88ed Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Tue, 29 Jul 2014 11:04:46 +0900 Subject: [PATCH] Sending SIGKILL/SIGTERM resulting in SIGSEGV delivered (Redmine#194) --- arch/x86/kernel/syscall.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c index 38c1ea42..2a1ba8cc 100644 --- a/arch/x86/kernel/syscall.c +++ b/arch/x86/kernel/syscall.c @@ -160,10 +160,6 @@ do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pendin for(w = pending->sigmask.__val[0], sig = 0; w; sig++, w >>= 1); - if(sig == SIGKILL || sig == SIGTERM) - terminate(0, sig, (ihk_mc_user_context_t *)regs->rsp); - - irqstate = ihk_mc_spinlock_lock(&proc->sighandler->lock); if(regs == NULL){ /* call from syscall */ asm("movq %%gs:132, %0" : "=r" (regs)); --regs; @@ -171,6 +167,11 @@ do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pendin else{ rc = regs->rax; } + + if(sig == SIGKILL || sig == SIGTERM) + terminate(0, sig, (ihk_mc_user_context_t *)regs->rsp); + + irqstate = ihk_mc_spinlock_lock(&proc->sighandler->lock); k = proc->sighandler->action + sig - 1; if(k->sa.sa_handler == (void *)1){