Use fd_getfile() instead of rewriting it.  Plus we'll need a properly
refcounted `fp' as soon as some syscalls are unlocked.

Ok?

Index: kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.335
diff -u -p -r1.335 kern_sysctl.c
--- kern/kern_sysctl.c  8 May 2018 09:03:58 -0000       1.335
+++ kern/kern_sysctl.c  8 May 2018 09:37:55 -0000
@@ -1364,11 +1364,10 @@ sysctl_file(int *name, u_int namelen, ch
                        if (pr->ps_tracevp)
                                FILLIT(NULL, NULL, KERN_FILE_TRACE, 
pr->ps_tracevp, pr);
                        for (i = 0; i < fdp->fd_nfiles; i++) {
-                               if ((fp = fdp->fd_ofiles[i]) == NULL)
-                                       continue;
-                               if (!FILE_IS_USABLE(fp))
+                               if ((fp = fd_getfile(fdp, i)) == NULL)
                                        continue;
                                FILLIT(fp, fdp, i, NULL, pr);
+                               FRELE(fp, p);
                        }
                }
                if (!matched)
@@ -1394,11 +1393,10 @@ sysctl_file(int *name, u_int namelen, ch
                        if (pr->ps_tracevp)
                                FILLIT(NULL, NULL, KERN_FILE_TRACE, 
pr->ps_tracevp, pr);
                        for (i = 0; i < fdp->fd_nfiles; i++) {
-                               if ((fp = fdp->fd_ofiles[i]) == NULL)
-                                       continue;
-                               if (!FILE_IS_USABLE(fp))
+                               if ((fp = fd_getfile(fdp, i)) == NULL)
                                        continue;
                                FILLIT(fp, fdp, i, NULL, pr);
+                               FRELE(fp, p);
                        }
                }
                break;

Reply via email to