Module Name: src Committed By: drochner Date: Fri Mar 27 10:58:38 UTC 2009
Modified Files: src/sys/kern: kern_sig.c Log Message: In sigput(), save the siginfo no matter whether SA_SIGINFO is set or not. There are also sigtimedwait(2) et al. to catch signals without invoking a signal handler. Fixes PR kern/41076 by Matteo Beccati (the first test case, where the signal is sent before sigwaitinfo(2) gets called). To generate a diff of this commit: cvs rdiff -u -r1.295 -r1.296 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.295 src/sys/kern/kern_sig.c:1.296 --- src/sys/kern/kern_sig.c:1.295 Thu Jan 22 14:38:35 2009 +++ src/sys/kern/kern_sig.c Fri Mar 27 10:58:38 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.295 2009/01/22 14:38:35 yamt Exp $ */ +/* $NetBSD: kern_sig.c,v 1.296 2009/03/27 10:58:38 drochner Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.295 2009/01/22 14:38:35 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.296 2009/03/27 10:58:38 drochner Exp $"); #include "opt_ptrace.h" #include "opt_compat_sunos.h" @@ -549,14 +549,12 @@ /* * sigput: * - * Append a new ksiginfo element to the list of pending ksiginfo's, if - * we need to (e.g. SA_SIGINFO was requested). + * Append a new ksiginfo element to the list of pending ksiginfo's. */ void sigput(sigpend_t *sp, struct proc *p, ksiginfo_t *ksi) { ksiginfo_t *kp; - struct sigaction *sa = &SIGACTION_PS(p->p_sigacts, ksi->ksi_signo); KASSERT(mutex_owned(p->p_lock)); KASSERT((ksi->ksi_flags & KSI_QUEUED) == 0); @@ -564,11 +562,9 @@ sigaddset(&sp->sp_set, ksi->ksi_signo); /* - * If there is no siginfo, or is not required (and we don't add - * it for the benefit of ktrace, we are done). + * If there is no siginfo, we are done. */ - if (KSI_EMPTY_P(ksi) || - (!KTRPOINT(p, KTR_PSIG) && (sa->sa_flags & SA_SIGINFO) == 0)) + if (KSI_EMPTY_P(ksi)) return; KASSERT((ksi->ksi_flags & KSI_FROMPOOL) != 0);