Diff below adds a FREF()/FRELE() dance after fd_getfile() in
sys_fcntl().   This will help upcoing diff moving FREF() inside
fd_getfile().

ok?

Index: kern/kern_descrip.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_descrip.c,v
retrieving revision 1.150
diff -u -p -r1.150 kern_descrip.c
--- kern/kern_descrip.c 12 Apr 2018 10:30:18 -0000      1.150
+++ kern/kern_descrip.c 16 Apr 2018 08:13:53 -0000
@@ -344,7 +344,7 @@ sys_fcntl(struct proc *p, void *v, regis
        } */ *uap = v;
        int fd = SCARG(uap, fd);
        struct filedesc *fdp = p->p_fd;
-       struct file *fp;
+       struct file *fp, *fp2;
        struct vnode *vp;
        int i, tmp, newmin, flg = F_POSIX;
        struct flock fl;
@@ -530,7 +530,10 @@ restart:
                        goto out;
                }
 
-               if (fp != fd_getfile(fdp, fd)) {
+               fp2 = fd_getfile(fdp, fd);
+               if (fp2 != NULL)
+                       FREF(fp2);
+               if (fp != fp2) {
                        /*
                         * We have lost the race with close() or dup2();
                         * unlock, pretend that we've won the race and that
@@ -542,6 +545,8 @@ restart:
                        VOP_ADVLOCK(vp, fdp, F_UNLCK, &fl, F_POSIX);
                        fl.l_type = F_UNLCK;
                }
+               if (fp2 != NULL)
+                       FRELE(fp2, p);
                goto out;
 
 

Reply via email to