]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/kern_descrip.c
Merge bmake-20210110
[FreeBSD/FreeBSD.git] / sys / kern / kern_descrip.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1982, 1986, 1989, 1991, 1993
5  *      The Regents of the University of California.  All rights reserved.
6  * (c) UNIX System Laboratories, Inc.
7  * All or some portions of this file are derived from material licensed
8  * to the University of California by American Telephone and Telegraph
9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10  * the permission of UNIX System Laboratories, Inc.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  *      @(#)kern_descrip.c      8.6 (Berkeley) 4/19/94
37  */
38
39 #include <sys/cdefs.h>
40 __FBSDID("$FreeBSD$");
41
42 #include "opt_capsicum.h"
43 #include "opt_ddb.h"
44 #include "opt_ktrace.h"
45
46 #include <sys/param.h>
47 #include <sys/systm.h>
48
49 #include <sys/capsicum.h>
50 #include <sys/conf.h>
51 #include <sys/fcntl.h>
52 #include <sys/file.h>
53 #include <sys/filedesc.h>
54 #include <sys/filio.h>
55 #include <sys/jail.h>
56 #include <sys/kernel.h>
57 #include <sys/limits.h>
58 #include <sys/lock.h>
59 #include <sys/malloc.h>
60 #include <sys/mount.h>
61 #include <sys/mutex.h>
62 #include <sys/namei.h>
63 #include <sys/selinfo.h>
64 #include <sys/priv.h>
65 #include <sys/proc.h>
66 #include <sys/protosw.h>
67 #include <sys/racct.h>
68 #include <sys/resourcevar.h>
69 #include <sys/sbuf.h>
70 #include <sys/signalvar.h>
71 #include <sys/kdb.h>
72 #include <sys/smr.h>
73 #include <sys/stat.h>
74 #include <sys/sx.h>
75 #include <sys/syscallsubr.h>
76 #include <sys/sysctl.h>
77 #include <sys/sysproto.h>
78 #include <sys/unistd.h>
79 #include <sys/user.h>
80 #include <sys/vnode.h>
81 #ifdef KTRACE
82 #include <sys/ktrace.h>
83 #endif
84
85 #include <net/vnet.h>
86
87 #include <security/audit/audit.h>
88
89 #include <vm/uma.h>
90 #include <vm/vm.h>
91
92 #include <ddb/ddb.h>
93
94 static MALLOC_DEFINE(M_FILEDESC, "filedesc", "Open file descriptor table");
95 static MALLOC_DEFINE(M_PWD, "pwd", "Descriptor table vnodes");
96 static MALLOC_DEFINE(M_PWDDESC, "pwddesc", "Pwd descriptors");
97 static MALLOC_DEFINE(M_FILEDESC_TO_LEADER, "filedesc_to_leader",
98     "file desc to leader structures");
99 static MALLOC_DEFINE(M_SIGIO, "sigio", "sigio structures");
100 MALLOC_DEFINE(M_FILECAPS, "filecaps", "descriptor capabilities");
101
102 MALLOC_DECLARE(M_FADVISE);
103
104 static __read_mostly uma_zone_t file_zone;
105 static __read_mostly uma_zone_t filedesc0_zone;
106 __read_mostly uma_zone_t pwd_zone;
107 VFS_SMR_DECLARE;
108
109 static int      closefp(struct filedesc *fdp, int fd, struct file *fp,
110                     struct thread *td, bool holdleaders, bool audit);
111 static int      fd_first_free(struct filedesc *fdp, int low, int size);
112 static void     fdgrowtable(struct filedesc *fdp, int nfd);
113 static void     fdgrowtable_exp(struct filedesc *fdp, int nfd);
114 static void     fdunused(struct filedesc *fdp, int fd);
115 static void     fdused(struct filedesc *fdp, int fd);
116 static int      getmaxfd(struct thread *td);
117 static u_long   *filecaps_copy_prep(const struct filecaps *src);
118 static void     filecaps_copy_finish(const struct filecaps *src,
119                     struct filecaps *dst, u_long *ioctls);
120 static u_long   *filecaps_free_prep(struct filecaps *fcaps);
121 static void     filecaps_free_finish(u_long *ioctls);
122
123 static struct pwd *pwd_alloc(void);
124
125 /*
126  * Each process has:
127  *
128  * - An array of open file descriptors (fd_ofiles)
129  * - An array of file flags (fd_ofileflags)
130  * - A bitmap recording which descriptors are in use (fd_map)
131  *
132  * A process starts out with NDFILE descriptors.  The value of NDFILE has
133  * been selected based the historical limit of 20 open files, and an
134  * assumption that the majority of processes, especially short-lived
135  * processes like shells, will never need more.
136  *
137  * If this initial allocation is exhausted, a larger descriptor table and
138  * map are allocated dynamically, and the pointers in the process's struct
139  * filedesc are updated to point to those.  This is repeated every time
140  * the process runs out of file descriptors (provided it hasn't hit its
141  * resource limit).
142  *
143  * Since threads may hold references to individual descriptor table
144  * entries, the tables are never freed.  Instead, they are placed on a
145  * linked list and freed only when the struct filedesc is released.
146  */
147 #define NDFILE          20
148 #define NDSLOTSIZE      sizeof(NDSLOTTYPE)
149 #define NDENTRIES       (NDSLOTSIZE * __CHAR_BIT)
150 #define NDSLOT(x)       ((x) / NDENTRIES)
151 #define NDBIT(x)        ((NDSLOTTYPE)1 << ((x) % NDENTRIES))
152 #define NDSLOTS(x)      (((x) + NDENTRIES - 1) / NDENTRIES)
153
154 /*
155  * SLIST entry used to keep track of ofiles which must be reclaimed when
156  * the process exits.
157  */
158 struct freetable {
159         struct fdescenttbl *ft_table;
160         SLIST_ENTRY(freetable) ft_next;
161 };
162
163 /*
164  * Initial allocation: a filedesc structure + the head of SLIST used to
165  * keep track of old ofiles + enough space for NDFILE descriptors.
166  */
167
168 struct fdescenttbl0 {
169         int     fdt_nfiles;
170         struct  filedescent fdt_ofiles[NDFILE];
171 };
172
173 struct filedesc0 {
174         struct filedesc fd_fd;
175         SLIST_HEAD(, freetable) fd_free;
176         struct  fdescenttbl0 fd_dfiles;
177         NDSLOTTYPE fd_dmap[NDSLOTS(NDFILE)];
178 };
179
180 /*
181  * Descriptor management.
182  */
183 static int __exclusive_cache_line openfiles; /* actual number of open files */
184 struct mtx sigio_lock;          /* mtx to protect pointers to sigio */
185 void __read_mostly (*mq_fdclose)(struct thread *td, int fd, struct file *fp);
186
187 /*
188  * If low >= size, just return low. Otherwise find the first zero bit in the
189  * given bitmap, starting at low and not exceeding size - 1. Return size if
190  * not found.
191  */
192 static int
193 fd_first_free(struct filedesc *fdp, int low, int size)
194 {
195         NDSLOTTYPE *map = fdp->fd_map;
196         NDSLOTTYPE mask;
197         int off, maxoff;
198
199         if (low >= size)
200                 return (low);
201
202         off = NDSLOT(low);
203         if (low % NDENTRIES) {
204                 mask = ~(~(NDSLOTTYPE)0 >> (NDENTRIES - (low % NDENTRIES)));
205                 if ((mask &= ~map[off]) != 0UL)
206                         return (off * NDENTRIES + ffsl(mask) - 1);
207                 ++off;
208         }
209         for (maxoff = NDSLOTS(size); off < maxoff; ++off)
210                 if (map[off] != ~0UL)
211                         return (off * NDENTRIES + ffsl(~map[off]) - 1);
212         return (size);
213 }
214
215 /*
216  * Find the last used fd.
217  *
218  * Call this variant if fdp can't be modified by anyone else (e.g, during exec).
219  * Otherwise use fdlastfile.
220  */
221 int
222 fdlastfile_single(struct filedesc *fdp)
223 {
224         NDSLOTTYPE *map = fdp->fd_map;
225         int off, minoff;
226
227         off = NDSLOT(fdp->fd_nfiles - 1);
228         for (minoff = NDSLOT(0); off >= minoff; --off)
229                 if (map[off] != 0)
230                         return (off * NDENTRIES + flsl(map[off]) - 1);
231         return (-1);
232 }
233
234 int
235 fdlastfile(struct filedesc *fdp)
236 {
237
238         FILEDESC_LOCK_ASSERT(fdp);
239         return (fdlastfile_single(fdp));
240 }
241
242 static int
243 fdisused(struct filedesc *fdp, int fd)
244 {
245
246         KASSERT(fd >= 0 && fd < fdp->fd_nfiles,
247             ("file descriptor %d out of range (0, %d)", fd, fdp->fd_nfiles));
248
249         return ((fdp->fd_map[NDSLOT(fd)] & NDBIT(fd)) != 0);
250 }
251
252 /*
253  * Mark a file descriptor as used.
254  */
255 static void
256 fdused_init(struct filedesc *fdp, int fd)
257 {
258
259         KASSERT(!fdisused(fdp, fd), ("fd=%d is already used", fd));
260
261         fdp->fd_map[NDSLOT(fd)] |= NDBIT(fd);
262 }
263
264 static void
265 fdused(struct filedesc *fdp, int fd)
266 {
267
268         FILEDESC_XLOCK_ASSERT(fdp);
269
270         fdused_init(fdp, fd);
271         if (fd == fdp->fd_freefile)
272                 fdp->fd_freefile++;
273 }
274
275 /*
276  * Mark a file descriptor as unused.
277  */
278 static void
279 fdunused(struct filedesc *fdp, int fd)
280 {
281
282         FILEDESC_XLOCK_ASSERT(fdp);
283
284         KASSERT(fdisused(fdp, fd), ("fd=%d is already unused", fd));
285         KASSERT(fdp->fd_ofiles[fd].fde_file == NULL,
286             ("fd=%d is still in use", fd));
287
288         fdp->fd_map[NDSLOT(fd)] &= ~NDBIT(fd);
289         if (fd < fdp->fd_freefile)
290                 fdp->fd_freefile = fd;
291 }
292
293 /*
294  * Free a file descriptor.
295  *
296  * Avoid some work if fdp is about to be destroyed.
297  */
298 static inline void
299 fdefree_last(struct filedescent *fde)
300 {
301
302         filecaps_free(&fde->fde_caps);
303 }
304
305 static inline void
306 fdfree(struct filedesc *fdp, int fd)
307 {
308         struct filedescent *fde;
309
310         FILEDESC_XLOCK_ASSERT(fdp);
311         fde = &fdp->fd_ofiles[fd];
312 #ifdef CAPABILITIES
313         seqc_write_begin(&fde->fde_seqc);
314 #endif
315         fde->fde_file = NULL;
316 #ifdef CAPABILITIES
317         seqc_write_end(&fde->fde_seqc);
318 #endif
319         fdefree_last(fde);
320         fdunused(fdp, fd);
321 }
322
323 /*
324  * System calls on descriptors.
325  */
326 #ifndef _SYS_SYSPROTO_H_
327 struct getdtablesize_args {
328         int     dummy;
329 };
330 #endif
331 /* ARGSUSED */
332 int
333 sys_getdtablesize(struct thread *td, struct getdtablesize_args *uap)
334 {
335 #ifdef  RACCT
336         uint64_t lim;
337 #endif
338
339         td->td_retval[0] = getmaxfd(td);
340 #ifdef  RACCT
341         PROC_LOCK(td->td_proc);
342         lim = racct_get_limit(td->td_proc, RACCT_NOFILE);
343         PROC_UNLOCK(td->td_proc);
344         if (lim < td->td_retval[0])
345                 td->td_retval[0] = lim;
346 #endif
347         return (0);
348 }
349
350 /*
351  * Duplicate a file descriptor to a particular value.
352  *
353  * Note: keep in mind that a potential race condition exists when closing
354  * descriptors from a shared descriptor table (via rfork).
355  */
356 #ifndef _SYS_SYSPROTO_H_
357 struct dup2_args {
358         u_int   from;
359         u_int   to;
360 };
361 #endif
362 /* ARGSUSED */
363 int
364 sys_dup2(struct thread *td, struct dup2_args *uap)
365 {
366
367         return (kern_dup(td, FDDUP_FIXED, 0, (int)uap->from, (int)uap->to));
368 }
369
370 /*
371  * Duplicate a file descriptor.
372  */
373 #ifndef _SYS_SYSPROTO_H_
374 struct dup_args {
375         u_int   fd;
376 };
377 #endif
378 /* ARGSUSED */
379 int
380 sys_dup(struct thread *td, struct dup_args *uap)
381 {
382
383         return (kern_dup(td, FDDUP_NORMAL, 0, (int)uap->fd, 0));
384 }
385
386 /*
387  * The file control system call.
388  */
389 #ifndef _SYS_SYSPROTO_H_
390 struct fcntl_args {
391         int     fd;
392         int     cmd;
393         long    arg;
394 };
395 #endif
396 /* ARGSUSED */
397 int
398 sys_fcntl(struct thread *td, struct fcntl_args *uap)
399 {
400
401         return (kern_fcntl_freebsd(td, uap->fd, uap->cmd, uap->arg));
402 }
403
404 int
405 kern_fcntl_freebsd(struct thread *td, int fd, int cmd, long arg)
406 {
407         struct flock fl;
408         struct __oflock ofl;
409         intptr_t arg1;
410         int error, newcmd;
411
412         error = 0;
413         newcmd = cmd;
414         switch (cmd) {
415         case F_OGETLK:
416         case F_OSETLK:
417         case F_OSETLKW:
418                 /*
419                  * Convert old flock structure to new.
420                  */
421                 error = copyin((void *)(intptr_t)arg, &ofl, sizeof(ofl));
422                 fl.l_start = ofl.l_start;
423                 fl.l_len = ofl.l_len;
424                 fl.l_pid = ofl.l_pid;
425                 fl.l_type = ofl.l_type;
426                 fl.l_whence = ofl.l_whence;
427                 fl.l_sysid = 0;
428
429                 switch (cmd) {
430                 case F_OGETLK:
431                         newcmd = F_GETLK;
432                         break;
433                 case F_OSETLK:
434                         newcmd = F_SETLK;
435                         break;
436                 case F_OSETLKW:
437                         newcmd = F_SETLKW;
438                         break;
439                 }
440                 arg1 = (intptr_t)&fl;
441                 break;
442         case F_GETLK:
443         case F_SETLK:
444         case F_SETLKW:
445         case F_SETLK_REMOTE:
446                 error = copyin((void *)(intptr_t)arg, &fl, sizeof(fl));
447                 arg1 = (intptr_t)&fl;
448                 break;
449         default:
450                 arg1 = arg;
451                 break;
452         }
453         if (error)
454                 return (error);
455         error = kern_fcntl(td, fd, newcmd, arg1);
456         if (error)
457                 return (error);
458         if (cmd == F_OGETLK) {
459                 ofl.l_start = fl.l_start;
460                 ofl.l_len = fl.l_len;
461                 ofl.l_pid = fl.l_pid;
462                 ofl.l_type = fl.l_type;
463                 ofl.l_whence = fl.l_whence;
464                 error = copyout(&ofl, (void *)(intptr_t)arg, sizeof(ofl));
465         } else if (cmd == F_GETLK) {
466                 error = copyout(&fl, (void *)(intptr_t)arg, sizeof(fl));
467         }
468         return (error);
469 }
470
471 int
472 kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg)
473 {
474         struct filedesc *fdp;
475         struct flock *flp;
476         struct file *fp, *fp2;
477         struct filedescent *fde;
478         struct proc *p;
479         struct vnode *vp;
480         struct mount *mp;
481         int error, flg, seals, tmp;
482         uint64_t bsize;
483         off_t foffset;
484
485         error = 0;
486         flg = F_POSIX;
487         p = td->td_proc;
488         fdp = p->p_fd;
489
490         AUDIT_ARG_FD(cmd);
491         AUDIT_ARG_CMD(cmd);
492         switch (cmd) {
493         case F_DUPFD:
494                 tmp = arg;
495                 error = kern_dup(td, FDDUP_FCNTL, 0, fd, tmp);
496                 break;
497
498         case F_DUPFD_CLOEXEC:
499                 tmp = arg;
500                 error = kern_dup(td, FDDUP_FCNTL, FDDUP_FLAG_CLOEXEC, fd, tmp);
501                 break;
502
503         case F_DUP2FD:
504                 tmp = arg;
505                 error = kern_dup(td, FDDUP_FIXED, 0, fd, tmp);
506                 break;
507
508         case F_DUP2FD_CLOEXEC:
509                 tmp = arg;
510                 error = kern_dup(td, FDDUP_FIXED, FDDUP_FLAG_CLOEXEC, fd, tmp);
511                 break;
512
513         case F_GETFD:
514                 error = EBADF;
515                 FILEDESC_SLOCK(fdp);
516                 fde = fdeget_locked(fdp, fd);
517                 if (fde != NULL) {
518                         td->td_retval[0] =
519                             (fde->fde_flags & UF_EXCLOSE) ? FD_CLOEXEC : 0;
520                         error = 0;
521                 }
522                 FILEDESC_SUNLOCK(fdp);
523                 break;
524
525         case F_SETFD:
526                 error = EBADF;
527                 FILEDESC_XLOCK(fdp);
528                 fde = fdeget_locked(fdp, fd);
529                 if (fde != NULL) {
530                         fde->fde_flags = (fde->fde_flags & ~UF_EXCLOSE) |
531                             (arg & FD_CLOEXEC ? UF_EXCLOSE : 0);
532                         error = 0;
533                 }
534                 FILEDESC_XUNLOCK(fdp);
535                 break;
536
537         case F_GETFL:
538                 error = fget_fcntl(td, fd, &cap_fcntl_rights, F_GETFL, &fp);
539                 if (error != 0)
540                         break;
541                 td->td_retval[0] = OFLAGS(fp->f_flag);
542                 fdrop(fp, td);
543                 break;
544
545         case F_SETFL:
546                 error = fget_fcntl(td, fd, &cap_fcntl_rights, F_SETFL, &fp);
547                 if (error != 0)
548                         break;
549                 do {
550                         tmp = flg = fp->f_flag;
551                         tmp &= ~FCNTLFLAGS;
552                         tmp |= FFLAGS(arg & ~O_ACCMODE) & FCNTLFLAGS;
553                 } while(atomic_cmpset_int(&fp->f_flag, flg, tmp) == 0);
554                 tmp = fp->f_flag & FNONBLOCK;
555                 error = fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
556                 if (error != 0) {
557                         fdrop(fp, td);
558                         break;
559                 }
560                 tmp = fp->f_flag & FASYNC;
561                 error = fo_ioctl(fp, FIOASYNC, &tmp, td->td_ucred, td);
562                 if (error == 0) {
563                         fdrop(fp, td);
564                         break;
565                 }
566                 atomic_clear_int(&fp->f_flag, FNONBLOCK);
567                 tmp = 0;
568                 (void)fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
569                 fdrop(fp, td);
570                 break;
571
572         case F_GETOWN:
573                 error = fget_fcntl(td, fd, &cap_fcntl_rights, F_GETOWN, &fp);
574                 if (error != 0)
575                         break;
576                 error = fo_ioctl(fp, FIOGETOWN, &tmp, td->td_ucred, td);
577                 if (error == 0)
578                         td->td_retval[0] = tmp;
579                 fdrop(fp, td);
580                 break;
581
582         case F_SETOWN:
583                 error = fget_fcntl(td, fd, &cap_fcntl_rights, F_SETOWN, &fp);
584                 if (error != 0)
585                         break;
586                 tmp = arg;
587                 error = fo_ioctl(fp, FIOSETOWN, &tmp, td->td_ucred, td);
588                 fdrop(fp, td);
589                 break;
590
591         case F_SETLK_REMOTE:
592                 error = priv_check(td, PRIV_NFS_LOCKD);
593                 if (error != 0)
594                         return (error);
595                 flg = F_REMOTE;
596                 goto do_setlk;
597
598         case F_SETLKW:
599                 flg |= F_WAIT;
600                 /* FALLTHROUGH F_SETLK */
601
602         case F_SETLK:
603         do_setlk:
604                 flp = (struct flock *)arg;
605                 if ((flg & F_REMOTE) != 0 && flp->l_sysid == 0) {
606                         error = EINVAL;
607                         break;
608                 }
609
610                 error = fget_unlocked(fdp, fd, &cap_flock_rights, &fp);
611                 if (error != 0)
612                         break;
613                 if (fp->f_type != DTYPE_VNODE) {
614                         error = EBADF;
615                         fdrop(fp, td);
616                         break;
617                 }
618
619                 if (flp->l_whence == SEEK_CUR) {
620                         foffset = foffset_get(fp);
621                         if (foffset < 0 ||
622                             (flp->l_start > 0 &&
623                              foffset > OFF_MAX - flp->l_start)) {
624                                 error = EOVERFLOW;
625                                 fdrop(fp, td);
626                                 break;
627                         }
628                         flp->l_start += foffset;
629                 }
630
631                 vp = fp->f_vnode;
632                 switch (flp->l_type) {
633                 case F_RDLCK:
634                         if ((fp->f_flag & FREAD) == 0) {
635                                 error = EBADF;
636                                 break;
637                         }
638                         if ((p->p_leader->p_flag & P_ADVLOCK) == 0) {
639                                 PROC_LOCK(p->p_leader);
640                                 p->p_leader->p_flag |= P_ADVLOCK;
641                                 PROC_UNLOCK(p->p_leader);
642                         }
643                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
644                             flp, flg);
645                         break;
646                 case F_WRLCK:
647                         if ((fp->f_flag & FWRITE) == 0) {
648                                 error = EBADF;
649                                 break;
650                         }
651                         if ((p->p_leader->p_flag & P_ADVLOCK) == 0) {
652                                 PROC_LOCK(p->p_leader);
653                                 p->p_leader->p_flag |= P_ADVLOCK;
654                                 PROC_UNLOCK(p->p_leader);
655                         }
656                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
657                             flp, flg);
658                         break;
659                 case F_UNLCK:
660                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK,
661                             flp, flg);
662                         break;
663                 case F_UNLCKSYS:
664                         if (flg != F_REMOTE) {
665                                 error = EINVAL;
666                                 break;
667                         }
668                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader,
669                             F_UNLCKSYS, flp, flg);
670                         break;
671                 default:
672                         error = EINVAL;
673                         break;
674                 }
675                 if (error != 0 || flp->l_type == F_UNLCK ||
676                     flp->l_type == F_UNLCKSYS) {
677                         fdrop(fp, td);
678                         break;
679                 }
680
681                 /*
682                  * Check for a race with close.
683                  *
684                  * The vnode is now advisory locked (or unlocked, but this case
685                  * is not really important) as the caller requested.
686                  * We had to drop the filedesc lock, so we need to recheck if
687                  * the descriptor is still valid, because if it was closed
688                  * in the meantime we need to remove advisory lock from the
689                  * vnode - close on any descriptor leading to an advisory
690                  * locked vnode, removes that lock.
691                  * We will return 0 on purpose in that case, as the result of
692                  * successful advisory lock might have been externally visible
693                  * already. This is fine - effectively we pretend to the caller
694                  * that the closing thread was a bit slower and that the
695                  * advisory lock succeeded before the close.
696                  */
697                 error = fget_unlocked(fdp, fd, &cap_no_rights, &fp2);
698                 if (error != 0) {
699                         fdrop(fp, td);
700                         break;
701                 }
702                 if (fp != fp2) {
703                         flp->l_whence = SEEK_SET;
704                         flp->l_start = 0;
705                         flp->l_len = 0;
706                         flp->l_type = F_UNLCK;
707                         (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader,
708                             F_UNLCK, flp, F_POSIX);
709                 }
710                 fdrop(fp, td);
711                 fdrop(fp2, td);
712                 break;
713
714         case F_GETLK:
715                 error = fget_unlocked(fdp, fd, &cap_flock_rights, &fp);
716                 if (error != 0)
717                         break;
718                 if (fp->f_type != DTYPE_VNODE) {
719                         error = EBADF;
720                         fdrop(fp, td);
721                         break;
722                 }
723                 flp = (struct flock *)arg;
724                 if (flp->l_type != F_RDLCK && flp->l_type != F_WRLCK &&
725                     flp->l_type != F_UNLCK) {
726                         error = EINVAL;
727                         fdrop(fp, td);
728                         break;
729                 }
730                 if (flp->l_whence == SEEK_CUR) {
731                         foffset = foffset_get(fp);
732                         if ((flp->l_start > 0 &&
733                             foffset > OFF_MAX - flp->l_start) ||
734                             (flp->l_start < 0 &&
735                             foffset < OFF_MIN - flp->l_start)) {
736                                 error = EOVERFLOW;
737                                 fdrop(fp, td);
738                                 break;
739                         }
740                         flp->l_start += foffset;
741                 }
742                 vp = fp->f_vnode;
743                 error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_GETLK, flp,
744                     F_POSIX);
745                 fdrop(fp, td);
746                 break;
747
748         case F_ADD_SEALS:
749                 error = fget_unlocked(fdp, fd, &cap_no_rights, &fp);
750                 if (error != 0)
751                         break;
752                 error = fo_add_seals(fp, arg);
753                 fdrop(fp, td);
754                 break;
755
756         case F_GET_SEALS:
757                 error = fget_unlocked(fdp, fd, &cap_no_rights, &fp);
758                 if (error != 0)
759                         break;
760                 if (fo_get_seals(fp, &seals) == 0)
761                         td->td_retval[0] = seals;
762                 else
763                         error = EINVAL;
764                 fdrop(fp, td);
765                 break;
766
767         case F_RDAHEAD:
768                 arg = arg ? 128 * 1024: 0;
769                 /* FALLTHROUGH */
770         case F_READAHEAD:
771                 error = fget_unlocked(fdp, fd, &cap_no_rights, &fp);
772                 if (error != 0)
773                         break;
774                 if (fp->f_type != DTYPE_VNODE) {
775                         fdrop(fp, td);
776                         error = EBADF;
777                         break;
778                 }
779                 vp = fp->f_vnode;
780                 if (vp->v_type != VREG) {
781                         fdrop(fp, td);
782                         error = ENOTTY;
783                         break;
784                 }
785
786                 /*
787                  * Exclusive lock synchronizes against f_seqcount reads and
788                  * writes in sequential_heuristic().
789                  */
790                 error = vn_lock(vp, LK_EXCLUSIVE);
791                 if (error != 0) {
792                         fdrop(fp, td);
793                         break;
794                 }
795                 if (arg >= 0) {
796                         bsize = fp->f_vnode->v_mount->mnt_stat.f_iosize;
797                         arg = MIN(arg, INT_MAX - bsize + 1);
798                         fp->f_seqcount[UIO_READ] = MIN(IO_SEQMAX,
799                             (arg + bsize - 1) / bsize);
800                         atomic_set_int(&fp->f_flag, FRDAHEAD);
801                 } else {
802                         atomic_clear_int(&fp->f_flag, FRDAHEAD);
803                 }
804                 VOP_UNLOCK(vp);
805                 fdrop(fp, td);
806                 break;
807
808         case F_ISUNIONSTACK:
809                 /*
810                  * Check if the vnode is part of a union stack (either the
811                  * "union" flag from mount(2) or unionfs).
812                  *
813                  * Prior to introduction of this op libc's readdir would call
814                  * fstatfs(2), in effect unnecessarily copying kilobytes of
815                  * data just to check fs name and a mount flag.
816                  *
817                  * Fixing the code to handle everything in the kernel instead
818                  * is a non-trivial endeavor and has low priority, thus this
819                  * horrible kludge facilitates the current behavior in a much
820                  * cheaper manner until someone(tm) sorts this out.
821                  */
822                 error = fget_unlocked(fdp, fd, &cap_no_rights, &fp);
823                 if (error != 0)
824                         break;
825                 if (fp->f_type != DTYPE_VNODE) {
826                         fdrop(fp, td);
827                         error = EBADF;
828                         break;
829                 }
830                 vp = fp->f_vnode;
831                 /*
832                  * Since we don't prevent dooming the vnode even non-null mp
833                  * found can become immediately stale. This is tolerable since
834                  * mount points are type-stable (providing safe memory access)
835                  * and any vfs op on this vnode going forward will return an
836                  * error (meaning return value in this case is meaningless).
837                  */
838                 mp = atomic_load_ptr(&vp->v_mount);
839                 if (__predict_false(mp == NULL)) {
840                         fdrop(fp, td);
841                         error = EBADF;
842                         break;
843                 }
844                 td->td_retval[0] = 0;
845                 if (mp->mnt_kern_flag & MNTK_UNIONFS ||
846                     mp->mnt_flag & MNT_UNION)
847                         td->td_retval[0] = 1;
848                 fdrop(fp, td);
849                 break;
850
851         default:
852                 error = EINVAL;
853                 break;
854         }
855         return (error);
856 }
857
858 static int
859 getmaxfd(struct thread *td)
860 {
861
862         return (min((int)lim_cur(td, RLIMIT_NOFILE), maxfilesperproc));
863 }
864
865 /*
866  * Common code for dup, dup2, fcntl(F_DUPFD) and fcntl(F_DUP2FD).
867  */
868 int
869 kern_dup(struct thread *td, u_int mode, int flags, int old, int new)
870 {
871         struct filedesc *fdp;
872         struct filedescent *oldfde, *newfde;
873         struct proc *p;
874         struct file *delfp, *oldfp;
875         u_long *oioctls, *nioctls;
876         int error, maxfd;
877
878         p = td->td_proc;
879         fdp = p->p_fd;
880         oioctls = NULL;
881
882         MPASS((flags & ~(FDDUP_FLAG_CLOEXEC)) == 0);
883         MPASS(mode < FDDUP_LASTMODE);
884
885         AUDIT_ARG_FD(old);
886         /* XXXRW: if (flags & FDDUP_FIXED) AUDIT_ARG_FD2(new); */
887
888         /*
889          * Verify we have a valid descriptor to dup from and possibly to
890          * dup to. Unlike dup() and dup2(), fcntl()'s F_DUPFD should
891          * return EINVAL when the new descriptor is out of bounds.
892          */
893         if (old < 0)
894                 return (EBADF);
895         if (new < 0)
896                 return (mode == FDDUP_FCNTL ? EINVAL : EBADF);
897         maxfd = getmaxfd(td);
898         if (new >= maxfd)
899                 return (mode == FDDUP_FCNTL ? EINVAL : EBADF);
900
901         error = EBADF;
902         FILEDESC_XLOCK(fdp);
903         if (fget_locked(fdp, old) == NULL)
904                 goto unlock;
905         if ((mode == FDDUP_FIXED || mode == FDDUP_MUSTREPLACE) && old == new) {
906                 td->td_retval[0] = new;
907                 if (flags & FDDUP_FLAG_CLOEXEC)
908                         fdp->fd_ofiles[new].fde_flags |= UF_EXCLOSE;
909                 error = 0;
910                 goto unlock;
911         }
912
913         oldfde = &fdp->fd_ofiles[old];
914         oldfp = oldfde->fde_file;
915         if (!fhold(oldfp))
916                 goto unlock;
917
918         /*
919          * If the caller specified a file descriptor, make sure the file
920          * table is large enough to hold it, and grab it.  Otherwise, just
921          * allocate a new descriptor the usual way.
922          */
923         switch (mode) {
924         case FDDUP_NORMAL:
925         case FDDUP_FCNTL:
926                 if ((error = fdalloc(td, new, &new)) != 0) {
927                         fdrop(oldfp, td);
928                         goto unlock;
929                 }
930                 break;
931         case FDDUP_MUSTREPLACE:
932                 /* Target file descriptor must exist. */
933                 if (fget_locked(fdp, new) == NULL) {
934                         fdrop(oldfp, td);
935                         goto unlock;
936                 }
937                 break;
938         case FDDUP_FIXED:
939                 if (new >= fdp->fd_nfiles) {
940                         /*
941                          * The resource limits are here instead of e.g.
942                          * fdalloc(), because the file descriptor table may be
943                          * shared between processes, so we can't really use
944                          * racct_add()/racct_sub().  Instead of counting the
945                          * number of actually allocated descriptors, just put
946                          * the limit on the size of the file descriptor table.
947                          */
948 #ifdef RACCT
949                         if (RACCT_ENABLED()) {
950                                 error = racct_set_unlocked(p, RACCT_NOFILE, new + 1);
951                                 if (error != 0) {
952                                         error = EMFILE;
953                                         fdrop(oldfp, td);
954                                         goto unlock;
955                                 }
956                         }
957 #endif
958                         fdgrowtable_exp(fdp, new + 1);
959                 }
960                 if (!fdisused(fdp, new))
961                         fdused(fdp, new);
962                 break;
963         default:
964                 KASSERT(0, ("%s unsupported mode %d", __func__, mode));
965         }
966
967         KASSERT(old != new, ("new fd is same as old"));
968
969         /* Refetch oldfde because the table may have grown and old one freed. */
970         oldfde = &fdp->fd_ofiles[old];
971         KASSERT(oldfp == oldfde->fde_file,
972             ("fdt_ofiles shift from growth observed at fd %d",
973             old));
974
975         newfde = &fdp->fd_ofiles[new];
976         delfp = newfde->fde_file;
977
978         nioctls = filecaps_copy_prep(&oldfde->fde_caps);
979
980         /*
981          * Duplicate the source descriptor.
982          */
983 #ifdef CAPABILITIES
984         seqc_write_begin(&newfde->fde_seqc);
985 #endif
986         oioctls = filecaps_free_prep(&newfde->fde_caps);
987         memcpy(newfde, oldfde, fde_change_size);
988         filecaps_copy_finish(&oldfde->fde_caps, &newfde->fde_caps,
989             nioctls);
990         if ((flags & FDDUP_FLAG_CLOEXEC) != 0)
991                 newfde->fde_flags = oldfde->fde_flags | UF_EXCLOSE;
992         else
993                 newfde->fde_flags = oldfde->fde_flags & ~UF_EXCLOSE;
994 #ifdef CAPABILITIES
995         seqc_write_end(&newfde->fde_seqc);
996 #endif
997         td->td_retval[0] = new;
998
999         error = 0;
1000
1001         if (delfp != NULL) {
1002                 (void) closefp(fdp, new, delfp, td, true, false);
1003                 FILEDESC_UNLOCK_ASSERT(fdp);
1004         } else {
1005 unlock:
1006                 FILEDESC_XUNLOCK(fdp);
1007         }
1008
1009         filecaps_free_finish(oioctls);
1010         return (error);
1011 }
1012
1013 static void
1014 sigiofree(struct sigio *sigio)
1015 {
1016         crfree(sigio->sio_ucred);
1017         free(sigio, M_SIGIO);
1018 }
1019
1020 static struct sigio *
1021 funsetown_locked(struct sigio *sigio)
1022 {
1023         struct proc *p;
1024         struct pgrp *pg;
1025
1026         SIGIO_ASSERT_LOCKED();
1027
1028         if (sigio == NULL)
1029                 return (NULL);
1030         *(sigio->sio_myref) = NULL;
1031         if (sigio->sio_pgid < 0) {
1032                 pg = sigio->sio_pgrp;
1033                 PGRP_LOCK(pg);
1034                 SLIST_REMOVE(&sigio->sio_pgrp->pg_sigiolst, sigio,
1035                     sigio, sio_pgsigio);
1036                 PGRP_UNLOCK(pg);
1037         } else {
1038                 p = sigio->sio_proc;
1039                 PROC_LOCK(p);
1040                 SLIST_REMOVE(&sigio->sio_proc->p_sigiolst, sigio,
1041                     sigio, sio_pgsigio);
1042                 PROC_UNLOCK(p);
1043         }
1044         return (sigio);
1045 }
1046
1047 /*
1048  * If sigio is on the list associated with a process or process group,
1049  * disable signalling from the device, remove sigio from the list and
1050  * free sigio.
1051  */
1052 void
1053 funsetown(struct sigio **sigiop)
1054 {
1055         struct sigio *sigio;
1056
1057         /* Racy check, consumers must provide synchronization. */
1058         if (*sigiop == NULL)
1059                 return;
1060
1061         SIGIO_LOCK();
1062         sigio = funsetown_locked(*sigiop);
1063         SIGIO_UNLOCK();
1064         if (sigio != NULL)
1065                 sigiofree(sigio);
1066 }
1067
1068 /*
1069  * Free a list of sigio structures.  The caller must ensure that new sigio
1070  * structures cannot be added after this point.  For process groups this is
1071  * guaranteed using the proctree lock; for processes, the P_WEXIT flag serves
1072  * as an interlock.
1073  */
1074 void
1075 funsetownlst(struct sigiolst *sigiolst)
1076 {
1077         struct proc *p;
1078         struct pgrp *pg;
1079         struct sigio *sigio, *tmp;
1080
1081         /* Racy check. */
1082         sigio = SLIST_FIRST(sigiolst);
1083         if (sigio == NULL)
1084                 return;
1085
1086         p = NULL;
1087         pg = NULL;
1088
1089         SIGIO_LOCK();
1090         sigio = SLIST_FIRST(sigiolst);
1091         if (sigio == NULL) {
1092                 SIGIO_UNLOCK();
1093                 return;
1094         }
1095
1096         /*
1097          * Every entry of the list should belong to a single proc or pgrp.
1098          */
1099         if (sigio->sio_pgid < 0) {
1100                 pg = sigio->sio_pgrp;
1101                 sx_assert(&proctree_lock, SX_XLOCKED);
1102                 PGRP_LOCK(pg);
1103         } else /* if (sigio->sio_pgid > 0) */ {
1104                 p = sigio->sio_proc;
1105                 PROC_LOCK(p);
1106                 KASSERT((p->p_flag & P_WEXIT) != 0,
1107                     ("%s: process %p is not exiting", __func__, p));
1108         }
1109
1110         SLIST_FOREACH(sigio, sigiolst, sio_pgsigio) {
1111                 *sigio->sio_myref = NULL;
1112                 if (pg != NULL) {
1113                         KASSERT(sigio->sio_pgid < 0,
1114                             ("Proc sigio in pgrp sigio list"));
1115                         KASSERT(sigio->sio_pgrp == pg,
1116                             ("Bogus pgrp in sigio list"));
1117                 } else /* if (p != NULL) */ {
1118                         KASSERT(sigio->sio_pgid > 0,
1119                             ("Pgrp sigio in proc sigio list"));
1120                         KASSERT(sigio->sio_proc == p,
1121                             ("Bogus proc in sigio list"));
1122                 }
1123         }
1124
1125         if (pg != NULL)
1126                 PGRP_UNLOCK(pg);
1127         else
1128                 PROC_UNLOCK(p);
1129         SIGIO_UNLOCK();
1130
1131         SLIST_FOREACH_SAFE(sigio, sigiolst, sio_pgsigio, tmp)
1132                 sigiofree(sigio);
1133 }
1134
1135 /*
1136  * This is common code for FIOSETOWN ioctl called by fcntl(fd, F_SETOWN, arg).
1137  *
1138  * After permission checking, add a sigio structure to the sigio list for
1139  * the process or process group.
1140  */
1141 int
1142 fsetown(pid_t pgid, struct sigio **sigiop)
1143 {
1144         struct proc *proc;
1145         struct pgrp *pgrp;
1146         struct sigio *osigio, *sigio;
1147         int ret;
1148
1149         if (pgid == 0) {
1150                 funsetown(sigiop);
1151                 return (0);
1152         }
1153
1154         ret = 0;
1155
1156         sigio = malloc(sizeof(struct sigio), M_SIGIO, M_WAITOK);
1157         sigio->sio_pgid = pgid;
1158         sigio->sio_ucred = crhold(curthread->td_ucred);
1159         sigio->sio_myref = sigiop;
1160
1161         sx_slock(&proctree_lock);
1162         SIGIO_LOCK();
1163         osigio = funsetown_locked(*sigiop);
1164         if (pgid > 0) {
1165                 proc = pfind(pgid);
1166                 if (proc == NULL) {
1167                         ret = ESRCH;
1168                         goto fail;
1169                 }
1170
1171                 /*
1172                  * Policy - Don't allow a process to FSETOWN a process
1173                  * in another session.
1174                  *
1175                  * Remove this test to allow maximum flexibility or
1176                  * restrict FSETOWN to the current process or process
1177                  * group for maximum safety.
1178                  */
1179                 if (proc->p_session != curthread->td_proc->p_session) {
1180                         PROC_UNLOCK(proc);
1181                         ret = EPERM;
1182                         goto fail;
1183                 }
1184
1185                 sigio->sio_proc = proc;
1186                 SLIST_INSERT_HEAD(&proc->p_sigiolst, sigio, sio_pgsigio);
1187                 PROC_UNLOCK(proc);
1188         } else /* if (pgid < 0) */ {
1189                 pgrp = pgfind(-pgid);
1190                 if (pgrp == NULL) {
1191                         ret = ESRCH;
1192                         goto fail;
1193                 }
1194
1195                 /*
1196                  * Policy - Don't allow a process to FSETOWN a process
1197                  * in another session.
1198                  *
1199                  * Remove this test to allow maximum flexibility or
1200                  * restrict FSETOWN to the current process or process
1201                  * group for maximum safety.
1202                  */
1203                 if (pgrp->pg_session != curthread->td_proc->p_session) {
1204                         PGRP_UNLOCK(pgrp);
1205                         ret = EPERM;
1206                         goto fail;
1207                 }
1208
1209                 SLIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
1210                 sigio->sio_pgrp = pgrp;
1211                 PGRP_UNLOCK(pgrp);
1212         }
1213         sx_sunlock(&proctree_lock);
1214         *sigiop = sigio;
1215         SIGIO_UNLOCK();
1216         if (osigio != NULL)
1217                 sigiofree(osigio);
1218         return (0);
1219
1220 fail:
1221         SIGIO_UNLOCK();
1222         sx_sunlock(&proctree_lock);
1223         sigiofree(sigio);
1224         if (osigio != NULL)
1225                 sigiofree(osigio);
1226         return (ret);
1227 }
1228
1229 /*
1230  * This is common code for FIOGETOWN ioctl called by fcntl(fd, F_GETOWN, arg).
1231  */
1232 pid_t
1233 fgetown(struct sigio **sigiop)
1234 {
1235         pid_t pgid;
1236
1237         SIGIO_LOCK();
1238         pgid = (*sigiop != NULL) ? (*sigiop)->sio_pgid : 0;
1239         SIGIO_UNLOCK();
1240         return (pgid);
1241 }
1242
1243 static int
1244 closefp_impl(struct filedesc *fdp, int fd, struct file *fp, struct thread *td,
1245     bool audit)
1246 {
1247         int error;
1248
1249         FILEDESC_XLOCK_ASSERT(fdp);
1250
1251         /*
1252          * We now hold the fp reference that used to be owned by the
1253          * descriptor array.  We have to unlock the FILEDESC *AFTER*
1254          * knote_fdclose to prevent a race of the fd getting opened, a knote
1255          * added, and deleteing a knote for the new fd.
1256          */
1257         if (__predict_false(!TAILQ_EMPTY(&fdp->fd_kqlist)))
1258                 knote_fdclose(td, fd);
1259
1260         /*
1261          * We need to notify mqueue if the object is of type mqueue.
1262          */
1263         if (__predict_false(fp->f_type == DTYPE_MQUEUE))
1264                 mq_fdclose(td, fd, fp);
1265         FILEDESC_XUNLOCK(fdp);
1266
1267 #ifdef AUDIT
1268         if (AUDITING_TD(td) && audit)
1269                 audit_sysclose(td, fd, fp);
1270 #endif
1271         error = closef(fp, td);
1272
1273         /*
1274          * All paths leading up to closefp() will have already removed or
1275          * replaced the fd in the filedesc table, so a restart would not
1276          * operate on the same file.
1277          */
1278         if (error == ERESTART)
1279                 error = EINTR;
1280
1281         return (error);
1282 }
1283
1284 static int
1285 closefp_hl(struct filedesc *fdp, int fd, struct file *fp, struct thread *td,
1286     bool holdleaders, bool audit)
1287 {
1288         int error;
1289
1290         FILEDESC_XLOCK_ASSERT(fdp);
1291
1292         if (holdleaders) {
1293                 if (td->td_proc->p_fdtol != NULL) {
1294                         /*
1295                          * Ask fdfree() to sleep to ensure that all relevant
1296                          * process leaders can be traversed in closef().
1297                          */
1298                         fdp->fd_holdleaderscount++;
1299                 } else {
1300                         holdleaders = false;
1301                 }
1302         }
1303
1304         error = closefp_impl(fdp, fd, fp, td, audit);
1305         if (holdleaders) {
1306                 FILEDESC_XLOCK(fdp);
1307                 fdp->fd_holdleaderscount--;
1308                 if (fdp->fd_holdleaderscount == 0 &&
1309                     fdp->fd_holdleaderswakeup != 0) {
1310                         fdp->fd_holdleaderswakeup = 0;
1311                         wakeup(&fdp->fd_holdleaderscount);
1312                 }
1313                 FILEDESC_XUNLOCK(fdp);
1314         }
1315         return (error);
1316 }
1317
1318 static int
1319 closefp(struct filedesc *fdp, int fd, struct file *fp, struct thread *td,
1320     bool holdleaders, bool audit)
1321 {
1322
1323         FILEDESC_XLOCK_ASSERT(fdp);
1324
1325         if (__predict_false(td->td_proc->p_fdtol != NULL)) {
1326                 return (closefp_hl(fdp, fd, fp, td, holdleaders, audit));
1327         } else {
1328                 return (closefp_impl(fdp, fd, fp, td, audit));
1329         }
1330 }
1331
1332 /*
1333  * Close a file descriptor.
1334  */
1335 #ifndef _SYS_SYSPROTO_H_
1336 struct close_args {
1337         int     fd;
1338 };
1339 #endif
1340 /* ARGSUSED */
1341 int
1342 sys_close(struct thread *td, struct close_args *uap)
1343 {
1344
1345         return (kern_close(td, uap->fd));
1346 }
1347
1348 int
1349 kern_close(struct thread *td, int fd)
1350 {
1351         struct filedesc *fdp;
1352         struct file *fp;
1353
1354         fdp = td->td_proc->p_fd;
1355
1356         FILEDESC_XLOCK(fdp);
1357         if ((fp = fget_locked(fdp, fd)) == NULL) {
1358                 FILEDESC_XUNLOCK(fdp);
1359                 return (EBADF);
1360         }
1361         fdfree(fdp, fd);
1362
1363         /* closefp() drops the FILEDESC lock for us. */
1364         return (closefp(fdp, fd, fp, td, true, true));
1365 }
1366
1367 int
1368 kern_close_range(struct thread *td, u_int lowfd, u_int highfd)
1369 {
1370         struct filedesc *fdp;
1371         const struct fdescenttbl *fdt;
1372         struct file *fp;
1373         int fd;
1374
1375         /*
1376          * Check this prior to clamping; closefrom(3) with only fd 0, 1, and 2
1377          * open should not be a usage error.  From a close_range() perspective,
1378          * close_range(3, ~0U, 0) in the same scenario should also likely not
1379          * be a usage error as all fd above 3 are in-fact already closed.
1380          */
1381         if (highfd < lowfd) {
1382                 return (EINVAL);
1383         }
1384
1385         fdp = td->td_proc->p_fd;
1386         FILEDESC_XLOCK(fdp);
1387         fdt = atomic_load_ptr(&fdp->fd_files);
1388         highfd = MIN(highfd, fdt->fdt_nfiles - 1);
1389         fd = lowfd;
1390         if (__predict_false(fd > highfd)) {
1391                 goto out_locked;
1392         }
1393         for (;;) {
1394                 fp = fdt->fdt_ofiles[fd].fde_file;
1395                 if (fp == NULL) {
1396                         if (fd == highfd)
1397                                 goto out_locked;
1398                 } else {
1399                         fdfree(fdp, fd);
1400                         (void) closefp(fdp, fd, fp, td, true, true);
1401                         if (fd == highfd)
1402                                 goto out_unlocked;
1403                         FILEDESC_XLOCK(fdp);
1404                         fdt = atomic_load_ptr(&fdp->fd_files);
1405                 }
1406                 fd++;
1407         }
1408 out_locked:
1409         FILEDESC_XUNLOCK(fdp);
1410 out_unlocked:
1411         return (0);
1412 }
1413
1414 #ifndef _SYS_SYSPROTO_H_
1415 struct close_range_args {
1416         u_int   lowfd;
1417         u_int   highfd;
1418         int     flags;
1419 };
1420 #endif
1421 int
1422 sys_close_range(struct thread *td, struct close_range_args *uap)
1423 {
1424
1425         /* No flags currently defined */
1426         if (uap->flags != 0)
1427                 return (EINVAL);
1428         return (kern_close_range(td, uap->lowfd, uap->highfd));
1429 }
1430
1431 #ifdef COMPAT_FREEBSD12
1432 /*
1433  * Close open file descriptors.
1434  */
1435 #ifndef _SYS_SYSPROTO_H_
1436 struct freebsd12_closefrom_args {
1437         int     lowfd;
1438 };
1439 #endif
1440 /* ARGSUSED */
1441 int
1442 freebsd12_closefrom(struct thread *td, struct freebsd12_closefrom_args *uap)
1443 {
1444         u_int lowfd;
1445
1446         AUDIT_ARG_FD(uap->lowfd);
1447
1448         /*
1449          * Treat negative starting file descriptor values identical to
1450          * closefrom(0) which closes all files.
1451          */
1452         lowfd = MAX(0, uap->lowfd);
1453         return (kern_close_range(td, lowfd, ~0U));
1454 }
1455 #endif  /* COMPAT_FREEBSD12 */
1456
1457 #if defined(COMPAT_43)
1458 /*
1459  * Return status information about a file descriptor.
1460  */
1461 #ifndef _SYS_SYSPROTO_H_
1462 struct ofstat_args {
1463         int     fd;
1464         struct  ostat *sb;
1465 };
1466 #endif
1467 /* ARGSUSED */
1468 int
1469 ofstat(struct thread *td, struct ofstat_args *uap)
1470 {
1471         struct ostat oub;
1472         struct stat ub;
1473         int error;
1474
1475         error = kern_fstat(td, uap->fd, &ub);
1476         if (error == 0) {
1477                 cvtstat(&ub, &oub);
1478                 error = copyout(&oub, uap->sb, sizeof(oub));
1479         }
1480         return (error);
1481 }
1482 #endif /* COMPAT_43 */
1483
1484 #if defined(COMPAT_FREEBSD11)
1485 int
1486 freebsd11_fstat(struct thread *td, struct freebsd11_fstat_args *uap)
1487 {
1488         struct stat sb;
1489         struct freebsd11_stat osb;
1490         int error;
1491
1492         error = kern_fstat(td, uap->fd, &sb);
1493         if (error != 0)
1494                 return (error);
1495         error = freebsd11_cvtstat(&sb, &osb);
1496         if (error == 0)
1497                 error = copyout(&osb, uap->sb, sizeof(osb));
1498         return (error);
1499 }
1500 #endif  /* COMPAT_FREEBSD11 */
1501
1502 /*
1503  * Return status information about a file descriptor.
1504  */
1505 #ifndef _SYS_SYSPROTO_H_
1506 struct fstat_args {
1507         int     fd;
1508         struct  stat *sb;
1509 };
1510 #endif
1511 /* ARGSUSED */
1512 int
1513 sys_fstat(struct thread *td, struct fstat_args *uap)
1514 {
1515         struct stat ub;
1516         int error;
1517
1518         error = kern_fstat(td, uap->fd, &ub);
1519         if (error == 0)
1520                 error = copyout(&ub, uap->sb, sizeof(ub));
1521         return (error);
1522 }
1523
1524 int
1525 kern_fstat(struct thread *td, int fd, struct stat *sbp)
1526 {
1527         struct file *fp;
1528         int error;
1529
1530         AUDIT_ARG_FD(fd);
1531
1532         error = fget(td, fd, &cap_fstat_rights, &fp);
1533         if (__predict_false(error != 0))
1534                 return (error);
1535
1536         AUDIT_ARG_FILE(td->td_proc, fp);
1537
1538         error = fo_stat(fp, sbp, td->td_ucred, td);
1539         fdrop(fp, td);
1540 #ifdef __STAT_TIME_T_EXT
1541         sbp->st_atim_ext = 0;
1542         sbp->st_mtim_ext = 0;
1543         sbp->st_ctim_ext = 0;
1544         sbp->st_btim_ext = 0;
1545 #endif
1546 #ifdef KTRACE
1547         if (KTRPOINT(td, KTR_STRUCT))
1548                 ktrstat_error(sbp, error);
1549 #endif
1550         return (error);
1551 }
1552
1553 #if defined(COMPAT_FREEBSD11)
1554 /*
1555  * Return status information about a file descriptor.
1556  */
1557 #ifndef _SYS_SYSPROTO_H_
1558 struct freebsd11_nfstat_args {
1559         int     fd;
1560         struct  nstat *sb;
1561 };
1562 #endif
1563 /* ARGSUSED */
1564 int
1565 freebsd11_nfstat(struct thread *td, struct freebsd11_nfstat_args *uap)
1566 {
1567         struct nstat nub;
1568         struct stat ub;
1569         int error;
1570
1571         error = kern_fstat(td, uap->fd, &ub);
1572         if (error == 0) {
1573                 freebsd11_cvtnstat(&ub, &nub);
1574                 error = copyout(&nub, uap->sb, sizeof(nub));
1575         }
1576         return (error);
1577 }
1578 #endif /* COMPAT_FREEBSD11 */
1579
1580 /*
1581  * Return pathconf information about a file descriptor.
1582  */
1583 #ifndef _SYS_SYSPROTO_H_
1584 struct fpathconf_args {
1585         int     fd;
1586         int     name;
1587 };
1588 #endif
1589 /* ARGSUSED */
1590 int
1591 sys_fpathconf(struct thread *td, struct fpathconf_args *uap)
1592 {
1593         long value;
1594         int error;
1595
1596         error = kern_fpathconf(td, uap->fd, uap->name, &value);
1597         if (error == 0)
1598                 td->td_retval[0] = value;
1599         return (error);
1600 }
1601
1602 int
1603 kern_fpathconf(struct thread *td, int fd, int name, long *valuep)
1604 {
1605         struct file *fp;
1606         struct vnode *vp;
1607         int error;
1608
1609         error = fget(td, fd, &cap_fpathconf_rights, &fp);
1610         if (error != 0)
1611                 return (error);
1612
1613         if (name == _PC_ASYNC_IO) {
1614                 *valuep = _POSIX_ASYNCHRONOUS_IO;
1615                 goto out;
1616         }
1617         vp = fp->f_vnode;
1618         if (vp != NULL) {
1619                 vn_lock(vp, LK_SHARED | LK_RETRY);
1620                 error = VOP_PATHCONF(vp, name, valuep);
1621                 VOP_UNLOCK(vp);
1622         } else if (fp->f_type == DTYPE_PIPE || fp->f_type == DTYPE_SOCKET) {
1623                 if (name != _PC_PIPE_BUF) {
1624                         error = EINVAL;
1625                 } else {
1626                         *valuep = PIPE_BUF;
1627                         error = 0;
1628                 }
1629         } else {
1630                 error = EOPNOTSUPP;
1631         }
1632 out:
1633         fdrop(fp, td);
1634         return (error);
1635 }
1636
1637 /*
1638  * Copy filecaps structure allocating memory for ioctls array if needed.
1639  *
1640  * The last parameter indicates whether the fdtable is locked. If it is not and
1641  * ioctls are encountered, copying fails and the caller must lock the table.
1642  *
1643  * Note that if the table was not locked, the caller has to check the relevant
1644  * sequence counter to determine whether the operation was successful.
1645  */
1646 bool
1647 filecaps_copy(const struct filecaps *src, struct filecaps *dst, bool locked)
1648 {
1649         size_t size;
1650
1651         if (src->fc_ioctls != NULL && !locked)
1652                 return (false);
1653         memcpy(dst, src, sizeof(*src));
1654         if (src->fc_ioctls == NULL)
1655                 return (true);
1656
1657         KASSERT(src->fc_nioctls > 0,
1658             ("fc_ioctls != NULL, but fc_nioctls=%hd", src->fc_nioctls));
1659
1660         size = sizeof(src->fc_ioctls[0]) * src->fc_nioctls;
1661         dst->fc_ioctls = malloc(size, M_FILECAPS, M_WAITOK);
1662         memcpy(dst->fc_ioctls, src->fc_ioctls, size);
1663         return (true);
1664 }
1665
1666 static u_long *
1667 filecaps_copy_prep(const struct filecaps *src)
1668 {
1669         u_long *ioctls;
1670         size_t size;
1671
1672         if (__predict_true(src->fc_ioctls == NULL))
1673                 return (NULL);
1674
1675         KASSERT(src->fc_nioctls > 0,
1676             ("fc_ioctls != NULL, but fc_nioctls=%hd", src->fc_nioctls));
1677
1678         size = sizeof(src->fc_ioctls[0]) * src->fc_nioctls;
1679         ioctls = malloc(size, M_FILECAPS, M_WAITOK);
1680         return (ioctls);
1681 }
1682
1683 static void
1684 filecaps_copy_finish(const struct filecaps *src, struct filecaps *dst,
1685     u_long *ioctls)
1686 {
1687         size_t size;
1688
1689         *dst = *src;
1690         if (__predict_true(src->fc_ioctls == NULL)) {
1691                 MPASS(ioctls == NULL);
1692                 return;
1693         }
1694
1695         size = sizeof(src->fc_ioctls[0]) * src->fc_nioctls;
1696         dst->fc_ioctls = ioctls;
1697         bcopy(src->fc_ioctls, dst->fc_ioctls, size);
1698 }
1699
1700 /*
1701  * Move filecaps structure to the new place and clear the old place.
1702  */
1703 void
1704 filecaps_move(struct filecaps *src, struct filecaps *dst)
1705 {
1706
1707         *dst = *src;
1708         bzero(src, sizeof(*src));
1709 }
1710
1711 /*
1712  * Fill the given filecaps structure with full rights.
1713  */
1714 static void
1715 filecaps_fill(struct filecaps *fcaps)
1716 {
1717
1718         CAP_ALL(&fcaps->fc_rights);
1719         fcaps->fc_ioctls = NULL;
1720         fcaps->fc_nioctls = -1;
1721         fcaps->fc_fcntls = CAP_FCNTL_ALL;
1722 }
1723
1724 /*
1725  * Free memory allocated within filecaps structure.
1726  */
1727 void
1728 filecaps_free(struct filecaps *fcaps)
1729 {
1730
1731         free(fcaps->fc_ioctls, M_FILECAPS);
1732         bzero(fcaps, sizeof(*fcaps));
1733 }
1734
1735 static u_long *
1736 filecaps_free_prep(struct filecaps *fcaps)
1737 {
1738         u_long *ioctls;
1739
1740         ioctls = fcaps->fc_ioctls;
1741         bzero(fcaps, sizeof(*fcaps));
1742         return (ioctls);
1743 }
1744
1745 static void
1746 filecaps_free_finish(u_long *ioctls)
1747 {
1748
1749         free(ioctls, M_FILECAPS);
1750 }
1751
1752 /*
1753  * Validate the given filecaps structure.
1754  */
1755 static void
1756 filecaps_validate(const struct filecaps *fcaps, const char *func)
1757 {
1758
1759         KASSERT(cap_rights_is_valid(&fcaps->fc_rights),
1760             ("%s: invalid rights", func));
1761         KASSERT((fcaps->fc_fcntls & ~CAP_FCNTL_ALL) == 0,
1762             ("%s: invalid fcntls", func));
1763         KASSERT(fcaps->fc_fcntls == 0 ||
1764             cap_rights_is_set(&fcaps->fc_rights, CAP_FCNTL),
1765             ("%s: fcntls without CAP_FCNTL", func));
1766         KASSERT(fcaps->fc_ioctls != NULL ? fcaps->fc_nioctls > 0 :
1767             (fcaps->fc_nioctls == -1 || fcaps->fc_nioctls == 0),
1768             ("%s: invalid ioctls", func));
1769         KASSERT(fcaps->fc_nioctls == 0 ||
1770             cap_rights_is_set(&fcaps->fc_rights, CAP_IOCTL),
1771             ("%s: ioctls without CAP_IOCTL", func));
1772 }
1773
1774 static void
1775 fdgrowtable_exp(struct filedesc *fdp, int nfd)
1776 {
1777         int nfd1;
1778
1779         FILEDESC_XLOCK_ASSERT(fdp);
1780
1781         nfd1 = fdp->fd_nfiles * 2;
1782         if (nfd1 < nfd)
1783                 nfd1 = nfd;
1784         fdgrowtable(fdp, nfd1);
1785 }
1786
1787 /*
1788  * Grow the file table to accommodate (at least) nfd descriptors.
1789  */
1790 static void
1791 fdgrowtable(struct filedesc *fdp, int nfd)
1792 {
1793         struct filedesc0 *fdp0;
1794         struct freetable *ft;
1795         struct fdescenttbl *ntable;
1796         struct fdescenttbl *otable;
1797         int nnfiles, onfiles;
1798         NDSLOTTYPE *nmap, *omap;
1799
1800         KASSERT(fdp->fd_nfiles > 0, ("zero-length file table"));
1801
1802         /* save old values */
1803         onfiles = fdp->fd_nfiles;
1804         otable = fdp->fd_files;
1805         omap = fdp->fd_map;
1806
1807         /* compute the size of the new table */
1808         nnfiles = NDSLOTS(nfd) * NDENTRIES; /* round up */
1809         if (nnfiles <= onfiles)
1810                 /* the table is already large enough */
1811                 return;
1812
1813         /*
1814          * Allocate a new table.  We need enough space for the number of
1815          * entries, file entries themselves and the struct freetable we will use
1816          * when we decommission the table and place it on the freelist.
1817          * We place the struct freetable in the middle so we don't have
1818          * to worry about padding.
1819          */
1820         ntable = malloc(offsetof(struct fdescenttbl, fdt_ofiles) +
1821             nnfiles * sizeof(ntable->fdt_ofiles[0]) +
1822             sizeof(struct freetable),
1823             M_FILEDESC, M_ZERO | M_WAITOK);
1824         /* copy the old data */
1825         ntable->fdt_nfiles = nnfiles;
1826         memcpy(ntable->fdt_ofiles, otable->fdt_ofiles,
1827             onfiles * sizeof(ntable->fdt_ofiles[0]));
1828
1829         /*
1830          * Allocate a new map only if the old is not large enough.  It will
1831          * grow at a slower rate than the table as it can map more
1832          * entries than the table can hold.
1833          */
1834         if (NDSLOTS(nnfiles) > NDSLOTS(onfiles)) {
1835                 nmap = malloc(NDSLOTS(nnfiles) * NDSLOTSIZE, M_FILEDESC,
1836                     M_ZERO | M_WAITOK);
1837                 /* copy over the old data and update the pointer */
1838                 memcpy(nmap, omap, NDSLOTS(onfiles) * sizeof(*omap));
1839                 fdp->fd_map = nmap;
1840         }
1841
1842         /*
1843          * Make sure that ntable is correctly initialized before we replace
1844          * fd_files poiner. Otherwise fget_unlocked() may see inconsistent
1845          * data.
1846          */
1847         atomic_store_rel_ptr((volatile void *)&fdp->fd_files, (uintptr_t)ntable);
1848
1849         /*
1850          * Free the old file table when not shared by other threads or processes.
1851          * The old file table is considered to be shared when either are true:
1852          * - The process has more than one thread.
1853          * - The file descriptor table has been shared via fdshare().
1854          *
1855          * When shared, the old file table will be placed on a freelist
1856          * which will be processed when the struct filedesc is released.
1857          *
1858          * Note that if onfiles == NDFILE, we're dealing with the original
1859          * static allocation contained within (struct filedesc0 *)fdp,
1860          * which must not be freed.
1861          */
1862         if (onfiles > NDFILE) {
1863                 if (curproc->p_numthreads == 1 &&
1864                     refcount_load(&fdp->fd_refcnt) == 1)
1865                         free(otable, M_FILEDESC);
1866                 else {
1867                         ft = (struct freetable *)&otable->fdt_ofiles[onfiles];
1868                         fdp0 = (struct filedesc0 *)fdp;
1869                         ft->ft_table = otable;
1870                         SLIST_INSERT_HEAD(&fdp0->fd_free, ft, ft_next);
1871                 }
1872         }
1873         /*
1874          * The map does not have the same possibility of threads still
1875          * holding references to it.  So always free it as long as it
1876          * does not reference the original static allocation.
1877          */
1878         if (NDSLOTS(onfiles) > NDSLOTS(NDFILE))
1879                 free(omap, M_FILEDESC);
1880 }
1881
1882 /*
1883  * Allocate a file descriptor for the process.
1884  */
1885 int
1886 fdalloc(struct thread *td, int minfd, int *result)
1887 {
1888         struct proc *p = td->td_proc;
1889         struct filedesc *fdp = p->p_fd;
1890         int fd, maxfd, allocfd;
1891 #ifdef RACCT
1892         int error;
1893 #endif
1894
1895         FILEDESC_XLOCK_ASSERT(fdp);
1896
1897         if (fdp->fd_freefile > minfd)
1898                 minfd = fdp->fd_freefile;
1899
1900         maxfd = getmaxfd(td);
1901
1902         /*
1903          * Search the bitmap for a free descriptor starting at minfd.
1904          * If none is found, grow the file table.
1905          */
1906         fd = fd_first_free(fdp, minfd, fdp->fd_nfiles);
1907         if (__predict_false(fd >= maxfd))
1908                 return (EMFILE);
1909         if (__predict_false(fd >= fdp->fd_nfiles)) {
1910                 allocfd = min(fd * 2, maxfd);
1911 #ifdef RACCT
1912                 if (RACCT_ENABLED()) {
1913                         error = racct_set_unlocked(p, RACCT_NOFILE, allocfd);
1914                         if (error != 0)
1915                                 return (EMFILE);
1916                 }
1917 #endif
1918                 /*
1919                  * fd is already equal to first free descriptor >= minfd, so
1920                  * we only need to grow the table and we are done.
1921                  */
1922                 fdgrowtable_exp(fdp, allocfd);
1923         }
1924
1925         /*
1926          * Perform some sanity checks, then mark the file descriptor as
1927          * used and return it to the caller.
1928          */
1929         KASSERT(fd >= 0 && fd < min(maxfd, fdp->fd_nfiles),
1930             ("invalid descriptor %d", fd));
1931         KASSERT(!fdisused(fdp, fd),
1932             ("fd_first_free() returned non-free descriptor"));
1933         KASSERT(fdp->fd_ofiles[fd].fde_file == NULL,
1934             ("file descriptor isn't free"));
1935         fdused(fdp, fd);
1936         *result = fd;
1937         return (0);
1938 }
1939
1940 /*
1941  * Allocate n file descriptors for the process.
1942  */
1943 int
1944 fdallocn(struct thread *td, int minfd, int *fds, int n)
1945 {
1946         struct proc *p = td->td_proc;
1947         struct filedesc *fdp = p->p_fd;
1948         int i;
1949
1950         FILEDESC_XLOCK_ASSERT(fdp);
1951
1952         for (i = 0; i < n; i++)
1953                 if (fdalloc(td, 0, &fds[i]) != 0)
1954                         break;
1955
1956         if (i < n) {
1957                 for (i--; i >= 0; i--)
1958                         fdunused(fdp, fds[i]);
1959                 return (EMFILE);
1960         }
1961
1962         return (0);
1963 }
1964
1965 /*
1966  * Create a new open file structure and allocate a file descriptor for the
1967  * process that refers to it.  We add one reference to the file for the
1968  * descriptor table and one reference for resultfp. This is to prevent us
1969  * being preempted and the entry in the descriptor table closed after we
1970  * release the FILEDESC lock.
1971  */
1972 int
1973 falloc_caps(struct thread *td, struct file **resultfp, int *resultfd, int flags,
1974     struct filecaps *fcaps)
1975 {
1976         struct file *fp;
1977         int error, fd;
1978
1979         MPASS(resultfp != NULL);
1980         MPASS(resultfd != NULL);
1981
1982         error = _falloc_noinstall(td, &fp, 2);
1983         if (__predict_false(error != 0)) {
1984                 return (error);
1985         }
1986
1987         error = finstall_refed(td, fp, &fd, flags, fcaps);
1988         if (__predict_false(error != 0)) {
1989                 falloc_abort(td, fp);
1990                 return (error);
1991         }
1992
1993         *resultfp = fp;
1994         *resultfd = fd;
1995
1996         return (0);
1997 }
1998
1999 /*
2000  * Create a new open file structure without allocating a file descriptor.
2001  */
2002 int
2003 _falloc_noinstall(struct thread *td, struct file **resultfp, u_int n)
2004 {
2005         struct file *fp;
2006         int maxuserfiles = maxfiles - (maxfiles / 20);
2007         int openfiles_new;
2008         static struct timeval lastfail;
2009         static int curfail;
2010
2011         KASSERT(resultfp != NULL, ("%s: resultfp == NULL", __func__));
2012         MPASS(n > 0);
2013
2014         openfiles_new = atomic_fetchadd_int(&openfiles, 1) + 1;
2015         if ((openfiles_new >= maxuserfiles &&
2016             priv_check(td, PRIV_MAXFILES) != 0) ||
2017             openfiles_new >= maxfiles) {
2018                 atomic_subtract_int(&openfiles, 1);
2019                 if (ppsratecheck(&lastfail, &curfail, 1)) {
2020                         printf("kern.maxfiles limit exceeded by uid %i, (%s) "
2021                             "please see tuning(7).\n", td->td_ucred->cr_ruid, td->td_proc->p_comm);
2022                 }
2023                 return (ENFILE);
2024         }
2025         fp = uma_zalloc(file_zone, M_WAITOK);
2026         bzero(fp, sizeof(*fp));
2027         refcount_init(&fp->f_count, n);
2028         fp->f_cred = crhold(td->td_ucred);
2029         fp->f_ops = &badfileops;
2030         *resultfp = fp;
2031         return (0);
2032 }
2033
2034 void
2035 falloc_abort(struct thread *td, struct file *fp)
2036 {
2037
2038         /*
2039          * For assertion purposes.
2040          */
2041         refcount_init(&fp->f_count, 0);
2042         _fdrop(fp, td);
2043 }
2044
2045 /*
2046  * Install a file in a file descriptor table.
2047  */
2048 void
2049 _finstall(struct filedesc *fdp, struct file *fp, int fd, int flags,
2050     struct filecaps *fcaps)
2051 {
2052         struct filedescent *fde;
2053
2054         MPASS(fp != NULL);
2055         if (fcaps != NULL)
2056                 filecaps_validate(fcaps, __func__);
2057         FILEDESC_XLOCK_ASSERT(fdp);
2058
2059         fde = &fdp->fd_ofiles[fd];
2060 #ifdef CAPABILITIES
2061         seqc_write_begin(&fde->fde_seqc);
2062 #endif
2063         fde->fde_file = fp;
2064         fde->fde_flags = (flags & O_CLOEXEC) != 0 ? UF_EXCLOSE : 0;
2065         if (fcaps != NULL)
2066                 filecaps_move(fcaps, &fde->fde_caps);
2067         else
2068                 filecaps_fill(&fde->fde_caps);
2069 #ifdef CAPABILITIES
2070         seqc_write_end(&fde->fde_seqc);
2071 #endif
2072 }
2073
2074 int
2075 finstall_refed(struct thread *td, struct file *fp, int *fd, int flags,
2076     struct filecaps *fcaps)
2077 {
2078         struct filedesc *fdp = td->td_proc->p_fd;
2079         int error;
2080
2081         MPASS(fd != NULL);
2082
2083         FILEDESC_XLOCK(fdp);
2084         error = fdalloc(td, 0, fd);
2085         if (__predict_true(error == 0)) {
2086                 _finstall(fdp, fp, *fd, flags, fcaps);
2087         }
2088         FILEDESC_XUNLOCK(fdp);
2089         return (error);
2090 }
2091
2092 int
2093 finstall(struct thread *td, struct file *fp, int *fd, int flags,
2094     struct filecaps *fcaps)
2095 {
2096         int error;
2097
2098         MPASS(fd != NULL);
2099
2100         if (!fhold(fp))
2101                 return (EBADF);
2102         error = finstall_refed(td, fp, fd, flags, fcaps);
2103         if (__predict_false(error != 0)) {
2104                 fdrop(fp, td);
2105         }
2106         return (error);
2107 }
2108
2109 /*
2110  * Build a new filedesc structure from another.
2111  *
2112  * If fdp is not NULL, return with it shared locked.
2113  */
2114 struct filedesc *
2115 fdinit(struct filedesc *fdp, bool prepfiles, int *lastfile)
2116 {
2117         struct filedesc0 *newfdp0;
2118         struct filedesc *newfdp;
2119
2120         if (prepfiles)
2121                 MPASS(lastfile != NULL);
2122         else
2123                 MPASS(lastfile == NULL);
2124
2125         newfdp0 = uma_zalloc(filedesc0_zone, M_WAITOK | M_ZERO);
2126         newfdp = &newfdp0->fd_fd;
2127
2128         /* Create the file descriptor table. */
2129         FILEDESC_LOCK_INIT(newfdp);
2130         refcount_init(&newfdp->fd_refcnt, 1);
2131         refcount_init(&newfdp->fd_holdcnt, 1);
2132         newfdp->fd_map = newfdp0->fd_dmap;
2133         newfdp->fd_files = (struct fdescenttbl *)&newfdp0->fd_dfiles;
2134         newfdp->fd_files->fdt_nfiles = NDFILE;
2135
2136         if (fdp == NULL)
2137                 return (newfdp);
2138
2139         FILEDESC_SLOCK(fdp);
2140         if (!prepfiles) {
2141                 FILEDESC_SUNLOCK(fdp);
2142                 return (newfdp);
2143         }
2144
2145         for (;;) {
2146                 *lastfile = fdlastfile(fdp);
2147                 if (*lastfile < newfdp->fd_nfiles)
2148                         break;
2149                 FILEDESC_SUNLOCK(fdp);
2150                 fdgrowtable(newfdp, *lastfile + 1);
2151                 FILEDESC_SLOCK(fdp);
2152         }
2153
2154         return (newfdp);
2155 }
2156
2157 /*
2158  * Build a pwddesc structure from another.
2159  * Copy the current, root, and jail root vnode references.
2160  *
2161  * If pdp is not NULL, return with it shared locked.
2162  */
2163 struct pwddesc *
2164 pdinit(struct pwddesc *pdp, bool keeplock)
2165 {
2166         struct pwddesc *newpdp;
2167         struct pwd *newpwd;
2168
2169         newpdp = malloc(sizeof(*newpdp), M_PWDDESC, M_WAITOK | M_ZERO);
2170
2171         PWDDESC_LOCK_INIT(newpdp);
2172         refcount_init(&newpdp->pd_refcount, 1);
2173         newpdp->pd_cmask = CMASK;
2174
2175         if (pdp == NULL) {
2176                 newpwd = pwd_alloc();
2177                 smr_serialized_store(&newpdp->pd_pwd, newpwd, true);
2178                 return (newpdp);
2179         }
2180
2181         PWDDESC_XLOCK(pdp);
2182         newpwd = pwd_hold_pwddesc(pdp);
2183         smr_serialized_store(&newpdp->pd_pwd, newpwd, true);
2184         if (!keeplock)
2185                 PWDDESC_XUNLOCK(pdp);
2186         return (newpdp);
2187 }
2188
2189 static struct filedesc *
2190 fdhold(struct proc *p)
2191 {
2192         struct filedesc *fdp;
2193
2194         PROC_LOCK_ASSERT(p, MA_OWNED);
2195         fdp = p->p_fd;
2196         if (fdp != NULL)
2197                 refcount_acquire(&fdp->fd_holdcnt);
2198         return (fdp);
2199 }
2200
2201 static struct pwddesc *
2202 pdhold(struct proc *p)
2203 {
2204         struct pwddesc *pdp;
2205
2206         PROC_LOCK_ASSERT(p, MA_OWNED);
2207         pdp = p->p_pd;
2208         if (pdp != NULL)
2209                 refcount_acquire(&pdp->pd_refcount);
2210         return (pdp);
2211 }
2212
2213 static void
2214 fddrop(struct filedesc *fdp)
2215 {
2216
2217         if (refcount_load(&fdp->fd_holdcnt) > 1) {
2218                 if (refcount_release(&fdp->fd_holdcnt) == 0)
2219                         return;
2220         }
2221
2222         FILEDESC_LOCK_DESTROY(fdp);
2223         uma_zfree(filedesc0_zone, fdp);
2224 }
2225
2226 static void
2227 pddrop(struct pwddesc *pdp)
2228 {
2229         struct pwd *pwd;
2230
2231         if (refcount_release_if_not_last(&pdp->pd_refcount))
2232                 return;
2233
2234         PWDDESC_XLOCK(pdp);
2235         if (refcount_release(&pdp->pd_refcount) == 0) {
2236                 PWDDESC_XUNLOCK(pdp);
2237                 return;
2238         }
2239         pwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
2240         pwd_set(pdp, NULL);
2241         PWDDESC_XUNLOCK(pdp);
2242         pwd_drop(pwd);
2243
2244         PWDDESC_LOCK_DESTROY(pdp);
2245         free(pdp, M_PWDDESC);
2246 }
2247
2248 /*
2249  * Share a filedesc structure.
2250  */
2251 struct filedesc *
2252 fdshare(struct filedesc *fdp)
2253 {
2254
2255         refcount_acquire(&fdp->fd_refcnt);
2256         return (fdp);
2257 }
2258
2259 /*
2260  * Share a pwddesc structure.
2261  */
2262 struct pwddesc *
2263 pdshare(struct pwddesc *pdp)
2264 {
2265         refcount_acquire(&pdp->pd_refcount);
2266         return (pdp);
2267 }
2268
2269 /*
2270  * Unshare a filedesc structure, if necessary by making a copy
2271  */
2272 void
2273 fdunshare(struct thread *td)
2274 {
2275         struct filedesc *tmp;
2276         struct proc *p = td->td_proc;
2277
2278         if (refcount_load(&p->p_fd->fd_refcnt) == 1)
2279                 return;
2280
2281         tmp = fdcopy(p->p_fd);
2282         fdescfree(td);
2283         p->p_fd = tmp;
2284 }
2285
2286 /*
2287  * Unshare a pwddesc structure.
2288  */
2289 void
2290 pdunshare(struct thread *td)
2291 {
2292         struct pwddesc *pdp;
2293         struct proc *p;
2294
2295         p = td->td_proc;
2296         /* Not shared. */
2297         if (p->p_pd->pd_refcount == 1)
2298                 return;
2299
2300         pdp = pdcopy(p->p_pd);
2301         pdescfree(td);
2302         p->p_pd = pdp;
2303 }
2304
2305 void
2306 fdinstall_remapped(struct thread *td, struct filedesc *fdp)
2307 {
2308
2309         fdescfree(td);
2310         td->td_proc->p_fd = fdp;
2311 }
2312
2313 /*
2314  * Copy a filedesc structure.  A NULL pointer in returns a NULL reference,
2315  * this is to ease callers, not catch errors.
2316  */
2317 struct filedesc *
2318 fdcopy(struct filedesc *fdp)
2319 {
2320         struct filedesc *newfdp;
2321         struct filedescent *nfde, *ofde;
2322         int i, lastfile;
2323
2324         MPASS(fdp != NULL);
2325
2326         newfdp = fdinit(fdp, true, &lastfile);
2327         /* copy all passable descriptors (i.e. not kqueue) */
2328         newfdp->fd_freefile = -1;
2329         for (i = 0; i <= lastfile; ++i) {
2330                 ofde = &fdp->fd_ofiles[i];
2331                 if (ofde->fde_file == NULL ||
2332                     (ofde->fde_file->f_ops->fo_flags & DFLAG_PASSABLE) == 0 ||
2333                     !fhold(ofde->fde_file)) {
2334                         if (newfdp->fd_freefile == -1)
2335                                 newfdp->fd_freefile = i;
2336                         continue;
2337                 }
2338                 nfde = &newfdp->fd_ofiles[i];
2339                 *nfde = *ofde;
2340                 filecaps_copy(&ofde->fde_caps, &nfde->fde_caps, true);
2341                 fdused_init(newfdp, i);
2342         }
2343         if (newfdp->fd_freefile == -1)
2344                 newfdp->fd_freefile = i;
2345         FILEDESC_SUNLOCK(fdp);
2346         return (newfdp);
2347 }
2348
2349 /*
2350  * Copy a pwddesc structure.
2351  */
2352 struct pwddesc *
2353 pdcopy(struct pwddesc *pdp)
2354 {
2355         struct pwddesc *newpdp;
2356
2357         MPASS(pdp != NULL);
2358
2359         newpdp = pdinit(pdp, true);
2360         newpdp->pd_cmask = pdp->pd_cmask;
2361         PWDDESC_XUNLOCK(pdp);
2362         return (newpdp);
2363 }
2364
2365 /*
2366  * Copies a filedesc structure, while remapping all file descriptors
2367  * stored inside using a translation table.
2368  *
2369  * File descriptors are copied over to the new file descriptor table,
2370  * regardless of whether the close-on-exec flag is set.
2371  */
2372 int
2373 fdcopy_remapped(struct filedesc *fdp, const int *fds, size_t nfds,
2374     struct filedesc **ret)
2375 {
2376         struct filedesc *newfdp;
2377         struct filedescent *nfde, *ofde;
2378         int error, i, lastfile;
2379
2380         MPASS(fdp != NULL);
2381
2382         newfdp = fdinit(fdp, true, &lastfile);
2383         if (nfds > lastfile + 1) {
2384                 /* New table cannot be larger than the old one. */
2385                 error = E2BIG;
2386                 goto bad;
2387         }
2388         /* Copy all passable descriptors (i.e. not kqueue). */
2389         newfdp->fd_freefile = nfds;
2390         for (i = 0; i < nfds; ++i) {
2391                 if (fds[i] < 0 || fds[i] > lastfile) {
2392                         /* File descriptor out of bounds. */
2393                         error = EBADF;
2394                         goto bad;
2395                 }
2396                 ofde = &fdp->fd_ofiles[fds[i]];
2397                 if (ofde->fde_file == NULL) {
2398                         /* Unused file descriptor. */
2399                         error = EBADF;
2400                         goto bad;
2401                 }
2402                 if ((ofde->fde_file->f_ops->fo_flags & DFLAG_PASSABLE) == 0) {
2403                         /* File descriptor cannot be passed. */
2404                         error = EINVAL;
2405                         goto bad;
2406                 }
2407                 if (!fhold(ofde->fde_file)) {
2408                         error = EBADF;
2409                         goto bad;
2410                 }
2411                 nfde = &newfdp->fd_ofiles[i];
2412                 *nfde = *ofde;
2413                 filecaps_copy(&ofde->fde_caps, &nfde->fde_caps, true);
2414                 fdused_init(newfdp, i);
2415         }
2416         FILEDESC_SUNLOCK(fdp);
2417         *ret = newfdp;
2418         return (0);
2419 bad:
2420         FILEDESC_SUNLOCK(fdp);
2421         fdescfree_remapped(newfdp);
2422         return (error);
2423 }
2424
2425 /*
2426  * Clear POSIX style locks. This is only used when fdp looses a reference (i.e.
2427  * one of processes using it exits) and the table used to be shared.
2428  */
2429 static void
2430 fdclearlocks(struct thread *td)
2431 {
2432         struct filedesc *fdp;
2433         struct filedesc_to_leader *fdtol;
2434         struct flock lf;
2435         struct file *fp;
2436         struct proc *p;
2437         struct vnode *vp;
2438         int i, lastfile;
2439
2440         p = td->td_proc;
2441         fdp = p->p_fd;
2442         fdtol = p->p_fdtol;
2443         MPASS(fdtol != NULL);
2444
2445         FILEDESC_XLOCK(fdp);
2446         KASSERT(fdtol->fdl_refcount > 0,
2447             ("filedesc_to_refcount botch: fdl_refcount=%d",
2448             fdtol->fdl_refcount));
2449         if (fdtol->fdl_refcount == 1 &&
2450             (p->p_leader->p_flag & P_ADVLOCK) != 0) {
2451                 lastfile = fdlastfile(fdp);
2452                 for (i = 0; i <= lastfile; i++) {
2453                         fp = fdp->fd_ofiles[i].fde_file;
2454                         if (fp == NULL || fp->f_type != DTYPE_VNODE ||
2455                             !fhold(fp))
2456                                 continue;
2457                         FILEDESC_XUNLOCK(fdp);
2458                         lf.l_whence = SEEK_SET;
2459                         lf.l_start = 0;
2460                         lf.l_len = 0;
2461                         lf.l_type = F_UNLCK;
2462                         vp = fp->f_vnode;
2463                         (void) VOP_ADVLOCK(vp,
2464                             (caddr_t)p->p_leader, F_UNLCK,
2465                             &lf, F_POSIX);
2466                         FILEDESC_XLOCK(fdp);
2467                         fdrop(fp, td);
2468                 }
2469         }
2470 retry:
2471         if (fdtol->fdl_refcount == 1) {
2472                 if (fdp->fd_holdleaderscount > 0 &&
2473                     (p->p_leader->p_flag & P_ADVLOCK) != 0) {
2474                         /*
2475                          * close() or kern_dup() has cleared a reference
2476                          * in a shared file descriptor table.
2477                          */
2478                         fdp->fd_holdleaderswakeup = 1;
2479                         sx_sleep(&fdp->fd_holdleaderscount,
2480                             FILEDESC_LOCK(fdp), PLOCK, "fdlhold", 0);
2481                         goto retry;
2482                 }
2483                 if (fdtol->fdl_holdcount > 0) {
2484                         /*
2485                          * Ensure that fdtol->fdl_leader remains
2486                          * valid in closef().
2487                          */
2488                         fdtol->fdl_wakeup = 1;
2489                         sx_sleep(fdtol, FILEDESC_LOCK(fdp), PLOCK,
2490                             "fdlhold", 0);
2491                         goto retry;
2492                 }
2493         }
2494         fdtol->fdl_refcount--;
2495         if (fdtol->fdl_refcount == 0 &&
2496             fdtol->fdl_holdcount == 0) {
2497                 fdtol->fdl_next->fdl_prev = fdtol->fdl_prev;
2498                 fdtol->fdl_prev->fdl_next = fdtol->fdl_next;
2499         } else
2500                 fdtol = NULL;
2501         p->p_fdtol = NULL;
2502         FILEDESC_XUNLOCK(fdp);
2503         if (fdtol != NULL)
2504                 free(fdtol, M_FILEDESC_TO_LEADER);
2505 }
2506
2507 /*
2508  * Release a filedesc structure.
2509  */
2510 static void
2511 fdescfree_fds(struct thread *td, struct filedesc *fdp, bool needclose)
2512 {
2513         struct filedesc0 *fdp0;
2514         struct freetable *ft, *tft;
2515         struct filedescent *fde;
2516         struct file *fp;
2517         int i, lastfile;
2518
2519         KASSERT(refcount_load(&fdp->fd_refcnt) == 0,
2520             ("%s: fd table %p carries references", __func__, fdp));
2521
2522         /*
2523          * Serialize with threads iterating over the table, if any.
2524          */
2525         if (refcount_load(&fdp->fd_holdcnt) > 1) {
2526                 FILEDESC_XLOCK(fdp);
2527                 FILEDESC_XUNLOCK(fdp);
2528         }
2529
2530         lastfile = fdlastfile_single(fdp);
2531         for (i = 0; i <= lastfile; i++) {
2532                 fde = &fdp->fd_ofiles[i];
2533                 fp = fde->fde_file;
2534                 if (fp != NULL) {
2535                         fdefree_last(fde);
2536                         if (needclose)
2537                                 (void) closef(fp, td);
2538                         else
2539                                 fdrop(fp, td);
2540                 }
2541         }
2542
2543         if (NDSLOTS(fdp->fd_nfiles) > NDSLOTS(NDFILE))
2544                 free(fdp->fd_map, M_FILEDESC);
2545         if (fdp->fd_nfiles > NDFILE)
2546                 free(fdp->fd_files, M_FILEDESC);
2547
2548         fdp0 = (struct filedesc0 *)fdp;
2549         SLIST_FOREACH_SAFE(ft, &fdp0->fd_free, ft_next, tft)
2550                 free(ft->ft_table, M_FILEDESC);
2551
2552         fddrop(fdp);
2553 }
2554
2555 void
2556 fdescfree(struct thread *td)
2557 {
2558         struct proc *p;
2559         struct filedesc *fdp;
2560
2561         p = td->td_proc;
2562         fdp = p->p_fd;
2563         MPASS(fdp != NULL);
2564
2565 #ifdef RACCT
2566         if (RACCT_ENABLED())
2567                 racct_set_unlocked(p, RACCT_NOFILE, 0);
2568 #endif
2569
2570         if (p->p_fdtol != NULL)
2571                 fdclearlocks(td);
2572
2573         PROC_LOCK(p);
2574         p->p_fd = NULL;
2575         PROC_UNLOCK(p);
2576
2577         if (refcount_release(&fdp->fd_refcnt) == 0)
2578                 return;
2579
2580         fdescfree_fds(td, fdp, 1);
2581 }
2582
2583 void
2584 pdescfree(struct thread *td)
2585 {
2586         struct proc *p;
2587         struct pwddesc *pdp;
2588
2589         p = td->td_proc;
2590         pdp = p->p_pd;
2591         MPASS(pdp != NULL);
2592
2593         PROC_LOCK(p);
2594         p->p_pd = NULL;
2595         PROC_UNLOCK(p);
2596
2597         pddrop(pdp);
2598 }
2599
2600 void
2601 fdescfree_remapped(struct filedesc *fdp)
2602 {
2603 #ifdef INVARIANTS
2604         /* fdescfree_fds() asserts that fd_refcnt == 0. */
2605         if (!refcount_release(&fdp->fd_refcnt))
2606                 panic("%s: fd table %p has extra references", __func__, fdp);
2607 #endif
2608         fdescfree_fds(curthread, fdp, 0);
2609 }
2610
2611 /*
2612  * For setugid programs, we don't want to people to use that setugidness
2613  * to generate error messages which write to a file which otherwise would
2614  * otherwise be off-limits to the process.  We check for filesystems where
2615  * the vnode can change out from under us after execve (like [lin]procfs).
2616  *
2617  * Since fdsetugidsafety calls this only for fd 0, 1 and 2, this check is
2618  * sufficient.  We also don't check for setugidness since we know we are.
2619  */
2620 static bool
2621 is_unsafe(struct file *fp)
2622 {
2623         struct vnode *vp;
2624
2625         if (fp->f_type != DTYPE_VNODE)
2626                 return (false);
2627
2628         vp = fp->f_vnode;
2629         return ((vp->v_vflag & VV_PROCDEP) != 0);
2630 }
2631
2632 /*
2633  * Make this setguid thing safe, if at all possible.
2634  */
2635 void
2636 fdsetugidsafety(struct thread *td)
2637 {
2638         struct filedesc *fdp;
2639         struct file *fp;
2640         int i;
2641
2642         fdp = td->td_proc->p_fd;
2643         KASSERT(refcount_load(&fdp->fd_refcnt) == 1,
2644             ("the fdtable should not be shared"));
2645         MPASS(fdp->fd_nfiles >= 3);
2646         for (i = 0; i <= 2; i++) {
2647                 fp = fdp->fd_ofiles[i].fde_file;
2648                 if (fp != NULL && is_unsafe(fp)) {
2649                         FILEDESC_XLOCK(fdp);
2650                         knote_fdclose(td, i);
2651                         /*
2652                          * NULL-out descriptor prior to close to avoid
2653                          * a race while close blocks.
2654                          */
2655                         fdfree(fdp, i);
2656                         FILEDESC_XUNLOCK(fdp);
2657                         (void) closef(fp, td);
2658                 }
2659         }
2660 }
2661
2662 /*
2663  * If a specific file object occupies a specific file descriptor, close the
2664  * file descriptor entry and drop a reference on the file object.  This is a
2665  * convenience function to handle a subsequent error in a function that calls
2666  * falloc() that handles the race that another thread might have closed the
2667  * file descriptor out from under the thread creating the file object.
2668  */
2669 void
2670 fdclose(struct thread *td, struct file *fp, int idx)
2671 {
2672         struct filedesc *fdp = td->td_proc->p_fd;
2673
2674         FILEDESC_XLOCK(fdp);
2675         if (fdp->fd_ofiles[idx].fde_file == fp) {
2676                 fdfree(fdp, idx);
2677                 FILEDESC_XUNLOCK(fdp);
2678                 fdrop(fp, td);
2679         } else
2680                 FILEDESC_XUNLOCK(fdp);
2681 }
2682
2683 /*
2684  * Close any files on exec?
2685  */
2686 void
2687 fdcloseexec(struct thread *td)
2688 {
2689         struct filedesc *fdp;
2690         struct filedescent *fde;
2691         struct file *fp;
2692         int i, lastfile;
2693
2694         fdp = td->td_proc->p_fd;
2695         KASSERT(refcount_load(&fdp->fd_refcnt) == 1,
2696             ("the fdtable should not be shared"));
2697         lastfile = fdlastfile_single(fdp);
2698         for (i = 0; i <= lastfile; i++) {
2699                 fde = &fdp->fd_ofiles[i];
2700                 fp = fde->fde_file;
2701                 if (fp != NULL && (fp->f_type == DTYPE_MQUEUE ||
2702                     (fde->fde_flags & UF_EXCLOSE))) {
2703                         FILEDESC_XLOCK(fdp);
2704                         fdfree(fdp, i);
2705                         (void) closefp(fdp, i, fp, td, false, false);
2706                         FILEDESC_UNLOCK_ASSERT(fdp);
2707                 }
2708         }
2709 }
2710
2711 /*
2712  * It is unsafe for set[ug]id processes to be started with file
2713  * descriptors 0..2 closed, as these descriptors are given implicit
2714  * significance in the Standard C library.  fdcheckstd() will create a
2715  * descriptor referencing /dev/null for each of stdin, stdout, and
2716  * stderr that is not already open.
2717  */
2718 int
2719 fdcheckstd(struct thread *td)
2720 {
2721         struct filedesc *fdp;
2722         register_t save;
2723         int i, error, devnull;
2724
2725         fdp = td->td_proc->p_fd;
2726         KASSERT(refcount_load(&fdp->fd_refcnt) == 1,
2727             ("the fdtable should not be shared"));
2728         MPASS(fdp->fd_nfiles >= 3);
2729         devnull = -1;
2730         for (i = 0; i <= 2; i++) {
2731                 if (fdp->fd_ofiles[i].fde_file != NULL)
2732                         continue;
2733
2734                 save = td->td_retval[0];
2735                 if (devnull != -1) {
2736                         error = kern_dup(td, FDDUP_FIXED, 0, devnull, i);
2737                 } else {
2738                         error = kern_openat(td, AT_FDCWD, "/dev/null",
2739                             UIO_SYSSPACE, O_RDWR, 0);
2740                         if (error == 0) {
2741                                 devnull = td->td_retval[0];
2742                                 KASSERT(devnull == i, ("we didn't get our fd"));
2743                         }
2744                 }
2745                 td->td_retval[0] = save;
2746                 if (error != 0)
2747                         return (error);
2748         }
2749         return (0);
2750 }
2751
2752 /*
2753  * Internal form of close.  Decrement reference count on file structure.
2754  * Note: td may be NULL when closing a file that was being passed in a
2755  * message.
2756  */
2757 int
2758 closef(struct file *fp, struct thread *td)
2759 {
2760         struct vnode *vp;
2761         struct flock lf;
2762         struct filedesc_to_leader *fdtol;
2763         struct filedesc *fdp;
2764
2765         MPASS(td != NULL);
2766
2767         /*
2768          * POSIX record locking dictates that any close releases ALL
2769          * locks owned by this process.  This is handled by setting
2770          * a flag in the unlock to free ONLY locks obeying POSIX
2771          * semantics, and not to free BSD-style file locks.
2772          * If the descriptor was in a message, POSIX-style locks
2773          * aren't passed with the descriptor, and the thread pointer
2774          * will be NULL.  Callers should be careful only to pass a
2775          * NULL thread pointer when there really is no owning
2776          * context that might have locks, or the locks will be
2777          * leaked.
2778          */
2779         if (fp->f_type == DTYPE_VNODE) {
2780                 vp = fp->f_vnode;
2781                 if ((td->td_proc->p_leader->p_flag & P_ADVLOCK) != 0) {
2782                         lf.l_whence = SEEK_SET;
2783                         lf.l_start = 0;
2784                         lf.l_len = 0;
2785                         lf.l_type = F_UNLCK;
2786                         (void) VOP_ADVLOCK(vp, (caddr_t)td->td_proc->p_leader,
2787                             F_UNLCK, &lf, F_POSIX);
2788                 }
2789                 fdtol = td->td_proc->p_fdtol;
2790                 if (fdtol != NULL) {
2791                         /*
2792                          * Handle special case where file descriptor table is
2793                          * shared between multiple process leaders.
2794                          */
2795                         fdp = td->td_proc->p_fd;
2796                         FILEDESC_XLOCK(fdp);
2797                         for (fdtol = fdtol->fdl_next;
2798                             fdtol != td->td_proc->p_fdtol;
2799                             fdtol = fdtol->fdl_next) {
2800                                 if ((fdtol->fdl_leader->p_flag &
2801                                     P_ADVLOCK) == 0)
2802                                         continue;
2803                                 fdtol->fdl_holdcount++;
2804                                 FILEDESC_XUNLOCK(fdp);
2805                                 lf.l_whence = SEEK_SET;
2806                                 lf.l_start = 0;
2807                                 lf.l_len = 0;
2808                                 lf.l_type = F_UNLCK;
2809                                 vp = fp->f_vnode;
2810                                 (void) VOP_ADVLOCK(vp,
2811                                     (caddr_t)fdtol->fdl_leader, F_UNLCK, &lf,
2812                                     F_POSIX);
2813                                 FILEDESC_XLOCK(fdp);
2814                                 fdtol->fdl_holdcount--;
2815                                 if (fdtol->fdl_holdcount == 0 &&
2816                                     fdtol->fdl_wakeup != 0) {
2817                                         fdtol->fdl_wakeup = 0;
2818                                         wakeup(fdtol);
2819                                 }
2820                         }
2821                         FILEDESC_XUNLOCK(fdp);
2822                 }
2823         }
2824         return (fdrop_close(fp, td));
2825 }
2826
2827 /*
2828  * Hack for file descriptor passing code.
2829  */
2830 void
2831 closef_nothread(struct file *fp)
2832 {
2833
2834         fdrop(fp, NULL);
2835 }
2836
2837 /*
2838  * Initialize the file pointer with the specified properties.
2839  *
2840  * The ops are set with release semantics to be certain that the flags, type,
2841  * and data are visible when ops is.  This is to prevent ops methods from being
2842  * called with bad data.
2843  */
2844 void
2845 finit(struct file *fp, u_int flag, short type, void *data, struct fileops *ops)
2846 {
2847         fp->f_data = data;
2848         fp->f_flag = flag;
2849         fp->f_type = type;
2850         atomic_store_rel_ptr((volatile uintptr_t *)&fp->f_ops, (uintptr_t)ops);
2851 }
2852
2853 void
2854 finit_vnode(struct file *fp, u_int flag, void *data, struct fileops *ops)
2855 {
2856         fp->f_seqcount[UIO_READ] = 1;
2857         fp->f_seqcount[UIO_WRITE] = 1;
2858         finit(fp, (flag & FMASK) | (fp->f_flag & FHASLOCK), DTYPE_VNODE,
2859             data, ops);
2860 }
2861
2862 int
2863 fget_cap_locked(struct filedesc *fdp, int fd, cap_rights_t *needrightsp,
2864     struct file **fpp, struct filecaps *havecapsp)
2865 {
2866         struct filedescent *fde;
2867         int error;
2868
2869         FILEDESC_LOCK_ASSERT(fdp);
2870
2871         fde = fdeget_locked(fdp, fd);
2872         if (fde == NULL) {
2873                 error = EBADF;
2874                 goto out;
2875         }
2876
2877 #ifdef CAPABILITIES
2878         error = cap_check(cap_rights_fde_inline(fde), needrightsp);
2879         if (error != 0)
2880                 goto out;
2881 #endif
2882
2883         if (havecapsp != NULL)
2884                 filecaps_copy(&fde->fde_caps, havecapsp, true);
2885
2886         *fpp = fde->fde_file;
2887
2888         error = 0;
2889 out:
2890         return (error);
2891 }
2892
2893 int
2894 fget_cap(struct thread *td, int fd, cap_rights_t *needrightsp,
2895     struct file **fpp, struct filecaps *havecapsp)
2896 {
2897         struct filedesc *fdp = td->td_proc->p_fd;
2898         int error;
2899 #ifndef CAPABILITIES
2900         error = fget_unlocked(fdp, fd, needrightsp, fpp);
2901         if (havecapsp != NULL && error == 0)
2902                 filecaps_fill(havecapsp);
2903 #else
2904         struct file *fp;
2905         seqc_t seq;
2906
2907         *fpp = NULL;
2908         for (;;) {
2909                 error = fget_unlocked_seq(fdp, fd, needrightsp, &fp, &seq);
2910                 if (error != 0)
2911                         return (error);
2912
2913                 if (havecapsp != NULL) {
2914                         if (!filecaps_copy(&fdp->fd_ofiles[fd].fde_caps,
2915                             havecapsp, false)) {
2916                                 fdrop(fp, td);
2917                                 goto get_locked;
2918                         }
2919                 }
2920
2921                 if (!fd_modified(fdp, fd, seq))
2922                         break;
2923                 fdrop(fp, td);
2924         }
2925
2926         *fpp = fp;
2927         return (0);
2928
2929 get_locked:
2930         FILEDESC_SLOCK(fdp);
2931         error = fget_cap_locked(fdp, fd, needrightsp, fpp, havecapsp);
2932         if (error == 0 && !fhold(*fpp))
2933                 error = EBADF;
2934         FILEDESC_SUNLOCK(fdp);
2935 #endif
2936         return (error);
2937 }
2938
2939 #ifdef CAPABILITIES
2940 int
2941 fgetvp_lookup_smr(int fd, struct nameidata *ndp, struct vnode **vpp, bool *fsearch)
2942 {
2943         const struct filedescent *fde;
2944         const struct fdescenttbl *fdt;
2945         struct filedesc *fdp;
2946         struct file *fp;
2947         struct vnode *vp;
2948         const cap_rights_t *haverights;
2949         cap_rights_t rights;
2950         seqc_t seq;
2951
2952         VFS_SMR_ASSERT_ENTERED();
2953
2954         rights = *ndp->ni_rightsneeded;
2955         cap_rights_set_one(&rights, CAP_LOOKUP);
2956
2957         fdp = curproc->p_fd;
2958         fdt = fdp->fd_files;
2959         if (__predict_false((u_int)fd >= fdt->fdt_nfiles))
2960                 return (EBADF);
2961         seq = seqc_read_notmodify(fd_seqc(fdt, fd));
2962         fde = &fdt->fdt_ofiles[fd];
2963         haverights = cap_rights_fde_inline(fde);
2964         fp = fde->fde_file;
2965         if (__predict_false(fp == NULL))
2966                 return (EAGAIN);
2967         if (__predict_false(cap_check_inline_transient(haverights, &rights)))
2968                 return (EAGAIN);
2969         *fsearch = ((fp->f_flag & FSEARCH) != 0);
2970         vp = fp->f_vnode;
2971         if (__predict_false(vp == NULL || vp->v_type != VDIR)) {
2972                 return (EAGAIN);
2973         }
2974         if (!filecaps_copy(&fde->fde_caps, &ndp->ni_filecaps, false)) {
2975                 return (EAGAIN);
2976         }
2977         /*
2978          * Use an acquire barrier to force re-reading of fdt so it is
2979          * refreshed for verification.
2980          */
2981         atomic_thread_fence_acq();
2982         fdt = fdp->fd_files;
2983         if (__predict_false(!seqc_consistent_nomb(fd_seqc(fdt, fd), seq)))
2984                 return (EAGAIN);
2985         /*
2986          * If file descriptor doesn't have all rights,
2987          * all lookups relative to it must also be
2988          * strictly relative.
2989          *
2990          * Not yet supported by fast path.
2991          */
2992         CAP_ALL(&rights);
2993         if (!cap_rights_contains(&ndp->ni_filecaps.fc_rights, &rights) ||
2994             ndp->ni_filecaps.fc_fcntls != CAP_FCNTL_ALL ||
2995             ndp->ni_filecaps.fc_nioctls != -1) {
2996 #ifdef notyet
2997                 ndp->ni_lcf |= NI_LCF_STRICTRELATIVE;
2998 #else
2999                 return (EAGAIN);
3000 #endif
3001         }
3002         *vpp = vp;
3003         return (0);
3004 }
3005 #else
3006 int
3007 fgetvp_lookup_smr(int fd, struct nameidata *ndp, struct vnode **vpp, bool *fsearch)
3008 {
3009         const struct fdescenttbl *fdt;
3010         struct filedesc *fdp;
3011         struct file *fp;
3012         struct vnode *vp;
3013
3014         VFS_SMR_ASSERT_ENTERED();
3015
3016         fdp = curproc->p_fd;
3017         fdt = fdp->fd_files;
3018         if (__predict_false((u_int)fd >= fdt->fdt_nfiles))
3019                 return (EBADF);
3020         fp = fdt->fdt_ofiles[fd].fde_file;
3021         if (__predict_false(fp == NULL))
3022                 return (EAGAIN);
3023         *fsearch = ((fp->f_flag & FSEARCH) != 0);
3024         vp = fp->f_vnode;
3025         if (__predict_false(vp == NULL || vp->v_type != VDIR)) {
3026                 return (EAGAIN);
3027         }
3028         /*
3029          * Use an acquire barrier to force re-reading of fdt so it is
3030          * refreshed for verification.
3031          */
3032         atomic_thread_fence_acq();
3033         fdt = fdp->fd_files;
3034         if (__predict_false(fp != fdt->fdt_ofiles[fd].fde_file))
3035                 return (EAGAIN);
3036         filecaps_fill(&ndp->ni_filecaps);
3037         *vpp = vp;
3038         return (0);
3039 }
3040 #endif
3041
3042 int
3043 fget_unlocked_seq(struct filedesc *fdp, int fd, cap_rights_t *needrightsp,
3044     struct file **fpp, seqc_t *seqp)
3045 {
3046 #ifdef CAPABILITIES
3047         const struct filedescent *fde;
3048 #endif
3049         const struct fdescenttbl *fdt;
3050         struct file *fp;
3051 #ifdef CAPABILITIES
3052         seqc_t seq;
3053         cap_rights_t haverights;
3054         int error;
3055 #endif
3056
3057         fdt = fdp->fd_files;
3058         if (__predict_false((u_int)fd >= fdt->fdt_nfiles))
3059                 return (EBADF);
3060         /*
3061          * Fetch the descriptor locklessly.  We avoid fdrop() races by
3062          * never raising a refcount above 0.  To accomplish this we have
3063          * to use a cmpset loop rather than an atomic_add.  The descriptor
3064          * must be re-verified once we acquire a reference to be certain
3065          * that the identity is still correct and we did not lose a race
3066          * due to preemption.
3067          */
3068         for (;;) {
3069 #ifdef CAPABILITIES
3070                 seq = seqc_read_notmodify(fd_seqc(fdt, fd));
3071                 fde = &fdt->fdt_ofiles[fd];
3072                 haverights = *cap_rights_fde_inline(fde);
3073                 fp = fde->fde_file;
3074                 if (!seqc_consistent(fd_seqc(fdt, fd), seq))
3075                         continue;
3076 #else
3077                 fp = fdt->fdt_ofiles[fd].fde_file;
3078 #endif
3079                 if (fp == NULL)
3080                         return (EBADF);
3081 #ifdef CAPABILITIES
3082                 error = cap_check_inline(&haverights, needrightsp);
3083                 if (error != 0)
3084                         return (error);
3085 #endif
3086                 if (__predict_false(!refcount_acquire_if_not_zero(&fp->f_count))) {
3087                         /*
3088                          * Force a reload. Other thread could reallocate the
3089                          * table before this fd was closed, so it is possible
3090                          * that there is a stale fp pointer in cached version.
3091                          */
3092                         fdt = atomic_load_ptr(&fdp->fd_files);
3093                         continue;
3094                 }
3095                 /*
3096                  * Use an acquire barrier to force re-reading of fdt so it is
3097                  * refreshed for verification.
3098                  */
3099                 atomic_thread_fence_acq();
3100                 fdt = fdp->fd_files;
3101 #ifdef  CAPABILITIES
3102                 if (seqc_consistent_nomb(fd_seqc(fdt, fd), seq))
3103 #else
3104                 if (fp == fdt->fdt_ofiles[fd].fde_file)
3105 #endif
3106                         break;
3107                 fdrop(fp, curthread);
3108         }
3109         *fpp = fp;
3110         if (seqp != NULL) {
3111 #ifdef CAPABILITIES
3112                 *seqp = seq;
3113 #endif
3114         }
3115         return (0);
3116 }
3117
3118 /*
3119  * See the comments in fget_unlocked_seq for an explanation of how this works.
3120  *
3121  * This is a simplified variant which bails out to the aforementioned routine
3122  * if anything goes wrong. In practice this only happens when userspace is
3123  * racing with itself.
3124  */
3125 int
3126 fget_unlocked(struct filedesc *fdp, int fd, cap_rights_t *needrightsp,
3127     struct file **fpp)
3128 {
3129 #ifdef CAPABILITIES
3130         const struct filedescent *fde;
3131 #endif
3132         const struct fdescenttbl *fdt;
3133         struct file *fp;
3134 #ifdef CAPABILITIES
3135         seqc_t seq;
3136         const cap_rights_t *haverights;
3137 #endif
3138
3139         fdt = fdp->fd_files;
3140         if (__predict_false((u_int)fd >= fdt->fdt_nfiles))
3141                 return (EBADF);
3142 #ifdef CAPABILITIES
3143         seq = seqc_read_notmodify(fd_seqc(fdt, fd));
3144         fde = &fdt->fdt_ofiles[fd];
3145         haverights = cap_rights_fde_inline(fde);
3146         fp = fde->fde_file;
3147 #else
3148         fp = fdt->fdt_ofiles[fd].fde_file;
3149 #endif
3150         if (__predict_false(fp == NULL))
3151                 goto out_fallback;
3152 #ifdef CAPABILITIES
3153         if (__predict_false(cap_check_inline_transient(haverights, needrightsp)))
3154                 goto out_fallback;
3155 #endif
3156         if (__predict_false(!refcount_acquire_if_not_zero(&fp->f_count)))
3157                 goto out_fallback;
3158
3159         /*
3160          * Use an acquire barrier to force re-reading of fdt so it is
3161          * refreshed for verification.
3162          */
3163         atomic_thread_fence_acq();
3164         fdt = fdp->fd_files;
3165 #ifdef  CAPABILITIES
3166         if (__predict_false(!seqc_consistent_nomb(fd_seqc(fdt, fd), seq)))
3167 #else
3168         if (__predict_false(fp != fdt->fdt_ofiles[fd].fde_file))
3169 #endif
3170                 goto out_fdrop;
3171         *fpp = fp;
3172         return (0);
3173 out_fdrop:
3174         fdrop(fp, curthread);
3175 out_fallback:
3176         return (fget_unlocked_seq(fdp, fd, needrightsp, fpp, NULL));
3177 }
3178
3179 /*
3180  * Extract the file pointer associated with the specified descriptor for the
3181  * current user process.
3182  *
3183  * If the descriptor doesn't exist or doesn't match 'flags', EBADF is
3184  * returned.
3185  *
3186  * File's rights will be checked against the capability rights mask.
3187  *
3188  * If an error occurred the non-zero error is returned and *fpp is set to
3189  * NULL.  Otherwise *fpp is held and set and zero is returned.  Caller is
3190  * responsible for fdrop().
3191  */
3192 static __inline int
3193 _fget(struct thread *td, int fd, struct file **fpp, int flags,
3194     cap_rights_t *needrightsp)
3195 {
3196         struct filedesc *fdp;
3197         struct file *fp;
3198         int error;
3199
3200         *fpp = NULL;
3201         fdp = td->td_proc->p_fd;
3202         error = fget_unlocked(fdp, fd, needrightsp, &fp);
3203         if (__predict_false(error != 0))
3204                 return (error);
3205         if (__predict_false(fp->f_ops == &badfileops)) {
3206                 fdrop(fp, td);
3207                 return (EBADF);
3208         }
3209
3210         /*
3211          * FREAD and FWRITE failure return EBADF as per POSIX.
3212          */
3213         error = 0;
3214         switch (flags) {
3215         case FREAD:
3216         case FWRITE:
3217                 if ((fp->f_flag & flags) == 0)
3218                         error = EBADF;
3219                 break;
3220         case FEXEC:
3221                 if ((fp->f_flag & (FREAD | FEXEC)) == 0 ||
3222                     ((fp->f_flag & FWRITE) != 0))
3223                         error = EBADF;
3224                 break;
3225         case 0:
3226                 break;
3227         default:
3228                 KASSERT(0, ("wrong flags"));
3229         }
3230
3231         if (error != 0) {
3232                 fdrop(fp, td);
3233                 return (error);
3234         }
3235
3236         *fpp = fp;
3237         return (0);
3238 }
3239
3240 int
3241 fget(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
3242 {
3243
3244         return (_fget(td, fd, fpp, 0, rightsp));
3245 }
3246
3247 int
3248 fget_mmap(struct thread *td, int fd, cap_rights_t *rightsp, vm_prot_t *maxprotp,
3249     struct file **fpp)
3250 {
3251         int error;
3252 #ifndef CAPABILITIES
3253         error = _fget(td, fd, fpp, 0, rightsp);
3254         if (maxprotp != NULL)
3255                 *maxprotp = VM_PROT_ALL;
3256         return (error);
3257 #else
3258         cap_rights_t fdrights;
3259         struct filedesc *fdp;
3260         struct file *fp;
3261         seqc_t seq;
3262
3263         *fpp = NULL;
3264         fdp = td->td_proc->p_fd;
3265         MPASS(cap_rights_is_set(rightsp, CAP_MMAP));
3266         for (;;) {
3267                 error = fget_unlocked_seq(fdp, fd, rightsp, &fp, &seq);
3268                 if (__predict_false(error != 0))
3269                         return (error);
3270                 if (__predict_false(fp->f_ops == &badfileops)) {
3271                         fdrop(fp, td);
3272                         return (EBADF);
3273                 }
3274                 if (maxprotp != NULL)
3275                         fdrights = *cap_rights(fdp, fd);
3276                 if (!fd_modified(fdp, fd, seq))
3277                         break;
3278                 fdrop(fp, td);
3279         }
3280
3281         /*
3282          * If requested, convert capability rights to access flags.
3283          */
3284         if (maxprotp != NULL)
3285                 *maxprotp = cap_rights_to_vmprot(&fdrights);
3286         *fpp = fp;
3287         return (0);
3288 #endif
3289 }
3290
3291 int
3292 fget_read(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
3293 {
3294
3295         return (_fget(td, fd, fpp, FREAD, rightsp));
3296 }
3297
3298 int
3299 fget_write(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
3300 {
3301
3302         return (_fget(td, fd, fpp, FWRITE, rightsp));
3303 }
3304
3305 int
3306 fget_fcntl(struct thread *td, int fd, cap_rights_t *rightsp, int needfcntl,
3307     struct file **fpp)
3308 {
3309         struct filedesc *fdp = td->td_proc->p_fd;
3310 #ifndef CAPABILITIES
3311         return (fget_unlocked(fdp, fd, rightsp, fpp));
3312 #else
3313         struct file *fp;
3314         int error;
3315         seqc_t seq;
3316
3317         *fpp = NULL;
3318         MPASS(cap_rights_is_set(rightsp, CAP_FCNTL));
3319         for (;;) {
3320                 error = fget_unlocked_seq(fdp, fd, rightsp, &fp, &seq);
3321                 if (error != 0)
3322                         return (error);
3323                 error = cap_fcntl_check(fdp, fd, needfcntl);
3324                 if (!fd_modified(fdp, fd, seq))
3325                         break;
3326                 fdrop(fp, td);
3327         }
3328         if (error != 0) {
3329                 fdrop(fp, td);
3330                 return (error);
3331         }
3332         *fpp = fp;
3333         return (0);
3334 #endif
3335 }
3336
3337 /*
3338  * Like fget() but loads the underlying vnode, or returns an error if the
3339  * descriptor does not represent a vnode.  Note that pipes use vnodes but
3340  * never have VM objects.  The returned vnode will be vref()'d.
3341  *
3342  * XXX: what about the unused flags ?
3343  */
3344 static __inline int
3345 _fgetvp(struct thread *td, int fd, int flags, cap_rights_t *needrightsp,
3346     struct vnode **vpp)
3347 {
3348         struct file *fp;
3349         int error;
3350
3351         *vpp = NULL;
3352         error = _fget(td, fd, &fp, flags, needrightsp);
3353         if (error != 0)
3354                 return (error);
3355         if (fp->f_vnode == NULL) {
3356                 error = EINVAL;
3357         } else {
3358                 *vpp = fp->f_vnode;
3359                 vrefact(*vpp);
3360         }
3361         fdrop(fp, td);
3362
3363         return (error);
3364 }
3365
3366 int
3367 fgetvp(struct thread *td, int fd, cap_rights_t *rightsp, struct vnode **vpp)
3368 {
3369
3370         return (_fgetvp(td, fd, 0, rightsp, vpp));
3371 }
3372
3373 int
3374 fgetvp_rights(struct thread *td, int fd, cap_rights_t *needrightsp,
3375     struct filecaps *havecaps, struct vnode **vpp)
3376 {
3377         struct filecaps caps;
3378         struct file *fp;
3379         int error;
3380
3381         error = fget_cap(td, fd, needrightsp, &fp, &caps);
3382         if (error != 0)
3383                 return (error);
3384         if (fp->f_ops == &badfileops) {
3385                 error = EBADF;
3386                 goto out;
3387         }
3388         if (fp->f_vnode == NULL) {
3389                 error = EINVAL;
3390                 goto out;
3391         }
3392
3393         *havecaps = caps;
3394         *vpp = fp->f_vnode;
3395         vrefact(*vpp);
3396         fdrop(fp, td);
3397
3398         return (0);
3399 out:
3400         filecaps_free(&caps);
3401         fdrop(fp, td);
3402         return (error);
3403 }
3404
3405 int
3406 fgetvp_read(struct thread *td, int fd, cap_rights_t *rightsp, struct vnode **vpp)
3407 {
3408
3409         return (_fgetvp(td, fd, FREAD, rightsp, vpp));
3410 }
3411
3412 int
3413 fgetvp_exec(struct thread *td, int fd, cap_rights_t *rightsp, struct vnode **vpp)
3414 {
3415
3416         return (_fgetvp(td, fd, FEXEC, rightsp, vpp));
3417 }
3418
3419 #ifdef notyet
3420 int
3421 fgetvp_write(struct thread *td, int fd, cap_rights_t *rightsp,
3422     struct vnode **vpp)
3423 {
3424
3425         return (_fgetvp(td, fd, FWRITE, rightsp, vpp));
3426 }
3427 #endif
3428
3429 /*
3430  * Handle the last reference to a file being closed.
3431  *
3432  * Without the noinline attribute clang keeps inlining the func thorough this
3433  * file when fdrop is used.
3434  */
3435 int __noinline
3436 _fdrop(struct file *fp, struct thread *td)
3437 {
3438         int error;
3439 #ifdef INVARIANTS
3440         int count;
3441
3442         count = refcount_load(&fp->f_count);
3443         if (count != 0)
3444                 panic("fdrop: fp %p count %d", fp, count);
3445 #endif
3446         error = fo_close(fp, td);
3447         atomic_subtract_int(&openfiles, 1);
3448         crfree(fp->f_cred);
3449         free(fp->f_advice, M_FADVISE);
3450         uma_zfree(file_zone, fp);
3451
3452         return (error);
3453 }
3454
3455 /*
3456  * Apply an advisory lock on a file descriptor.
3457  *
3458  * Just attempt to get a record lock of the requested type on the entire file
3459  * (l_whence = SEEK_SET, l_start = 0, l_len = 0).
3460  */
3461 #ifndef _SYS_SYSPROTO_H_
3462 struct flock_args {
3463         int     fd;
3464         int     how;
3465 };
3466 #endif
3467 /* ARGSUSED */
3468 int
3469 sys_flock(struct thread *td, struct flock_args *uap)
3470 {
3471         struct file *fp;
3472         struct vnode *vp;
3473         struct flock lf;
3474         int error;
3475
3476         error = fget(td, uap->fd, &cap_flock_rights, &fp);
3477         if (error != 0)
3478                 return (error);
3479         if (fp->f_type != DTYPE_VNODE) {
3480                 fdrop(fp, td);
3481                 return (EOPNOTSUPP);
3482         }
3483
3484         vp = fp->f_vnode;
3485         lf.l_whence = SEEK_SET;
3486         lf.l_start = 0;
3487         lf.l_len = 0;
3488         if (uap->how & LOCK_UN) {
3489                 lf.l_type = F_UNLCK;
3490                 atomic_clear_int(&fp->f_flag, FHASLOCK);
3491                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, F_FLOCK);
3492                 goto done2;
3493         }
3494         if (uap->how & LOCK_EX)
3495                 lf.l_type = F_WRLCK;
3496         else if (uap->how & LOCK_SH)
3497                 lf.l_type = F_RDLCK;
3498         else {
3499                 error = EBADF;
3500                 goto done2;
3501         }
3502         atomic_set_int(&fp->f_flag, FHASLOCK);
3503         error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf,
3504             (uap->how & LOCK_NB) ? F_FLOCK : F_FLOCK | F_WAIT);
3505 done2:
3506         fdrop(fp, td);
3507         return (error);
3508 }
3509 /*
3510  * Duplicate the specified descriptor to a free descriptor.
3511  */
3512 int
3513 dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode,
3514     int openerror, int *indxp)
3515 {
3516         struct filedescent *newfde, *oldfde;
3517         struct file *fp;
3518         u_long *ioctls;
3519         int error, indx;
3520
3521         KASSERT(openerror == ENODEV || openerror == ENXIO,
3522             ("unexpected error %d in %s", openerror, __func__));
3523
3524         /*
3525          * If the to-be-dup'd fd number is greater than the allowed number
3526          * of file descriptors, or the fd to be dup'd has already been
3527          * closed, then reject.
3528          */
3529         FILEDESC_XLOCK(fdp);
3530         if ((fp = fget_locked(fdp, dfd)) == NULL) {
3531                 FILEDESC_XUNLOCK(fdp);
3532                 return (EBADF);
3533         }
3534
3535         error = fdalloc(td, 0, &indx);
3536         if (error != 0) {
3537                 FILEDESC_XUNLOCK(fdp);
3538                 return (error);
3539         }
3540
3541         /*
3542          * There are two cases of interest here.
3543          *
3544          * For ENODEV simply dup (dfd) to file descriptor (indx) and return.
3545          *
3546          * For ENXIO steal away the file structure from (dfd) and store it in
3547          * (indx).  (dfd) is effectively closed by this operation.
3548          */
3549         switch (openerror) {
3550         case ENODEV:
3551                 /*
3552                  * Check that the mode the file is being opened for is a
3553                  * subset of the mode of the existing descriptor.
3554                  */
3555                 if (((mode & (FREAD|FWRITE)) | fp->f_flag) != fp->f_flag) {
3556                         fdunused(fdp, indx);
3557                         FILEDESC_XUNLOCK(fdp);
3558                         return (EACCES);
3559                 }
3560                 if (!fhold(fp)) {
3561                         fdunused(fdp, indx);
3562                         FILEDESC_XUNLOCK(fdp);
3563                         return (EBADF);
3564                 }
3565                 newfde = &fdp->fd_ofiles[indx];
3566                 oldfde = &fdp->fd_ofiles[dfd];
3567                 ioctls = filecaps_copy_prep(&oldfde->fde_caps);
3568 #ifdef CAPABILITIES
3569                 seqc_write_begin(&newfde->fde_seqc);
3570 #endif
3571                 memcpy(newfde, oldfde, fde_change_size);
3572                 filecaps_copy_finish(&oldfde->fde_caps, &newfde->fde_caps,
3573                     ioctls);
3574 #ifdef CAPABILITIES
3575                 seqc_write_end(&newfde->fde_seqc);
3576 #endif
3577                 break;
3578         case ENXIO:
3579                 /*
3580                  * Steal away the file pointer from dfd and stuff it into indx.
3581                  */
3582                 newfde = &fdp->fd_ofiles[indx];
3583                 oldfde = &fdp->fd_ofiles[dfd];
3584 #ifdef CAPABILITIES
3585                 seqc_write_begin(&newfde->fde_seqc);
3586 #endif
3587                 memcpy(newfde, oldfde, fde_change_size);
3588                 oldfde->fde_file = NULL;
3589                 fdunused(fdp, dfd);
3590 #ifdef CAPABILITIES
3591                 seqc_write_end(&newfde->fde_seqc);
3592 #endif
3593                 break;
3594         }
3595         FILEDESC_XUNLOCK(fdp);
3596         *indxp = indx;
3597         return (0);
3598 }
3599
3600 /*
3601  * This sysctl determines if we will allow a process to chroot(2) if it
3602  * has a directory open:
3603  *      0: disallowed for all processes.
3604  *      1: allowed for processes that were not already chroot(2)'ed.
3605  *      2: allowed for all processes.
3606  */
3607
3608 static int chroot_allow_open_directories = 1;
3609
3610 SYSCTL_INT(_kern, OID_AUTO, chroot_allow_open_directories, CTLFLAG_RW,
3611     &chroot_allow_open_directories, 0,
3612     "Allow a process to chroot(2) if it has a directory open");
3613
3614 /*
3615  * Helper function for raised chroot(2) security function:  Refuse if
3616  * any filedescriptors are open directories.
3617  */
3618 static int
3619 chroot_refuse_vdir_fds(struct filedesc *fdp)
3620 {
3621         struct vnode *vp;
3622         struct file *fp;
3623         int fd, lastfile;
3624
3625         FILEDESC_LOCK_ASSERT(fdp);
3626
3627         lastfile = fdlastfile(fdp);
3628         for (fd = 0; fd <= lastfile; fd++) {
3629                 fp = fget_locked(fdp, fd);
3630                 if (fp == NULL)
3631                         continue;
3632                 if (fp->f_type == DTYPE_VNODE) {
3633                         vp = fp->f_vnode;
3634                         if (vp->v_type == VDIR)
3635                                 return (EPERM);
3636                 }
3637         }
3638         return (0);
3639 }
3640
3641 static void
3642 pwd_fill(struct pwd *oldpwd, struct pwd *newpwd)
3643 {
3644
3645         if (newpwd->pwd_cdir == NULL && oldpwd->pwd_cdir != NULL) {
3646                 vrefact(oldpwd->pwd_cdir);
3647                 newpwd->pwd_cdir = oldpwd->pwd_cdir;
3648         }
3649
3650         if (newpwd->pwd_rdir == NULL && oldpwd->pwd_rdir != NULL) {
3651                 vrefact(oldpwd->pwd_rdir);
3652                 newpwd->pwd_rdir = oldpwd->pwd_rdir;
3653         }
3654
3655         if (newpwd->pwd_jdir == NULL && oldpwd->pwd_jdir != NULL) {
3656                 vrefact(oldpwd->pwd_jdir);
3657                 newpwd->pwd_jdir = oldpwd->pwd_jdir;
3658         }
3659 }
3660
3661 struct pwd *
3662 pwd_hold_pwddesc(struct pwddesc *pdp)
3663 {
3664         struct pwd *pwd;
3665
3666         PWDDESC_ASSERT_XLOCKED(pdp);
3667         pwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3668         if (pwd != NULL)
3669                 refcount_acquire(&pwd->pwd_refcount);
3670         return (pwd);
3671 }
3672
3673 bool
3674 pwd_hold_smr(struct pwd *pwd)
3675 {
3676
3677         MPASS(pwd != NULL);
3678         if (__predict_true(refcount_acquire_if_not_zero(&pwd->pwd_refcount))) {
3679                 return (true);
3680         }
3681         return (false);
3682 }
3683
3684 struct pwd *
3685 pwd_hold(struct thread *td)
3686 {
3687         struct pwddesc *pdp;
3688         struct pwd *pwd;
3689
3690         pdp = td->td_proc->p_pd;
3691
3692         vfs_smr_enter();
3693         pwd = vfs_smr_entered_load(&pdp->pd_pwd);
3694         if (pwd_hold_smr(pwd)) {
3695                 vfs_smr_exit();
3696                 return (pwd);
3697         }
3698         vfs_smr_exit();
3699         PWDDESC_XLOCK(pdp);
3700         pwd = pwd_hold_pwddesc(pdp);
3701         MPASS(pwd != NULL);
3702         PWDDESC_XUNLOCK(pdp);
3703         return (pwd);
3704 }
3705
3706 static struct pwd *
3707 pwd_alloc(void)
3708 {
3709         struct pwd *pwd;
3710
3711         pwd = uma_zalloc_smr(pwd_zone, M_WAITOK);
3712         bzero(pwd, sizeof(*pwd));
3713         refcount_init(&pwd->pwd_refcount, 1);
3714         return (pwd);
3715 }
3716
3717 void
3718 pwd_drop(struct pwd *pwd)
3719 {
3720
3721         if (!refcount_release(&pwd->pwd_refcount))
3722                 return;
3723
3724         if (pwd->pwd_cdir != NULL)
3725                 vrele(pwd->pwd_cdir);
3726         if (pwd->pwd_rdir != NULL)
3727                 vrele(pwd->pwd_rdir);
3728         if (pwd->pwd_jdir != NULL)
3729                 vrele(pwd->pwd_jdir);
3730         uma_zfree_smr(pwd_zone, pwd);
3731 }
3732
3733 /*
3734 * Common routine for kern_chroot() and jail_attach().  The caller is
3735 * responsible for invoking priv_check() and mac_vnode_check_chroot() to
3736 * authorize this operation.
3737 */
3738 int
3739 pwd_chroot(struct thread *td, struct vnode *vp)
3740 {
3741         struct pwddesc *pdp;
3742         struct filedesc *fdp;
3743         struct pwd *newpwd, *oldpwd;
3744         int error;
3745
3746         fdp = td->td_proc->p_fd;
3747         pdp = td->td_proc->p_pd;
3748         newpwd = pwd_alloc();
3749         FILEDESC_SLOCK(fdp);
3750         PWDDESC_XLOCK(pdp);
3751         oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3752         if (chroot_allow_open_directories == 0 ||
3753             (chroot_allow_open_directories == 1 &&
3754             oldpwd->pwd_rdir != rootvnode)) {
3755                 error = chroot_refuse_vdir_fds(fdp);
3756                 FILEDESC_SUNLOCK(fdp);
3757                 if (error != 0) {
3758                         PWDDESC_XUNLOCK(pdp);
3759                         pwd_drop(newpwd);
3760                         return (error);
3761                 }
3762         } else {
3763                 FILEDESC_SUNLOCK(fdp);
3764         }
3765
3766         vrefact(vp);
3767         newpwd->pwd_rdir = vp;
3768         if (oldpwd->pwd_jdir == NULL) {
3769                 vrefact(vp);
3770                 newpwd->pwd_jdir = vp;
3771         }
3772         pwd_fill(oldpwd, newpwd);
3773         pwd_set(pdp, newpwd);
3774         PWDDESC_XUNLOCK(pdp);
3775         pwd_drop(oldpwd);
3776         return (0);
3777 }
3778
3779 void
3780 pwd_chdir(struct thread *td, struct vnode *vp)
3781 {
3782         struct pwddesc *pdp;
3783         struct pwd *newpwd, *oldpwd;
3784
3785         VNPASS(vp->v_usecount > 0, vp);
3786
3787         newpwd = pwd_alloc();
3788         pdp = td->td_proc->p_pd;
3789         PWDDESC_XLOCK(pdp);
3790         oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3791         newpwd->pwd_cdir = vp;
3792         pwd_fill(oldpwd, newpwd);
3793         pwd_set(pdp, newpwd);
3794         PWDDESC_XUNLOCK(pdp);
3795         pwd_drop(oldpwd);
3796 }
3797
3798 void
3799 pwd_ensure_dirs(void)
3800 {
3801         struct pwddesc *pdp;
3802         struct pwd *oldpwd, *newpwd;
3803
3804         pdp = curproc->p_pd;
3805         PWDDESC_XLOCK(pdp);
3806         oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3807         if (oldpwd->pwd_cdir != NULL && oldpwd->pwd_rdir != NULL) {
3808                 PWDDESC_XUNLOCK(pdp);
3809                 return;
3810         }
3811         PWDDESC_XUNLOCK(pdp);
3812
3813         newpwd = pwd_alloc();
3814         PWDDESC_XLOCK(pdp);
3815         oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3816         pwd_fill(oldpwd, newpwd);
3817         if (newpwd->pwd_cdir == NULL) {
3818                 vrefact(rootvnode);
3819                 newpwd->pwd_cdir = rootvnode;
3820         }
3821         if (newpwd->pwd_rdir == NULL) {
3822                 vrefact(rootvnode);
3823                 newpwd->pwd_rdir = rootvnode;
3824         }
3825         pwd_set(pdp, newpwd);
3826         PWDDESC_XUNLOCK(pdp);
3827         pwd_drop(oldpwd);
3828 }
3829
3830 void
3831 pwd_set_rootvnode(void)
3832 {
3833         struct pwddesc *pdp;
3834         struct pwd *oldpwd, *newpwd;
3835
3836         pdp = curproc->p_pd;
3837
3838         newpwd = pwd_alloc();
3839         PWDDESC_XLOCK(pdp);
3840         oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3841         vrefact(rootvnode);
3842         newpwd->pwd_cdir = rootvnode;
3843         vrefact(rootvnode);
3844         newpwd->pwd_rdir = rootvnode;
3845         pwd_fill(oldpwd, newpwd);
3846         pwd_set(pdp, newpwd);
3847         PWDDESC_XUNLOCK(pdp);
3848         pwd_drop(oldpwd);
3849 }
3850
3851 /*
3852  * Scan all active processes and prisons to see if any of them have a current
3853  * or root directory of `olddp'. If so, replace them with the new mount point.
3854  */
3855 void
3856 mountcheckdirs(struct vnode *olddp, struct vnode *newdp)
3857 {
3858         struct pwddesc *pdp;
3859         struct pwd *newpwd, *oldpwd;
3860         struct prison *pr;
3861         struct proc *p;
3862         int nrele;
3863
3864         if (vrefcnt(olddp) == 1)
3865                 return;
3866         nrele = 0;
3867         newpwd = pwd_alloc();
3868         sx_slock(&allproc_lock);
3869         FOREACH_PROC_IN_SYSTEM(p) {
3870                 PROC_LOCK(p);
3871                 pdp = pdhold(p);
3872                 PROC_UNLOCK(p);
3873                 if (pdp == NULL)
3874                         continue;
3875                 PWDDESC_XLOCK(pdp);
3876                 oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
3877                 if (oldpwd == NULL ||
3878                     (oldpwd->pwd_cdir != olddp &&
3879                     oldpwd->pwd_rdir != olddp &&
3880                     oldpwd->pwd_jdir != olddp)) {
3881                         PWDDESC_XUNLOCK(pdp);
3882                         pddrop(pdp);
3883                         continue;
3884                 }
3885                 if (oldpwd->pwd_cdir == olddp) {
3886                         vrefact(newdp);
3887                         newpwd->pwd_cdir = newdp;
3888                 }
3889                 if (oldpwd->pwd_rdir == olddp) {
3890                         vrefact(newdp);
3891                         newpwd->pwd_rdir = newdp;
3892                 }
3893                 if (oldpwd->pwd_jdir == olddp) {
3894                         vrefact(newdp);
3895                         newpwd->pwd_jdir = newdp;
3896                 }
3897                 pwd_fill(oldpwd, newpwd);
3898                 pwd_set(pdp, newpwd);
3899                 PWDDESC_XUNLOCK(pdp);
3900                 pwd_drop(oldpwd);
3901                 pddrop(pdp);
3902                 newpwd = pwd_alloc();
3903         }
3904         sx_sunlock(&allproc_lock);
3905         pwd_drop(newpwd);
3906         if (rootvnode == olddp) {
3907                 vrefact(newdp);
3908                 rootvnode = newdp;
3909                 nrele++;
3910         }
3911         mtx_lock(&prison0.pr_mtx);
3912         if (prison0.pr_root == olddp) {
3913                 vrefact(newdp);
3914                 prison0.pr_root = newdp;
3915                 nrele++;
3916         }
3917         mtx_unlock(&prison0.pr_mtx);
3918         sx_slock(&allprison_lock);
3919         TAILQ_FOREACH(pr, &allprison, pr_list) {
3920                 mtx_lock(&pr->pr_mtx);
3921                 if (pr->pr_root == olddp) {
3922                         vrefact(newdp);
3923                         pr->pr_root = newdp;
3924                         nrele++;
3925                 }
3926                 mtx_unlock(&pr->pr_mtx);
3927         }
3928         sx_sunlock(&allprison_lock);
3929         while (nrele--)
3930                 vrele(olddp);
3931 }
3932
3933 struct filedesc_to_leader *
3934 filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader)
3935 {
3936         struct filedesc_to_leader *fdtol;
3937
3938         fdtol = malloc(sizeof(struct filedesc_to_leader),
3939             M_FILEDESC_TO_LEADER, M_WAITOK);
3940         fdtol->fdl_refcount = 1;
3941         fdtol->fdl_holdcount = 0;
3942         fdtol->fdl_wakeup = 0;
3943         fdtol->fdl_leader = leader;
3944         if (old != NULL) {
3945                 FILEDESC_XLOCK(fdp);
3946                 fdtol->fdl_next = old->fdl_next;
3947                 fdtol->fdl_prev = old;
3948                 old->fdl_next = fdtol;
3949                 fdtol->fdl_next->fdl_prev = fdtol;
3950                 FILEDESC_XUNLOCK(fdp);
3951         } else {
3952                 fdtol->fdl_next = fdtol;
3953                 fdtol->fdl_prev = fdtol;
3954         }
3955         return (fdtol);
3956 }
3957
3958 static int
3959 sysctl_kern_proc_nfds(SYSCTL_HANDLER_ARGS)
3960 {
3961         NDSLOTTYPE *map;
3962         struct filedesc *fdp;
3963         int count, off, minoff;
3964
3965         if (*(int *)arg1 != 0)
3966                 return (EINVAL);
3967
3968         fdp = curproc->p_fd;
3969         count = 0;
3970         FILEDESC_SLOCK(fdp);
3971         map = fdp->fd_map;
3972         off = NDSLOT(fdp->fd_nfiles - 1);
3973         for (minoff = NDSLOT(0); off >= minoff; --off)
3974                 count += bitcountl(map[off]);
3975         FILEDESC_SUNLOCK(fdp);
3976
3977         return (SYSCTL_OUT(req, &count, sizeof(count)));
3978 }
3979
3980 static SYSCTL_NODE(_kern_proc, KERN_PROC_NFDS, nfds,
3981     CTLFLAG_RD|CTLFLAG_CAPRD|CTLFLAG_MPSAFE, sysctl_kern_proc_nfds,
3982     "Number of open file descriptors");
3983
3984 /*
3985  * Get file structures globally.
3986  */
3987 static int
3988 sysctl_kern_file(SYSCTL_HANDLER_ARGS)
3989 {
3990         struct xfile xf;
3991         struct filedesc *fdp;
3992         struct file *fp;
3993         struct proc *p;
3994         int error, n, lastfile;
3995
3996         error = sysctl_wire_old_buffer(req, 0);
3997         if (error != 0)
3998                 return (error);
3999         if (req->oldptr == NULL) {
4000                 n = 0;
4001                 sx_slock(&allproc_lock);
4002                 FOREACH_PROC_IN_SYSTEM(p) {
4003                         PROC_LOCK(p);
4004                         if (p->p_state == PRS_NEW) {
4005                                 PROC_UNLOCK(p);
4006                                 continue;
4007                         }
4008                         fdp = fdhold(p);
4009                         PROC_UNLOCK(p);
4010                         if (fdp == NULL)
4011                                 continue;
4012                         /* overestimates sparse tables. */
4013                         n += fdp->fd_nfiles;
4014                         fddrop(fdp);
4015                 }
4016                 sx_sunlock(&allproc_lock);
4017                 return (SYSCTL_OUT(req, 0, n * sizeof(xf)));
4018         }
4019         error = 0;
4020         bzero(&xf, sizeof(xf));
4021         xf.xf_size = sizeof(xf);
4022         sx_slock(&allproc_lock);
4023         FOREACH_PROC_IN_SYSTEM(p) {
4024                 PROC_LOCK(p);
4025                 if (p->p_state == PRS_NEW) {
4026                         PROC_UNLOCK(p);
4027                         continue;
4028                 }
4029                 if (p_cansee(req->td, p) != 0) {
4030                         PROC_UNLOCK(p);
4031                         continue;
4032                 }
4033                 xf.xf_pid = p->p_pid;
4034                 xf.xf_uid = p->p_ucred->cr_uid;
4035                 fdp = fdhold(p);
4036                 PROC_UNLOCK(p);
4037                 if (fdp == NULL)
4038                         continue;
4039                 FILEDESC_SLOCK(fdp);
4040                 lastfile = fdlastfile(fdp);
4041                 for (n = 0; refcount_load(&fdp->fd_refcnt) > 0 && n <= lastfile;
4042                     n++) {
4043                         if ((fp = fdp->fd_ofiles[n].fde_file) == NULL)
4044                                 continue;
4045                         xf.xf_fd = n;
4046                         xf.xf_file = (uintptr_t)fp;
4047                         xf.xf_data = (uintptr_t)fp->f_data;
4048                         xf.xf_vnode = (uintptr_t)fp->f_vnode;
4049                         xf.xf_type = (uintptr_t)fp->f_type;
4050                         xf.xf_count = refcount_load(&fp->f_count);
4051                         xf.xf_msgcount = 0;
4052                         xf.xf_offset = foffset_get(fp);
4053                         xf.xf_flag = fp->f_flag;
4054                         error = SYSCTL_OUT(req, &xf, sizeof(xf));
4055                         if (error)
4056                                 break;
4057                 }
4058                 FILEDESC_SUNLOCK(fdp);
4059                 fddrop(fdp);
4060                 if (error)
4061                         break;
4062         }
4063         sx_sunlock(&allproc_lock);
4064         return (error);
4065 }
4066
4067 SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD|CTLFLAG_MPSAFE,
4068     0, 0, sysctl_kern_file, "S,xfile", "Entire file table");
4069
4070 #ifdef KINFO_FILE_SIZE
4071 CTASSERT(sizeof(struct kinfo_file) == KINFO_FILE_SIZE);
4072 #endif
4073
4074 static int
4075 xlate_fflags(int fflags)
4076 {
4077         static const struct {
4078                 int     fflag;
4079                 int     kf_fflag;
4080         } fflags_table[] = {
4081                 { FAPPEND, KF_FLAG_APPEND },
4082                 { FASYNC, KF_FLAG_ASYNC },
4083                 { FFSYNC, KF_FLAG_FSYNC },
4084                 { FHASLOCK, KF_FLAG_HASLOCK },
4085                 { FNONBLOCK, KF_FLAG_NONBLOCK },
4086                 { FREAD, KF_FLAG_READ },
4087                 { FWRITE, KF_FLAG_WRITE },
4088                 { O_CREAT, KF_FLAG_CREAT },
4089                 { O_DIRECT, KF_FLAG_DIRECT },
4090                 { O_EXCL, KF_FLAG_EXCL },
4091                 { O_EXEC, KF_FLAG_EXEC },
4092                 { O_EXLOCK, KF_FLAG_EXLOCK },
4093                 { O_NOFOLLOW, KF_FLAG_NOFOLLOW },
4094                 { O_SHLOCK, KF_FLAG_SHLOCK },
4095                 { O_TRUNC, KF_FLAG_TRUNC }
4096         };
4097         unsigned int i;
4098         int kflags;
4099
4100         kflags = 0;
4101         for (i = 0; i < nitems(fflags_table); i++)
4102                 if (fflags & fflags_table[i].fflag)
4103                         kflags |=  fflags_table[i].kf_fflag;
4104         return (kflags);
4105 }
4106
4107 /* Trim unused data from kf_path by truncating the structure size. */
4108 void
4109 pack_kinfo(struct kinfo_file *kif)
4110 {
4111
4112         kif->kf_structsize = offsetof(struct kinfo_file, kf_path) +
4113             strlen(kif->kf_path) + 1;
4114         kif->kf_structsize = roundup(kif->kf_structsize, sizeof(uint64_t));
4115 }
4116
4117 static void
4118 export_file_to_kinfo(struct file *fp, int fd, cap_rights_t *rightsp,
4119     struct kinfo_file *kif, struct filedesc *fdp, int flags)
4120 {
4121         int error;
4122
4123         bzero(kif, sizeof(*kif));
4124
4125         /* Set a default type to allow for empty fill_kinfo() methods. */
4126         kif->kf_type = KF_TYPE_UNKNOWN;
4127         kif->kf_flags = xlate_fflags(fp->f_flag);
4128         if (rightsp != NULL)
4129                 kif->kf_cap_rights = *rightsp;
4130         else
4131                 cap_rights_init_zero(&kif->kf_cap_rights);
4132         kif->kf_fd = fd;
4133         kif->kf_ref_count = refcount_load(&fp->f_count);
4134         kif->kf_offset = foffset_get(fp);
4135
4136         /*
4137          * This may drop the filedesc lock, so the 'fp' cannot be
4138          * accessed after this call.
4139          */
4140         error = fo_fill_kinfo(fp, kif, fdp);
4141         if (error == 0)
4142                 kif->kf_status |= KF_ATTR_VALID;
4143         if ((flags & KERN_FILEDESC_PACK_KINFO) != 0)
4144                 pack_kinfo(kif);
4145         else
4146                 kif->kf_structsize = roundup2(sizeof(*kif), sizeof(uint64_t));
4147 }
4148
4149 static void
4150 export_vnode_to_kinfo(struct vnode *vp, int fd, int fflags,
4151     struct kinfo_file *kif, int flags)
4152 {
4153         int error;
4154
4155         bzero(kif, sizeof(*kif));
4156
4157         kif->kf_type = KF_TYPE_VNODE;
4158         error = vn_fill_kinfo_vnode(vp, kif);
4159         if (error == 0)
4160                 kif->kf_status |= KF_ATTR_VALID;
4161         kif->kf_flags = xlate_fflags(fflags);
4162         cap_rights_init_zero(&kif->kf_cap_rights);
4163         kif->kf_fd = fd;
4164         kif->kf_ref_count = -1;
4165         kif->kf_offset = -1;
4166         if ((flags & KERN_FILEDESC_PACK_KINFO) != 0)
4167                 pack_kinfo(kif);
4168         else
4169                 kif->kf_structsize = roundup2(sizeof(*kif), sizeof(uint64_t));
4170         vrele(vp);
4171 }
4172
4173 struct export_fd_buf {
4174         struct filedesc         *fdp;
4175         struct pwddesc  *pdp;
4176         struct sbuf             *sb;
4177         ssize_t                 remainder;
4178         struct kinfo_file       kif;
4179         int                     flags;
4180 };
4181
4182 static int
4183 export_kinfo_to_sb(struct export_fd_buf *efbuf)
4184 {
4185         struct kinfo_file *kif;
4186
4187         kif = &efbuf->kif;
4188         if (efbuf->remainder != -1) {
4189                 if (efbuf->remainder < kif->kf_structsize) {
4190                         /* Terminate export. */
4191                         efbuf->remainder = 0;
4192                         return (0);
4193                 }
4194                 efbuf->remainder -= kif->kf_structsize;
4195         }
4196         return (sbuf_bcat(efbuf->sb, kif, kif->kf_structsize) == 0 ? 0 : ENOMEM);
4197 }
4198
4199 static int
4200 export_file_to_sb(struct file *fp, int fd, cap_rights_t *rightsp,
4201     struct export_fd_buf *efbuf)
4202 {
4203         int error;
4204
4205         if (efbuf->remainder == 0)
4206                 return (0);
4207         export_file_to_kinfo(fp, fd, rightsp, &efbuf->kif, efbuf->fdp,
4208             efbuf->flags);
4209         FILEDESC_SUNLOCK(efbuf->fdp);
4210         error = export_kinfo_to_sb(efbuf);
4211         FILEDESC_SLOCK(efbuf->fdp);
4212         return (error);
4213 }
4214
4215 static int
4216 export_vnode_to_sb(struct vnode *vp, int fd, int fflags,
4217     struct export_fd_buf *efbuf)
4218 {
4219         int error;
4220
4221         if (efbuf->remainder == 0)
4222                 return (0);
4223         if (efbuf->pdp != NULL)
4224                 PWDDESC_XUNLOCK(efbuf->pdp);
4225         export_vnode_to_kinfo(vp, fd, fflags, &efbuf->kif, efbuf->flags);
4226         error = export_kinfo_to_sb(efbuf);
4227         if (efbuf->pdp != NULL)
4228                 PWDDESC_XLOCK(efbuf->pdp);
4229         return (error);
4230 }
4231
4232 /*
4233  * Store a process file descriptor information to sbuf.
4234  *
4235  * Takes a locked proc as argument, and returns with the proc unlocked.
4236  */
4237 int
4238 kern_proc_filedesc_out(struct proc *p,  struct sbuf *sb, ssize_t maxlen,
4239     int flags)
4240 {
4241         struct file *fp;
4242         struct filedesc *fdp;
4243         struct pwddesc *pdp;
4244         struct export_fd_buf *efbuf;
4245         struct vnode *cttyvp, *textvp, *tracevp;
4246         struct pwd *pwd;
4247         int error, i, lastfile;
4248         cap_rights_t rights;
4249
4250         PROC_LOCK_ASSERT(p, MA_OWNED);
4251
4252         /* ktrace vnode */
4253         tracevp = p->p_tracevp;
4254         if (tracevp != NULL)
4255                 vrefact(tracevp);
4256         /* text vnode */
4257         textvp = p->p_textvp;
4258         if (textvp != NULL)
4259                 vrefact(textvp);
4260         /* Controlling tty. */
4261         cttyvp = NULL;
4262         if (p->p_pgrp != NULL && p->p_pgrp->pg_session != NULL) {
4263                 cttyvp = p->p_pgrp->pg_session->s_ttyvp;
4264                 if (cttyvp != NULL)
4265                         vrefact(cttyvp);
4266         }
4267         fdp = fdhold(p);
4268         pdp = pdhold(p);
4269         PROC_UNLOCK(p);
4270         efbuf = malloc(sizeof(*efbuf), M_TEMP, M_WAITOK);
4271         efbuf->fdp = NULL;
4272         efbuf->pdp = NULL;
4273         efbuf->sb = sb;
4274         efbuf->remainder = maxlen;
4275         efbuf->flags = flags;
4276         if (tracevp != NULL)
4277                 export_vnode_to_sb(tracevp, KF_FD_TYPE_TRACE, FREAD | FWRITE,
4278                     efbuf);
4279         if (textvp != NULL)
4280                 export_vnode_to_sb(textvp, KF_FD_TYPE_TEXT, FREAD, efbuf);
4281         if (cttyvp != NULL)
4282                 export_vnode_to_sb(cttyvp, KF_FD_TYPE_CTTY, FREAD | FWRITE,
4283                     efbuf);
4284         error = 0;
4285         if (pdp == NULL || fdp == NULL)
4286                 goto fail;
4287         efbuf->fdp = fdp;
4288         efbuf->pdp = pdp;
4289         PWDDESC_XLOCK(pdp);
4290         pwd = pwd_hold_pwddesc(pdp);
4291         if (pwd != NULL) {
4292                 /* working directory */
4293                 if (pwd->pwd_cdir != NULL) {
4294                         vrefact(pwd->pwd_cdir);
4295                         export_vnode_to_sb(pwd->pwd_cdir, KF_FD_TYPE_CWD, FREAD, efbuf);
4296                 }
4297                 /* root directory */
4298                 if (pwd->pwd_rdir != NULL) {
4299                         vrefact(pwd->pwd_rdir);
4300                         export_vnode_to_sb(pwd->pwd_rdir, KF_FD_TYPE_ROOT, FREAD, efbuf);
4301                 }
4302                 /* jail directory */
4303                 if (pwd->pwd_jdir != NULL) {
4304                         vrefact(pwd->pwd_jdir);
4305                         export_vnode_to_sb(pwd->pwd_jdir, KF_FD_TYPE_JAIL, FREAD, efbuf);
4306                 }
4307         }
4308         PWDDESC_XUNLOCK(pdp);
4309         if (pwd != NULL)
4310                 pwd_drop(pwd);
4311         FILEDESC_SLOCK(fdp);
4312         lastfile = fdlastfile(fdp);
4313         for (i = 0; refcount_load(&fdp->fd_refcnt) > 0 && i <= lastfile; i++) {
4314                 if ((fp = fdp->fd_ofiles[i].fde_file) == NULL)
4315                         continue;
4316 #ifdef CAPABILITIES
4317                 rights = *cap_rights(fdp, i);
4318 #else /* !CAPABILITIES */
4319                 rights = cap_no_rights;
4320 #endif
4321                 /*
4322                  * Create sysctl entry.  It is OK to drop the filedesc
4323                  * lock inside of export_file_to_sb() as we will
4324                  * re-validate and re-evaluate its properties when the
4325                  * loop continues.
4326                  */
4327                 error = export_file_to_sb(fp, i, &rights, efbuf);
4328                 if (error != 0 || efbuf->remainder == 0)
4329                         break;
4330         }
4331         FILEDESC_SUNLOCK(fdp);
4332 fail:
4333         if (fdp != NULL)
4334                 fddrop(fdp);
4335         if (pdp != NULL)
4336                 pddrop(pdp);
4337         free(efbuf, M_TEMP);
4338         return (error);
4339 }
4340
4341 #define FILEDESC_SBUF_SIZE      (sizeof(struct kinfo_file) * 5)
4342
4343 /*
4344  * Get per-process file descriptors for use by procstat(1), et al.
4345  */
4346 static int
4347 sysctl_kern_proc_filedesc(SYSCTL_HANDLER_ARGS)
4348 {
4349         struct sbuf sb;
4350         struct proc *p;
4351         ssize_t maxlen;
4352         int error, error2, *name;
4353
4354         name = (int *)arg1;
4355
4356         sbuf_new_for_sysctl(&sb, NULL, FILEDESC_SBUF_SIZE, req);
4357         sbuf_clear_flags(&sb, SBUF_INCLUDENUL);
4358         error = pget((pid_t)name[0], PGET_CANDEBUG | PGET_NOTWEXIT, &p);
4359         if (error != 0) {
4360                 sbuf_delete(&sb);
4361                 return (error);
4362         }
4363         maxlen = req->oldptr != NULL ? req->oldlen : -1;
4364         error = kern_proc_filedesc_out(p, &sb, maxlen,
4365             KERN_FILEDESC_PACK_KINFO);
4366         error2 = sbuf_finish(&sb);
4367         sbuf_delete(&sb);
4368         return (error != 0 ? error : error2);
4369 }
4370
4371 #ifdef COMPAT_FREEBSD7
4372 #ifdef KINFO_OFILE_SIZE
4373 CTASSERT(sizeof(struct kinfo_ofile) == KINFO_OFILE_SIZE);
4374 #endif
4375
4376 static void
4377 kinfo_to_okinfo(struct kinfo_file *kif, struct kinfo_ofile *okif)
4378 {
4379
4380         okif->kf_structsize = sizeof(*okif);
4381         okif->kf_type = kif->kf_type;
4382         okif->kf_fd = kif->kf_fd;
4383         okif->kf_ref_count = kif->kf_ref_count;
4384         okif->kf_flags = kif->kf_flags & (KF_FLAG_READ | KF_FLAG_WRITE |
4385             KF_FLAG_APPEND | KF_FLAG_ASYNC | KF_FLAG_FSYNC | KF_FLAG_NONBLOCK |
4386             KF_FLAG_DIRECT | KF_FLAG_HASLOCK);
4387         okif->kf_offset = kif->kf_offset;
4388         if (kif->kf_type == KF_TYPE_VNODE)
4389                 okif->kf_vnode_type = kif->kf_un.kf_file.kf_file_type;
4390         else
4391                 okif->kf_vnode_type = KF_VTYPE_VNON;
4392         strlcpy(okif->kf_path, kif->kf_path, sizeof(okif->kf_path));
4393         if (kif->kf_type == KF_TYPE_SOCKET) {
4394                 okif->kf_sock_domain = kif->kf_un.kf_sock.kf_sock_domain0;
4395                 okif->kf_sock_type = kif->kf_un.kf_sock.kf_sock_type0;
4396                 okif->kf_sock_protocol = kif->kf_un.kf_sock.kf_sock_protocol0;
4397                 okif->kf_sa_local = kif->kf_un.kf_sock.kf_sa_local;
4398                 okif->kf_sa_peer = kif->kf_un.kf_sock.kf_sa_peer;
4399         } else {
4400                 okif->kf_sa_local.ss_family = AF_UNSPEC;
4401                 okif->kf_sa_peer.ss_family = AF_UNSPEC;
4402         }
4403 }
4404
4405 static int
4406 export_vnode_for_osysctl(struct vnode *vp, int type, struct kinfo_file *kif,
4407     struct kinfo_ofile *okif, struct pwddesc *pdp, struct sysctl_req *req)
4408 {
4409         int error;
4410
4411         vrefact(vp);
4412         PWDDESC_XUNLOCK(pdp);
4413         export_vnode_to_kinfo(vp, type, 0, kif, KERN_FILEDESC_PACK_KINFO);
4414         kinfo_to_okinfo(kif, okif);
4415         error = SYSCTL_OUT(req, okif, sizeof(*okif));
4416         PWDDESC_XLOCK(pdp);
4417         return (error);
4418 }
4419
4420 /*
4421  * Get per-process file descriptors for use by procstat(1), et al.
4422  */
4423 static int
4424 sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS)
4425 {
4426         struct kinfo_ofile *okif;
4427         struct kinfo_file *kif;
4428         struct filedesc *fdp;
4429         struct pwddesc *pdp;
4430         struct pwd *pwd;
4431         int error, i, lastfile, *name;
4432         struct file *fp;
4433         struct proc *p;
4434
4435         name = (int *)arg1;
4436         error = pget((pid_t)name[0], PGET_CANDEBUG | PGET_NOTWEXIT, &p);
4437         if (error != 0)
4438                 return (error);
4439         fdp = fdhold(p);
4440         if (fdp != NULL)
4441                 pdp = pdhold(p);
4442         PROC_UNLOCK(p);
4443         if (fdp == NULL || pdp == NULL) {
4444                 if (fdp != NULL)
4445                         fddrop(fdp);
4446                 return (ENOENT);
4447         }
4448         kif = malloc(sizeof(*kif), M_TEMP, M_WAITOK);
4449         okif = malloc(sizeof(*okif), M_TEMP, M_WAITOK);
4450         PWDDESC_XLOCK(pdp);
4451         pwd = pwd_hold_pwddesc(pdp);
4452         if (pwd != NULL) {
4453                 if (pwd->pwd_cdir != NULL)
4454                         export_vnode_for_osysctl(pwd->pwd_cdir, KF_FD_TYPE_CWD, kif,
4455                             okif, pdp, req);
4456                 if (pwd->pwd_rdir != NULL)
4457                         export_vnode_for_osysctl(pwd->pwd_rdir, KF_FD_TYPE_ROOT, kif,
4458                             okif, pdp, req);
4459                 if (pwd->pwd_jdir != NULL)
4460                         export_vnode_for_osysctl(pwd->pwd_jdir, KF_FD_TYPE_JAIL, kif,
4461                             okif, pdp, req);
4462         }
4463         PWDDESC_XUNLOCK(pdp);
4464         if (pwd != NULL)
4465                 pwd_drop(pwd);
4466         FILEDESC_SLOCK(fdp);
4467         lastfile = fdlastfile(fdp);
4468         for (i = 0; refcount_load(&fdp->fd_refcnt) > 0 && i <= lastfile; i++) {
4469                 if ((fp = fdp->fd_ofiles[i].fde_file) == NULL)
4470                         continue;
4471                 export_file_to_kinfo(fp, i, NULL, kif, fdp,
4472                     KERN_FILEDESC_PACK_KINFO);
4473                 FILEDESC_SUNLOCK(fdp);
4474                 kinfo_to_okinfo(kif, okif);
4475                 error = SYSCTL_OUT(req, okif, sizeof(*okif));
4476                 FILEDESC_SLOCK(fdp);
4477                 if (error)
4478                         break;
4479         }
4480         FILEDESC_SUNLOCK(fdp);
4481         fddrop(fdp);
4482         pddrop(pdp);
4483         free(kif, M_TEMP);
4484         free(okif, M_TEMP);
4485         return (0);
4486 }
4487
4488 static SYSCTL_NODE(_kern_proc, KERN_PROC_OFILEDESC, ofiledesc,
4489     CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc_ofiledesc,
4490     "Process ofiledesc entries");
4491 #endif  /* COMPAT_FREEBSD7 */
4492
4493 int
4494 vntype_to_kinfo(int vtype)
4495 {
4496         struct {
4497                 int     vtype;
4498                 int     kf_vtype;
4499         } vtypes_table[] = {
4500                 { VBAD, KF_VTYPE_VBAD },
4501                 { VBLK, KF_VTYPE_VBLK },
4502                 { VCHR, KF_VTYPE_VCHR },
4503                 { VDIR, KF_VTYPE_VDIR },
4504                 { VFIFO, KF_VTYPE_VFIFO },
4505                 { VLNK, KF_VTYPE_VLNK },
4506                 { VNON, KF_VTYPE_VNON },
4507                 { VREG, KF_VTYPE_VREG },
4508                 { VSOCK, KF_VTYPE_VSOCK }
4509         };
4510         unsigned int i;
4511
4512         /*
4513          * Perform vtype translation.
4514          */
4515         for (i = 0; i < nitems(vtypes_table); i++)
4516                 if (vtypes_table[i].vtype == vtype)
4517                         return (vtypes_table[i].kf_vtype);
4518
4519         return (KF_VTYPE_UNKNOWN);
4520 }
4521
4522 static SYSCTL_NODE(_kern_proc, KERN_PROC_FILEDESC, filedesc,
4523     CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc_filedesc,
4524     "Process filedesc entries");
4525
4526 /*
4527  * Store a process current working directory information to sbuf.
4528  *
4529  * Takes a locked proc as argument, and returns with the proc unlocked.
4530  */
4531 int
4532 kern_proc_cwd_out(struct proc *p,  struct sbuf *sb, ssize_t maxlen)
4533 {
4534         struct pwddesc *pdp;
4535         struct pwd *pwd;
4536         struct export_fd_buf *efbuf;
4537         struct vnode *cdir;
4538         int error;
4539
4540         PROC_LOCK_ASSERT(p, MA_OWNED);
4541
4542         pdp = pdhold(p);
4543         PROC_UNLOCK(p);
4544         if (pdp == NULL)
4545                 return (EINVAL);
4546
4547         efbuf = malloc(sizeof(*efbuf), M_TEMP, M_WAITOK);
4548         efbuf->pdp = pdp;
4549         efbuf->sb = sb;
4550         efbuf->remainder = maxlen;
4551
4552         PWDDESC_XLOCK(pdp);
4553         pwd = PWDDESC_XLOCKED_LOAD_PWD(pdp);
4554         cdir = pwd->pwd_cdir;
4555         if (cdir == NULL) {
4556                 error = EINVAL;
4557         } else {
4558                 vrefact(cdir);
4559                 error = export_vnode_to_sb(cdir, KF_FD_TYPE_CWD, FREAD, efbuf);
4560         }
4561         PWDDESC_XUNLOCK(pdp);
4562         pddrop(pdp);
4563         free(efbuf, M_TEMP);
4564         return (error);
4565 }
4566
4567 /*
4568  * Get per-process current working directory.
4569  */
4570 static int
4571 sysctl_kern_proc_cwd(SYSCTL_HANDLER_ARGS)
4572 {
4573         struct sbuf sb;
4574         struct proc *p;
4575         ssize_t maxlen;
4576         int error, error2, *name;
4577
4578         name = (int *)arg1;
4579
4580         sbuf_new_for_sysctl(&sb, NULL, sizeof(struct kinfo_file), req);
4581         sbuf_clear_flags(&sb, SBUF_INCLUDENUL);
4582         error = pget((pid_t)name[0], PGET_CANDEBUG | PGET_NOTWEXIT, &p);
4583         if (error != 0) {
4584                 sbuf_delete(&sb);
4585                 return (error);
4586         }
4587         maxlen = req->oldptr != NULL ? req->oldlen : -1;
4588         error = kern_proc_cwd_out(p, &sb, maxlen);
4589         error2 = sbuf_finish(&sb);
4590         sbuf_delete(&sb);
4591         return (error != 0 ? error : error2);
4592 }
4593
4594 static SYSCTL_NODE(_kern_proc, KERN_PROC_CWD, cwd, CTLFLAG_RD|CTLFLAG_MPSAFE,
4595     sysctl_kern_proc_cwd, "Process current working directory");
4596
4597 #ifdef DDB
4598 /*
4599  * For the purposes of debugging, generate a human-readable string for the
4600  * file type.
4601  */
4602 static const char *
4603 file_type_to_name(short type)
4604 {
4605
4606         switch (type) {
4607         case 0:
4608                 return ("zero");
4609         case DTYPE_VNODE:
4610                 return ("vnode");
4611         case DTYPE_SOCKET:
4612                 return ("socket");
4613         case DTYPE_PIPE:
4614                 return ("pipe");
4615         case DTYPE_FIFO:
4616                 return ("fifo");
4617         case DTYPE_KQUEUE:
4618                 return ("kqueue");
4619         case DTYPE_CRYPTO:
4620                 return ("crypto");
4621         case DTYPE_MQUEUE:
4622                 return ("mqueue");
4623         case DTYPE_SHM:
4624                 return ("shm");
4625         case DTYPE_SEM:
4626                 return ("ksem");
4627         case DTYPE_PTS:
4628                 return ("pts");
4629         case DTYPE_DEV:
4630                 return ("dev");
4631         case DTYPE_PROCDESC:
4632                 return ("proc");
4633         case DTYPE_EVENTFD:
4634                 return ("eventfd");
4635         case DTYPE_LINUXTFD:
4636                 return ("ltimer");
4637         default:
4638                 return ("unkn");
4639         }
4640 }
4641
4642 /*
4643  * For the purposes of debugging, identify a process (if any, perhaps one of
4644  * many) that references the passed file in its file descriptor array. Return
4645  * NULL if none.
4646  */
4647 static struct proc *
4648 file_to_first_proc(struct file *fp)
4649 {
4650         struct filedesc *fdp;
4651         struct proc *p;
4652         int n;
4653
4654         FOREACH_PROC_IN_SYSTEM(p) {
4655                 if (p->p_state == PRS_NEW)
4656                         continue;
4657                 fdp = p->p_fd;
4658                 if (fdp == NULL)
4659                         continue;
4660                 for (n = 0; n < fdp->fd_nfiles; n++) {
4661                         if (fp == fdp->fd_ofiles[n].fde_file)
4662                                 return (p);
4663                 }
4664         }
4665         return (NULL);
4666 }
4667
4668 static void
4669 db_print_file(struct file *fp, int header)
4670 {
4671 #define XPTRWIDTH ((int)howmany(sizeof(void *) * NBBY, 4))
4672         struct proc *p;
4673
4674         if (header)
4675                 db_printf("%*s %6s %*s %8s %4s %5s %6s %*s %5s %s\n",
4676                     XPTRWIDTH, "File", "Type", XPTRWIDTH, "Data", "Flag",
4677                     "GCFl", "Count", "MCount", XPTRWIDTH, "Vnode", "FPID",
4678                     "FCmd");
4679         p = file_to_first_proc(fp);
4680         db_printf("%*p %6s %*p %08x %04x %5d %6d %*p %5d %s\n", XPTRWIDTH,
4681             fp, file_type_to_name(fp->f_type), XPTRWIDTH, fp->f_data,
4682             fp->f_flag, 0, refcount_load(&fp->f_count), 0, XPTRWIDTH, fp->f_vnode,
4683             p != NULL ? p->p_pid : -1, p != NULL ? p->p_comm : "-");
4684
4685 #undef XPTRWIDTH
4686 }
4687
4688 DB_SHOW_COMMAND(file, db_show_file)
4689 {
4690         struct file *fp;
4691
4692         if (!have_addr) {
4693                 db_printf("usage: show file <addr>\n");
4694                 return;
4695         }
4696         fp = (struct file *)addr;
4697         db_print_file(fp, 1);
4698 }
4699
4700 DB_SHOW_COMMAND(files, db_show_files)
4701 {
4702         struct filedesc *fdp;
4703         struct file *fp;
4704         struct proc *p;
4705         int header;
4706         int n;
4707
4708         header = 1;
4709         FOREACH_PROC_IN_SYSTEM(p) {
4710                 if (p->p_state == PRS_NEW)
4711                         continue;
4712                 if ((fdp = p->p_fd) == NULL)
4713                         continue;
4714                 for (n = 0; n < fdp->fd_nfiles; ++n) {
4715                         if ((fp = fdp->fd_ofiles[n].fde_file) == NULL)
4716                                 continue;
4717                         db_print_file(fp, header);
4718                         header = 0;
4719                 }
4720         }
4721 }
4722 #endif
4723
4724 SYSCTL_INT(_kern, KERN_MAXFILESPERPROC, maxfilesperproc, CTLFLAG_RW,
4725     &maxfilesperproc, 0, "Maximum files allowed open per process");
4726
4727 SYSCTL_INT(_kern, KERN_MAXFILES, maxfiles, CTLFLAG_RW,
4728     &maxfiles, 0, "Maximum number of files");
4729
4730 SYSCTL_INT(_kern, OID_AUTO, openfiles, CTLFLAG_RD,
4731     &openfiles, 0, "System-wide number of open files");
4732
4733 /* ARGSUSED*/
4734 static void
4735 filelistinit(void *dummy)
4736 {
4737
4738         file_zone = uma_zcreate("Files", sizeof(struct file), NULL, NULL,
4739             NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE);
4740         filedesc0_zone = uma_zcreate("filedesc0", sizeof(struct filedesc0),
4741             NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
4742         pwd_zone = uma_zcreate("PWD", sizeof(struct pwd), NULL, NULL,
4743             NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_SMR);
4744         /*
4745          * XXXMJG this is a temporary hack due to boot ordering issues against
4746          * the vnode zone.
4747          */
4748         vfs_smr = uma_zone_get_smr(pwd_zone);
4749         mtx_init(&sigio_lock, "sigio lock", NULL, MTX_DEF);
4750 }
4751 SYSINIT(select, SI_SUB_LOCK, SI_ORDER_FIRST, filelistinit, NULL);
4752
4753 /*-------------------------------------------------------------------*/
4754
4755 static int
4756 badfo_readwrite(struct file *fp, struct uio *uio, struct ucred *active_cred,
4757     int flags, struct thread *td)
4758 {
4759
4760         return (EBADF);
4761 }
4762
4763 static int
4764 badfo_truncate(struct file *fp, off_t length, struct ucred *active_cred,
4765     struct thread *td)
4766 {
4767
4768         return (EINVAL);
4769 }
4770
4771 static int
4772 badfo_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred,
4773     struct thread *td)
4774 {
4775
4776         return (EBADF);
4777 }
4778
4779 static int
4780 badfo_poll(struct file *fp, int events, struct ucred *active_cred,
4781     struct thread *td)
4782 {
4783
4784         return (0);
4785 }
4786
4787 static int
4788 badfo_kqfilter(struct file *fp, struct knote *kn)
4789 {
4790
4791         return (EBADF);
4792 }
4793
4794 static int
4795 badfo_stat(struct file *fp, struct stat *sb, struct ucred *active_cred,
4796     struct thread *td)
4797 {
4798
4799         return (EBADF);
4800 }
4801
4802 static int
4803 badfo_close(struct file *fp, struct thread *td)
4804 {
4805
4806         return (0);
4807 }
4808
4809 static int
4810 badfo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred,
4811     struct thread *td)
4812 {
4813
4814         return (EBADF);
4815 }
4816
4817 static int
4818 badfo_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred,
4819     struct thread *td)
4820 {
4821
4822         return (EBADF);
4823 }
4824
4825 static int
4826 badfo_sendfile(struct file *fp, int sockfd, struct uio *hdr_uio,
4827     struct uio *trl_uio, off_t offset, size_t nbytes, off_t *sent, int flags,
4828     struct thread *td)
4829 {
4830
4831         return (EBADF);
4832 }
4833
4834 static int
4835 badfo_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp)
4836 {
4837
4838         return (0);
4839 }
4840
4841 struct fileops badfileops = {
4842         .fo_read = badfo_readwrite,
4843         .fo_write = badfo_readwrite,
4844         .fo_truncate = badfo_truncate,
4845         .fo_ioctl = badfo_ioctl,
4846         .fo_poll = badfo_poll,
4847         .fo_kqfilter = badfo_kqfilter,
4848         .fo_stat = badfo_stat,
4849         .fo_close = badfo_close,
4850         .fo_chmod = badfo_chmod,
4851         .fo_chown = badfo_chown,
4852         .fo_sendfile = badfo_sendfile,
4853         .fo_fill_kinfo = badfo_fill_kinfo,
4854 };
4855
4856 int
4857 invfo_rdwr(struct file *fp, struct uio *uio, struct ucred *active_cred,
4858     int flags, struct thread *td)
4859 {
4860
4861         return (EOPNOTSUPP);
4862 }
4863
4864 int
4865 invfo_truncate(struct file *fp, off_t length, struct ucred *active_cred,
4866     struct thread *td)
4867 {
4868
4869         return (EINVAL);
4870 }
4871
4872 int
4873 invfo_ioctl(struct file *fp, u_long com, void *data,
4874     struct ucred *active_cred, struct thread *td)
4875 {
4876
4877         return (ENOTTY);
4878 }
4879
4880 int
4881 invfo_poll(struct file *fp, int events, struct ucred *active_cred,
4882     struct thread *td)
4883 {
4884
4885         return (poll_no_poll(events));
4886 }
4887
4888 int
4889 invfo_kqfilter(struct file *fp, struct knote *kn)
4890 {
4891
4892         return (EINVAL);
4893 }
4894
4895 int
4896 invfo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred,
4897     struct thread *td)
4898 {
4899
4900         return (EINVAL);
4901 }
4902
4903 int
4904 invfo_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred,
4905     struct thread *td)
4906 {
4907
4908         return (EINVAL);
4909 }
4910
4911 int
4912 invfo_sendfile(struct file *fp, int sockfd, struct uio *hdr_uio,
4913     struct uio *trl_uio, off_t offset, size_t nbytes, off_t *sent, int flags,
4914     struct thread *td)
4915 {
4916
4917         return (EINVAL);
4918 }
4919
4920 /*-------------------------------------------------------------------*/
4921
4922 /*
4923  * File Descriptor pseudo-device driver (/dev/fd/).
4924  *
4925  * Opening minor device N dup()s the file (if any) connected to file
4926  * descriptor N belonging to the calling process.  Note that this driver
4927  * consists of only the ``open()'' routine, because all subsequent
4928  * references to this file will be direct to the other driver.
4929  *
4930  * XXX: we could give this one a cloning event handler if necessary.
4931  */
4932
4933 /* ARGSUSED */
4934 static int
4935 fdopen(struct cdev *dev, int mode, int type, struct thread *td)
4936 {
4937
4938         /*
4939          * XXX Kludge: set curthread->td_dupfd to contain the value of the
4940          * the file descriptor being sought for duplication. The error
4941          * return ensures that the vnode for this device will be released
4942          * by vn_open. Open will detect this special error and take the
4943          * actions in dupfdopen below. Other callers of vn_open or VOP_OPEN
4944          * will simply report the error.
4945          */
4946         td->td_dupfd = dev2unit(dev);
4947         return (ENODEV);
4948 }
4949
4950 static struct cdevsw fildesc_cdevsw = {
4951         .d_version =    D_VERSION,
4952         .d_open =       fdopen,
4953         .d_name =       "FD",
4954 };
4955
4956 static void
4957 fildesc_drvinit(void *unused)
4958 {
4959         struct cdev *dev;
4960
4961         dev = make_dev_credf(MAKEDEV_ETERNAL, &fildesc_cdevsw, 0, NULL,
4962             UID_ROOT, GID_WHEEL, 0666, "fd/0");
4963         make_dev_alias(dev, "stdin");
4964         dev = make_dev_credf(MAKEDEV_ETERNAL, &fildesc_cdevsw, 1, NULL,
4965             UID_ROOT, GID_WHEEL, 0666, "fd/1");
4966         make_dev_alias(dev, "stdout");
4967         dev = make_dev_credf(MAKEDEV_ETERNAL, &fildesc_cdevsw, 2, NULL,
4968             UID_ROOT, GID_WHEEL, 0666, "fd/2");
4969         make_dev_alias(dev, "stderr");
4970 }
4971
4972 SYSINIT(fildescdev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, fildesc_drvinit, NULL);