PERFORCE change 167368 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sat Aug 15 15:59:18 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167368
Change 167368 by trasz at trasz_anger on 2009/08/15 15:58:21
Fix use after free - process_exit eventhandler gets invoked
a little too early for my needs. Also, don't crash on
'hrl -u c:'.
Affected files ...
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_exit.c#12 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_fork.c#11 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#57 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#8 edit
Differences ...
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_exit.c#12 (text+ko) ====
@@ -48,6 +48,7 @@
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/lock.h>
+#include <sys/loginclass.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/pioctl.h>
@@ -765,7 +766,7 @@
hrl_proc_exiting(p);
/*
- * Free credentials, arguments, and sigacts.
+ * Free credentials, arguments, sigacts and loginclass.
*/
crfree(p->p_ucred);
p->p_ucred = NULL;
@@ -773,6 +774,8 @@
p->p_args = NULL;
sigacts_free(p->p_sigacts);
p->p_sigacts = NULL;
+ loginclass_release(p->p_loginclass);
+ p->p_loginclass = NULL;
/*
* Do any thread-system specific cleanups.
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_fork.c#11 (text+ko) ====
@@ -51,6 +51,7 @@
#include <sys/kthread.h>
#include <sys/sysctl.h>
#include <sys/lock.h>
+#include <sys/loginclass.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/priv.h>
@@ -478,6 +479,9 @@
/* Tell the prison that we exist. */
prison_proc_hold(p2->p_ucred->cr_prison);
+ /* Loginclass might want to know too. */
+ loginclass_acquire(p2->p_loginclass);
+
PROC_UNLOCK(p2);
/*
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#57 (text+ko) ====
@@ -1331,8 +1331,12 @@
static int
hrl_get_usage_lc(struct thread *td, int lcp, struct sbuf **outputsbuf)
{
- struct loginclass *lc = (struct loginclass *)lcp;
+ struct loginclass *lc;
+
+ if (lcp == HRL_SUBJECT_ID_UNDEFINED)
+ return (EINVAL);
+ lc = (struct loginclass *)lcp;
*outputsbuf = hrl_usage_to_sbuf(&lc->lc_usage);
return (0);
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#8 (text+ko) ====
@@ -228,29 +228,8 @@
}
static void
-lc_proc_fork(void *arg __unused, struct proc *parent, struct proc *child,
- int flags __unused)
-{
-
- PROC_LOCK(child);
- loginclass_acquire(child->p_loginclass);
- PROC_UNLOCK(child);
-}
-
-static void
-lc_proc_exit(void *arg __unused, struct proc *p)
-{
-
- PROC_LOCK(p);
- loginclass_release(p->p_loginclass);
- PROC_UNLOCK(p);
-}
-
-static void
lc_init(void)
{
mtx_init(&loginclasses_lock, "loginclasses lock", NULL, MTX_DEF);
- EVENTHANDLER_REGISTER(process_fork, lc_proc_fork, NULL, EVENTHANDLER_PRI_ANY);
- EVENTHANDLER_REGISTER(process_exit, lc_proc_exit, NULL, EVENTHANDLER_PRI_ANY);
}
More information about the p4-projects
mailing list