Date: Sat, 15 Aug 2009 15:59:17 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 167368 for review Message-ID: <200908151559.n7FFxHa4083783@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167368 Change 167368 by trasz@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908151559.n7FFxHa4083783>