Module Name:    src
Committed By:   snj
Date:           Thu Jan  7 07:08:34 UTC 2010

Modified Files:
        src/sys/kern [netbsd-5-0]: sys_sig.c

Log Message:
Pull up following revision(s) (requested by rmind in ticket #1199):
        sys/kern/sys_sig.c: revision 1.24
sigtimedwait: fix a memory leak (which happens since newlock2 times).
Allocate ksiginfo on stack since it is safe and sigget() assumes that it is
not allocated from pool (pending signals via sigput()/sigget() "mill" should
be dynamically allocated, however).  Might be useful to revisit later.
Likely the cause of PR/40750 and indirect cause of PR/39283.


To generate a diff of this commit:
cvs rdiff -u -r1.17.4.2 -r1.17.4.2.2.1 src/sys/kern/sys_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/sys_sig.c
diff -u src/sys/kern/sys_sig.c:1.17.4.2 src/sys/kern/sys_sig.c:1.17.4.2.2.1
--- src/sys/kern/sys_sig.c:1.17.4.2	Wed Apr  1 21:43:53 2009
+++ src/sys/kern/sys_sig.c	Thu Jan  7 07:08:34 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_sig.c,v 1.17.4.2 2009/04/01 21:43:53 snj Exp $	*/
+/*	$NetBSD: sys_sig.c,v 1.17.4.2.2.1 2010/01/07 07:08:34 snj Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.17.4.2 2009/04/01 21:43:53 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.17.4.2.2.1 2010/01/07 07:08:34 snj Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_compat_netbsd.h"
@@ -622,7 +622,7 @@
 	int error, signum;
 	int timo = 0;
 	struct timespec ts, tsstart, tsnow;
-	ksiginfo_t *ksi;
+	ksiginfo_t ksi;
 
 	memset(&tsstart, 0, sizeof tsstart);	 /* XXX gcc */
 
@@ -660,13 +660,6 @@
 	 */
 	sigminusset(&sigcantmask, &l->l_sigwaitset);
 
-	/*
-	 * Allocate a ksi up front.  We can't sleep with the mutex held.
-	 */
-	ksi = ksiginfo_alloc(p, NULL, PR_WAITOK);
-	if (ksi == NULL)
-		return (ENOMEM);
-
 	mutex_enter(p->p_lock);
 
 	/*
@@ -678,8 +671,8 @@
 		goto out;
 	}
 
-	if ((signum = sigget(&p->p_sigpend, ksi, 0, &l->l_sigwaitset)) == 0)
-		signum = sigget(&l->l_sigpend, ksi, 0, &l->l_sigwaitset);
+	if ((signum = sigget(&p->p_sigpend, &ksi, 0, &l->l_sigwaitset)) == 0)
+		signum = sigget(&l->l_sigpend, &ksi, 0, &l->l_sigwaitset);
 
 	if (signum != 0) {
 		/*
@@ -692,7 +685,7 @@
 	/*
 	 * Set up the sigwait list.
 	 */
-	l->l_sigwaited = ksi;
+	l->l_sigwaited = &ksi;
 	LIST_INSERT_HEAD(&p->p_sigwaiters, l, l_sigwaiter);
 
 	/*
@@ -747,10 +740,8 @@
 	 */
  out:
 	if (error == 0)
-		error = (*put_info)(&ksi->ksi_info, SCARG(uap, info),
-		    sizeof(ksi->ksi_info));
-
-	ksiginfo_free(ksi);
+		error = (*put_info)(&ksi.ksi_info, SCARG(uap, info),
+		    sizeof(ksi.ksi_info));
 
 	return error;
 }

Reply via email to