Author: mjg
Date: Sat Aug 22 16:57:45 2020
New Revision: 364486
URL: https://svnweb.freebsd.org/changeset/base/364486

Log:
  fd: pwd_drop after releasing filedesc lock
  
  Fixes a potential LOR against vnode lock.

Modified:
  head/sys/kern/kern_descrip.c

Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c        Sat Aug 22 15:31:56 2020        
(r364485)
+++ head/sys/kern/kern_descrip.c        Sat Aug 22 16:57:45 2020        
(r364486)
@@ -3957,7 +3957,6 @@ kern_proc_filedesc_out(struct proc *p,  struct sbuf *s
                        vrefact(pwd->pwd_jdir);
                        export_vnode_to_sb(pwd->pwd_jdir, KF_FD_TYPE_JAIL, 
FREAD, efbuf);
                }
-               pwd_drop(pwd);
        }
        lastfile = fdlastfile(fdp);
        for (i = 0; fdp->fd_refcnt > 0 && i <= lastfile; i++) {
@@ -3979,6 +3978,8 @@ kern_proc_filedesc_out(struct proc *p,  struct sbuf *s
                        break;
        }
        FILEDESC_SUNLOCK(fdp);
+       if (pwd != NULL)
+               pwd_drop(pwd);
        fddrop(fdp);
 fail:
        free(efbuf, M_TEMP);
@@ -4100,7 +4101,6 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS)
                if (pwd->pwd_jdir != NULL)
                        export_vnode_for_osysctl(pwd->pwd_jdir, 
KF_FD_TYPE_JAIL, kif,
                            okif, fdp, req);
-               pwd_drop(pwd);
        }
        lastfile = fdlastfile(fdp);
        for (i = 0; fdp->fd_refcnt > 0 && i <= lastfile; i++) {
@@ -4116,6 +4116,8 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS)
                        break;
        }
        FILEDESC_SUNLOCK(fdp);
+       if (pwd != NULL)
+               pwd_drop(pwd);
        fddrop(fdp);
        free(kif, M_TEMP);
        free(okif, M_TEMP);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to