Module Name:    src
Committed By:   christos
Date:           Sat Sep  3 19:33:40 UTC 2011

Modified Files:
        src/sys/kern: kern_sig.c

Log Message:
PR/45327: Jared McNeill: ptrace: siginfo doesn't work with traced processes
When saving the signal in p->p_xstat, clear it from the pending mask, but
don't remove it from the siginfo queue, so that next time the debugger
delivers it, the original information is found.
When posting a signal from the debugger l->l_sigpendset is not set, so we
use the process pending signal and add it back to the process pending set.


To generate a diff of this commit:
cvs rdiff -u -r1.312 -r1.313 src/sys/kern/kern_sig.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.312 src/sys/kern/kern_sig.c:1.313
--- src/sys/kern/kern_sig.c:1.312	Wed Aug 31 18:43:19 2011
+++ src/sys/kern/kern_sig.c	Sat Sep  3 15:33:40 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.312 2011/08/31 22:43:19 rmind Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.313 2011/09/03 19:33:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.312 2011/08/31 22:43:19 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.313 2011/09/03 19:33:40 christos Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_compat_sunos.h"
@@ -1850,8 +1850,12 @@
 		 */
 		if ((p->p_slflag & PSL_TRACED) != 0 &&
 		    (p->p_lflag & PL_PPWAIT) == 0 && signo != SIGKILL) {
-			/* Take the signal. */
-			(void)sigget(sp, NULL, signo, NULL);
+			/*
+			 * Take the signal, but don't remove it from the
+			 * siginfo queue, because the debugger can send
+			 * it later.
+			 */
+			sigdelset(&sp->sp_set, signo);
 			p->p_xstat = signo;
 
 			/* Emulation-specific handling of signal trace */
@@ -1966,6 +1970,7 @@
 	sig_t		action;
 	sigset_t	*returnmask;
 	ksiginfo_t	ksi;
+	sigpend_t	*sp;
 
 	l = curlwp;
 	p = l->l_proc;
@@ -1993,7 +1998,12 @@
 	 */
 	action = SIGACTION_PS(ps, signo).sa_handler;
 	l->l_ru.ru_nsignals++;
-	sigget(l->l_sigpendset, &ksi, signo, NULL);
+	if ((sp = l->l_sigpendset) == NULL) {
+		/* From the debugger */
+		sp = &p->p_sigpend;
+		sigaddset(&sp->sp_set, signo);
+	}
+	sigget(sp, &ksi, signo, NULL);
 
 	if (ktrpoint(KTR_PSIG)) {
 		mutex_exit(p->p_lock);

Reply via email to