Author: bryanv
Date: Tue Aug 20 19:17:01 2013
New Revision: 254579
URL: http://svnweb.freebsd.org/changeset/base/254579

Log:
  MFC r254457
    Do not use potentially stale thread in kthread_add()
  
    When an existing process is provided, the thread selected to use
    to initialize the new thread could have exited and be reaped.
    Acquire the proc lock earlier to ensure the thread remains valid.

Modified:
  stable/8/sys/kern/kern_kthread.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/kern/   (props changed)

Modified: stable/8/sys/kern/kern_kthread.c
==============================================================================
--- stable/8/sys/kern/kern_kthread.c    Tue Aug 20 19:13:13 2013        
(r254578)
+++ stable/8/sys/kern/kern_kthread.c    Tue Aug 20 19:17:01 2013        
(r254579)
@@ -256,18 +256,17 @@ kthread_add(void (*func)(void *), void *
                panic("kthread_add called too soon");
 
        /* If no process supplied, put it on proc0 */
-       if (p == NULL) {
+       if (p == NULL)
                p = &proc0;
-               oldtd = &thread0;
-       } else {
-               oldtd = FIRST_THREAD_IN_PROC(p);
-       }
 
        /* Initialize our new td  */
        newtd = thread_alloc(pages);
        if (newtd == NULL)
                return (ENOMEM);
 
+       PROC_LOCK(p);
+       oldtd = FIRST_THREAD_IN_PROC(p);
+
        bzero(&newtd->td_startzero,
            __rangeof(struct thread, td_startzero, td_endzero));
        bzero(&newtd->td_rux, sizeof(newtd->td_rux));
@@ -295,7 +294,6 @@ kthread_add(void (*func)(void *), void *
        newtd->td_ucred = crhold(p->p_ucred);
 
        /* this code almost the same as create_thread() in kern_thr.c */
-       PROC_LOCK(p);
        p->p_flag |= P_HADTHREADS;
        newtd->td_sigmask = oldtd->td_sigmask; /* XXX dubious */
        thread_link(newtd, p);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to