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; }