All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 9/11] - UML - fix signal mask on delivery error
@ 2004-11-13  2:01 Jeff Dike
  2004-11-13  0:34 ` Andrew Morton
  0 siblings, 1 reply; 12+ messages in thread
From: Jeff Dike @ 2004-11-13  2:01 UTC (permalink / raw)
  To: akpm, Blaisorblade, Bodo Stroesser; +Cc: linux-kernel

>From Bodo Stroesser - If the user stack limit is reached or the
signal stack assigned with sigaltstack() is invalid when a user signal
handler with SA_ONSTACK has to be started, the signal mask of the
interrupted user program is modified. This happens because the mask,
that should be used with the handler only, is written to
"current->blocked" even if the handler could not be started. But
without a handler, no rewrite of the original mask at sys_sigreturn
will be done. A slightly different case is sys_sigsuspend(), where the
mask is already modified when kern_do_signal() is started. "*oldset" and
"current->blocked" are not equal here and thus current->blocked has to
be set to *oldset, if an error occurs in handle_signal().
For both cases I've written small tests, and with the patch the result
is OK.
This issue is relevant for other architectures too (e.g. i386, I've
seen).

Signed-off-by: Jeff Dike <jdike@addtoit.com>

Index: 2.6.9/arch/um/kernel/signal_kern.c
===================================================================
--- 2.6.9.orig/arch/um/kernel/signal_kern.c	2004-11-12 16:24:18.000000000 -0500
+++ 2.6.9/arch/um/kernel/signal_kern.c	2004-11-12 18:05:26.000000000 -0500
@@ -79,7 +79,14 @@
 	else
 		err = setup_signal_stack_sc(sp, signr, ka, regs, oldset);
 
-	if (!err && !(ka->sa.sa_flags & SA_NODEFER)) {
+	if(err){
+		spin_lock_irq(&current->sighand->siglock);
+		current->blocked = *oldset;
+		recalc_sigpending();
+		spin_unlock_irq(&current->sighand->siglock);
+		force_sigsegv(signr, current);
+	}
+	else if(!(ka->sa.sa_flags & SA_NODEFER)){
 		spin_lock_irq(&current->sighand->siglock);
 		sigorsets(&current->blocked, &current->blocked, 
 			  &ka->sa.sa_mask);
@@ -87,9 +94,6 @@
 		recalc_sigpending();
 		spin_unlock_irq(&current->sighand->siglock);
 	}
-
-	if(err)
-		force_sigsegv(signr, current);
 }
 
 static int kern_do_signal(struct pt_regs *regs, sigset_t *oldset)


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2004-12-02 11:40 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-13  2:01 [PATCH 9/11] - UML - fix signal mask on delivery error Jeff Dike
2004-11-13  0:34 ` Andrew Morton
2004-11-14 22:13   ` Jeff Dike
2004-11-15  8:35     ` David Woodhouse
2004-11-22 15:30       ` David Woodhouse
2004-11-15 11:40     ` Bodo Stroesser
2004-11-15 17:18       ` Jeff Dike
2004-11-16  9:39         ` Bodo Stroesser
2004-11-30 14:59     ` David Woodhouse
2004-12-02  9:55       ` Bodo Stroesser
2004-12-02 11:25         ` Paul Mackerras
2004-12-02 11:40           ` Bodo Stroesser

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.