Author: mjg
Date: Sat Aug 30 03:10:55 2014
New Revision: 270834
URL: http://svnweb.freebsd.org/changeset/base/270834

Log:
  Add missing proctree locking to fill_kinfo_proc consumers.
  
  This fixes r270444.
  
  Pointy hat:   mjg
  Reported by:  many
  MFC after:    1 week

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
  head/sys/compat/linprocfs/linprocfs.c
  head/sys/kern/imgact_elf.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c      Sat Aug 
30 02:13:09 2014        (r270833)
+++ head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c      Sat Aug 
30 03:10:55 2014        (r270834)
@@ -2311,9 +2311,11 @@ fasttrap_ioctl(struct cdev *dev, u_long 
                         * Report an error if the process doesn't exist
                         * or is actively being birthed.
                         */
+                       sx_slock(&proctree_lock);
                        p = pfind(pid);
                        if (p)
                                fill_kinfo_proc(p, &kp);
+                       sx_sunlock(&proctree_lock);
                        if (p == NULL || kp.ki_stat == SIDL) {
 #if defined(sun)
                                mutex_exit(&pidlock);
@@ -2377,9 +2379,11 @@ err:
                         * Report an error if the process doesn't exist
                         * or is actively being birthed.
                         */
+                       sx_slock(&proctree_lock);
                        p = pfind(pid);
                        if (p)
                                fill_kinfo_proc(p, &kp);
+                       sx_sunlock(&proctree_lock);
                        if (p == NULL || kp.ki_stat == SIDL) {
 #if defined(sun)
                                mutex_exit(&pidlock);

Modified: head/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- head/sys/compat/linprocfs/linprocfs.c       Sat Aug 30 02:13:09 2014        
(r270833)
+++ head/sys/compat/linprocfs/linprocfs.c       Sat Aug 30 03:10:55 2014        
(r270834)
@@ -645,8 +645,10 @@ linprocfs_doprocstat(PFS_FILL_ARGS)
        static int ratelimit = 0;
        vm_offset_t startcode, startdata;
 
+       sx_slock(&proctree_lock);
        PROC_LOCK(p);
        fill_kinfo_proc(p, &kp);
+       sx_sunlock(&proctree_lock);
        if (p->p_vmspace) {
           startcode = (vm_offset_t)p->p_vmspace->vm_taddr;
           startdata = (vm_offset_t)p->p_vmspace->vm_daddr;
@@ -722,9 +724,11 @@ linprocfs_doprocstatm(PFS_FILL_ARGS)
        struct kinfo_proc kp;
        segsz_t lsize;
 
+       sx_slock(&proctree_lock);
        PROC_LOCK(p);
        fill_kinfo_proc(p, &kp);
        PROC_UNLOCK(p);
+       sx_sunlock(&proctree_lock);
 
        /*
         * See comments in linprocfs_doprocstatus() regarding the
@@ -757,6 +761,7 @@ linprocfs_doprocstatus(PFS_FILL_ARGS)
        struct sigacts *ps;
        int i;
 
+       sx_slock(&proctree_lock);
        PROC_LOCK(p);
        td2 = FIRST_THREAD_IN_PROC(p); /* XXXKSE pretend only one thread */
 
@@ -795,6 +800,8 @@ linprocfs_doprocstatus(PFS_FILL_ARGS)
        }
 
        fill_kinfo_proc(p, &kp);
+       sx_sunlock(&proctree_lock);
+
        sbuf_printf(sb, "Name:\t%s\n",          p->p_comm); /* XXX escape */
        sbuf_printf(sb, "State:\t%s\n",         state);
 

Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c  Sat Aug 30 02:13:09 2014        (r270833)
+++ head/sys/kern/imgact_elf.c  Sat Aug 30 03:10:55 2014        (r270834)
@@ -1783,8 +1783,10 @@ __elfN(note_procstat_proc)(void *arg, st
                KASSERT(*sizep == size, ("invalid size"));
                structsize = sizeof(elf_kinfo_proc_t);
                sbuf_bcat(sb, &structsize, sizeof(structsize));
+               sx_slock(&proctree_lock);
                PROC_LOCK(p);
                kern_proc_out(p, sb, ELF_KERN_PROC_MASK);
+               sx_sunlock(&proctree_lock);
        }
        *sizep = size;
 }
_______________________________________________
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