Module Name: src
Committed By: bouyer
Date: Sat Jan 16 17:32:46 UTC 2010
Modified Files:
src/sys/kern [netbsd-5-0]: kern_sig.c
Log Message:
Pull up following revision(s) (requested by rmind in ticket #1238):
sys/kern/kern_sig.c: revision 1.302
sigactsunshare(): set reference count in a case of new sigacts allocation.
Bug (e.g. memory leak) can happen when using clone(2) call.
To generate a diff of this commit:
cvs rdiff -u -r1.289.4.5 -r1.289.4.5.2.1 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.289.4.5 src/sys/kern/kern_sig.c:1.289.4.5.2.1
--- src/sys/kern/kern_sig.c:1.289.4.5 Wed Apr 1 21:56:50 2009
+++ src/sys/kern/kern_sig.c Sat Jan 16 17:32:45 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_sig.c,v 1.289.4.5 2009/04/01 21:56:50 snj Exp $ */
+/* $NetBSD: kern_sig.c,v 1.289.4.5.2.1 2010/01/16 17:32:45 bouyer 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.289.4.5 2009/04/01 21:56:50 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.289.4.5.2.1 2010/01/16 17:32:45 bouyer Exp $");
#include "opt_ptrace.h"
#include "opt_compat_sunos.h"
@@ -200,24 +200,19 @@
struct sigacts *
sigactsinit(struct proc *pp, int share)
{
- struct sigacts *ps, *ps2;
+ struct sigacts *ps = pp->p_sigacts, *ps2;
- ps = pp->p_sigacts;
-
- if (share) {
+ if (__predict_false(share)) {
atomic_inc_uint(&ps->sa_refcnt);
- ps2 = ps;
- } else {
- ps2 = pool_cache_get(sigacts_cache, PR_WAITOK);
- /* XXXAD get rid of this */
- mutex_init(&ps2->sa_mutex, MUTEX_DEFAULT, IPL_SCHED);
- mutex_enter(&ps->sa_mutex);
- memcpy(&ps2->sa_sigdesc, ps->sa_sigdesc,
- sizeof(ps2->sa_sigdesc));
- mutex_exit(&ps->sa_mutex);
- ps2->sa_refcnt = 1;
+ return ps;
}
+ ps2 = pool_cache_get(sigacts_cache, PR_WAITOK);
+ mutex_init(&ps2->sa_mutex, MUTEX_DEFAULT, IPL_SCHED);
+ ps2->sa_refcnt = 1;
+ mutex_enter(&ps->sa_mutex);
+ memcpy(ps2->sa_sigdesc, ps->sa_sigdesc, sizeof(ps2->sa_sigdesc));
+ mutex_exit(&ps->sa_mutex);
return ps2;
}
@@ -230,15 +225,16 @@
void
sigactsunshare(struct proc *p)
{
- struct sigacts *ps, *oldps;
+ struct sigacts *ps, *oldps = p->p_sigacts;
- oldps = p->p_sigacts;
- if (oldps->sa_refcnt == 1)
+ if (__predict_true(oldps->sa_refcnt == 1))
return;
+
ps = pool_cache_get(sigacts_cache, PR_WAITOK);
- /* XXXAD get rid of this */
mutex_init(&ps->sa_mutex, MUTEX_DEFAULT, IPL_SCHED);
- memset(&ps->sa_sigdesc, 0, sizeof(ps->sa_sigdesc));
+ memset(ps->sa_sigdesc, 0, sizeof(ps->sa_sigdesc));
+ ps->sa_refcnt = 1;
+
p->p_sigacts = ps;
sigactsfree(oldps);
}