Subject: Re: link context for signal handlers
To: Antti Kantee <pooka@cs.hut.fi>
From: Christos Zoulas <christos@zoulas.com>
List: tech-kern
Date: 07/05/2007 10:44:56
On Jul 5,  5:42pm, pooka@cs.hut.fi (Antti Kantee) wrote:
-- Subject: link context for signal handlers

| I had a problem which boiled down to a process losing its ucontext link
| in a signal handler.  Upon examination, turned out that the link context
| is always set to NULL in the kernel when a signal is dispatched and
| therefore lost when the signal handler calls setcontext() after execution.
| 
| The following patch makes everything behave the way I would expect it
| to behave.  But I'm unsure about corner bases such as multiple signal
| handlers etcetc.  Can anyone see a problem?
| 
| (The same patch obviously needs to be done for all archs, this is
| just i386)
| 
| Index: machdep.c
| ===================================================================
| RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v
| retrieving revision 1.604
| diff -u -p -r1.604 machdep.c
| --- machdep.c	26 Jun 2007 20:11:12 -0000	1.604
| +++ machdep.c	5 Jul 2007 14:41:22 -0000
| @@ -777,7 +777,7 @@ sendsig_siginfo(const ksiginfo_t *ksi, c
|  	frame.sf_si._info = ksi->ksi_info;
|  	frame.sf_uc.uc_flags = _UC_SIGMASK|_UC_VM;
|  	frame.sf_uc.uc_sigmask = *mask;
| -	frame.sf_uc.uc_link = NULL;
| +	frame.sf_uc.uc_link = l->l_ctxlink;
|  	frame.sf_uc.uc_flags |= (l->l_sigstk.ss_flags & SS_ONSTACK)
|  	    ? _UC_SETSTACK : _UC_CLRSTACK;
|  	memset(&frame.sf_uc.uc_stack, 0, sizeof(frame.sf_uc.uc_stack));
| 
| -- 

I think you are right.

christos