]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/kern_jail.c
Add 'contrib/terminus/' from commit 'cee3932f8c02a220d70e48949c7c5ca6e98dfef4'
[FreeBSD/FreeBSD.git] / sys / kern / kern_jail.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1999 Poul-Henning Kamp.
5  * Copyright (c) 2008 Bjoern A. Zeeb.
6  * Copyright (c) 2009 James Gritton.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33
34 #include "opt_ddb.h"
35 #include "opt_inet.h"
36 #include "opt_inet6.h"
37
38 #include <sys/param.h>
39 #include <sys/types.h>
40 #include <sys/kernel.h>
41 #include <sys/systm.h>
42 #include <sys/errno.h>
43 #include <sys/sysproto.h>
44 #include <sys/malloc.h>
45 #include <sys/osd.h>
46 #include <sys/priv.h>
47 #include <sys/proc.h>
48 #include <sys/taskqueue.h>
49 #include <sys/fcntl.h>
50 #include <sys/jail.h>
51 #include <sys/linker.h>
52 #include <sys/lock.h>
53 #include <sys/mutex.h>
54 #include <sys/racct.h>
55 #include <sys/rctl.h>
56 #include <sys/refcount.h>
57 #include <sys/sx.h>
58 #include <sys/sysent.h>
59 #include <sys/namei.h>
60 #include <sys/mount.h>
61 #include <sys/queue.h>
62 #include <sys/socket.h>
63 #include <sys/syscallsubr.h>
64 #include <sys/sysctl.h>
65 #include <sys/uuid.h>
66 #include <sys/vnode.h>
67
68 #include <net/if.h>
69 #include <net/vnet.h>
70
71 #include <netinet/in.h>
72
73 #ifdef DDB
74 #include <ddb/ddb.h>
75 #endif /* DDB */
76
77 #include <security/mac/mac_framework.h>
78
79 #define DEFAULT_HOSTUUID        "00000000-0000-0000-0000-000000000000"
80 #define PRISON0_HOSTUUID_MODULE "hostuuid"
81
82 MALLOC_DEFINE(M_PRISON, "prison", "Prison structures");
83 static MALLOC_DEFINE(M_PRISON_RACCT, "prison_racct", "Prison racct structures");
84
85 /* Keep struct prison prison0 and some code in kern_jail_set() readable. */
86 #ifdef INET
87 #ifdef INET6
88 #define _PR_IP_SADDRSEL PR_IP4_SADDRSEL|PR_IP6_SADDRSEL
89 #else
90 #define _PR_IP_SADDRSEL PR_IP4_SADDRSEL
91 #endif
92 #else /* !INET */
93 #ifdef INET6
94 #define _PR_IP_SADDRSEL PR_IP6_SADDRSEL
95 #else
96 #define _PR_IP_SADDRSEL 0
97 #endif
98 #endif
99
100 /* prison0 describes what is "real" about the system. */
101 struct prison prison0 = {
102         .pr_id          = 0,
103         .pr_name        = "0",
104         .pr_ref         = 1,
105         .pr_uref        = 1,
106         .pr_path        = "/",
107         .pr_securelevel = -1,
108         .pr_devfs_rsnum = 0,
109         .pr_childmax    = JAIL_MAX,
110         .pr_hostuuid    = DEFAULT_HOSTUUID,
111         .pr_children    = LIST_HEAD_INITIALIZER(prison0.pr_children),
112 #ifdef VIMAGE
113         .pr_flags       = PR_HOST|PR_VNET|_PR_IP_SADDRSEL,
114 #else
115         .pr_flags       = PR_HOST|_PR_IP_SADDRSEL,
116 #endif
117         .pr_allow       = PR_ALLOW_ALL_STATIC,
118 };
119 MTX_SYSINIT(prison0, &prison0.pr_mtx, "jail mutex", MTX_DEF);
120
121 struct bool_flags {
122         const char      *name;
123         const char      *noname;
124         volatile u_int   flag;
125 };
126 struct jailsys_flags {
127         const char      *name;
128         unsigned         disable;
129         unsigned         new;
130 };
131
132 /* allprison, allprison_racct and lastprid are protected by allprison_lock. */
133 struct  sx allprison_lock;
134 SX_SYSINIT(allprison_lock, &allprison_lock, "allprison");
135 struct  prisonlist allprison = TAILQ_HEAD_INITIALIZER(allprison);
136 LIST_HEAD(, prison_racct) allprison_racct;
137 int     lastprid = 0;
138
139 static int get_next_prid(struct prison **insprp);
140 static int do_jail_attach(struct thread *td, struct prison *pr);
141 static void prison_complete(void *context, int pending);
142 static void prison_deref(struct prison *pr, int flags);
143 static void prison_set_allow_locked(struct prison *pr, unsigned flag,
144     int enable);
145 static char *prison_path(struct prison *pr1, struct prison *pr2);
146 static void prison_remove_one(struct prison *pr);
147 #ifdef RACCT
148 static void prison_racct_attach(struct prison *pr);
149 static void prison_racct_modify(struct prison *pr);
150 static void prison_racct_detach(struct prison *pr);
151 #endif
152
153 /* Flags for prison_deref */
154 #define PD_DEREF        0x01
155 #define PD_DEUREF       0x02
156 #define PD_LOCKED       0x04
157 #define PD_LIST_SLOCKED 0x08
158 #define PD_LIST_XLOCKED 0x10
159
160 /*
161  * Parameter names corresponding to PR_* flag values.  Size values are for kvm
162  * as we cannot figure out the size of a sparse array, or an array without a
163  * terminating entry.
164  */
165 static struct bool_flags pr_flag_bool[] = {
166         {"persist", "nopersist", PR_PERSIST},
167 #ifdef INET
168         {"ip4.saddrsel", "ip4.nosaddrsel", PR_IP4_SADDRSEL},
169 #endif
170 #ifdef INET6
171         {"ip6.saddrsel", "ip6.nosaddrsel", PR_IP6_SADDRSEL},
172 #endif
173 };
174 const size_t pr_flag_bool_size = sizeof(pr_flag_bool);
175
176 static struct jailsys_flags pr_flag_jailsys[] = {
177         {"host", 0, PR_HOST},
178 #ifdef VIMAGE
179         {"vnet", 0, PR_VNET},
180 #endif
181 #ifdef INET
182         {"ip4", PR_IP4_USER, PR_IP4_USER},
183 #endif
184 #ifdef INET6
185         {"ip6", PR_IP6_USER, PR_IP6_USER},
186 #endif
187 };
188 const size_t pr_flag_jailsys_size = sizeof(pr_flag_jailsys);
189
190 /*
191  * Make this array full-size so dynamic parameters can be added.
192  * It is protected by prison0.mtx, but lockless reading is allowed
193  * with an atomic check of the flag values.
194  */
195 static struct bool_flags pr_flag_allow[NBBY * NBPW] = {
196         {"allow.set_hostname", "allow.noset_hostname", PR_ALLOW_SET_HOSTNAME},
197         {"allow.sysvipc", "allow.nosysvipc", PR_ALLOW_SYSVIPC},
198         {"allow.raw_sockets", "allow.noraw_sockets", PR_ALLOW_RAW_SOCKETS},
199         {"allow.chflags", "allow.nochflags", PR_ALLOW_CHFLAGS},
200         {"allow.mount", "allow.nomount", PR_ALLOW_MOUNT},
201         {"allow.quotas", "allow.noquotas", PR_ALLOW_QUOTAS},
202         {"allow.socket_af", "allow.nosocket_af", PR_ALLOW_SOCKET_AF},
203         {"allow.mlock", "allow.nomlock", PR_ALLOW_MLOCK},
204         {"allow.reserved_ports", "allow.noreserved_ports",
205          PR_ALLOW_RESERVED_PORTS},
206         {"allow.read_msgbuf", "allow.noread_msgbuf", PR_ALLOW_READ_MSGBUF},
207         {"allow.unprivileged_proc_debug", "allow.nounprivileged_proc_debug",
208          PR_ALLOW_UNPRIV_DEBUG},
209         {"allow.suser", "allow.nosuser", PR_ALLOW_SUSER},
210 };
211 static unsigned pr_allow_all = PR_ALLOW_ALL_STATIC;
212 const size_t pr_flag_allow_size = sizeof(pr_flag_allow);
213
214 #define JAIL_DEFAULT_ALLOW              (PR_ALLOW_SET_HOSTNAME | \
215                                          PR_ALLOW_RESERVED_PORTS | \
216                                          PR_ALLOW_UNPRIV_DEBUG | \
217                                          PR_ALLOW_SUSER)
218 #define JAIL_DEFAULT_ENFORCE_STATFS     2
219 #define JAIL_DEFAULT_DEVFS_RSNUM        0
220 static unsigned jail_default_allow = JAIL_DEFAULT_ALLOW;
221 static int jail_default_enforce_statfs = JAIL_DEFAULT_ENFORCE_STATFS;
222 static int jail_default_devfs_rsnum = JAIL_DEFAULT_DEVFS_RSNUM;
223 #if defined(INET) || defined(INET6)
224 static unsigned jail_max_af_ips = 255;
225 #endif
226
227 /*
228  * Initialize the parts of prison0 that can't be static-initialized with
229  * constants.  This is called from proc0_init() after creating thread0 cpuset.
230  */
231 void
232 prison0_init(void)
233 {
234         uint8_t *file, *data;
235         size_t size;
236
237         prison0.pr_cpuset = cpuset_ref(thread0.td_cpuset);
238         prison0.pr_osreldate = osreldate;
239         strlcpy(prison0.pr_osrelease, osrelease, sizeof(prison0.pr_osrelease));
240
241         /* If we have a preloaded hostuuid, use it. */
242         file = preload_search_by_type(PRISON0_HOSTUUID_MODULE);
243         if (file != NULL) {
244                 data = preload_fetch_addr(file);
245                 size = preload_fetch_size(file);
246                 if (data != NULL) {
247                         /*
248                          * The preloaded data may include trailing whitespace, almost
249                          * certainly a newline; skip over any whitespace or
250                          * non-printable characters to be safe.
251                          */
252                         while (size > 0 && data[size - 1] <= 0x20) {
253                                 data[size--] = '\0';
254                         }
255                         if (validate_uuid(data, size, NULL, 0) == 0) {
256                                 (void)strlcpy(prison0.pr_hostuuid, data,
257                                     size + 1);
258                         } else if (bootverbose) {
259                                 printf("hostuuid: preload data malformed: '%s'",
260                                     data);
261                         }
262                 }
263         }
264         if (bootverbose)
265                 printf("hostuuid: using %s\n", prison0.pr_hostuuid);
266 }
267
268 /*
269  * struct jail_args {
270  *      struct jail *jail;
271  * };
272  */
273 int
274 sys_jail(struct thread *td, struct jail_args *uap)
275 {
276         uint32_t version;
277         int error;
278         struct jail j;
279
280         error = copyin(uap->jail, &version, sizeof(uint32_t));
281         if (error)
282                 return (error);
283
284         switch (version) {
285         case 0:
286         {
287                 struct jail_v0 j0;
288
289                 /* FreeBSD single IPv4 jails. */
290                 bzero(&j, sizeof(struct jail));
291                 error = copyin(uap->jail, &j0, sizeof(struct jail_v0));
292                 if (error)
293                         return (error);
294                 j.version = j0.version;
295                 j.path = j0.path;
296                 j.hostname = j0.hostname;
297                 j.ip4s = htonl(j0.ip_number);   /* jail_v0 is host order */
298                 break;
299         }
300
301         case 1:
302                 /*
303                  * Version 1 was used by multi-IPv4 jail implementations
304                  * that never made it into the official kernel.
305                  */
306                 return (EINVAL);
307
308         case 2: /* JAIL_API_VERSION */
309                 /* FreeBSD multi-IPv4/IPv6,noIP jails. */
310                 error = copyin(uap->jail, &j, sizeof(struct jail));
311                 if (error)
312                         return (error);
313                 break;
314
315         default:
316                 /* Sci-Fi jails are not supported, sorry. */
317                 return (EINVAL);
318         }
319         return (kern_jail(td, &j));
320 }
321
322 int
323 kern_jail(struct thread *td, struct jail *j)
324 {
325         struct iovec optiov[2 * (4 + nitems(pr_flag_allow)
326 #ifdef INET
327                             + 1
328 #endif
329 #ifdef INET6
330                             + 1
331 #endif
332                             )];
333         struct uio opt;
334         char *u_path, *u_hostname, *u_name;
335         struct bool_flags *bf;
336 #ifdef INET
337         uint32_t ip4s;
338         struct in_addr *u_ip4;
339 #endif
340 #ifdef INET6
341         struct in6_addr *u_ip6;
342 #endif
343         size_t tmplen;
344         int error, enforce_statfs;
345
346         bzero(&optiov, sizeof(optiov));
347         opt.uio_iov = optiov;
348         opt.uio_iovcnt = 0;
349         opt.uio_offset = -1;
350         opt.uio_resid = -1;
351         opt.uio_segflg = UIO_SYSSPACE;
352         opt.uio_rw = UIO_READ;
353         opt.uio_td = td;
354
355         /* Set permissions for top-level jails from sysctls. */
356         if (!jailed(td->td_ucred)) {
357                 for (bf = pr_flag_allow;
358                      bf < pr_flag_allow + nitems(pr_flag_allow) &&
359                         atomic_load_int(&bf->flag) != 0;
360                      bf++) {
361                         optiov[opt.uio_iovcnt].iov_base = __DECONST(char *,
362                             (jail_default_allow & bf->flag)
363                             ? bf->name : bf->noname);
364                         optiov[opt.uio_iovcnt].iov_len =
365                             strlen(optiov[opt.uio_iovcnt].iov_base) + 1;
366                         opt.uio_iovcnt += 2;
367                 }
368                 optiov[opt.uio_iovcnt].iov_base = "enforce_statfs";
369                 optiov[opt.uio_iovcnt].iov_len = sizeof("enforce_statfs");
370                 opt.uio_iovcnt++;
371                 enforce_statfs = jail_default_enforce_statfs;
372                 optiov[opt.uio_iovcnt].iov_base = &enforce_statfs;
373                 optiov[opt.uio_iovcnt].iov_len = sizeof(enforce_statfs);
374                 opt.uio_iovcnt++;
375         }
376
377         tmplen = MAXPATHLEN + MAXHOSTNAMELEN + MAXHOSTNAMELEN;
378 #ifdef INET
379         ip4s = (j->version == 0) ? 1 : j->ip4s;
380         if (ip4s > jail_max_af_ips)
381                 return (EINVAL);
382         tmplen += ip4s * sizeof(struct in_addr);
383 #else
384         if (j->ip4s > 0)
385                 return (EINVAL);
386 #endif
387 #ifdef INET6
388         if (j->ip6s > jail_max_af_ips)
389                 return (EINVAL);
390         tmplen += j->ip6s * sizeof(struct in6_addr);
391 #else
392         if (j->ip6s > 0)
393                 return (EINVAL);
394 #endif
395         u_path = malloc(tmplen, M_TEMP, M_WAITOK);
396         u_hostname = u_path + MAXPATHLEN;
397         u_name = u_hostname + MAXHOSTNAMELEN;
398 #ifdef INET
399         u_ip4 = (struct in_addr *)(u_name + MAXHOSTNAMELEN);
400 #endif
401 #ifdef INET6
402 #ifdef INET
403         u_ip6 = (struct in6_addr *)(u_ip4 + ip4s);
404 #else
405         u_ip6 = (struct in6_addr *)(u_name + MAXHOSTNAMELEN);
406 #endif
407 #endif
408         optiov[opt.uio_iovcnt].iov_base = "path";
409         optiov[opt.uio_iovcnt].iov_len = sizeof("path");
410         opt.uio_iovcnt++;
411         optiov[opt.uio_iovcnt].iov_base = u_path;
412         error = copyinstr(j->path, u_path, MAXPATHLEN,
413             &optiov[opt.uio_iovcnt].iov_len);
414         if (error) {
415                 free(u_path, M_TEMP);
416                 return (error);
417         }
418         opt.uio_iovcnt++;
419         optiov[opt.uio_iovcnt].iov_base = "host.hostname";
420         optiov[opt.uio_iovcnt].iov_len = sizeof("host.hostname");
421         opt.uio_iovcnt++;
422         optiov[opt.uio_iovcnt].iov_base = u_hostname;
423         error = copyinstr(j->hostname, u_hostname, MAXHOSTNAMELEN,
424             &optiov[opt.uio_iovcnt].iov_len);
425         if (error) {
426                 free(u_path, M_TEMP);
427                 return (error);
428         }
429         opt.uio_iovcnt++;
430         if (j->jailname != NULL) {
431                 optiov[opt.uio_iovcnt].iov_base = "name";
432                 optiov[opt.uio_iovcnt].iov_len = sizeof("name");
433                 opt.uio_iovcnt++;
434                 optiov[opt.uio_iovcnt].iov_base = u_name;
435                 error = copyinstr(j->jailname, u_name, MAXHOSTNAMELEN,
436                     &optiov[opt.uio_iovcnt].iov_len);
437                 if (error) {
438                         free(u_path, M_TEMP);
439                         return (error);
440                 }
441                 opt.uio_iovcnt++;
442         }
443 #ifdef INET
444         optiov[opt.uio_iovcnt].iov_base = "ip4.addr";
445         optiov[opt.uio_iovcnt].iov_len = sizeof("ip4.addr");
446         opt.uio_iovcnt++;
447         optiov[opt.uio_iovcnt].iov_base = u_ip4;
448         optiov[opt.uio_iovcnt].iov_len = ip4s * sizeof(struct in_addr);
449         if (j->version == 0)
450                 u_ip4->s_addr = j->ip4s;
451         else {
452                 error = copyin(j->ip4, u_ip4, optiov[opt.uio_iovcnt].iov_len);
453                 if (error) {
454                         free(u_path, M_TEMP);
455                         return (error);
456                 }
457         }
458         opt.uio_iovcnt++;
459 #endif
460 #ifdef INET6
461         optiov[opt.uio_iovcnt].iov_base = "ip6.addr";
462         optiov[opt.uio_iovcnt].iov_len = sizeof("ip6.addr");
463         opt.uio_iovcnt++;
464         optiov[opt.uio_iovcnt].iov_base = u_ip6;
465         optiov[opt.uio_iovcnt].iov_len = j->ip6s * sizeof(struct in6_addr);
466         error = copyin(j->ip6, u_ip6, optiov[opt.uio_iovcnt].iov_len);
467         if (error) {
468                 free(u_path, M_TEMP);
469                 return (error);
470         }
471         opt.uio_iovcnt++;
472 #endif
473         KASSERT(opt.uio_iovcnt <= nitems(optiov),
474                 ("kern_jail: too many iovecs (%d)", opt.uio_iovcnt));
475         error = kern_jail_set(td, &opt, JAIL_CREATE | JAIL_ATTACH);
476         free(u_path, M_TEMP);
477         return (error);
478 }
479
480 /*
481  * struct jail_set_args {
482  *      struct iovec *iovp;
483  *      unsigned int iovcnt;
484  *      int flags;
485  * };
486  */
487 int
488 sys_jail_set(struct thread *td, struct jail_set_args *uap)
489 {
490         struct uio *auio;
491         int error;
492
493         /* Check that we have an even number of iovecs. */
494         if (uap->iovcnt & 1)
495                 return (EINVAL);
496
497         error = copyinuio(uap->iovp, uap->iovcnt, &auio);
498         if (error)
499                 return (error);
500         error = kern_jail_set(td, auio, uap->flags);
501         free(auio, M_IOV);
502         return (error);
503 }
504
505 int
506 kern_jail_set(struct thread *td, struct uio *optuio, int flags)
507 {
508         struct nameidata nd;
509 #ifdef INET
510         struct in_addr *ip4;
511 #endif
512 #ifdef INET6
513         struct in6_addr *ip6;
514 #endif
515         struct vfsopt *opt;
516         struct vfsoptlist *opts;
517         struct prison *pr, *deadpr, *inspr, *mypr, *ppr, *tpr;
518         struct vnode *root;
519         char *domain, *errmsg, *host, *name, *namelc, *p, *path, *uuid;
520         char *g_path, *osrelstr;
521         struct bool_flags *bf;
522         struct jailsys_flags *jsf;
523 #if defined(INET) || defined(INET6)
524         struct prison *tppr;
525         void *op;
526 #endif
527         unsigned long hid;
528         size_t namelen, onamelen, pnamelen;
529         int born, created, cuflags, descend, enforce, slocked;
530         int error, errmsg_len, errmsg_pos;
531         int gotchildmax, gotenforce, gothid, gotrsnum, gotslevel;
532         int jid, jsys, len, level;
533         int childmax, osreldt, rsnum, slevel;
534 #if defined(INET) || defined(INET6)
535         int ii, ij;
536 #endif
537 #ifdef INET
538         int ip4s, redo_ip4;
539 #endif
540 #ifdef INET6
541         int ip6s, redo_ip6;
542 #endif
543         uint64_t pr_allow, ch_allow, pr_flags, ch_flags;
544         uint64_t pr_allow_diff;
545         unsigned tallow;
546         char numbuf[12];
547
548         error = priv_check(td, PRIV_JAIL_SET);
549         if (!error && (flags & JAIL_ATTACH))
550                 error = priv_check(td, PRIV_JAIL_ATTACH);
551         if (error)
552                 return (error);
553         mypr = td->td_ucred->cr_prison;
554         if ((flags & JAIL_CREATE) && mypr->pr_childmax == 0)
555                 return (EPERM);
556         if (flags & ~JAIL_SET_MASK)
557                 return (EINVAL);
558
559         /*
560          * Check all the parameters before committing to anything.  Not all
561          * errors can be caught early, but we may as well try.  Also, this
562          * takes care of some expensive stuff (path lookup) before getting
563          * the allprison lock.
564          *
565          * XXX Jails are not filesystems, and jail parameters are not mount
566          *     options.  But it makes more sense to re-use the vfsopt code
567          *     than duplicate it under a different name.
568          */
569         error = vfs_buildopts(optuio, &opts);
570         if (error)
571                 return (error);
572 #ifdef INET
573         ip4 = NULL;
574 #endif
575 #ifdef INET6
576         ip6 = NULL;
577 #endif
578         g_path = NULL;
579
580         cuflags = flags & (JAIL_CREATE | JAIL_UPDATE);
581         if (!cuflags) {
582                 error = EINVAL;
583                 vfs_opterror(opts, "no valid operation (create or update)");
584                 goto done_errmsg;
585         }
586
587         error = vfs_copyopt(opts, "jid", &jid, sizeof(jid));
588         if (error == ENOENT)
589                 jid = 0;
590         else if (error != 0)
591                 goto done_free;
592
593         error = vfs_copyopt(opts, "securelevel", &slevel, sizeof(slevel));
594         if (error == ENOENT)
595                 gotslevel = 0;
596         else if (error != 0)
597                 goto done_free;
598         else
599                 gotslevel = 1;
600
601         error =
602             vfs_copyopt(opts, "children.max", &childmax, sizeof(childmax));
603         if (error == ENOENT)
604                 gotchildmax = 0;
605         else if (error != 0)
606                 goto done_free;
607         else
608                 gotchildmax = 1;
609
610         error = vfs_copyopt(opts, "enforce_statfs", &enforce, sizeof(enforce));
611         if (error == ENOENT)
612                 gotenforce = 0;
613         else if (error != 0)
614                 goto done_free;
615         else if (enforce < 0 || enforce > 2) {
616                 error = EINVAL;
617                 goto done_free;
618         } else
619                 gotenforce = 1;
620
621         error = vfs_copyopt(opts, "devfs_ruleset", &rsnum, sizeof(rsnum));
622         if (error == ENOENT)
623                 gotrsnum = 0;
624         else if (error != 0)
625                 goto done_free;
626         else
627                 gotrsnum = 1;
628
629         pr_flags = ch_flags = 0;
630         for (bf = pr_flag_bool;
631              bf < pr_flag_bool + nitems(pr_flag_bool);
632              bf++) {
633                 vfs_flagopt(opts, bf->name, &pr_flags, bf->flag);
634                 vfs_flagopt(opts, bf->noname, &ch_flags, bf->flag);
635         }
636         ch_flags |= pr_flags;
637         for (jsf = pr_flag_jailsys;
638              jsf < pr_flag_jailsys + nitems(pr_flag_jailsys);
639              jsf++) {
640                 error = vfs_copyopt(opts, jsf->name, &jsys, sizeof(jsys));
641                 if (error == ENOENT)
642                         continue;
643                 if (error != 0)
644                         goto done_free;
645                 switch (jsys) {
646                 case JAIL_SYS_DISABLE:
647                         if (!jsf->disable) {
648                                 error = EINVAL;
649                                 goto done_free;
650                         }
651                         pr_flags |= jsf->disable;
652                         break;
653                 case JAIL_SYS_NEW:
654                         pr_flags |= jsf->new;
655                         break;
656                 case JAIL_SYS_INHERIT:
657                         break;
658                 default:
659                         error = EINVAL;
660                         goto done_free;
661                 }
662                 ch_flags |= jsf->new | jsf->disable;
663         }
664         if ((flags & (JAIL_CREATE | JAIL_UPDATE | JAIL_ATTACH)) == JAIL_CREATE
665             && !(pr_flags & PR_PERSIST)) {
666                 error = EINVAL;
667                 vfs_opterror(opts, "new jail must persist or attach");
668                 goto done_errmsg;
669         }
670 #ifdef VIMAGE
671         if ((flags & JAIL_UPDATE) && (ch_flags & PR_VNET)) {
672                 error = EINVAL;
673                 vfs_opterror(opts, "vnet cannot be changed after creation");
674                 goto done_errmsg;
675         }
676 #endif
677 #ifdef INET
678         if ((flags & JAIL_UPDATE) && (ch_flags & PR_IP4_USER)) {
679                 error = EINVAL;
680                 vfs_opterror(opts, "ip4 cannot be changed after creation");
681                 goto done_errmsg;
682         }
683 #endif
684 #ifdef INET6
685         if ((flags & JAIL_UPDATE) && (ch_flags & PR_IP6_USER)) {
686                 error = EINVAL;
687                 vfs_opterror(opts, "ip6 cannot be changed after creation");
688                 goto done_errmsg;
689         }
690 #endif
691
692         pr_allow = ch_allow = 0;
693         for (bf = pr_flag_allow;
694              bf < pr_flag_allow + nitems(pr_flag_allow) &&
695                 atomic_load_int(&bf->flag) != 0;
696              bf++) {
697                 vfs_flagopt(opts, bf->name, &pr_allow, bf->flag);
698                 vfs_flagopt(opts, bf->noname, &ch_allow, bf->flag);
699         }
700         ch_allow |= pr_allow;
701
702         error = vfs_getopt(opts, "name", (void **)&name, &len);
703         if (error == ENOENT)
704                 name = NULL;
705         else if (error != 0)
706                 goto done_free;
707         else {
708                 if (len == 0 || name[len - 1] != '\0') {
709                         error = EINVAL;
710                         goto done_free;
711                 }
712                 if (len > MAXHOSTNAMELEN) {
713                         error = ENAMETOOLONG;
714                         goto done_free;
715                 }
716         }
717
718         error = vfs_getopt(opts, "host.hostname", (void **)&host, &len);
719         if (error == ENOENT)
720                 host = NULL;
721         else if (error != 0)
722                 goto done_free;
723         else {
724                 ch_flags |= PR_HOST;
725                 pr_flags |= PR_HOST;
726                 if (len == 0 || host[len - 1] != '\0') {
727                         error = EINVAL;
728                         goto done_free;
729                 }
730                 if (len > MAXHOSTNAMELEN) {
731                         error = ENAMETOOLONG;
732                         goto done_free;
733                 }
734         }
735
736         error = vfs_getopt(opts, "host.domainname", (void **)&domain, &len);
737         if (error == ENOENT)
738                 domain = NULL;
739         else if (error != 0)
740                 goto done_free;
741         else {
742                 ch_flags |= PR_HOST;
743                 pr_flags |= PR_HOST;
744                 if (len == 0 || domain[len - 1] != '\0') {
745                         error = EINVAL;
746                         goto done_free;
747                 }
748                 if (len > MAXHOSTNAMELEN) {
749                         error = ENAMETOOLONG;
750                         goto done_free;
751                 }
752         }
753
754         error = vfs_getopt(opts, "host.hostuuid", (void **)&uuid, &len);
755         if (error == ENOENT)
756                 uuid = NULL;
757         else if (error != 0)
758                 goto done_free;
759         else {
760                 ch_flags |= PR_HOST;
761                 pr_flags |= PR_HOST;
762                 if (len == 0 || uuid[len - 1] != '\0') {
763                         error = EINVAL;
764                         goto done_free;
765                 }
766                 if (len > HOSTUUIDLEN) {
767                         error = ENAMETOOLONG;
768                         goto done_free;
769                 }
770         }
771
772 #ifdef COMPAT_FREEBSD32
773         if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) {
774                 uint32_t hid32;
775
776                 error = vfs_copyopt(opts, "host.hostid", &hid32, sizeof(hid32));
777                 hid = hid32;
778         } else
779 #endif
780                 error = vfs_copyopt(opts, "host.hostid", &hid, sizeof(hid));
781         if (error == ENOENT)
782                 gothid = 0;
783         else if (error != 0)
784                 goto done_free;
785         else {
786                 gothid = 1;
787                 ch_flags |= PR_HOST;
788                 pr_flags |= PR_HOST;
789         }
790
791 #ifdef INET
792         error = vfs_getopt(opts, "ip4.addr", &op, &ip4s);
793         if (error == ENOENT)
794                 ip4s = 0;
795         else if (error != 0)
796                 goto done_free;
797         else if (ip4s & (sizeof(*ip4) - 1)) {
798                 error = EINVAL;
799                 goto done_free;
800         } else {
801                 ch_flags |= PR_IP4_USER;
802                 pr_flags |= PR_IP4_USER;
803                 if (ip4s > 0) {
804                         ip4s /= sizeof(*ip4);
805                         if (ip4s > jail_max_af_ips) {
806                                 error = EINVAL;
807                                 vfs_opterror(opts, "too many IPv4 addresses");
808                                 goto done_errmsg;
809                         }
810                         ip4 = malloc(ip4s * sizeof(*ip4), M_PRISON, M_WAITOK);
811                         bcopy(op, ip4, ip4s * sizeof(*ip4));
812                         /*
813                          * IP addresses are all sorted but ip[0] to preserve
814                          * the primary IP address as given from userland.
815                          * This special IP is used for unbound outgoing
816                          * connections as well for "loopback" traffic in case
817                          * source address selection cannot find any more fitting
818                          * address to connect from.
819                          */
820                         if (ip4s > 1)
821                                 qsort(ip4 + 1, ip4s - 1, sizeof(*ip4),
822                                     prison_qcmp_v4);
823                         /*
824                          * Check for duplicate addresses and do some simple
825                          * zero and broadcast checks. If users give other bogus
826                          * addresses it is their problem.
827                          *
828                          * We do not have to care about byte order for these
829                          * checks so we will do them in NBO.
830                          */
831                         for (ii = 0; ii < ip4s; ii++) {
832                                 if (ip4[ii].s_addr == INADDR_ANY ||
833                                     ip4[ii].s_addr == INADDR_BROADCAST) {
834                                         error = EINVAL;
835                                         goto done_free;
836                                 }
837                                 if ((ii+1) < ip4s &&
838                                     (ip4[0].s_addr == ip4[ii+1].s_addr ||
839                                      ip4[ii].s_addr == ip4[ii+1].s_addr)) {
840                                         error = EINVAL;
841                                         goto done_free;
842                                 }
843                         }
844                 }
845         }
846 #endif
847
848 #ifdef INET6
849         error = vfs_getopt(opts, "ip6.addr", &op, &ip6s);
850         if (error == ENOENT)
851                 ip6s = 0;
852         else if (error != 0)
853                 goto done_free;
854         else if (ip6s & (sizeof(*ip6) - 1)) {
855                 error = EINVAL;
856                 goto done_free;
857         } else {
858                 ch_flags |= PR_IP6_USER;
859                 pr_flags |= PR_IP6_USER;
860                 if (ip6s > 0) {
861                         ip6s /= sizeof(*ip6);
862                         if (ip6s > jail_max_af_ips) {
863                                 error = EINVAL;
864                                 vfs_opterror(opts, "too many IPv6 addresses");
865                                 goto done_errmsg;
866                         }
867                         ip6 = malloc(ip6s * sizeof(*ip6), M_PRISON, M_WAITOK);
868                         bcopy(op, ip6, ip6s * sizeof(*ip6));
869                         if (ip6s > 1)
870                                 qsort(ip6 + 1, ip6s - 1, sizeof(*ip6),
871                                     prison_qcmp_v6);
872                         for (ii = 0; ii < ip6s; ii++) {
873                                 if (IN6_IS_ADDR_UNSPECIFIED(&ip6[ii])) {
874                                         error = EINVAL;
875                                         goto done_free;
876                                 }
877                                 if ((ii+1) < ip6s &&
878                                     (IN6_ARE_ADDR_EQUAL(&ip6[0], &ip6[ii+1]) ||
879                                      IN6_ARE_ADDR_EQUAL(&ip6[ii], &ip6[ii+1])))
880                                 {
881                                         error = EINVAL;
882                                         goto done_free;
883                                 }
884                         }
885                 }
886         }
887 #endif
888
889 #if defined(VIMAGE) && (defined(INET) || defined(INET6))
890         if ((ch_flags & PR_VNET) && (ch_flags & (PR_IP4_USER | PR_IP6_USER))) {
891                 error = EINVAL;
892                 vfs_opterror(opts,
893                     "vnet jails cannot have IP address restrictions");
894                 goto done_errmsg;
895         }
896 #endif
897
898         error = vfs_getopt(opts, "osrelease", (void **)&osrelstr, &len);
899         if (error == ENOENT)
900                 osrelstr = NULL;
901         else if (error != 0)
902                 goto done_free;
903         else {
904                 if (flags & JAIL_UPDATE) {
905                         error = EINVAL;
906                         vfs_opterror(opts,
907                             "osrelease cannot be changed after creation");
908                         goto done_errmsg;
909                 }
910                 if (len == 0 || osrelstr[len - 1] != '\0') {
911                         error = EINVAL;
912                         goto done_free;
913                 }
914                 if (len >= OSRELEASELEN) {
915                         error = ENAMETOOLONG;
916                         vfs_opterror(opts,
917                             "osrelease string must be 1-%d bytes long",
918                             OSRELEASELEN - 1);
919                         goto done_errmsg;
920                 }
921         }
922
923         error = vfs_copyopt(opts, "osreldate", &osreldt, sizeof(osreldt));
924         if (error == ENOENT)
925                 osreldt = 0;
926         else if (error != 0)
927                 goto done_free;
928         else {
929                 if (flags & JAIL_UPDATE) {
930                         error = EINVAL;
931                         vfs_opterror(opts,
932                             "osreldate cannot be changed after creation");
933                         goto done_errmsg;
934                 }
935                 if (osreldt == 0) {
936                         error = EINVAL;
937                         vfs_opterror(opts, "osreldate cannot be 0");
938                         goto done_errmsg;
939                 }
940         }
941
942         root = NULL;
943         error = vfs_getopt(opts, "path", (void **)&path, &len);
944         if (error == ENOENT)
945                 path = NULL;
946         else if (error != 0)
947                 goto done_free;
948         else {
949                 if (flags & JAIL_UPDATE) {
950                         error = EINVAL;
951                         vfs_opterror(opts,
952                             "path cannot be changed after creation");
953                         goto done_errmsg;
954                 }
955                 if (len == 0 || path[len - 1] != '\0') {
956                         error = EINVAL;
957                         goto done_free;
958                 }
959                 NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE,
960                     path, td);
961                 error = namei(&nd);
962                 if (error)
963                         goto done_free;
964                 root = nd.ni_vp;
965                 NDFREE(&nd, NDF_ONLY_PNBUF);
966                 g_path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
967                 strlcpy(g_path, path, MAXPATHLEN);
968                 error = vn_path_to_global_path(td, root, g_path, MAXPATHLEN);
969                 if (error == 0) {
970                         path = g_path;
971                 } else {
972                         /* exit on other errors */
973                         goto done_free;
974                 }
975                 if (root->v_type != VDIR) {
976                         error = ENOTDIR;
977                         vput(root);
978                         goto done_free;
979                 }
980                 VOP_UNLOCK(root);
981         }
982
983         /*
984          * Find the specified jail, or at least its parent.
985          * This abuses the file error codes ENOENT and EEXIST.
986          */
987         pr = NULL;
988         ppr = mypr;
989         inspr = NULL;
990         if (cuflags == JAIL_CREATE && jid == 0 && name != NULL) {
991                 namelc = strrchr(name, '.');
992                 jid = strtoul(namelc != NULL ? namelc + 1 : name, &p, 10);
993                 if (*p != '\0')
994                         jid = 0;
995         }
996         sx_xlock(&allprison_lock);
997         if (jid != 0) {
998                 if (jid < 0) {
999                         error = EINVAL;
1000                         vfs_opterror(opts, "negative jid");
1001                         goto done_unlock_list;
1002                 }
1003                 /*
1004                  * See if a requested jid already exists.  Keep track of
1005                  * where it can be inserted later.
1006                  */
1007                 TAILQ_FOREACH(inspr, &allprison, pr_list) {
1008                         if (inspr->pr_id == jid) {
1009                                 mtx_lock(&inspr->pr_mtx);
1010                                 if (inspr->pr_ref > 0) {
1011                                         pr = inspr;
1012                                         inspr = NULL;
1013                                 } else
1014                                         mtx_unlock(&inspr->pr_mtx);
1015                                 break;
1016                         }
1017                         if (inspr->pr_id > jid)
1018                                 break;
1019                 }
1020                 if (pr != NULL) {
1021                         ppr = pr->pr_parent;
1022                         /* Create: jid must not exist. */
1023                         if (cuflags == JAIL_CREATE) {
1024                                 /*
1025                                  * Even creators that cannot see the jail will
1026                                  * get EEXIST.
1027                                  */
1028                                 mtx_unlock(&pr->pr_mtx);
1029                                 error = EEXIST;
1030                                 vfs_opterror(opts, "jail %d already exists",
1031                                     jid);
1032                                 goto done_unlock_list;
1033                         }
1034                         if (!prison_ischild(mypr, pr)) {
1035                                 /*
1036                                  * Updaters get ENOENT if they cannot see the
1037                                  * jail.  This is true even for CREATE | UPDATE,
1038                                  * which normally cannot give this error.
1039                                  */
1040                                 mtx_unlock(&pr->pr_mtx);
1041                                 pr = NULL;
1042                         } else if (pr->pr_uref == 0) {
1043                                 if (!(flags & JAIL_DYING)) {
1044                                         mtx_unlock(&pr->pr_mtx);
1045                                         error = ENOENT;
1046                                         vfs_opterror(opts, "jail %d is dying",
1047                                             jid);
1048                                         goto done_unlock_list;
1049                                 } else if ((flags & JAIL_ATTACH) ||
1050                                     (pr_flags & PR_PERSIST)) {
1051                                         /*
1052                                          * A dying jail might be resurrected
1053                                          * (via attach or persist), but first
1054                                          * it must determine if another jail
1055                                          * has claimed its name.  Accomplish
1056                                          * this by implicitly re-setting the
1057                                          * name.
1058                                          */
1059                                         if (name == NULL)
1060                                                 name = prison_name(mypr, pr);
1061                                 }
1062                         }
1063                 }
1064                 if (pr == NULL) {
1065                         /* Update: jid must exist. */
1066                         if (cuflags == JAIL_UPDATE) {
1067                                 error = ENOENT;
1068                                 vfs_opterror(opts, "jail %d not found", jid);
1069                                 goto done_unlock_list;
1070                         }
1071                 }
1072         }
1073         /*
1074          * If the caller provided a name, look for a jail by that name.
1075          * This has different semantics for creates and updates keyed by jid
1076          * (where the name must not already exist in a different jail),
1077          * and updates keyed by the name itself (where the name must exist
1078          * because that is the jail being updated).
1079          */
1080         namelc = NULL;
1081         if (name != NULL) {
1082                 namelc = strrchr(name, '.');
1083                 if (namelc == NULL)
1084                         namelc = name;
1085                 else {
1086                         /*
1087                          * This is a hierarchical name.  Split it into the
1088                          * parent and child names, and make sure the parent
1089                          * exists or matches an already found jail.
1090                          */
1091                         if (pr != NULL) {
1092                                 if (strncmp(name, ppr->pr_name, namelc - name)
1093                                     || ppr->pr_name[namelc - name] != '\0') {
1094                                         mtx_unlock(&pr->pr_mtx);
1095                                         error = EINVAL;
1096                                         vfs_opterror(opts,
1097                                             "cannot change jail's parent");
1098                                         goto done_unlock_list;
1099                                 }
1100                         } else {
1101                                 *namelc = '\0';
1102                                 ppr = prison_find_name(mypr, name);
1103                                 if (ppr == NULL) {
1104                                         error = ENOENT;
1105                                         vfs_opterror(opts,
1106                                             "jail \"%s\" not found", name);
1107                                         goto done_unlock_list;
1108                                 }
1109                                 mtx_unlock(&ppr->pr_mtx);
1110                                 *namelc = '.';
1111                         }
1112                         namelc++;
1113                 }
1114                 if (namelc[0] != '\0') {
1115                         pnamelen =
1116                             (ppr == &prison0) ? 0 : strlen(ppr->pr_name) + 1;
1117  name_again:
1118                         deadpr = NULL;
1119                         FOREACH_PRISON_CHILD(ppr, tpr) {
1120                                 if (tpr != pr && tpr->pr_ref > 0 &&
1121                                     !strcmp(tpr->pr_name + pnamelen, namelc)) {
1122                                         if (pr == NULL &&
1123                                             cuflags != JAIL_CREATE) {
1124                                                 mtx_lock(&tpr->pr_mtx);
1125                                                 if (tpr->pr_ref > 0) {
1126                                                         /*
1127                                                          * Use this jail
1128                                                          * for updates.
1129                                                          */
1130                                                         if (tpr->pr_uref > 0) {
1131                                                                 pr = tpr;
1132                                                                 break;
1133                                                         }
1134                                                         deadpr = tpr;
1135                                                 }
1136                                                 mtx_unlock(&tpr->pr_mtx);
1137                                         } else if (tpr->pr_uref > 0) {
1138                                                 /*
1139                                                  * Create, or update(jid):
1140                                                  * name must not exist in an
1141                                                  * active sibling jail.
1142                                                  */
1143                                                 error = EEXIST;
1144                                                 if (pr != NULL)
1145                                                         mtx_unlock(&pr->pr_mtx);
1146                                                 vfs_opterror(opts,
1147                                                    "jail \"%s\" already exists",
1148                                                    name);
1149                                                 goto done_unlock_list;
1150                                         }
1151                                 }
1152                         }
1153                         /* If no active jail is found, use a dying one. */
1154                         if (deadpr != NULL && pr == NULL) {
1155                                 if (flags & JAIL_DYING) {
1156                                         mtx_lock(&deadpr->pr_mtx);
1157                                         if (deadpr->pr_ref == 0) {
1158                                                 mtx_unlock(&deadpr->pr_mtx);
1159                                                 goto name_again;
1160                                         }
1161                                         pr = deadpr;
1162                                 } else if (cuflags == JAIL_UPDATE) {
1163                                         error = ENOENT;
1164                                         vfs_opterror(opts,
1165                                             "jail \"%s\" is dying", name);
1166                                         goto done_unlock_list;
1167                                 }
1168                         }
1169                         /* Update: name must exist if no jid. */
1170                         else if (cuflags == JAIL_UPDATE && pr == NULL) {
1171                                 error = ENOENT;
1172                                 vfs_opterror(opts, "jail \"%s\" not found",
1173                                     name);
1174                                 goto done_unlock_list;
1175                         }
1176                 }
1177         }
1178         /* Update: must provide a jid or name. */
1179         else if (cuflags == JAIL_UPDATE && pr == NULL) {
1180                 error = ENOENT;
1181                 vfs_opterror(opts, "update specified no jail");
1182                 goto done_unlock_list;
1183         }
1184
1185         /* If there's no prison to update, create a new one and link it in. */
1186         if (pr == NULL) {
1187                 for (tpr = mypr; tpr != NULL; tpr = tpr->pr_parent)
1188                         if (tpr->pr_childcount >= tpr->pr_childmax) {
1189                                 error = EPERM;
1190                                 vfs_opterror(opts, "prison limit exceeded");
1191                                 goto done_unlock_list;
1192                         }
1193                 created = 1;
1194                 mtx_lock(&ppr->pr_mtx);
1195                 if (ppr->pr_ref == 0) {
1196                         mtx_unlock(&ppr->pr_mtx);
1197                         error = ENOENT;
1198                         vfs_opterror(opts, "jail \"%s\" not found",
1199                             prison_name(mypr, ppr));
1200                         goto done_unlock_list;
1201                 }
1202                 ppr->pr_ref++;
1203                 ppr->pr_uref++;
1204                 mtx_unlock(&ppr->pr_mtx);
1205                 pr = malloc(sizeof(*pr), M_PRISON, M_WAITOK | M_ZERO);
1206
1207                 if (jid == 0 && (jid = get_next_prid(&inspr)) == 0) {
1208                         error = EAGAIN;
1209                         vfs_opterror(opts, "no available jail IDs");
1210                         free(pr, M_PRISON);
1211                         prison_deref(ppr,
1212                             PD_DEREF | PD_DEUREF | PD_LIST_XLOCKED);
1213                         goto done_releroot;
1214                 }
1215                 pr->pr_id = jid;
1216                 if (inspr != NULL)
1217                         TAILQ_INSERT_BEFORE(inspr, pr, pr_list);
1218                 else
1219                         TAILQ_INSERT_TAIL(&allprison, pr, pr_list);
1220
1221                 pr->pr_parent = ppr;
1222                 LIST_INSERT_HEAD(&ppr->pr_children, pr, pr_sibling);
1223                 for (tpr = ppr; tpr != NULL; tpr = tpr->pr_parent)
1224                         tpr->pr_childcount++;
1225
1226                 /* Set some default values, and inherit some from the parent. */
1227                 if (namelc == NULL)
1228                         namelc = "";
1229                 if (path == NULL) {
1230                         path = "/";
1231                         root = mypr->pr_root;
1232                         vref(root);
1233                 }
1234                 strlcpy(pr->pr_hostuuid, DEFAULT_HOSTUUID, HOSTUUIDLEN);
1235                 pr->pr_flags |= PR_HOST;
1236 #if defined(INET) || defined(INET6)
1237 #ifdef VIMAGE
1238                 if (!(pr_flags & PR_VNET))
1239 #endif
1240                 {
1241 #ifdef INET
1242                         if (!(ch_flags & PR_IP4_USER))
1243                                 pr->pr_flags |= PR_IP4 | PR_IP4_USER;
1244                         else if (!(pr_flags & PR_IP4_USER)) {
1245                                 pr->pr_flags |= ppr->pr_flags & PR_IP4;
1246                                 if (ppr->pr_ip4 != NULL) {
1247                                         pr->pr_ip4s = ppr->pr_ip4s;
1248                                         pr->pr_ip4 = malloc(pr->pr_ip4s *
1249                                             sizeof(struct in_addr), M_PRISON,
1250                                             M_WAITOK);
1251                                         bcopy(ppr->pr_ip4, pr->pr_ip4,
1252                                             pr->pr_ip4s * sizeof(*pr->pr_ip4));
1253                                 }
1254                         }
1255 #endif
1256 #ifdef INET6
1257                         if (!(ch_flags & PR_IP6_USER))
1258                                 pr->pr_flags |= PR_IP6 | PR_IP6_USER;
1259                         else if (!(pr_flags & PR_IP6_USER)) {
1260                                 pr->pr_flags |= ppr->pr_flags & PR_IP6;
1261                                 if (ppr->pr_ip6 != NULL) {
1262                                         pr->pr_ip6s = ppr->pr_ip6s;
1263                                         pr->pr_ip6 = malloc(pr->pr_ip6s *
1264                                             sizeof(struct in6_addr), M_PRISON,
1265                                             M_WAITOK);
1266                                         bcopy(ppr->pr_ip6, pr->pr_ip6,
1267                                             pr->pr_ip6s * sizeof(*pr->pr_ip6));
1268                                 }
1269                         }
1270 #endif
1271                 }
1272 #endif
1273                 /* Source address selection is always on by default. */
1274                 pr->pr_flags |= _PR_IP_SADDRSEL;
1275
1276                 pr->pr_securelevel = ppr->pr_securelevel;
1277                 pr->pr_allow = JAIL_DEFAULT_ALLOW & ppr->pr_allow;
1278                 pr->pr_enforce_statfs = jail_default_enforce_statfs;
1279                 pr->pr_devfs_rsnum = ppr->pr_devfs_rsnum;
1280
1281                 pr->pr_osreldate = osreldt ? osreldt : ppr->pr_osreldate;
1282                 if (osrelstr == NULL)
1283                         strlcpy(pr->pr_osrelease, ppr->pr_osrelease,
1284                             sizeof(pr->pr_osrelease));
1285                 else
1286                         strlcpy(pr->pr_osrelease, osrelstr,
1287                             sizeof(pr->pr_osrelease));
1288
1289                 LIST_INIT(&pr->pr_children);
1290                 mtx_init(&pr->pr_mtx, "jail mutex", NULL, MTX_DEF | MTX_DUPOK);
1291                 TASK_INIT(&pr->pr_task, 0, prison_complete, pr);
1292
1293 #ifdef VIMAGE
1294                 /* Allocate a new vnet if specified. */
1295                 pr->pr_vnet = (pr_flags & PR_VNET)
1296                     ? vnet_alloc() : ppr->pr_vnet;
1297 #endif
1298                 /*
1299                  * Allocate a dedicated cpuset for each jail.
1300                  * Unlike other initial settings, this may return an erorr.
1301                  */
1302                 error = cpuset_create_root(ppr, &pr->pr_cpuset);
1303                 if (error) {
1304                         prison_deref(pr, PD_LIST_XLOCKED);
1305                         goto done_releroot;
1306                 }
1307
1308                 mtx_lock(&pr->pr_mtx);
1309                 /*
1310                  * New prisons do not yet have a reference, because we do not
1311                  * want others to see the incomplete prison once the
1312                  * allprison_lock is downgraded.
1313                  */
1314         } else {
1315                 created = 0;
1316                 /*
1317                  * Grab a reference for existing prisons, to ensure they
1318                  * continue to exist for the duration of the call.
1319                  */
1320                 pr->pr_ref++;
1321 #if defined(VIMAGE) && (defined(INET) || defined(INET6))
1322                 if ((pr->pr_flags & PR_VNET) &&
1323                     (ch_flags & (PR_IP4_USER | PR_IP6_USER))) {
1324                         error = EINVAL;
1325                         vfs_opterror(opts,
1326                             "vnet jails cannot have IP address restrictions");
1327                         goto done_deref_locked;
1328                 }
1329 #endif
1330 #ifdef INET
1331                 if (PR_IP4_USER & ch_flags & (pr_flags ^ pr->pr_flags)) {
1332                         error = EINVAL;
1333                         vfs_opterror(opts,
1334                             "ip4 cannot be changed after creation");
1335                         goto done_deref_locked;
1336                 }
1337 #endif
1338 #ifdef INET6
1339                 if (PR_IP6_USER & ch_flags & (pr_flags ^ pr->pr_flags)) {
1340                         error = EINVAL;
1341                         vfs_opterror(opts,
1342                             "ip6 cannot be changed after creation");
1343                         goto done_deref_locked;
1344                 }
1345 #endif
1346         }
1347
1348         /* Do final error checking before setting anything. */
1349         if (gotslevel) {
1350                 if (slevel < ppr->pr_securelevel) {
1351                         error = EPERM;
1352                         goto done_deref_locked;
1353                 }
1354         }
1355         if (gotchildmax) {
1356                 if (childmax >= ppr->pr_childmax) {
1357                         error = EPERM;
1358                         goto done_deref_locked;
1359                 }
1360         }
1361         if (gotenforce) {
1362                 if (enforce < ppr->pr_enforce_statfs) {
1363                         error = EPERM;
1364                         goto done_deref_locked;
1365                 }
1366         }
1367         if (gotrsnum) {
1368                 /*
1369                  * devfs_rsnum is a uint16_t
1370                  */
1371                 if (rsnum < 0 || rsnum > 65535) {
1372                         error = EINVAL;
1373                         goto done_deref_locked;
1374                 }
1375                 /*
1376                  * Nested jails always inherit parent's devfs ruleset
1377                  */
1378                 if (jailed(td->td_ucred)) {
1379                         if (rsnum > 0 && rsnum != ppr->pr_devfs_rsnum) {
1380                                 error = EPERM;
1381                                 goto done_deref_locked;
1382                         } else
1383                                 rsnum = ppr->pr_devfs_rsnum;
1384                 }
1385         }
1386 #ifdef INET
1387         if (ip4s > 0) {
1388                 if (ppr->pr_flags & PR_IP4) {
1389                         /*
1390                          * Make sure the new set of IP addresses is a
1391                          * subset of the parent's list.  Don't worry
1392                          * about the parent being unlocked, as any
1393                          * setting is done with allprison_lock held.
1394                          */
1395                         for (ij = 0; ij < ppr->pr_ip4s; ij++)
1396                                 if (ip4[0].s_addr == ppr->pr_ip4[ij].s_addr)
1397                                         break;
1398                         if (ij == ppr->pr_ip4s) {
1399                                 error = EPERM;
1400                                 goto done_deref_locked;
1401                         }
1402                         if (ip4s > 1) {
1403                                 for (ii = ij = 1; ii < ip4s; ii++) {
1404                                         if (ip4[ii].s_addr ==
1405                                             ppr->pr_ip4[0].s_addr)
1406                                                 continue;
1407                                         for (; ij < ppr->pr_ip4s; ij++)
1408                                                 if (ip4[ii].s_addr ==
1409                                                     ppr->pr_ip4[ij].s_addr)
1410                                                         break;
1411                                         if (ij == ppr->pr_ip4s)
1412                                                 break;
1413                                 }
1414                                 if (ij == ppr->pr_ip4s) {
1415                                         error = EPERM;
1416                                         goto done_deref_locked;
1417                                 }
1418                         }
1419                 }
1420                 /*
1421                  * Check for conflicting IP addresses.  We permit them
1422                  * if there is no more than one IP on each jail.  If
1423                  * there is a duplicate on a jail with more than one
1424                  * IP stop checking and return error.
1425                  */
1426 #ifdef VIMAGE
1427                 for (tppr = ppr; tppr != &prison0; tppr = tppr->pr_parent)
1428                         if (tppr->pr_flags & PR_VNET)
1429                                 break;
1430 #else
1431                 tppr = &prison0;
1432 #endif
1433                 FOREACH_PRISON_DESCENDANT(tppr, tpr, descend) {
1434                         if (tpr == pr ||
1435 #ifdef VIMAGE
1436                             (tpr != tppr && (tpr->pr_flags & PR_VNET)) ||
1437 #endif
1438                             tpr->pr_uref == 0) {
1439                                 descend = 0;
1440                                 continue;
1441                         }
1442                         if (!(tpr->pr_flags & PR_IP4_USER))
1443                                 continue;
1444                         descend = 0;
1445                         if (tpr->pr_ip4 == NULL ||
1446                             (ip4s == 1 && tpr->pr_ip4s == 1))
1447                                 continue;
1448                         for (ii = 0; ii < ip4s; ii++) {
1449                                 if (prison_check_ip4_locked(tpr, &ip4[ii]) ==
1450                                     0) {
1451                                         error = EADDRINUSE;
1452                                         vfs_opterror(opts,
1453                                             "IPv4 addresses clash");
1454                                         goto done_deref_locked;
1455                                 }
1456                         }
1457                 }
1458         }
1459 #endif
1460 #ifdef INET6
1461         if (ip6s > 0) {
1462                 if (ppr->pr_flags & PR_IP6) {
1463                         /*
1464                          * Make sure the new set of IP addresses is a
1465                          * subset of the parent's list.
1466                          */
1467                         for (ij = 0; ij < ppr->pr_ip6s; ij++)
1468                                 if (IN6_ARE_ADDR_EQUAL(&ip6[0],
1469                                     &ppr->pr_ip6[ij]))
1470                                         break;
1471                         if (ij == ppr->pr_ip6s) {
1472                                 error = EPERM;
1473                                 goto done_deref_locked;
1474                         }
1475                         if (ip6s > 1) {
1476                                 for (ii = ij = 1; ii < ip6s; ii++) {
1477                                         if (IN6_ARE_ADDR_EQUAL(&ip6[ii],
1478                                              &ppr->pr_ip6[0]))
1479                                                 continue;
1480                                         for (; ij < ppr->pr_ip6s; ij++)
1481                                                 if (IN6_ARE_ADDR_EQUAL(
1482                                                     &ip6[ii], &ppr->pr_ip6[ij]))
1483                                                         break;
1484                                         if (ij == ppr->pr_ip6s)
1485                                                 break;
1486                                 }
1487                                 if (ij == ppr->pr_ip6s) {
1488                                         error = EPERM;
1489                                         goto done_deref_locked;
1490                                 }
1491                         }
1492                 }
1493                 /* Check for conflicting IP addresses. */
1494 #ifdef VIMAGE
1495                 for (tppr = ppr; tppr != &prison0; tppr = tppr->pr_parent)
1496                         if (tppr->pr_flags & PR_VNET)
1497                                 break;
1498 #else
1499                 tppr = &prison0;
1500 #endif
1501                 FOREACH_PRISON_DESCENDANT(tppr, tpr, descend) {
1502                         if (tpr == pr ||
1503 #ifdef VIMAGE
1504                             (tpr != tppr && (tpr->pr_flags & PR_VNET)) ||
1505 #endif
1506                             tpr->pr_uref == 0) {
1507                                 descend = 0;
1508                                 continue;
1509                         }
1510                         if (!(tpr->pr_flags & PR_IP6_USER))
1511                                 continue;
1512                         descend = 0;
1513                         if (tpr->pr_ip6 == NULL ||
1514                             (ip6s == 1 && tpr->pr_ip6s == 1))
1515                                 continue;
1516                         for (ii = 0; ii < ip6s; ii++) {
1517                                 if (prison_check_ip6_locked(tpr, &ip6[ii]) ==
1518                                     0) {
1519                                         error = EADDRINUSE;
1520                                         vfs_opterror(opts,
1521                                             "IPv6 addresses clash");
1522                                         goto done_deref_locked;
1523                                 }
1524                         }
1525                 }
1526         }
1527 #endif
1528         onamelen = namelen = 0;
1529         if (namelc != NULL) {
1530                 /* Give a default name of the jid.  Also allow the name to be
1531                  * explicitly the jid - but not any other number, and only in
1532                  * normal form (no leading zero/etc).
1533                  */
1534                 if (namelc[0] == '\0')
1535                         snprintf(namelc = numbuf, sizeof(numbuf), "%d", jid);
1536                 else if ((strtoul(namelc, &p, 10) != jid ||
1537                           namelc[0] < '1' || namelc[0] > '9') && *p == '\0') {
1538                         error = EINVAL;
1539                         vfs_opterror(opts,
1540                             "name cannot be numeric (unless it is the jid)");
1541                         goto done_deref_locked;
1542                 }
1543                 /*
1544                  * Make sure the name isn't too long for the prison or its
1545                  * children.
1546                  */
1547                 pnamelen = (ppr == &prison0) ? 0 : strlen(ppr->pr_name) + 1;
1548                 onamelen = strlen(pr->pr_name + pnamelen);
1549                 namelen = strlen(namelc);
1550                 if (pnamelen + namelen + 1 > sizeof(pr->pr_name)) {
1551                         error = ENAMETOOLONG;
1552                         goto done_deref_locked;
1553                 }
1554                 FOREACH_PRISON_DESCENDANT(pr, tpr, descend) {
1555                         if (strlen(tpr->pr_name) + (namelen - onamelen) >=
1556                             sizeof(pr->pr_name)) {
1557                                 error = ENAMETOOLONG;
1558                                 goto done_deref_locked;
1559                         }
1560                 }
1561         }
1562         pr_allow_diff = pr_allow & ~ppr->pr_allow;
1563         if (pr_allow_diff & ~PR_ALLOW_DIFFERENCES) {
1564                 error = EPERM;
1565                 goto done_deref_locked;
1566         }
1567
1568         /*
1569          * Let modules check their parameters.  This requires unlocking and
1570          * then re-locking the prison, but this is still a valid state as long
1571          * as allprison_lock remains xlocked.
1572          */
1573         mtx_unlock(&pr->pr_mtx);
1574         error = osd_jail_call(pr, PR_METHOD_CHECK, opts);
1575         if (error != 0) {
1576                 prison_deref(pr, created
1577                     ? PD_LIST_XLOCKED
1578                     : PD_DEREF | PD_LIST_XLOCKED);
1579                 goto done_releroot;
1580         }
1581         mtx_lock(&pr->pr_mtx);
1582
1583         /* At this point, all valid parameters should have been noted. */
1584         TAILQ_FOREACH(opt, opts, link) {
1585                 if (!opt->seen && strcmp(opt->name, "errmsg")) {
1586                         error = EINVAL;
1587                         vfs_opterror(opts, "unknown parameter: %s", opt->name);
1588                         goto done_deref_locked;
1589                 }
1590         }
1591
1592         /* Set the parameters of the prison. */
1593 #ifdef INET
1594         redo_ip4 = 0;
1595         if (pr_flags & PR_IP4_USER) {
1596                 pr->pr_flags |= PR_IP4;
1597                 free(pr->pr_ip4, M_PRISON);
1598                 pr->pr_ip4s = ip4s;
1599                 pr->pr_ip4 = ip4;
1600                 ip4 = NULL;
1601                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend) {
1602 #ifdef VIMAGE
1603                         if (tpr->pr_flags & PR_VNET) {
1604                                 descend = 0;
1605                                 continue;
1606                         }
1607 #endif
1608                         if (prison_restrict_ip4(tpr, NULL)) {
1609                                 redo_ip4 = 1;
1610                                 descend = 0;
1611                         }
1612                 }
1613         }
1614 #endif
1615 #ifdef INET6
1616         redo_ip6 = 0;
1617         if (pr_flags & PR_IP6_USER) {
1618                 pr->pr_flags |= PR_IP6;
1619                 free(pr->pr_ip6, M_PRISON);
1620                 pr->pr_ip6s = ip6s;
1621                 pr->pr_ip6 = ip6;
1622                 ip6 = NULL;
1623                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend) {
1624 #ifdef VIMAGE
1625                         if (tpr->pr_flags & PR_VNET) {
1626                                 descend = 0;
1627                                 continue;
1628                         }
1629 #endif
1630                         if (prison_restrict_ip6(tpr, NULL)) {
1631                                 redo_ip6 = 1;
1632                                 descend = 0;
1633                         }
1634                 }
1635         }
1636 #endif
1637         if (gotslevel) {
1638                 pr->pr_securelevel = slevel;
1639                 /* Set all child jails to be at least this level. */
1640                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend)
1641                         if (tpr->pr_securelevel < slevel)
1642                                 tpr->pr_securelevel = slevel;
1643         }
1644         if (gotchildmax) {
1645                 pr->pr_childmax = childmax;
1646                 /* Set all child jails to under this limit. */
1647                 FOREACH_PRISON_DESCENDANT_LOCKED_LEVEL(pr, tpr, descend, level)
1648                         if (tpr->pr_childmax > childmax - level)
1649                                 tpr->pr_childmax = childmax > level
1650                                     ? childmax - level : 0;
1651         }
1652         if (gotenforce) {
1653                 pr->pr_enforce_statfs = enforce;
1654                 /* Pass this restriction on to the children. */
1655                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend)
1656                         if (tpr->pr_enforce_statfs < enforce)
1657                                 tpr->pr_enforce_statfs = enforce;
1658         }
1659         if (gotrsnum) {
1660                 pr->pr_devfs_rsnum = rsnum;
1661                 /* Pass this restriction on to the children. */
1662                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend)
1663                         tpr->pr_devfs_rsnum = rsnum;
1664         }
1665         if (namelc != NULL) {
1666                 if (ppr == &prison0)
1667                         strlcpy(pr->pr_name, namelc, sizeof(pr->pr_name));
1668                 else
1669                         snprintf(pr->pr_name, sizeof(pr->pr_name), "%s.%s",
1670                             ppr->pr_name, namelc);
1671                 /* Change this component of child names. */
1672                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend) {
1673                         bcopy(tpr->pr_name + onamelen, tpr->pr_name + namelen,
1674                             strlen(tpr->pr_name + onamelen) + 1);
1675                         bcopy(pr->pr_name, tpr->pr_name, namelen);
1676                 }
1677         }
1678         if (path != NULL) {
1679                 /* Try to keep a real-rooted full pathname. */
1680                 strlcpy(pr->pr_path, path, sizeof(pr->pr_path));
1681                 pr->pr_root = root;
1682         }
1683         if (PR_HOST & ch_flags & ~pr_flags) {
1684                 if (pr->pr_flags & PR_HOST) {
1685                         /*
1686                          * Copy the parent's host info.  As with pr_ip4 above,
1687                          * the lack of a lock on the parent is not a problem;
1688                          * it is always set with allprison_lock at least
1689                          * shared, and is held exclusively here.
1690                          */
1691                         strlcpy(pr->pr_hostname, pr->pr_parent->pr_hostname,
1692                             sizeof(pr->pr_hostname));
1693                         strlcpy(pr->pr_domainname, pr->pr_parent->pr_domainname,
1694                             sizeof(pr->pr_domainname));
1695                         strlcpy(pr->pr_hostuuid, pr->pr_parent->pr_hostuuid,
1696                             sizeof(pr->pr_hostuuid));
1697                         pr->pr_hostid = pr->pr_parent->pr_hostid;
1698                 }
1699         } else if (host != NULL || domain != NULL || uuid != NULL || gothid) {
1700                 /* Set this prison, and any descendants without PR_HOST. */
1701                 if (host != NULL)
1702                         strlcpy(pr->pr_hostname, host, sizeof(pr->pr_hostname));
1703                 if (domain != NULL)
1704                         strlcpy(pr->pr_domainname, domain, 
1705                             sizeof(pr->pr_domainname));
1706                 if (uuid != NULL)
1707                         strlcpy(pr->pr_hostuuid, uuid, sizeof(pr->pr_hostuuid));
1708                 if (gothid)
1709                         pr->pr_hostid = hid;
1710                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend) {
1711                         if (tpr->pr_flags & PR_HOST)
1712                                 descend = 0;
1713                         else {
1714                                 if (host != NULL)
1715                                         strlcpy(tpr->pr_hostname,
1716                                             pr->pr_hostname,
1717                                             sizeof(tpr->pr_hostname));
1718                                 if (domain != NULL)
1719                                         strlcpy(tpr->pr_domainname, 
1720                                             pr->pr_domainname,
1721                                             sizeof(tpr->pr_domainname));
1722                                 if (uuid != NULL)
1723                                         strlcpy(tpr->pr_hostuuid,
1724                                             pr->pr_hostuuid,
1725                                             sizeof(tpr->pr_hostuuid));
1726                                 if (gothid)
1727                                         tpr->pr_hostid = hid;
1728                         }
1729                 }
1730         }
1731         pr->pr_allow = (pr->pr_allow & ~ch_allow) | pr_allow;
1732         if ((tallow = ch_allow & ~pr_allow))
1733                 prison_set_allow_locked(pr, tallow, 0);
1734         /*
1735          * Persistent prisons get an extra reference, and prisons losing their
1736          * persist flag lose that reference.  Only do this for existing prisons
1737          * for now, so new ones will remain unseen until after the module
1738          * handlers have completed.
1739          */
1740         born = pr->pr_uref == 0;
1741         if (!created && (ch_flags & PR_PERSIST & (pr_flags ^ pr->pr_flags))) {
1742                 if (pr_flags & PR_PERSIST) {
1743                         pr->pr_ref++;
1744                         pr->pr_uref++;
1745                 } else {
1746                         pr->pr_ref--;
1747                         pr->pr_uref--;
1748                 }
1749         }
1750         pr->pr_flags = (pr->pr_flags & ~ch_flags) | pr_flags;
1751         mtx_unlock(&pr->pr_mtx);
1752
1753 #ifdef RACCT
1754         if (racct_enable && created)
1755                 prison_racct_attach(pr);
1756 #endif
1757
1758         /* Locks may have prevented a complete restriction of child IP
1759          * addresses.  If so, allocate some more memory and try again.
1760          */
1761 #ifdef INET
1762         while (redo_ip4) {
1763                 ip4s = pr->pr_ip4s;
1764                 ip4 = malloc(ip4s * sizeof(*ip4), M_PRISON, M_WAITOK);
1765                 mtx_lock(&pr->pr_mtx);
1766                 redo_ip4 = 0;
1767                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend) {
1768 #ifdef VIMAGE
1769                         if (tpr->pr_flags & PR_VNET) {
1770                                 descend = 0;
1771                                 continue;
1772                         }
1773 #endif
1774                         if (prison_restrict_ip4(tpr, ip4)) {
1775                                 if (ip4 != NULL)
1776                                         ip4 = NULL;
1777                                 else
1778                                         redo_ip4 = 1;
1779                         }
1780                 }
1781                 mtx_unlock(&pr->pr_mtx);
1782         }
1783 #endif
1784 #ifdef INET6
1785         while (redo_ip6) {
1786                 ip6s = pr->pr_ip6s;
1787                 ip6 = malloc(ip6s * sizeof(*ip6), M_PRISON, M_WAITOK);
1788                 mtx_lock(&pr->pr_mtx);
1789                 redo_ip6 = 0;
1790                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, tpr, descend) {
1791 #ifdef VIMAGE
1792                         if (tpr->pr_flags & PR_VNET) {
1793                                 descend = 0;
1794                                 continue;
1795                         }
1796 #endif
1797                         if (prison_restrict_ip6(tpr, ip6)) {
1798                                 if (ip6 != NULL)
1799                                         ip6 = NULL;
1800                                 else
1801                                         redo_ip6 = 1;
1802                         }
1803                 }
1804                 mtx_unlock(&pr->pr_mtx);
1805         }
1806 #endif
1807
1808         /* Let the modules do their work. */
1809         sx_downgrade(&allprison_lock);
1810         if (born) {
1811                 error = osd_jail_call(pr, PR_METHOD_CREATE, opts);
1812                 if (error) {
1813                         (void)osd_jail_call(pr, PR_METHOD_REMOVE, NULL);
1814                         prison_deref(pr, created
1815                             ? PD_LIST_SLOCKED
1816                             : PD_DEREF | PD_LIST_SLOCKED);
1817                         goto done_errmsg;
1818                 }
1819         }
1820         error = osd_jail_call(pr, PR_METHOD_SET, opts);
1821         if (error) {
1822                 if (born)
1823                         (void)osd_jail_call(pr, PR_METHOD_REMOVE, NULL);
1824                 prison_deref(pr, created
1825                     ? PD_LIST_SLOCKED
1826                     : PD_DEREF | PD_LIST_SLOCKED);
1827                 goto done_errmsg;
1828         }
1829
1830         /* Attach this process to the prison if requested. */
1831         slocked = PD_LIST_SLOCKED;
1832         if (flags & JAIL_ATTACH) {
1833                 mtx_lock(&pr->pr_mtx);
1834                 error = do_jail_attach(td, pr);
1835                 slocked = 0;
1836                 if (error) {
1837                         vfs_opterror(opts, "attach failed");
1838                         if (!created)
1839                                 prison_deref(pr, PD_DEREF);
1840                         goto done_errmsg;
1841                 }
1842         }
1843
1844 #ifdef RACCT
1845         if (racct_enable && !created) {
1846                 if (slocked) {
1847                         sx_sunlock(&allprison_lock);
1848                         slocked = 0;
1849                 }
1850                 prison_racct_modify(pr);
1851         }
1852 #endif
1853
1854         td->td_retval[0] = pr->pr_id;
1855
1856         /*
1857          * Now that it is all there, drop the temporary reference from existing
1858          * prisons.  Or add a reference to newly created persistent prisons
1859          * (which was not done earlier so that the prison would not be publicly
1860          * visible).
1861          */
1862         if (!created)
1863                 prison_deref(pr, PD_DEREF | slocked);
1864         else {
1865                 if (pr_flags & PR_PERSIST) {
1866                         mtx_lock(&pr->pr_mtx);
1867                         pr->pr_ref++;
1868                         pr->pr_uref++;
1869                         mtx_unlock(&pr->pr_mtx);
1870                 }
1871                 if (slocked)
1872                         sx_sunlock(&allprison_lock);
1873         }
1874
1875         goto done_free;
1876
1877  done_deref_locked:
1878         prison_deref(pr, created
1879             ? PD_LOCKED | PD_LIST_XLOCKED
1880             : PD_DEREF | PD_LOCKED | PD_LIST_XLOCKED);
1881         goto done_releroot;
1882  done_unlock_list:
1883         sx_xunlock(&allprison_lock);
1884  done_releroot:
1885         if (root != NULL)
1886                 vrele(root);
1887  done_errmsg:
1888         if (error) {
1889                 if (vfs_getopt(opts, "errmsg", (void **)&errmsg,
1890                     &errmsg_len) == 0 && errmsg_len > 0) {
1891                         errmsg_pos = 2 * vfs_getopt_pos(opts, "errmsg") + 1;
1892                         if (optuio->uio_segflg == UIO_SYSSPACE)
1893                                 bcopy(errmsg,
1894                                     optuio->uio_iov[errmsg_pos].iov_base,
1895                                     errmsg_len);
1896                         else
1897                                 copyout(errmsg,
1898                                     optuio->uio_iov[errmsg_pos].iov_base,
1899                                     errmsg_len);
1900                 }
1901         }
1902  done_free:
1903 #ifdef INET
1904         free(ip4, M_PRISON);
1905 #endif
1906 #ifdef INET6
1907         free(ip6, M_PRISON);
1908 #endif
1909         if (g_path != NULL)
1910                 free(g_path, M_TEMP);
1911         vfs_freeopts(opts);
1912         return (error);
1913 }
1914
1915 /*
1916  * Find the next available prison ID.  Return the ID on success, or zero
1917  * on failure.  Also set a pointer to the allprison list entry the prison
1918  * should be inserted before.
1919  */
1920 static int
1921 get_next_prid(struct prison **insprp)
1922 {
1923         struct prison *inspr;
1924         int jid, maxid;
1925
1926         jid = lastprid % JAIL_MAX + 1;
1927         if (TAILQ_EMPTY(&allprison) ||
1928             TAILQ_LAST(&allprison, prisonlist)->pr_id < jid) {
1929                 /*
1930                  * A common case is for all jails to be implicitly numbered,
1931                  * which means they'll go on the end of the list, at least
1932                  * for the first JAIL_MAX times.
1933                  */
1934                 inspr = NULL;
1935         } else {
1936                 /*
1937                  * Take two passes through the allprison list: first starting
1938                  * with the proposed jid, then ending with it.
1939                  */
1940                 for (maxid = JAIL_MAX; maxid != 0; ) {
1941                         TAILQ_FOREACH(inspr, &allprison, pr_list) {
1942                                 if (inspr->pr_id < jid)
1943                                         continue;
1944                                 if (inspr->pr_id > jid || inspr->pr_ref == 0) {
1945                                         /*
1946                                          * Found an opening.  This may be a gap
1947                                          * in the list, or a dead jail with the
1948                                          * same ID.
1949                                          */
1950                                         maxid = 0;
1951                                         break;
1952                                 }
1953                                 if (++jid > maxid) {
1954                                         if (lastprid == maxid || lastprid == 0)
1955                                         {
1956                                                 /*
1957                                                  * The entire legal range
1958                                                  * has been traversed
1959                                                  */
1960                                                 return 0;
1961                                         }
1962                                         /* Try again from the start. */
1963                                         jid = 1;
1964                                         maxid = lastprid;
1965                                         break;
1966                                 }
1967                         }
1968                         if (inspr == NULL) {
1969                                 /* Found room at the end of the list. */
1970                                 break;
1971                         }
1972                 }
1973         }
1974         *insprp = inspr;
1975         lastprid = jid;
1976         return (jid);
1977 }
1978
1979 /*
1980  * struct jail_get_args {
1981  *      struct iovec *iovp;
1982  *      unsigned int iovcnt;
1983  *      int flags;
1984  * };
1985  */
1986 int
1987 sys_jail_get(struct thread *td, struct jail_get_args *uap)
1988 {
1989         struct uio *auio;
1990         int error;
1991
1992         /* Check that we have an even number of iovecs. */
1993         if (uap->iovcnt & 1)
1994                 return (EINVAL);
1995
1996         error = copyinuio(uap->iovp, uap->iovcnt, &auio);
1997         if (error)
1998                 return (error);
1999         error = kern_jail_get(td, auio, uap->flags);
2000         if (error == 0)
2001                 error = copyout(auio->uio_iov, uap->iovp,
2002                     uap->iovcnt * sizeof (struct iovec));
2003         free(auio, M_IOV);
2004         return (error);
2005 }
2006
2007 int
2008 kern_jail_get(struct thread *td, struct uio *optuio, int flags)
2009 {
2010         struct bool_flags *bf;
2011         struct jailsys_flags *jsf;
2012         struct prison *pr, *mypr;
2013         struct vfsopt *opt;
2014         struct vfsoptlist *opts;
2015         char *errmsg, *name;
2016         int error, errmsg_len, errmsg_pos, i, jid, len, locked, pos;
2017         unsigned f;
2018
2019         if (flags & ~JAIL_GET_MASK)
2020                 return (EINVAL);
2021
2022         /* Get the parameter list. */
2023         error = vfs_buildopts(optuio, &opts);
2024         if (error)
2025                 return (error);
2026         errmsg_pos = vfs_getopt_pos(opts, "errmsg");
2027         mypr = td->td_ucred->cr_prison;
2028
2029         /*
2030          * Find the prison specified by one of: lastjid, jid, name.
2031          */
2032         sx_slock(&allprison_lock);
2033         error = vfs_copyopt(opts, "lastjid", &jid, sizeof(jid));
2034         if (error == 0) {
2035                 TAILQ_FOREACH(pr, &allprison, pr_list) {
2036                         if (pr->pr_id > jid && prison_ischild(mypr, pr)) {
2037                                 mtx_lock(&pr->pr_mtx);
2038                                 if (pr->pr_ref > 0 &&
2039                                     (pr->pr_uref > 0 || (flags & JAIL_DYING)))
2040                                         break;
2041                                 mtx_unlock(&pr->pr_mtx);
2042                         }
2043                 }
2044                 if (pr != NULL)
2045                         goto found_prison;
2046                 error = ENOENT;
2047                 vfs_opterror(opts, "no jail after %d", jid);
2048                 goto done_unlock_list;
2049         } else if (error != ENOENT)
2050                 goto done_unlock_list;
2051
2052         error = vfs_copyopt(opts, "jid", &jid, sizeof(jid));
2053         if (error == 0) {
2054                 if (jid != 0) {
2055                         pr = prison_find_child(mypr, jid);
2056                         if (pr != NULL) {
2057                                 if (pr->pr_uref == 0 && !(flags & JAIL_DYING)) {
2058                                         mtx_unlock(&pr->pr_mtx);
2059                                         error = ENOENT;
2060                                         vfs_opterror(opts, "jail %d is dying",
2061                                             jid);
2062                                         goto done_unlock_list;
2063                                 }
2064                                 goto found_prison;
2065                         }
2066                         error = ENOENT;
2067                         vfs_opterror(opts, "jail %d not found", jid);
2068                         goto done_unlock_list;
2069                 }
2070         } else if (error != ENOENT)
2071                 goto done_unlock_list;
2072
2073         error = vfs_getopt(opts, "name", (void **)&name, &len);
2074         if (error == 0) {
2075                 if (len == 0 || name[len - 1] != '\0') {
2076                         error = EINVAL;
2077                         goto done_unlock_list;
2078                 }
2079                 pr = prison_find_name(mypr, name);
2080                 if (pr != NULL) {
2081                         if (pr->pr_uref == 0 && !(flags & JAIL_DYING)) {
2082                                 mtx_unlock(&pr->pr_mtx);
2083                                 error = ENOENT;
2084                                 vfs_opterror(opts, "jail \"%s\" is dying",
2085                                     name);
2086                                 goto done_unlock_list;
2087                         }
2088                         goto found_prison;
2089                 }
2090                 error = ENOENT;
2091                 vfs_opterror(opts, "jail \"%s\" not found", name);
2092                 goto done_unlock_list;
2093         } else if (error != ENOENT)
2094                 goto done_unlock_list;
2095
2096         vfs_opterror(opts, "no jail specified");
2097         error = ENOENT;
2098         goto done_unlock_list;
2099
2100  found_prison:
2101         /* Get the parameters of the prison. */
2102         pr->pr_ref++;
2103         locked = PD_LOCKED;
2104         td->td_retval[0] = pr->pr_id;
2105         error = vfs_setopt(opts, "jid", &pr->pr_id, sizeof(pr->pr_id));
2106         if (error != 0 && error != ENOENT)
2107                 goto done_deref;
2108         i = (pr->pr_parent == mypr) ? 0 : pr->pr_parent->pr_id;
2109         error = vfs_setopt(opts, "parent", &i, sizeof(i));
2110         if (error != 0 && error != ENOENT)
2111                 goto done_deref;
2112         error = vfs_setopts(opts, "name", prison_name(mypr, pr));
2113         if (error != 0 && error != ENOENT)
2114                 goto done_deref;
2115         error = vfs_setopt(opts, "cpuset.id", &pr->pr_cpuset->cs_id,
2116             sizeof(pr->pr_cpuset->cs_id));
2117         if (error != 0 && error != ENOENT)
2118                 goto done_deref;
2119         error = vfs_setopts(opts, "path", prison_path(mypr, pr));
2120         if (error != 0 && error != ENOENT)
2121                 goto done_deref;
2122 #ifdef INET
2123         error = vfs_setopt_part(opts, "ip4.addr", pr->pr_ip4,
2124             pr->pr_ip4s * sizeof(*pr->pr_ip4));
2125         if (error != 0 && error != ENOENT)
2126                 goto done_deref;
2127 #endif
2128 #ifdef INET6
2129         error = vfs_setopt_part(opts, "ip6.addr", pr->pr_ip6,
2130             pr->pr_ip6s * sizeof(*pr->pr_ip6));
2131         if (error != 0 && error != ENOENT)
2132                 goto done_deref;
2133 #endif
2134         error = vfs_setopt(opts, "securelevel", &pr->pr_securelevel,
2135             sizeof(pr->pr_securelevel));
2136         if (error != 0 && error != ENOENT)
2137                 goto done_deref;
2138         error = vfs_setopt(opts, "children.cur", &pr->pr_childcount,
2139             sizeof(pr->pr_childcount));
2140         if (error != 0 && error != ENOENT)
2141                 goto done_deref;
2142         error = vfs_setopt(opts, "children.max", &pr->pr_childmax,
2143             sizeof(pr->pr_childmax));
2144         if (error != 0 && error != ENOENT)
2145                 goto done_deref;
2146         error = vfs_setopts(opts, "host.hostname", pr->pr_hostname);
2147         if (error != 0 && error != ENOENT)
2148                 goto done_deref;
2149         error = vfs_setopts(opts, "host.domainname", pr->pr_domainname);
2150         if (error != 0 && error != ENOENT)
2151                 goto done_deref;
2152         error = vfs_setopts(opts, "host.hostuuid", pr->pr_hostuuid);
2153         if (error != 0 && error != ENOENT)
2154                 goto done_deref;
2155 #ifdef COMPAT_FREEBSD32
2156         if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) {
2157                 uint32_t hid32 = pr->pr_hostid;
2158
2159                 error = vfs_setopt(opts, "host.hostid", &hid32, sizeof(hid32));
2160         } else
2161 #endif
2162         error = vfs_setopt(opts, "host.hostid", &pr->pr_hostid,
2163             sizeof(pr->pr_hostid));
2164         if (error != 0 && error != ENOENT)
2165                 goto done_deref;
2166         error = vfs_setopt(opts, "enforce_statfs", &pr->pr_enforce_statfs,
2167             sizeof(pr->pr_enforce_statfs));
2168         if (error != 0 && error != ENOENT)
2169                 goto done_deref;
2170         error = vfs_setopt(opts, "devfs_ruleset", &pr->pr_devfs_rsnum,
2171             sizeof(pr->pr_devfs_rsnum));
2172         if (error != 0 && error != ENOENT)
2173                 goto done_deref;
2174         for (bf = pr_flag_bool;
2175              bf < pr_flag_bool + nitems(pr_flag_bool);
2176              bf++) {
2177                 i = (pr->pr_flags & bf->flag) ? 1 : 0;
2178                 error = vfs_setopt(opts, bf->name, &i, sizeof(i));
2179                 if (error != 0 && error != ENOENT)
2180                         goto done_deref;
2181                 i = !i;
2182                 error = vfs_setopt(opts, bf->noname, &i, sizeof(i));
2183                 if (error != 0 && error != ENOENT)
2184                         goto done_deref;
2185         }
2186         for (jsf = pr_flag_jailsys;
2187              jsf < pr_flag_jailsys + nitems(pr_flag_jailsys);
2188              jsf++) {
2189                 f = pr->pr_flags & (jsf->disable | jsf->new);
2190                 i = (f != 0 && f == jsf->disable) ? JAIL_SYS_DISABLE
2191                     : (f == jsf->new) ? JAIL_SYS_NEW
2192                     : JAIL_SYS_INHERIT;
2193                 error = vfs_setopt(opts, jsf->name, &i, sizeof(i));
2194                 if (error != 0 && error != ENOENT)
2195                         goto done_deref;
2196         }
2197         for (bf = pr_flag_allow;
2198              bf < pr_flag_allow + nitems(pr_flag_allow) &&
2199                 atomic_load_int(&bf->flag) != 0;
2200              bf++) {
2201                 i = (pr->pr_allow & bf->flag) ? 1 : 0;
2202                 error = vfs_setopt(opts, bf->name, &i, sizeof(i));
2203                 if (error != 0 && error != ENOENT)
2204                         goto done_deref;
2205                 i = !i;
2206                 error = vfs_setopt(opts, bf->noname, &i, sizeof(i));
2207                 if (error != 0 && error != ENOENT)
2208                         goto done_deref;
2209         }
2210         i = (pr->pr_uref == 0);
2211         error = vfs_setopt(opts, "dying", &i, sizeof(i));
2212         if (error != 0 && error != ENOENT)
2213                 goto done_deref;
2214         i = !i;
2215         error = vfs_setopt(opts, "nodying", &i, sizeof(i));
2216         if (error != 0 && error != ENOENT)
2217                 goto done_deref;
2218         error = vfs_setopt(opts, "osreldate", &pr->pr_osreldate,
2219             sizeof(pr->pr_osreldate));
2220         if (error != 0 && error != ENOENT)
2221                 goto done_deref;
2222         error = vfs_setopts(opts, "osrelease", pr->pr_osrelease);
2223         if (error != 0 && error != ENOENT)
2224                 goto done_deref;
2225
2226         /* Get the module parameters. */
2227         mtx_unlock(&pr->pr_mtx);
2228         locked = 0;
2229         error = osd_jail_call(pr, PR_METHOD_GET, opts);
2230         if (error)
2231                 goto done_deref;
2232         prison_deref(pr, PD_DEREF | PD_LIST_SLOCKED);
2233
2234         /* By now, all parameters should have been noted. */
2235         TAILQ_FOREACH(opt, opts, link) {
2236                 if (!opt->seen && strcmp(opt->name, "errmsg")) {
2237                         error = EINVAL;
2238                         vfs_opterror(opts, "unknown parameter: %s", opt->name);
2239                         goto done_errmsg;
2240                 }
2241         }
2242
2243         /* Write the fetched parameters back to userspace. */
2244         error = 0;
2245         TAILQ_FOREACH(opt, opts, link) {
2246                 if (opt->pos >= 0 && opt->pos != errmsg_pos) {
2247                         pos = 2 * opt->pos + 1;
2248                         optuio->uio_iov[pos].iov_len = opt->len;
2249                         if (opt->value != NULL) {
2250                                 if (optuio->uio_segflg == UIO_SYSSPACE) {
2251                                         bcopy(opt->value,
2252                                             optuio->uio_iov[pos].iov_base,
2253                                             opt->len);
2254                                 } else {
2255                                         error = copyout(opt->value,
2256                                             optuio->uio_iov[pos].iov_base,
2257                                             opt->len);
2258                                         if (error)
2259                                                 break;
2260                                 }
2261                         }
2262                 }
2263         }
2264         goto done_errmsg;
2265
2266  done_deref:
2267         prison_deref(pr, locked | PD_DEREF | PD_LIST_SLOCKED);
2268         goto done_errmsg;
2269
2270  done_unlock_list:
2271         sx_sunlock(&allprison_lock);
2272  done_errmsg:
2273         if (error && errmsg_pos >= 0) {
2274                 vfs_getopt(opts, "errmsg", (void **)&errmsg, &errmsg_len);
2275                 errmsg_pos = 2 * errmsg_pos + 1;
2276                 if (errmsg_len > 0) {
2277                         if (optuio->uio_segflg == UIO_SYSSPACE)
2278                                 bcopy(errmsg,
2279                                     optuio->uio_iov[errmsg_pos].iov_base,
2280                                     errmsg_len);
2281                         else
2282                                 copyout(errmsg,
2283                                     optuio->uio_iov[errmsg_pos].iov_base,
2284                                     errmsg_len);
2285                 }
2286         }
2287         vfs_freeopts(opts);
2288         return (error);
2289 }
2290
2291 /*
2292  * struct jail_remove_args {
2293  *      int jid;
2294  * };
2295  */
2296 int
2297 sys_jail_remove(struct thread *td, struct jail_remove_args *uap)
2298 {
2299         struct prison *pr, *cpr, *lpr, *tpr;
2300         int descend, error;
2301
2302         error = priv_check(td, PRIV_JAIL_REMOVE);
2303         if (error)
2304                 return (error);
2305
2306         sx_xlock(&allprison_lock);
2307         pr = prison_find_child(td->td_ucred->cr_prison, uap->jid);
2308         if (pr == NULL) {
2309                 sx_xunlock(&allprison_lock);
2310                 return (EINVAL);
2311         }
2312
2313         /* Remove all descendants of this prison, then remove this prison. */
2314         pr->pr_ref++;
2315         if (!LIST_EMPTY(&pr->pr_children)) {
2316                 mtx_unlock(&pr->pr_mtx);
2317                 lpr = NULL;
2318                 FOREACH_PRISON_DESCENDANT(pr, cpr, descend) {
2319                         mtx_lock(&cpr->pr_mtx);
2320                         if (cpr->pr_ref > 0) {
2321                                 tpr = cpr;
2322                                 cpr->pr_ref++;
2323                         } else {
2324                                 /* Already removed - do not do it again. */
2325                                 tpr = NULL;
2326                         }
2327                         mtx_unlock(&cpr->pr_mtx);
2328                         if (lpr != NULL) {
2329                                 mtx_lock(&lpr->pr_mtx);
2330                                 prison_remove_one(lpr);
2331                                 sx_xlock(&allprison_lock);
2332                         }
2333                         lpr = tpr;
2334                 }
2335                 if (lpr != NULL) {
2336                         mtx_lock(&lpr->pr_mtx);
2337                         prison_remove_one(lpr);
2338                         sx_xlock(&allprison_lock);
2339                 }
2340                 mtx_lock(&pr->pr_mtx);
2341         }
2342         prison_remove_one(pr);
2343         return (0);
2344 }
2345
2346 static void
2347 prison_remove_one(struct prison *pr)
2348 {
2349         struct proc *p;
2350         int deuref;
2351
2352         /* If the prison was persistent, it is not anymore. */
2353         deuref = 0;
2354         if (pr->pr_flags & PR_PERSIST) {
2355                 pr->pr_ref--;
2356                 deuref = PD_DEUREF;
2357                 pr->pr_flags &= ~PR_PERSIST;
2358         }
2359
2360         /*
2361          * jail_remove added a reference.  If that's the only one, remove
2362          * the prison now.
2363          */
2364         KASSERT(pr->pr_ref > 0,
2365             ("prison_remove_one removing a dead prison (jid=%d)", pr->pr_id));
2366         if (pr->pr_ref == 1) {
2367                 prison_deref(pr,
2368                     deuref | PD_DEREF | PD_LOCKED | PD_LIST_XLOCKED);
2369                 return;
2370         }
2371
2372         mtx_unlock(&pr->pr_mtx);
2373         sx_xunlock(&allprison_lock);
2374         /*
2375          * Kill all processes unfortunate enough to be attached to this prison.
2376          */
2377         sx_slock(&allproc_lock);
2378         FOREACH_PROC_IN_SYSTEM(p) {
2379                 PROC_LOCK(p);
2380                 if (p->p_state != PRS_NEW && p->p_ucred &&
2381                     p->p_ucred->cr_prison == pr)
2382                         kern_psignal(p, SIGKILL);
2383                 PROC_UNLOCK(p);
2384         }
2385         sx_sunlock(&allproc_lock);
2386         /* Remove the temporary reference added by jail_remove. */
2387         prison_deref(pr, deuref | PD_DEREF);
2388 }
2389
2390 /*
2391  * struct jail_attach_args {
2392  *      int jid;
2393  * };
2394  */
2395 int
2396 sys_jail_attach(struct thread *td, struct jail_attach_args *uap)
2397 {
2398         struct prison *pr;
2399         int error;
2400
2401         error = priv_check(td, PRIV_JAIL_ATTACH);
2402         if (error)
2403                 return (error);
2404
2405         /*
2406          * Start with exclusive hold on allprison_lock to ensure that a possible
2407          * PR_METHOD_REMOVE call isn't concurrent with jail_set or jail_remove.
2408          * But then immediately downgrade it since we don't need to stop
2409          * readers.
2410          */
2411         sx_xlock(&allprison_lock);
2412         sx_downgrade(&allprison_lock);
2413         pr = prison_find_child(td->td_ucred->cr_prison, uap->jid);
2414         if (pr == NULL) {
2415                 sx_sunlock(&allprison_lock);
2416                 return (EINVAL);
2417         }
2418
2419         /*
2420          * Do not allow a process to attach to a prison that is not
2421          * considered to be "alive".
2422          */
2423         if (pr->pr_uref == 0) {
2424                 mtx_unlock(&pr->pr_mtx);
2425                 sx_sunlock(&allprison_lock);
2426                 return (EINVAL);
2427         }
2428
2429         return (do_jail_attach(td, pr));
2430 }
2431
2432 static int
2433 do_jail_attach(struct thread *td, struct prison *pr)
2434 {
2435         struct proc *p;
2436         struct ucred *newcred, *oldcred;
2437         int error;
2438
2439         /*
2440          * XXX: Note that there is a slight race here if two threads
2441          * in the same privileged process attempt to attach to two
2442          * different jails at the same time.  It is important for
2443          * user processes not to do this, or they might end up with
2444          * a process root from one prison, but attached to the jail
2445          * of another.
2446          */
2447         pr->pr_ref++;
2448         pr->pr_uref++;
2449         mtx_unlock(&pr->pr_mtx);
2450
2451         /* Let modules do whatever they need to prepare for attaching. */
2452         error = osd_jail_call(pr, PR_METHOD_ATTACH, td);
2453         if (error) {
2454                 prison_deref(pr, PD_DEREF | PD_DEUREF | PD_LIST_SLOCKED);
2455                 return (error);
2456         }
2457         sx_sunlock(&allprison_lock);
2458
2459         /*
2460          * Reparent the newly attached process to this jail.
2461          */
2462         p = td->td_proc;
2463         error = cpuset_setproc_update_set(p, pr->pr_cpuset);
2464         if (error)
2465                 goto e_revert_osd;
2466
2467         vn_lock(pr->pr_root, LK_EXCLUSIVE | LK_RETRY);
2468         if ((error = change_dir(pr->pr_root, td)) != 0)
2469                 goto e_unlock;
2470 #ifdef MAC
2471         if ((error = mac_vnode_check_chroot(td->td_ucred, pr->pr_root)))
2472                 goto e_unlock;
2473 #endif
2474         VOP_UNLOCK(pr->pr_root);
2475         if ((error = pwd_chroot(td, pr->pr_root)))
2476                 goto e_revert_osd;
2477
2478         newcred = crget();
2479         PROC_LOCK(p);
2480         oldcred = crcopysafe(p, newcred);
2481         newcred->cr_prison = pr;
2482         proc_set_cred(p, newcred);
2483         setsugid(p);
2484 #ifdef RACCT
2485         racct_proc_ucred_changed(p, oldcred, newcred);
2486         crhold(newcred);
2487 #endif
2488         PROC_UNLOCK(p);
2489 #ifdef RCTL
2490         rctl_proc_ucred_changed(p, newcred);
2491         crfree(newcred);
2492 #endif
2493         prison_deref(oldcred->cr_prison, PD_DEREF | PD_DEUREF);
2494         crfree(oldcred);
2495         return (0);
2496
2497  e_unlock:
2498         VOP_UNLOCK(pr->pr_root);
2499  e_revert_osd:
2500         /* Tell modules this thread is still in its old jail after all. */
2501         sx_slock(&allprison_lock);
2502         (void)osd_jail_call(td->td_ucred->cr_prison, PR_METHOD_ATTACH, td);
2503         prison_deref(pr, PD_DEREF | PD_DEUREF | PD_LIST_SLOCKED);
2504         return (error);
2505 }
2506
2507 /*
2508  * Returns a locked prison instance, or NULL on failure.
2509  */
2510 struct prison *
2511 prison_find(int prid)
2512 {
2513         struct prison *pr;
2514
2515         sx_assert(&allprison_lock, SX_LOCKED);
2516         TAILQ_FOREACH(pr, &allprison, pr_list) {
2517                 if (pr->pr_id == prid) {
2518                         mtx_lock(&pr->pr_mtx);
2519                         if (pr->pr_ref > 0)
2520                                 return (pr);
2521                         /*
2522                          * Any active prison with the same ID would have
2523                          * been inserted before a dead one.
2524                          */
2525                         mtx_unlock(&pr->pr_mtx);
2526                         break;
2527                 }
2528                 if (pr->pr_id > prid)
2529                         break;
2530         }
2531         return (NULL);
2532 }
2533
2534 /*
2535  * Find a prison that is a descendant of mypr.  Returns a locked prison or NULL.
2536  */
2537 struct prison *
2538 prison_find_child(struct prison *mypr, int prid)
2539 {
2540         struct prison *pr;
2541         int descend;
2542
2543         sx_assert(&allprison_lock, SX_LOCKED);
2544         FOREACH_PRISON_DESCENDANT(mypr, pr, descend) {
2545                 if (pr->pr_id == prid) {
2546                         mtx_lock(&pr->pr_mtx);
2547                         if (pr->pr_ref > 0)
2548                                 return (pr);
2549                         mtx_unlock(&pr->pr_mtx);
2550                 }
2551         }
2552         return (NULL);
2553 }
2554
2555 /*
2556  * Look for the name relative to mypr.  Returns a locked prison or NULL.
2557  */
2558 struct prison *
2559 prison_find_name(struct prison *mypr, const char *name)
2560 {
2561         struct prison *pr, *deadpr;
2562         size_t mylen;
2563         int descend;
2564
2565         sx_assert(&allprison_lock, SX_LOCKED);
2566         mylen = (mypr == &prison0) ? 0 : strlen(mypr->pr_name) + 1;
2567  again:
2568         deadpr = NULL;
2569         FOREACH_PRISON_DESCENDANT(mypr, pr, descend) {
2570                 if (!strcmp(pr->pr_name + mylen, name)) {
2571                         mtx_lock(&pr->pr_mtx);
2572                         if (pr->pr_ref > 0) {
2573                                 if (pr->pr_uref > 0)
2574                                         return (pr);
2575                                 deadpr = pr;
2576                         }
2577                         mtx_unlock(&pr->pr_mtx);
2578                 }
2579         }
2580         /* There was no valid prison - perhaps there was a dying one. */
2581         if (deadpr != NULL) {
2582                 mtx_lock(&deadpr->pr_mtx);
2583                 if (deadpr->pr_ref == 0) {
2584                         mtx_unlock(&deadpr->pr_mtx);
2585                         goto again;
2586                 }
2587         }
2588         return (deadpr);
2589 }
2590
2591 /*
2592  * See if a prison has the specific flag set.  The prison should be locked,
2593  * unless checking for flags that are only set at jail creation (such as
2594  * PR_IP4 and PR_IP6), or only the single bit is examined, without regard
2595  * to any other prison data.
2596  */
2597 int
2598 prison_flag(struct ucred *cred, unsigned flag)
2599 {
2600
2601         return (cred->cr_prison->pr_flags & flag);
2602 }
2603
2604 int
2605 prison_allow(struct ucred *cred, unsigned flag)
2606 {
2607
2608         return ((cred->cr_prison->pr_allow & flag) != 0);
2609 }
2610
2611 /*
2612  * Remove a prison reference.  If that was the last reference, remove the
2613  * prison itself - but not in this context in case there are locks held.
2614  */
2615 void
2616 prison_free_locked(struct prison *pr)
2617 {
2618         int ref;
2619
2620         mtx_assert(&pr->pr_mtx, MA_OWNED);
2621         ref = --pr->pr_ref;
2622         mtx_unlock(&pr->pr_mtx);
2623         if (ref == 0)
2624                 taskqueue_enqueue(taskqueue_thread, &pr->pr_task);
2625 }
2626
2627 void
2628 prison_free(struct prison *pr)
2629 {
2630
2631         mtx_lock(&pr->pr_mtx);
2632         prison_free_locked(pr);
2633 }
2634
2635 /*
2636  * Complete a call to either prison_free or prison_proc_free.
2637  */
2638 static void
2639 prison_complete(void *context, int pending)
2640 {
2641         struct prison *pr = context;
2642
2643         sx_xlock(&allprison_lock);
2644         mtx_lock(&pr->pr_mtx);
2645         prison_deref(pr, pr->pr_uref
2646             ? PD_DEREF | PD_DEUREF | PD_LOCKED | PD_LIST_XLOCKED
2647             : PD_LOCKED | PD_LIST_XLOCKED);
2648 }
2649
2650 /*
2651  * Remove a prison reference (usually).  This internal version assumes no
2652  * mutexes are held, except perhaps the prison itself.  If there are no more
2653  * references, release and delist the prison.  On completion, the prison lock
2654  * and the allprison lock are both unlocked.
2655  */
2656 static void
2657 prison_deref(struct prison *pr, int flags)
2658 {
2659         struct prison *ppr, *tpr;
2660         int ref, lasturef;
2661
2662         if (!(flags & PD_LOCKED))
2663                 mtx_lock(&pr->pr_mtx);
2664         for (;;) {
2665                 if (flags & PD_DEUREF) {
2666                         KASSERT(pr->pr_uref > 0,
2667                             ("prison_deref PD_DEUREF on a dead prison (jid=%d)",
2668                              pr->pr_id));
2669                         pr->pr_uref--;
2670                         lasturef = pr->pr_uref == 0;
2671                         if (lasturef)
2672                                 pr->pr_ref++;
2673                         KASSERT(prison0.pr_uref != 0, ("prison0 pr_uref=0"));
2674                 } else
2675                         lasturef = 0;
2676                 if (flags & PD_DEREF) {
2677                         KASSERT(pr->pr_ref > 0,
2678                             ("prison_deref PD_DEREF on a dead prison (jid=%d)",
2679                              pr->pr_id));
2680                         pr->pr_ref--;
2681                 }
2682                 ref = pr->pr_ref;
2683                 mtx_unlock(&pr->pr_mtx);
2684
2685                 /*
2686                  * Tell the modules if the last user reference was removed
2687                  * (even it sticks around in dying state).
2688                  */
2689                 if (lasturef) {
2690                         if (!(flags & (PD_LIST_SLOCKED | PD_LIST_XLOCKED))) {
2691                                 if (ref > 1) {
2692                                         sx_slock(&allprison_lock);
2693                                         flags |= PD_LIST_SLOCKED;
2694                                 } else {
2695                                         sx_xlock(&allprison_lock);
2696                                         flags |= PD_LIST_XLOCKED;
2697                                 }
2698                         }
2699                         (void)osd_jail_call(pr, PR_METHOD_REMOVE, NULL);
2700                         mtx_lock(&pr->pr_mtx);
2701                         ref = --pr->pr_ref;
2702                         mtx_unlock(&pr->pr_mtx);
2703                 }
2704
2705                 /* If the prison still has references, nothing else to do. */
2706                 if (ref > 0) {
2707                         if (flags & PD_LIST_SLOCKED)
2708                                 sx_sunlock(&allprison_lock);
2709                         else if (flags & PD_LIST_XLOCKED)
2710                                 sx_xunlock(&allprison_lock);
2711                         return;
2712                 }
2713
2714                 if (flags & PD_LIST_SLOCKED) {
2715                         if (!sx_try_upgrade(&allprison_lock)) {
2716                                 sx_sunlock(&allprison_lock);
2717                                 sx_xlock(&allprison_lock);
2718                         }
2719                 } else if (!(flags & PD_LIST_XLOCKED))
2720                         sx_xlock(&allprison_lock);
2721
2722                 TAILQ_REMOVE(&allprison, pr, pr_list);
2723                 LIST_REMOVE(pr, pr_sibling);
2724                 ppr = pr->pr_parent;
2725                 for (tpr = ppr; tpr != NULL; tpr = tpr->pr_parent)
2726                         tpr->pr_childcount--;
2727                 sx_xunlock(&allprison_lock);
2728
2729 #ifdef VIMAGE
2730                 if (pr->pr_vnet != ppr->pr_vnet)
2731                         vnet_destroy(pr->pr_vnet);
2732 #endif
2733                 if (pr->pr_root != NULL)
2734                         vrele(pr->pr_root);
2735                 mtx_destroy(&pr->pr_mtx);
2736 #ifdef INET
2737                 free(pr->pr_ip4, M_PRISON);
2738 #endif
2739 #ifdef INET6
2740                 free(pr->pr_ip6, M_PRISON);
2741 #endif
2742                 if (pr->pr_cpuset != NULL)
2743                         cpuset_rel(pr->pr_cpuset);
2744                 osd_jail_exit(pr);
2745 #ifdef RACCT
2746                 if (racct_enable)
2747                         prison_racct_detach(pr);
2748 #endif
2749                 free(pr, M_PRISON);
2750
2751                 /* Removing a prison frees a reference on its parent. */
2752                 pr = ppr;
2753                 mtx_lock(&pr->pr_mtx);
2754                 flags = PD_DEREF | PD_DEUREF;
2755         }
2756 }
2757
2758 void
2759 prison_hold_locked(struct prison *pr)
2760 {
2761
2762         mtx_assert(&pr->pr_mtx, MA_OWNED);
2763         KASSERT(pr->pr_ref > 0,
2764             ("Trying to hold dead prison %p (jid=%d).", pr, pr->pr_id));
2765         pr->pr_ref++;
2766 }
2767
2768 void
2769 prison_hold(struct prison *pr)
2770 {
2771
2772         mtx_lock(&pr->pr_mtx);
2773         prison_hold_locked(pr);
2774         mtx_unlock(&pr->pr_mtx);
2775 }
2776
2777 void
2778 prison_proc_hold(struct prison *pr)
2779 {
2780
2781         mtx_lock(&pr->pr_mtx);
2782         KASSERT(pr->pr_uref > 0,
2783             ("Cannot add a process to a non-alive prison (jid=%d)", pr->pr_id));
2784         pr->pr_uref++;
2785         mtx_unlock(&pr->pr_mtx);
2786 }
2787
2788 void
2789 prison_proc_free(struct prison *pr)
2790 {
2791
2792         mtx_lock(&pr->pr_mtx);
2793         KASSERT(pr->pr_uref > 0,
2794             ("Trying to kill a process in a dead prison (jid=%d)", pr->pr_id));
2795         if (pr->pr_uref > 1)
2796                 pr->pr_uref--;
2797         else {
2798                 /*
2799                  * Don't remove the last user reference in this context, which
2800                  * is expected to be a process that is not only locked, but
2801                  * also half dead.
2802                  */
2803                 pr->pr_ref++;
2804                 mtx_unlock(&pr->pr_mtx);
2805                 taskqueue_enqueue(taskqueue_thread, &pr->pr_task);
2806                 return;
2807         }
2808         mtx_unlock(&pr->pr_mtx);
2809 }
2810
2811 /*
2812  * Set or clear a permission bit in the pr_allow field, passing restrictions
2813  * (cleared permission) down to child jails.
2814  */
2815 void
2816 prison_set_allow(struct ucred *cred, unsigned flag, int enable)
2817 {
2818         struct prison *pr;
2819
2820         pr = cred->cr_prison;
2821         sx_slock(&allprison_lock);
2822         mtx_lock(&pr->pr_mtx);
2823         prison_set_allow_locked(pr, flag, enable);
2824         mtx_unlock(&pr->pr_mtx);
2825         sx_sunlock(&allprison_lock);
2826 }
2827
2828 static void
2829 prison_set_allow_locked(struct prison *pr, unsigned flag, int enable)
2830 {
2831         struct prison *cpr;
2832         int descend;
2833
2834         if (enable != 0)
2835                 pr->pr_allow |= flag;
2836         else {
2837                 pr->pr_allow &= ~flag;
2838                 FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend)
2839                         cpr->pr_allow &= ~flag;
2840         }
2841 }
2842
2843 /*
2844  * Check if a jail supports the given address family.
2845  *
2846  * Returns 0 if not jailed or the address family is supported, EAFNOSUPPORT
2847  * if not.
2848  */
2849 int
2850 prison_check_af(struct ucred *cred, int af)
2851 {
2852         struct prison *pr;
2853         int error;
2854
2855         KASSERT(cred != NULL, ("%s: cred is NULL", __func__));
2856
2857         pr = cred->cr_prison;
2858 #ifdef VIMAGE
2859         /* Prisons with their own network stack are not limited. */
2860         if (prison_owns_vnet(cred))
2861                 return (0);
2862 #endif
2863
2864         error = 0;
2865         switch (af)
2866         {
2867 #ifdef INET
2868         case AF_INET:
2869                 if (pr->pr_flags & PR_IP4)
2870                 {
2871                         mtx_lock(&pr->pr_mtx);
2872                         if ((pr->pr_flags & PR_IP4) && pr->pr_ip4 == NULL)
2873                                 error = EAFNOSUPPORT;
2874                         mtx_unlock(&pr->pr_mtx);
2875                 }
2876                 break;
2877 #endif
2878 #ifdef INET6
2879         case AF_INET6:
2880                 if (pr->pr_flags & PR_IP6)
2881                 {
2882                         mtx_lock(&pr->pr_mtx);
2883                         if ((pr->pr_flags & PR_IP6) && pr->pr_ip6 == NULL)
2884                                 error = EAFNOSUPPORT;
2885                         mtx_unlock(&pr->pr_mtx);
2886                 }
2887                 break;
2888 #endif
2889         case AF_LOCAL:
2890         case AF_ROUTE:
2891                 break;
2892         default:
2893                 if (!(pr->pr_allow & PR_ALLOW_SOCKET_AF))
2894                         error = EAFNOSUPPORT;
2895         }
2896         return (error);
2897 }
2898
2899 /*
2900  * Check if given address belongs to the jail referenced by cred (wrapper to
2901  * prison_check_ip[46]).
2902  *
2903  * Returns 0 if jail doesn't restrict the address family or if address belongs
2904  * to jail, EADDRNOTAVAIL if the address doesn't belong, or EAFNOSUPPORT if
2905  * the jail doesn't allow the address family.  IPv4 Address passed in in NBO.
2906  */
2907 int
2908 prison_if(struct ucred *cred, const struct sockaddr *sa)
2909 {
2910 #ifdef INET
2911         const struct sockaddr_in *sai;
2912 #endif
2913 #ifdef INET6
2914         const struct sockaddr_in6 *sai6;
2915 #endif
2916         int error;
2917
2918         KASSERT(cred != NULL, ("%s: cred is NULL", __func__));
2919         KASSERT(sa != NULL, ("%s: sa is NULL", __func__));
2920
2921 #ifdef VIMAGE
2922         if (prison_owns_vnet(cred))
2923                 return (0);
2924 #endif
2925
2926         error = 0;
2927         switch (sa->sa_family)
2928         {
2929 #ifdef INET
2930         case AF_INET:
2931                 sai = (const struct sockaddr_in *)sa;
2932                 error = prison_check_ip4(cred, &sai->sin_addr);
2933                 break;
2934 #endif
2935 #ifdef INET6
2936         case AF_INET6:
2937                 sai6 = (const struct sockaddr_in6 *)sa;
2938                 error = prison_check_ip6(cred, &sai6->sin6_addr);
2939                 break;
2940 #endif
2941         default:
2942                 if (!(cred->cr_prison->pr_allow & PR_ALLOW_SOCKET_AF))
2943                         error = EAFNOSUPPORT;
2944         }
2945         return (error);
2946 }
2947
2948 /*
2949  * Return 0 if jails permit p1 to frob p2, otherwise ESRCH.
2950  */
2951 int
2952 prison_check(struct ucred *cred1, struct ucred *cred2)
2953 {
2954
2955         return ((cred1->cr_prison == cred2->cr_prison ||
2956             prison_ischild(cred1->cr_prison, cred2->cr_prison)) ? 0 : ESRCH);
2957 }
2958
2959 /*
2960  * Return 1 if p2 is a child of p1, otherwise 0.
2961  */
2962 int
2963 prison_ischild(struct prison *pr1, struct prison *pr2)
2964 {
2965
2966         for (pr2 = pr2->pr_parent; pr2 != NULL; pr2 = pr2->pr_parent)
2967                 if (pr1 == pr2)
2968                         return (1);
2969         return (0);
2970 }
2971
2972 /*
2973  * Return 1 if the passed credential is in a jail and that jail does not
2974  * have its own virtual network stack, otherwise 0.
2975  */
2976 int
2977 jailed_without_vnet(struct ucred *cred)
2978 {
2979
2980         if (!jailed(cred))
2981                 return (0);
2982 #ifdef VIMAGE
2983         if (prison_owns_vnet(cred))
2984                 return (0);
2985 #endif
2986
2987         return (1);
2988 }
2989
2990 /*
2991  * Return the correct hostname (domainname, et al) for the passed credential.
2992  */
2993 void
2994 getcredhostname(struct ucred *cred, char *buf, size_t size)
2995 {
2996         struct prison *pr;
2997
2998         /*
2999          * A NULL credential can be used to shortcut to the physical
3000          * system's hostname.
3001          */
3002         pr = (cred != NULL) ? cred->cr_prison : &prison0;
3003         mtx_lock(&pr->pr_mtx);
3004         strlcpy(buf, pr->pr_hostname, size);
3005         mtx_unlock(&pr->pr_mtx);
3006 }
3007
3008 void
3009 getcreddomainname(struct ucred *cred, char *buf, size_t size)
3010 {
3011
3012         mtx_lock(&cred->cr_prison->pr_mtx);
3013         strlcpy(buf, cred->cr_prison->pr_domainname, size);
3014         mtx_unlock(&cred->cr_prison->pr_mtx);
3015 }
3016
3017 void
3018 getcredhostuuid(struct ucred *cred, char *buf, size_t size)
3019 {
3020
3021         mtx_lock(&cred->cr_prison->pr_mtx);
3022         strlcpy(buf, cred->cr_prison->pr_hostuuid, size);
3023         mtx_unlock(&cred->cr_prison->pr_mtx);
3024 }
3025
3026 void
3027 getcredhostid(struct ucred *cred, unsigned long *hostid)
3028 {
3029
3030         mtx_lock(&cred->cr_prison->pr_mtx);
3031         *hostid = cred->cr_prison->pr_hostid;
3032         mtx_unlock(&cred->cr_prison->pr_mtx);
3033 }
3034
3035 void
3036 getjailname(struct ucred *cred, char *name, size_t len)
3037 {
3038
3039         mtx_lock(&cred->cr_prison->pr_mtx);
3040         strlcpy(name, cred->cr_prison->pr_name, len);
3041         mtx_unlock(&cred->cr_prison->pr_mtx);
3042 }
3043
3044 #ifdef VIMAGE
3045 /*
3046  * Determine whether the prison represented by cred owns
3047  * its vnet rather than having it inherited.
3048  *
3049  * Returns 1 in case the prison owns the vnet, 0 otherwise.
3050  */
3051 int
3052 prison_owns_vnet(struct ucred *cred)
3053 {
3054
3055         /*
3056          * vnets cannot be added/removed after jail creation,
3057          * so no need to lock here.
3058          */
3059         return (cred->cr_prison->pr_flags & PR_VNET ? 1 : 0);
3060 }
3061 #endif
3062
3063 /*
3064  * Determine whether the subject represented by cred can "see"
3065  * status of a mount point.
3066  * Returns: 0 for permitted, ENOENT otherwise.
3067  * XXX: This function should be called cr_canseemount() and should be
3068  *      placed in kern_prot.c.
3069  */
3070 int
3071 prison_canseemount(struct ucred *cred, struct mount *mp)
3072 {
3073         struct prison *pr;
3074         struct statfs *sp;
3075         size_t len;
3076
3077         pr = cred->cr_prison;
3078         if (pr->pr_enforce_statfs == 0)
3079                 return (0);
3080         if (pr->pr_root->v_mount == mp)
3081                 return (0);
3082         if (pr->pr_enforce_statfs == 2)
3083                 return (ENOENT);
3084         /*
3085          * If jail's chroot directory is set to "/" we should be able to see
3086          * all mount-points from inside a jail.
3087          * This is ugly check, but this is the only situation when jail's
3088          * directory ends with '/'.
3089          */
3090         if (strcmp(pr->pr_path, "/") == 0)
3091                 return (0);
3092         len = strlen(pr->pr_path);
3093         sp = &mp->mnt_stat;
3094         if (strncmp(pr->pr_path, sp->f_mntonname, len) != 0)
3095                 return (ENOENT);
3096         /*
3097          * Be sure that we don't have situation where jail's root directory
3098          * is "/some/path" and mount point is "/some/pathpath".
3099          */
3100         if (sp->f_mntonname[len] != '\0' && sp->f_mntonname[len] != '/')
3101                 return (ENOENT);
3102         return (0);
3103 }
3104
3105 void
3106 prison_enforce_statfs(struct ucred *cred, struct mount *mp, struct statfs *sp)
3107 {
3108         char jpath[MAXPATHLEN];
3109         struct prison *pr;
3110         size_t len;
3111
3112         pr = cred->cr_prison;
3113         if (pr->pr_enforce_statfs == 0)
3114                 return;
3115         if (prison_canseemount(cred, mp) != 0) {
3116                 bzero(sp->f_mntonname, sizeof(sp->f_mntonname));
3117                 strlcpy(sp->f_mntonname, "[restricted]",
3118                     sizeof(sp->f_mntonname));
3119                 return;
3120         }
3121         if (pr->pr_root->v_mount == mp) {
3122                 /*
3123                  * Clear current buffer data, so we are sure nothing from
3124                  * the valid path left there.
3125                  */
3126                 bzero(sp->f_mntonname, sizeof(sp->f_mntonname));
3127                 *sp->f_mntonname = '/';
3128                 return;
3129         }
3130         /*
3131          * If jail's chroot directory is set to "/" we should be able to see
3132          * all mount-points from inside a jail.
3133          */
3134         if (strcmp(pr->pr_path, "/") == 0)
3135                 return;
3136         len = strlen(pr->pr_path);
3137         strlcpy(jpath, sp->f_mntonname + len, sizeof(jpath));
3138         /*
3139          * Clear current buffer data, so we are sure nothing from
3140          * the valid path left there.
3141          */
3142         bzero(sp->f_mntonname, sizeof(sp->f_mntonname));
3143         if (*jpath == '\0') {
3144                 /* Should never happen. */
3145                 *sp->f_mntonname = '/';
3146         } else {
3147                 strlcpy(sp->f_mntonname, jpath, sizeof(sp->f_mntonname));
3148         }
3149 }
3150
3151 /*
3152  * Check with permission for a specific privilege is granted within jail.  We
3153  * have a specific list of accepted privileges; the rest are denied.
3154  */
3155 int
3156 prison_priv_check(struct ucred *cred, int priv)
3157 {
3158         struct prison *pr;
3159         int error;
3160
3161         /*
3162          * Some policies have custom handlers. This routine should not be
3163          * called for them. See priv_check_cred().
3164          */
3165         switch (priv) {
3166         case PRIV_VFS_LOOKUP:
3167         case PRIV_VFS_GENERATION:
3168                 KASSERT(0, ("prison_priv_check instead of a custom handler "
3169                     "called for %d\n", priv));
3170         }
3171
3172         if (!jailed(cred))
3173                 return (0);
3174
3175 #ifdef VIMAGE
3176         /*
3177          * Privileges specific to prisons with a virtual network stack.
3178          * There might be a duplicate entry here in case the privilege
3179          * is only granted conditionally in the legacy jail case.
3180          */
3181         switch (priv) {
3182 #ifdef notyet
3183                 /*
3184                  * NFS-specific privileges.
3185                  */
3186         case PRIV_NFS_DAEMON:
3187         case PRIV_NFS_LOCKD:
3188 #endif
3189                 /*
3190                  * Network stack privileges.
3191                  */
3192         case PRIV_NET_BRIDGE:
3193         case PRIV_NET_GRE:
3194         case PRIV_NET_BPF:
3195         case PRIV_NET_RAW:              /* Dup, cond. in legacy jail case. */
3196         case PRIV_NET_ROUTE:
3197         case PRIV_NET_TAP:
3198         case PRIV_NET_SETIFMTU:
3199         case PRIV_NET_SETIFFLAGS:
3200         case PRIV_NET_SETIFCAP:
3201         case PRIV_NET_SETIFDESCR:
3202         case PRIV_NET_SETIFNAME :
3203         case PRIV_NET_SETIFMETRIC:
3204         case PRIV_NET_SETIFPHYS:
3205         case PRIV_NET_SETIFMAC:
3206         case PRIV_NET_SETLANPCP:
3207         case PRIV_NET_ADDMULTI:
3208         case PRIV_NET_DELMULTI:
3209         case PRIV_NET_HWIOCTL:
3210         case PRIV_NET_SETLLADDR:
3211         case PRIV_NET_ADDIFGROUP:
3212         case PRIV_NET_DELIFGROUP:
3213         case PRIV_NET_IFCREATE:
3214         case PRIV_NET_IFDESTROY:
3215         case PRIV_NET_ADDIFADDR:
3216         case PRIV_NET_DELIFADDR:
3217         case PRIV_NET_LAGG:
3218         case PRIV_NET_GIF:
3219         case PRIV_NET_SETIFVNET:
3220         case PRIV_NET_SETIFFIB:
3221
3222                 /*
3223                  * 802.11-related privileges.
3224                  */
3225         case PRIV_NET80211_VAP_GETKEY:
3226         case PRIV_NET80211_VAP_MANAGE:
3227
3228 #ifdef notyet
3229                 /*
3230                  * ATM privileges.
3231                  */
3232         case PRIV_NETATM_CFG:
3233         case PRIV_NETATM_ADD:
3234         case PRIV_NETATM_DEL:
3235         case PRIV_NETATM_SET:
3236
3237                 /*
3238                  * Bluetooth privileges.
3239                  */
3240         case PRIV_NETBLUETOOTH_RAW:
3241 #endif
3242
3243                 /*
3244                  * Netgraph and netgraph module privileges.
3245                  */
3246         case PRIV_NETGRAPH_CONTROL:
3247 #ifdef notyet
3248         case PRIV_NETGRAPH_TTY:
3249 #endif
3250
3251                 /*
3252                  * IPv4 and IPv6 privileges.
3253                  */
3254         case PRIV_NETINET_IPFW:
3255         case PRIV_NETINET_DIVERT:
3256         case PRIV_NETINET_PF:
3257         case PRIV_NETINET_DUMMYNET:
3258         case PRIV_NETINET_CARP:
3259         case PRIV_NETINET_MROUTE:
3260         case PRIV_NETINET_RAW:
3261         case PRIV_NETINET_ADDRCTRL6:
3262         case PRIV_NETINET_ND6:
3263         case PRIV_NETINET_SCOPE6:
3264         case PRIV_NETINET_ALIFETIME6:
3265         case PRIV_NETINET_IPSEC:
3266         case PRIV_NETINET_BINDANY:
3267
3268 #ifdef notyet
3269                 /*
3270                  * NCP privileges.
3271                  */
3272         case PRIV_NETNCP:
3273
3274                 /*
3275                  * SMB privileges.
3276                  */
3277         case PRIV_NETSMB:
3278 #endif
3279
3280         /*
3281          * No default: or deny here.
3282          * In case of no permit fall through to next switch().
3283          */
3284                 if (cred->cr_prison->pr_flags & PR_VNET)
3285                         return (0);
3286         }
3287 #endif /* VIMAGE */
3288
3289         switch (priv) {
3290                 /*
3291                  * Allow ktrace privileges for root in jail.
3292                  */
3293         case PRIV_KTRACE:
3294
3295 #if 0
3296                 /*
3297                  * Allow jailed processes to configure audit identity and
3298                  * submit audit records (login, etc).  In the future we may
3299                  * want to further refine the relationship between audit and
3300                  * jail.
3301                  */
3302         case PRIV_AUDIT_GETAUDIT:
3303         case PRIV_AUDIT_SETAUDIT:
3304         case PRIV_AUDIT_SUBMIT:
3305 #endif
3306
3307                 /*
3308                  * Allow jailed processes to manipulate process UNIX
3309                  * credentials in any way they see fit.
3310                  */
3311         case PRIV_CRED_SETUID:
3312         case PRIV_CRED_SETEUID:
3313         case PRIV_CRED_SETGID:
3314         case PRIV_CRED_SETEGID:
3315         case PRIV_CRED_SETGROUPS:
3316         case PRIV_CRED_SETREUID:
3317         case PRIV_CRED_SETREGID:
3318         case PRIV_CRED_SETRESUID:
3319         case PRIV_CRED_SETRESGID:
3320
3321                 /*
3322                  * Jail implements visibility constraints already, so allow
3323                  * jailed root to override uid/gid-based constraints.
3324                  */
3325         case PRIV_SEEOTHERGIDS:
3326         case PRIV_SEEOTHERUIDS:
3327
3328                 /*
3329                  * Jail implements inter-process debugging limits already, so
3330                  * allow jailed root various debugging privileges.
3331                  */
3332         case PRIV_DEBUG_DIFFCRED:
3333         case PRIV_DEBUG_SUGID:
3334         case PRIV_DEBUG_UNPRIV:
3335
3336                 /*
3337                  * Allow jail to set various resource limits and login
3338                  * properties, and for now, exceed process resource limits.
3339                  */
3340         case PRIV_PROC_LIMIT:
3341         case PRIV_PROC_SETLOGIN:
3342         case PRIV_PROC_SETRLIMIT:
3343
3344                 /*
3345                  * System V and POSIX IPC privileges are granted in jail.
3346                  */
3347         case PRIV_IPC_READ:
3348         case PRIV_IPC_WRITE:
3349         case PRIV_IPC_ADMIN:
3350         case PRIV_IPC_MSGSIZE:
3351         case PRIV_MQ_ADMIN:
3352
3353                 /*
3354                  * Jail operations within a jail work on child jails.
3355                  */
3356         case PRIV_JAIL_ATTACH:
3357         case PRIV_JAIL_SET:
3358         case PRIV_JAIL_REMOVE:
3359
3360                 /*
3361                  * Jail implements its own inter-process limits, so allow
3362                  * root processes in jail to change scheduling on other
3363                  * processes in the same jail.  Likewise for signalling.
3364                  */
3365         case PRIV_SCHED_DIFFCRED:
3366         case PRIV_SCHED_CPUSET:
3367         case PRIV_SIGNAL_DIFFCRED:
3368         case PRIV_SIGNAL_SUGID:
3369
3370                 /*
3371                  * Allow jailed processes to write to sysctls marked as jail
3372                  * writable.
3373                  */
3374         case PRIV_SYSCTL_WRITEJAIL:
3375
3376                 /*
3377                  * Allow root in jail to manage a variety of quota
3378                  * properties.  These should likely be conditional on a
3379                  * configuration option.
3380                  */
3381         case PRIV_VFS_GETQUOTA:
3382         case PRIV_VFS_SETQUOTA:
3383
3384                 /*
3385                  * Since Jail relies on chroot() to implement file system
3386                  * protections, grant many VFS privileges to root in jail.
3387                  * Be careful to exclude mount-related and NFS-related
3388                  * privileges.
3389                  */
3390         case PRIV_VFS_READ:
3391         case PRIV_VFS_WRITE:
3392         case PRIV_VFS_ADMIN:
3393         case PRIV_VFS_EXEC:
3394         case PRIV_VFS_BLOCKRESERVE:     /* XXXRW: Slightly surprising. */
3395         case PRIV_VFS_CHFLAGS_DEV:
3396         case PRIV_VFS_CHOWN:
3397         case PRIV_VFS_CHROOT:
3398         case PRIV_VFS_RETAINSUGID:
3399         case PRIV_VFS_FCHROOT:
3400         case PRIV_VFS_LINK:
3401         case PRIV_VFS_SETGID:
3402         case PRIV_VFS_STAT:
3403         case PRIV_VFS_STICKYFILE:
3404
3405                 /*
3406                  * As in the non-jail case, non-root users are expected to be
3407                  * able to read kernel/phyiscal memory (provided /dev/[k]mem
3408                  * exists in the jail and they have permission to access it).
3409                  */
3410         case PRIV_KMEM_READ:
3411                 return (0);
3412
3413                 /*
3414                  * Depending on the global setting, allow privilege of
3415                  * setting system flags.
3416                  */
3417         case PRIV_VFS_SYSFLAGS:
3418                 if (cred->cr_prison->pr_allow & PR_ALLOW_CHFLAGS)
3419                         return (0);
3420                 else
3421                         return (EPERM);
3422
3423                 /*
3424                  * Depending on the global setting, allow privilege of
3425                  * mounting/unmounting file systems.
3426                  */
3427         case PRIV_VFS_MOUNT:
3428         case PRIV_VFS_UNMOUNT:
3429         case PRIV_VFS_MOUNT_NONUSER:
3430         case PRIV_VFS_MOUNT_OWNER:
3431                 pr = cred->cr_prison;
3432                 prison_lock(pr);
3433                 if (pr->pr_allow & PR_ALLOW_MOUNT && pr->pr_enforce_statfs < 2)
3434                         error = 0;
3435                 else
3436                         error = EPERM;
3437                 prison_unlock(pr);
3438                 return (error);
3439
3440                 /*
3441                  * Jails should hold no disposition on the PRIV_VFS_READ_DIR
3442                  * policy.  priv_check_cred will not specifically allow it, and
3443                  * we may want a MAC policy to allow it.
3444                  */
3445         case PRIV_VFS_READ_DIR:
3446                 return (0);
3447
3448                 /*
3449                  * Conditionnaly allow locking (unlocking) physical pages
3450                  * in memory.
3451                  */
3452         case PRIV_VM_MLOCK:
3453         case PRIV_VM_MUNLOCK:
3454                 if (cred->cr_prison->pr_allow & PR_ALLOW_MLOCK)
3455                         return (0);
3456                 else
3457                         return (EPERM);
3458
3459                 /*
3460                  * Conditionally allow jailed root to bind reserved ports.
3461                  */
3462         case PRIV_NETINET_RESERVEDPORT:
3463                 if (cred->cr_prison->pr_allow & PR_ALLOW_RESERVED_PORTS)
3464                         return (0);
3465                 else
3466                         return (EPERM);
3467
3468                 /*
3469                  * Allow jailed root to reuse in-use ports.
3470                  */
3471         case PRIV_NETINET_REUSEPORT:
3472                 return (0);
3473
3474                 /*
3475                  * Allow jailed root to set certain IPv4/6 (option) headers.
3476                  */
3477         case PRIV_NETINET_SETHDROPTS:
3478                 return (0);
3479
3480                 /*
3481                  * Conditionally allow creating raw sockets in jail.
3482                  */
3483         case PRIV_NETINET_RAW:
3484                 if (cred->cr_prison->pr_allow & PR_ALLOW_RAW_SOCKETS)
3485                         return (0);
3486                 else
3487                         return (EPERM);
3488
3489                 /*
3490                  * Since jail implements its own visibility limits on netstat
3491                  * sysctls, allow getcred.  This allows identd to work in
3492                  * jail.
3493                  */
3494         case PRIV_NETINET_GETCRED:
3495                 return (0);
3496
3497                 /*
3498                  * Allow jailed root to set loginclass.
3499                  */
3500         case PRIV_PROC_SETLOGINCLASS:
3501                 return (0);
3502
3503                 /*
3504                  * Do not allow a process inside a jail to read the kernel
3505                  * message buffer unless explicitly permitted.
3506                  */
3507         case PRIV_MSGBUF:
3508                 if (cred->cr_prison->pr_allow & PR_ALLOW_READ_MSGBUF)
3509                         return (0);
3510                 return (EPERM);
3511
3512         default:
3513                 /*
3514                  * In all remaining cases, deny the privilege request.  This
3515                  * includes almost all network privileges, many system
3516                  * configuration privileges.
3517                  */
3518                 return (EPERM);
3519         }
3520 }
3521
3522 /*
3523  * Return the part of pr2's name that is relative to pr1, or the whole name
3524  * if it does not directly follow.
3525  */
3526
3527 char *
3528 prison_name(struct prison *pr1, struct prison *pr2)
3529 {
3530         char *name;
3531
3532         /* Jails see themselves as "0" (if they see themselves at all). */
3533         if (pr1 == pr2)
3534                 return "0";
3535         name = pr2->pr_name;
3536         if (prison_ischild(pr1, pr2)) {
3537                 /*
3538                  * pr1 isn't locked (and allprison_lock may not be either)
3539                  * so its length can't be counted on.  But the number of dots
3540                  * can be counted on - and counted.
3541                  */
3542                 for (; pr1 != &prison0; pr1 = pr1->pr_parent)
3543                         name = strchr(name, '.') + 1;
3544         }
3545         return (name);
3546 }
3547
3548 /*
3549  * Return the part of pr2's path that is relative to pr1, or the whole path
3550  * if it does not directly follow.
3551  */
3552 static char *
3553 prison_path(struct prison *pr1, struct prison *pr2)
3554 {
3555         char *path1, *path2;
3556         int len1;
3557
3558         path1 = pr1->pr_path;
3559         path2 = pr2->pr_path;
3560         if (!strcmp(path1, "/"))
3561                 return (path2);
3562         len1 = strlen(path1);
3563         if (strncmp(path1, path2, len1))
3564                 return (path2);
3565         if (path2[len1] == '\0')
3566                 return "/";
3567         if (path2[len1] == '/')
3568                 return (path2 + len1);
3569         return (path2);
3570 }
3571
3572 /*
3573  * Jail-related sysctls.
3574  */
3575 static SYSCTL_NODE(_security, OID_AUTO, jail, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
3576     "Jails");
3577
3578 static int
3579 sysctl_jail_list(SYSCTL_HANDLER_ARGS)
3580 {
3581         struct xprison *xp;
3582         struct prison *pr, *cpr;
3583 #ifdef INET
3584         struct in_addr *ip4 = NULL;
3585         int ip4s = 0;
3586 #endif
3587 #ifdef INET6
3588         struct in6_addr *ip6 = NULL;
3589         int ip6s = 0;
3590 #endif
3591         int descend, error;
3592
3593         xp = malloc(sizeof(*xp), M_TEMP, M_WAITOK);
3594         pr = req->td->td_ucred->cr_prison;
3595         error = 0;
3596         sx_slock(&allprison_lock);
3597         FOREACH_PRISON_DESCENDANT(pr, cpr, descend) {
3598 #if defined(INET) || defined(INET6)
3599  again:
3600 #endif
3601                 mtx_lock(&cpr->pr_mtx);
3602 #ifdef INET
3603                 if (cpr->pr_ip4s > 0) {
3604                         if (ip4s < cpr->pr_ip4s) {
3605                                 ip4s = cpr->pr_ip4s;
3606                                 mtx_unlock(&cpr->pr_mtx);
3607                                 ip4 = realloc(ip4, ip4s *
3608                                     sizeof(struct in_addr), M_TEMP, M_WAITOK);
3609                                 goto again;
3610                         }
3611                         bcopy(cpr->pr_ip4, ip4,
3612                             cpr->pr_ip4s * sizeof(struct in_addr));
3613                 }
3614 #endif
3615 #ifdef INET6
3616                 if (cpr->pr_ip6s > 0) {
3617                         if (ip6s < cpr->pr_ip6s) {
3618                                 ip6s = cpr->pr_ip6s;
3619                                 mtx_unlock(&cpr->pr_mtx);
3620                                 ip6 = realloc(ip6, ip6s *
3621                                     sizeof(struct in6_addr), M_TEMP, M_WAITOK);
3622                                 goto again;
3623                         }
3624                         bcopy(cpr->pr_ip6, ip6,
3625                             cpr->pr_ip6s * sizeof(struct in6_addr));
3626                 }
3627 #endif
3628                 if (cpr->pr_ref == 0) {
3629                         mtx_unlock(&cpr->pr_mtx);
3630                         continue;
3631                 }
3632                 bzero(xp, sizeof(*xp));
3633                 xp->pr_version = XPRISON_VERSION;
3634                 xp->pr_id = cpr->pr_id;
3635                 xp->pr_state = cpr->pr_uref > 0
3636                     ? PRISON_STATE_ALIVE : PRISON_STATE_DYING;
3637                 strlcpy(xp->pr_path, prison_path(pr, cpr), sizeof(xp->pr_path));
3638                 strlcpy(xp->pr_host, cpr->pr_hostname, sizeof(xp->pr_host));
3639                 strlcpy(xp->pr_name, prison_name(pr, cpr), sizeof(xp->pr_name));
3640 #ifdef INET
3641                 xp->pr_ip4s = cpr->pr_ip4s;
3642 #endif
3643 #ifdef INET6
3644                 xp->pr_ip6s = cpr->pr_ip6s;
3645 #endif
3646                 mtx_unlock(&cpr->pr_mtx);
3647                 error = SYSCTL_OUT(req, xp, sizeof(*xp));
3648                 if (error)
3649                         break;
3650 #ifdef INET
3651                 if (xp->pr_ip4s > 0) {
3652                         error = SYSCTL_OUT(req, ip4,
3653                             xp->pr_ip4s * sizeof(struct in_addr));
3654                         if (error)
3655                                 break;
3656                 }
3657 #endif
3658 #ifdef INET6
3659                 if (xp->pr_ip6s > 0) {
3660                         error = SYSCTL_OUT(req, ip6,
3661                             xp->pr_ip6s * sizeof(struct in6_addr));
3662                         if (error)
3663                                 break;
3664                 }
3665 #endif
3666         }
3667         sx_sunlock(&allprison_lock);
3668         free(xp, M_TEMP);
3669 #ifdef INET
3670         free(ip4, M_TEMP);
3671 #endif
3672 #ifdef INET6
3673         free(ip6, M_TEMP);
3674 #endif
3675         return (error);
3676 }
3677
3678 SYSCTL_OID(_security_jail, OID_AUTO, list,
3679     CTLTYPE_STRUCT | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0,
3680     sysctl_jail_list, "S", "List of active jails");
3681
3682 static int
3683 sysctl_jail_jailed(SYSCTL_HANDLER_ARGS)
3684 {
3685         int error, injail;
3686
3687         injail = jailed(req->td->td_ucred);
3688         error = SYSCTL_OUT(req, &injail, sizeof(injail));
3689
3690         return (error);
3691 }
3692
3693 SYSCTL_PROC(_security_jail, OID_AUTO, jailed,
3694     CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0,
3695     sysctl_jail_jailed, "I", "Process in jail?");
3696
3697 static int
3698 sysctl_jail_vnet(SYSCTL_HANDLER_ARGS)
3699 {
3700         int error, havevnet;
3701 #ifdef VIMAGE
3702         struct ucred *cred = req->td->td_ucred;
3703
3704         havevnet = jailed(cred) && prison_owns_vnet(cred);
3705 #else
3706         havevnet = 0;
3707 #endif
3708         error = SYSCTL_OUT(req, &havevnet, sizeof(havevnet));
3709
3710         return (error);
3711 }
3712
3713 SYSCTL_PROC(_security_jail, OID_AUTO, vnet,
3714     CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0,
3715     sysctl_jail_vnet, "I", "Jail owns vnet?");
3716
3717 #if defined(INET) || defined(INET6)
3718 SYSCTL_UINT(_security_jail, OID_AUTO, jail_max_af_ips, CTLFLAG_RW,
3719     &jail_max_af_ips, 0,
3720     "Number of IP addresses a jail may have at most per address family (deprecated)");
3721 #endif
3722
3723 /*
3724  * Default parameters for jail(2) compatibility.  For historical reasons,
3725  * the sysctl names have varying similarity to the parameter names.  Prisons
3726  * just see their own parameters, and can't change them.
3727  */
3728 static int
3729 sysctl_jail_default_allow(SYSCTL_HANDLER_ARGS)
3730 {
3731         int error, i;
3732
3733         /* Get the current flag value, and convert it to a boolean. */
3734         if (req->td->td_ucred->cr_prison == &prison0) {
3735                 mtx_lock(&prison0.pr_mtx);
3736                 i = (jail_default_allow & arg2) != 0;
3737                 mtx_unlock(&prison0.pr_mtx);
3738         } else
3739                 i = prison_allow(req->td->td_ucred, arg2);
3740
3741         if (arg1 != NULL)
3742                 i = !i;
3743         error = sysctl_handle_int(oidp, &i, 0, req);
3744         if (error || !req->newptr)
3745                 return (error);
3746         i = i ? arg2 : 0;
3747         if (arg1 != NULL)
3748                 i ^= arg2;
3749         /*
3750          * The sysctls don't have CTLFLAGS_PRISON, so assume prison0
3751          * for writing.
3752          */
3753         mtx_lock(&prison0.pr_mtx);
3754         jail_default_allow = (jail_default_allow & ~arg2) | i;
3755         mtx_unlock(&prison0.pr_mtx);
3756         return (0);
3757 }
3758
3759 SYSCTL_PROC(_security_jail, OID_AUTO, set_hostname_allowed,
3760     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3761     NULL, PR_ALLOW_SET_HOSTNAME, sysctl_jail_default_allow, "I",
3762     "Processes in jail can set their hostnames (deprecated)");
3763 SYSCTL_PROC(_security_jail, OID_AUTO, socket_unixiproute_only,
3764     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3765     (void *)1, PR_ALLOW_SOCKET_AF, sysctl_jail_default_allow, "I",
3766     "Processes in jail are limited to creating UNIX/IP/route sockets only (deprecated)");
3767 SYSCTL_PROC(_security_jail, OID_AUTO, sysvipc_allowed,
3768     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3769     NULL, PR_ALLOW_SYSVIPC, sysctl_jail_default_allow, "I",
3770     "Processes in jail can use System V IPC primitives (deprecated)");
3771 SYSCTL_PROC(_security_jail, OID_AUTO, allow_raw_sockets,
3772     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3773     NULL, PR_ALLOW_RAW_SOCKETS, sysctl_jail_default_allow, "I",
3774     "Prison root can create raw sockets (deprecated)");
3775 SYSCTL_PROC(_security_jail, OID_AUTO, chflags_allowed,
3776     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3777     NULL, PR_ALLOW_CHFLAGS, sysctl_jail_default_allow, "I",
3778     "Processes in jail can alter system file flags (deprecated)");
3779 SYSCTL_PROC(_security_jail, OID_AUTO, mount_allowed,
3780     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3781     NULL, PR_ALLOW_MOUNT, sysctl_jail_default_allow, "I",
3782     "Processes in jail can mount/unmount jail-friendly file systems (deprecated)");
3783
3784 static int
3785 sysctl_jail_default_level(SYSCTL_HANDLER_ARGS)
3786 {
3787         struct prison *pr;
3788         int level, error;
3789
3790         pr = req->td->td_ucred->cr_prison;
3791         level = (pr == &prison0) ? *(int *)arg1 : *(int *)((char *)pr + arg2);
3792         error = sysctl_handle_int(oidp, &level, 0, req);
3793         if (error || !req->newptr)
3794                 return (error);
3795         *(int *)arg1 = level;
3796         return (0);
3797 }
3798
3799 SYSCTL_PROC(_security_jail, OID_AUTO, enforce_statfs,
3800     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
3801     &jail_default_enforce_statfs, offsetof(struct prison, pr_enforce_statfs),
3802     sysctl_jail_default_level, "I",
3803     "Processes in jail cannot see all mounted file systems (deprecated)");
3804
3805 SYSCTL_PROC(_security_jail, OID_AUTO, devfs_ruleset,
3806     CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
3807     &jail_default_devfs_rsnum, offsetof(struct prison, pr_devfs_rsnum),
3808     sysctl_jail_default_level, "I",
3809     "Ruleset for the devfs filesystem in jail (deprecated)");
3810
3811 /*
3812  * Nodes to describe jail parameters.  Maximum length of string parameters
3813  * is returned in the string itself, and the other parameters exist merely
3814  * to make themselves and their types known.
3815  */
3816 SYSCTL_NODE(_security_jail, OID_AUTO, param, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
3817     "Jail parameters");
3818
3819 int
3820 sysctl_jail_param(SYSCTL_HANDLER_ARGS)
3821 {
3822         int i;
3823         long l;
3824         size_t s;
3825         char numbuf[12];
3826
3827         switch (oidp->oid_kind & CTLTYPE)
3828         {
3829         case CTLTYPE_LONG:
3830         case CTLTYPE_ULONG:
3831                 l = 0;
3832 #ifdef SCTL_MASK32
3833                 if (!(req->flags & SCTL_MASK32))
3834 #endif
3835                         return (SYSCTL_OUT(req, &l, sizeof(l)));
3836         case CTLTYPE_INT:
3837         case CTLTYPE_UINT:
3838                 i = 0;
3839                 return (SYSCTL_OUT(req, &i, sizeof(i)));
3840         case CTLTYPE_STRING:
3841                 snprintf(numbuf, sizeof(numbuf), "%jd", (intmax_t)arg2);
3842                 return
3843                     (sysctl_handle_string(oidp, numbuf, sizeof(numbuf), req));
3844         case CTLTYPE_STRUCT:
3845                 s = (size_t)arg2;
3846                 return (SYSCTL_OUT(req, &s, sizeof(s)));
3847         }
3848         return (0);
3849 }
3850
3851 /*
3852  * CTLFLAG_RDTUN in the following indicates jail parameters that can be set at
3853  * jail creation time but cannot be changed in an existing jail.
3854  */
3855 SYSCTL_JAIL_PARAM(, jid, CTLTYPE_INT | CTLFLAG_RDTUN, "I", "Jail ID");
3856 SYSCTL_JAIL_PARAM(, parent, CTLTYPE_INT | CTLFLAG_RD, "I", "Jail parent ID");
3857 SYSCTL_JAIL_PARAM_STRING(, name, CTLFLAG_RW, MAXHOSTNAMELEN, "Jail name");
3858 SYSCTL_JAIL_PARAM_STRING(, path, CTLFLAG_RDTUN, MAXPATHLEN, "Jail root path");
3859 SYSCTL_JAIL_PARAM(, securelevel, CTLTYPE_INT | CTLFLAG_RW,
3860     "I", "Jail secure level");
3861 SYSCTL_JAIL_PARAM(, osreldate, CTLTYPE_INT | CTLFLAG_RDTUN, "I",
3862     "Jail value for kern.osreldate and uname -K");
3863 SYSCTL_JAIL_PARAM_STRING(, osrelease, CTLFLAG_RDTUN, OSRELEASELEN,
3864     "Jail value for kern.osrelease and uname -r");
3865 SYSCTL_JAIL_PARAM(, enforce_statfs, CTLTYPE_INT | CTLFLAG_RW,
3866     "I", "Jail cannot see all mounted file systems");
3867 SYSCTL_JAIL_PARAM(, devfs_ruleset, CTLTYPE_INT | CTLFLAG_RW,
3868     "I", "Ruleset for in-jail devfs mounts");
3869 SYSCTL_JAIL_PARAM(, persist, CTLTYPE_INT | CTLFLAG_RW,
3870     "B", "Jail persistence");
3871 #ifdef VIMAGE
3872 SYSCTL_JAIL_PARAM(, vnet, CTLTYPE_INT | CTLFLAG_RDTUN,
3873     "E,jailsys", "Virtual network stack");
3874 #endif
3875 SYSCTL_JAIL_PARAM(, dying, CTLTYPE_INT | CTLFLAG_RD,
3876     "B", "Jail is in the process of shutting down");
3877
3878 SYSCTL_JAIL_PARAM_NODE(children, "Number of child jails");
3879 SYSCTL_JAIL_PARAM(_children, cur, CTLTYPE_INT | CTLFLAG_RD,
3880     "I", "Current number of child jails");
3881 SYSCTL_JAIL_PARAM(_children, max, CTLTYPE_INT | CTLFLAG_RW,
3882     "I", "Maximum number of child jails");
3883
3884 SYSCTL_JAIL_PARAM_SYS_NODE(host, CTLFLAG_RW, "Jail host info");
3885 SYSCTL_JAIL_PARAM_STRING(_host, hostname, CTLFLAG_RW, MAXHOSTNAMELEN,
3886     "Jail hostname");
3887 SYSCTL_JAIL_PARAM_STRING(_host, domainname, CTLFLAG_RW, MAXHOSTNAMELEN,
3888     "Jail NIS domainname");
3889 SYSCTL_JAIL_PARAM_STRING(_host, hostuuid, CTLFLAG_RW, HOSTUUIDLEN,
3890     "Jail host UUID");
3891 SYSCTL_JAIL_PARAM(_host, hostid, CTLTYPE_ULONG | CTLFLAG_RW,
3892     "LU", "Jail host ID");
3893
3894 SYSCTL_JAIL_PARAM_NODE(cpuset, "Jail cpuset");
3895 SYSCTL_JAIL_PARAM(_cpuset, id, CTLTYPE_INT | CTLFLAG_RD, "I", "Jail cpuset ID");
3896
3897 #ifdef INET
3898 SYSCTL_JAIL_PARAM_SYS_NODE(ip4, CTLFLAG_RDTUN,
3899     "Jail IPv4 address virtualization");
3900 SYSCTL_JAIL_PARAM_STRUCT(_ip4, addr, CTLFLAG_RW, sizeof(struct in_addr),
3901     "S,in_addr,a", "Jail IPv4 addresses");
3902 SYSCTL_JAIL_PARAM(_ip4, saddrsel, CTLTYPE_INT | CTLFLAG_RW,
3903     "B", "Do (not) use IPv4 source address selection rather than the "
3904     "primary jail IPv4 address.");
3905 #endif
3906 #ifdef INET6
3907 SYSCTL_JAIL_PARAM_SYS_NODE(ip6, CTLFLAG_RDTUN,
3908     "Jail IPv6 address virtualization");
3909 SYSCTL_JAIL_PARAM_STRUCT(_ip6, addr, CTLFLAG_RW, sizeof(struct in6_addr),
3910     "S,in6_addr,a", "Jail IPv6 addresses");
3911 SYSCTL_JAIL_PARAM(_ip6, saddrsel, CTLTYPE_INT | CTLFLAG_RW,
3912     "B", "Do (not) use IPv6 source address selection rather than the "
3913     "primary jail IPv6 address.");
3914 #endif
3915
3916 SYSCTL_JAIL_PARAM_NODE(allow, "Jail permission flags");
3917 SYSCTL_JAIL_PARAM(_allow, set_hostname, CTLTYPE_INT | CTLFLAG_RW,
3918     "B", "Jail may set hostname");
3919 SYSCTL_JAIL_PARAM(_allow, sysvipc, CTLTYPE_INT | CTLFLAG_RW,
3920     "B", "Jail may use SYSV IPC");
3921 SYSCTL_JAIL_PARAM(_allow, raw_sockets, CTLTYPE_INT | CTLFLAG_RW,
3922     "B", "Jail may create raw sockets");
3923 SYSCTL_JAIL_PARAM(_allow, chflags, CTLTYPE_INT | CTLFLAG_RW,
3924     "B", "Jail may alter system file flags");
3925 SYSCTL_JAIL_PARAM(_allow, quotas, CTLTYPE_INT | CTLFLAG_RW,
3926     "B", "Jail may set file quotas");
3927 SYSCTL_JAIL_PARAM(_allow, socket_af, CTLTYPE_INT | CTLFLAG_RW,
3928     "B", "Jail may create sockets other than just UNIX/IPv4/IPv6/route");
3929 SYSCTL_JAIL_PARAM(_allow, mlock, CTLTYPE_INT | CTLFLAG_RW,
3930     "B", "Jail may lock (unlock) physical pages in memory");
3931 SYSCTL_JAIL_PARAM(_allow, reserved_ports, CTLTYPE_INT | CTLFLAG_RW,
3932     "B", "Jail may bind sockets to reserved ports");
3933 SYSCTL_JAIL_PARAM(_allow, read_msgbuf, CTLTYPE_INT | CTLFLAG_RW,
3934     "B", "Jail may read the kernel message buffer");
3935 SYSCTL_JAIL_PARAM(_allow, unprivileged_proc_debug, CTLTYPE_INT | CTLFLAG_RW,
3936     "B", "Unprivileged processes may use process debugging facilities");
3937 SYSCTL_JAIL_PARAM(_allow, suser, CTLTYPE_INT | CTLFLAG_RW,
3938     "B", "Processes in jail with uid 0 have privilege");
3939
3940 SYSCTL_JAIL_PARAM_SUBNODE(allow, mount, "Jail mount/unmount permission flags");
3941 SYSCTL_JAIL_PARAM(_allow_mount, , CTLTYPE_INT | CTLFLAG_RW,
3942     "B", "Jail may mount/unmount jail-friendly file systems in general");
3943
3944 /*
3945  * Add a dynamic parameter allow.<name>, or allow.<prefix>.<name>.  Return
3946  * its associated bit in the pr_allow bitmask, or zero if the parameter was
3947  * not created.
3948  */
3949 unsigned
3950 prison_add_allow(const char *prefix, const char *name, const char *prefix_descr,
3951     const char *descr)
3952 {
3953         struct bool_flags *bf;
3954         struct sysctl_oid *parent;
3955         char *allow_name, *allow_noname, *allowed;
3956 #ifndef NO_SYSCTL_DESCR
3957         char *descr_deprecated;
3958 #endif
3959         u_int allow_flag;
3960
3961         if (prefix
3962             ? asprintf(&allow_name, M_PRISON, "allow.%s.%s", prefix, name)
3963                 < 0 ||
3964               asprintf(&allow_noname, M_PRISON, "allow.%s.no%s", prefix, name)
3965                 < 0
3966             : asprintf(&allow_name, M_PRISON, "allow.%s", name) < 0 ||
3967               asprintf(&allow_noname, M_PRISON, "allow.no%s", name) < 0) {
3968                 free(allow_name, M_PRISON);
3969                 return 0;
3970         }
3971
3972         /*
3973          * See if this parameter has already beed added, i.e. a module was
3974          * previously loaded/unloaded.
3975          */
3976         mtx_lock(&prison0.pr_mtx);
3977         for (bf = pr_flag_allow;
3978              bf < pr_flag_allow + nitems(pr_flag_allow) &&
3979                 atomic_load_int(&bf->flag) != 0;
3980              bf++) {
3981                 if (strcmp(bf->name, allow_name) == 0) {
3982                         allow_flag = bf->flag;
3983                         goto no_add;
3984                 }
3985         }
3986
3987         /*
3988          * Find a free bit in pr_allow_all, failing if there are none
3989          * (which shouldn't happen as long as we keep track of how many
3990          * potential dynamic flags exist).
3991          */
3992         for (allow_flag = 1;; allow_flag <<= 1) {
3993                 if (allow_flag == 0)
3994                         goto no_add;
3995                 if ((pr_allow_all & allow_flag) == 0)
3996                         break;
3997         }
3998
3999         /* Note the parameter in the next open slot in pr_flag_allow. */
4000         for (bf = pr_flag_allow; ; bf++) {
4001                 if (bf == pr_flag_allow + nitems(pr_flag_allow)) {
4002                         /* This should never happen, but is not fatal. */
4003                         allow_flag = 0;
4004                         goto no_add;
4005                 }
4006                 if (atomic_load_int(&bf->flag) == 0)
4007                         break;
4008         }
4009         bf->name = allow_name;
4010         bf->noname = allow_noname;
4011         pr_allow_all |= allow_flag;
4012         /*
4013          * prison0 always has permission for the new parameter.
4014          * Other jails must have it granted to them.
4015          */
4016         prison0.pr_allow |= allow_flag;
4017         /* The flag indicates a valid entry, so make sure it is set last. */
4018         atomic_store_rel_int(&bf->flag, allow_flag);
4019         mtx_unlock(&prison0.pr_mtx);
4020
4021         /*
4022          * Create sysctls for the paramter, and the back-compat global
4023          * permission.
4024          */
4025         parent = prefix
4026             ? SYSCTL_ADD_NODE(NULL,
4027                   SYSCTL_CHILDREN(&sysctl___security_jail_param_allow),
4028                   OID_AUTO, prefix, CTLFLAG_MPSAFE, 0, prefix_descr)
4029             : &sysctl___security_jail_param_allow;
4030         (void)SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(parent), OID_AUTO,
4031             name, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
4032             NULL, 0, sysctl_jail_param, "B", descr);
4033         if ((prefix
4034              ? asprintf(&allowed, M_TEMP, "%s_%s_allowed", prefix, name)
4035              : asprintf(&allowed, M_TEMP, "%s_allowed", name)) >= 0) {
4036 #ifndef NO_SYSCTL_DESCR
4037                 (void)asprintf(&descr_deprecated, M_TEMP, "%s (deprecated)",
4038                     descr);
4039 #endif
4040                 (void)SYSCTL_ADD_PROC(NULL,
4041                     SYSCTL_CHILDREN(&sysctl___security_jail), OID_AUTO, allowed,
4042                     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, allow_flag,
4043                     sysctl_jail_default_allow, "I", descr_deprecated);
4044 #ifndef NO_SYSCTL_DESCR
4045                 free(descr_deprecated, M_TEMP);
4046 #endif
4047                 free(allowed, M_TEMP);
4048         }
4049         return allow_flag;
4050
4051  no_add:
4052         mtx_unlock(&prison0.pr_mtx);
4053         free(allow_name, M_PRISON);
4054         free(allow_noname, M_PRISON);
4055         return allow_flag;
4056 }
4057
4058 /*
4059  * The VFS system will register jail-aware filesystems here.  They each get
4060  * a parameter allow.mount.xxxfs and a flag to check when a jailed user
4061  * attempts to mount.
4062  */
4063 void
4064 prison_add_vfs(struct vfsconf *vfsp)
4065 {
4066 #ifdef NO_SYSCTL_DESCR
4067
4068         vfsp->vfc_prison_flag = prison_add_allow("mount", vfsp->vfc_name,
4069             NULL, NULL);
4070 #else
4071         char *descr;
4072
4073         (void)asprintf(&descr, M_TEMP, "Jail may mount the %s file system",
4074             vfsp->vfc_name);
4075         vfsp->vfc_prison_flag = prison_add_allow("mount", vfsp->vfc_name,
4076             NULL, descr);
4077         free(descr, M_TEMP);
4078 #endif
4079 }
4080
4081 #ifdef RACCT
4082 void
4083 prison_racct_foreach(void (*callback)(struct racct *racct,
4084     void *arg2, void *arg3), void (*pre)(void), void (*post)(void),
4085     void *arg2, void *arg3)
4086 {
4087         struct prison_racct *prr;
4088
4089         ASSERT_RACCT_ENABLED();
4090
4091         sx_slock(&allprison_lock);
4092         if (pre != NULL)
4093                 (pre)();
4094         LIST_FOREACH(prr, &allprison_racct, prr_next)
4095                 (callback)(prr->prr_racct, arg2, arg3);
4096         if (post != NULL)
4097                 (post)();
4098         sx_sunlock(&allprison_lock);
4099 }
4100
4101 static struct prison_racct *
4102 prison_racct_find_locked(const char *name)
4103 {
4104         struct prison_racct *prr;
4105
4106         ASSERT_RACCT_ENABLED();
4107         sx_assert(&allprison_lock, SA_XLOCKED);
4108
4109         if (name[0] == '\0' || strlen(name) >= MAXHOSTNAMELEN)
4110                 return (NULL);
4111
4112         LIST_FOREACH(prr, &allprison_racct, prr_next) {
4113                 if (strcmp(name, prr->prr_name) != 0)
4114                         continue;
4115
4116                 /* Found prison_racct with a matching name? */
4117                 prison_racct_hold(prr);
4118                 return (prr);
4119         }
4120
4121         /* Add new prison_racct. */
4122         prr = malloc(sizeof(*prr), M_PRISON_RACCT, M_ZERO | M_WAITOK);
4123         racct_create(&prr->prr_racct);
4124
4125         strcpy(prr->prr_name, name);
4126         refcount_init(&prr->prr_refcount, 1);
4127         LIST_INSERT_HEAD(&allprison_racct, prr, prr_next);
4128
4129         return (prr);
4130 }
4131
4132 struct prison_racct *
4133 prison_racct_find(const char *name)
4134 {
4135         struct prison_racct *prr;
4136
4137         ASSERT_RACCT_ENABLED();
4138
4139         sx_xlock(&allprison_lock);
4140         prr = prison_racct_find_locked(name);
4141         sx_xunlock(&allprison_lock);
4142         return (prr);
4143 }
4144
4145 void
4146 prison_racct_hold(struct prison_racct *prr)
4147 {
4148
4149         ASSERT_RACCT_ENABLED();
4150
4151         refcount_acquire(&prr->prr_refcount);
4152 }
4153
4154 static void
4155 prison_racct_free_locked(struct prison_racct *prr)
4156 {
4157
4158         ASSERT_RACCT_ENABLED();
4159         sx_assert(&allprison_lock, SA_XLOCKED);
4160
4161         if (refcount_release(&prr->prr_refcount)) {
4162                 racct_destroy(&prr->prr_racct);
4163                 LIST_REMOVE(prr, prr_next);
4164                 free(prr, M_PRISON_RACCT);
4165         }
4166 }
4167
4168 void
4169 prison_racct_free(struct prison_racct *prr)
4170 {
4171
4172         ASSERT_RACCT_ENABLED();
4173         sx_assert(&allprison_lock, SA_UNLOCKED);
4174
4175         if (refcount_release_if_not_last(&prr->prr_refcount))
4176                 return;
4177
4178         sx_xlock(&allprison_lock);
4179         prison_racct_free_locked(prr);
4180         sx_xunlock(&allprison_lock);
4181 }
4182
4183 static void
4184 prison_racct_attach(struct prison *pr)
4185 {
4186         struct prison_racct *prr;
4187
4188         ASSERT_RACCT_ENABLED();
4189         sx_assert(&allprison_lock, SA_XLOCKED);
4190
4191         prr = prison_racct_find_locked(pr->pr_name);
4192         KASSERT(prr != NULL, ("cannot find prison_racct"));
4193
4194         pr->pr_prison_racct = prr;
4195 }
4196
4197 /*
4198  * Handle jail renaming.  From the racct point of view, renaming means
4199  * moving from one prison_racct to another.
4200  */
4201 static void
4202 prison_racct_modify(struct prison *pr)
4203 {
4204 #ifdef RCTL
4205         struct proc *p;
4206         struct ucred *cred;
4207 #endif
4208         struct prison_racct *oldprr;
4209
4210         ASSERT_RACCT_ENABLED();
4211
4212         sx_slock(&allproc_lock);
4213         sx_xlock(&allprison_lock);
4214
4215         if (strcmp(pr->pr_name, pr->pr_prison_racct->prr_name) == 0) {
4216                 sx_xunlock(&allprison_lock);
4217                 sx_sunlock(&allproc_lock);
4218                 return;
4219         }
4220
4221         oldprr = pr->pr_prison_racct;
4222         pr->pr_prison_racct = NULL;
4223
4224         prison_racct_attach(pr);
4225
4226         /*
4227          * Move resource utilisation records.
4228          */
4229         racct_move(pr->pr_prison_racct->prr_racct, oldprr->prr_racct);
4230
4231 #ifdef RCTL
4232         /*
4233          * Force rctl to reattach rules to processes.
4234          */
4235         FOREACH_PROC_IN_SYSTEM(p) {
4236                 PROC_LOCK(p);
4237                 cred = crhold(p->p_ucred);
4238                 PROC_UNLOCK(p);
4239                 rctl_proc_ucred_changed(p, cred);
4240                 crfree(cred);
4241         }
4242 #endif
4243
4244         sx_sunlock(&allproc_lock);
4245         prison_racct_free_locked(oldprr);
4246         sx_xunlock(&allprison_lock);
4247 }
4248
4249 static void
4250 prison_racct_detach(struct prison *pr)
4251 {
4252
4253         ASSERT_RACCT_ENABLED();
4254         sx_assert(&allprison_lock, SA_UNLOCKED);
4255
4256         if (pr->pr_prison_racct == NULL)
4257                 return;
4258         prison_racct_free(pr->pr_prison_racct);
4259         pr->pr_prison_racct = NULL;
4260 }
4261 #endif /* RACCT */
4262
4263 #ifdef DDB
4264
4265 static void
4266 db_show_prison(struct prison *pr)
4267 {
4268         struct bool_flags *bf;
4269         struct jailsys_flags *jsf;
4270 #if defined(INET) || defined(INET6)
4271         int ii;
4272 #endif
4273         unsigned f;
4274 #ifdef INET
4275         char ip4buf[INET_ADDRSTRLEN];
4276 #endif
4277 #ifdef INET6
4278         char ip6buf[INET6_ADDRSTRLEN];
4279 #endif
4280
4281         db_printf("prison %p:\n", pr);
4282         db_printf(" jid             = %d\n", pr->pr_id);
4283         db_printf(" name            = %s\n", pr->pr_name);
4284         db_printf(" parent          = %p\n", pr->pr_parent);
4285         db_printf(" ref             = %d\n", pr->pr_ref);
4286         db_printf(" uref            = %d\n", pr->pr_uref);
4287         db_printf(" path            = %s\n", pr->pr_path);
4288         db_printf(" cpuset          = %d\n", pr->pr_cpuset
4289             ? pr->pr_cpuset->cs_id : -1);
4290 #ifdef VIMAGE
4291         db_printf(" vnet            = %p\n", pr->pr_vnet);
4292 #endif
4293         db_printf(" root            = %p\n", pr->pr_root);
4294         db_printf(" securelevel     = %d\n", pr->pr_securelevel);
4295         db_printf(" devfs_rsnum     = %d\n", pr->pr_devfs_rsnum);
4296         db_printf(" children.max    = %d\n", pr->pr_childmax);
4297         db_printf(" children.cur    = %d\n", pr->pr_childcount);
4298         db_printf(" child           = %p\n", LIST_FIRST(&pr->pr_children));
4299         db_printf(" sibling         = %p\n", LIST_NEXT(pr, pr_sibling));
4300         db_printf(" flags           = 0x%x", pr->pr_flags);
4301         for (bf = pr_flag_bool; bf < pr_flag_bool + nitems(pr_flag_bool); bf++)
4302                 if (pr->pr_flags & bf->flag)
4303                         db_printf(" %s", bf->name);
4304         for (jsf = pr_flag_jailsys;
4305              jsf < pr_flag_jailsys + nitems(pr_flag_jailsys);
4306              jsf++) {
4307                 f = pr->pr_flags & (jsf->disable | jsf->new);
4308                 db_printf(" %-16s= %s\n", jsf->name,
4309                     (f != 0 && f == jsf->disable) ? "disable"
4310                     : (f == jsf->new) ? "new"
4311                     : "inherit");
4312         }
4313         db_printf(" allow           = 0x%x", pr->pr_allow);
4314         for (bf = pr_flag_allow;
4315              bf < pr_flag_allow + nitems(pr_flag_allow) &&
4316                 atomic_load_int(&bf->flag) != 0;
4317              bf++)
4318                 if (pr->pr_allow & bf->flag)
4319                         db_printf(" %s", bf->name);
4320         db_printf("\n");
4321         db_printf(" enforce_statfs  = %d\n", pr->pr_enforce_statfs);
4322         db_printf(" host.hostname   = %s\n", pr->pr_hostname);
4323         db_printf(" host.domainname = %s\n", pr->pr_domainname);
4324         db_printf(" host.hostuuid   = %s\n", pr->pr_hostuuid);
4325         db_printf(" host.hostid     = %lu\n", pr->pr_hostid);
4326 #ifdef INET
4327         db_printf(" ip4s            = %d\n", pr->pr_ip4s);
4328         for (ii = 0; ii < pr->pr_ip4s; ii++)
4329                 db_printf(" %s %s\n",
4330                     ii == 0 ? "ip4.addr        =" : "                 ",
4331                     inet_ntoa_r(pr->pr_ip4[ii], ip4buf));
4332 #endif
4333 #ifdef INET6
4334         db_printf(" ip6s            = %d\n", pr->pr_ip6s);
4335         for (ii = 0; ii < pr->pr_ip6s; ii++)
4336                 db_printf(" %s %s\n",
4337                     ii == 0 ? "ip6.addr        =" : "                 ",
4338                     ip6_sprintf(ip6buf, &pr->pr_ip6[ii]));
4339 #endif
4340 }
4341
4342 DB_SHOW_COMMAND(prison, db_show_prison_command)
4343 {
4344         struct prison *pr;
4345
4346         if (!have_addr) {
4347                 /*
4348                  * Show all prisons in the list, and prison0 which is not
4349                  * listed.
4350                  */
4351                 db_show_prison(&prison0);
4352                 if (!db_pager_quit) {
4353                         TAILQ_FOREACH(pr, &allprison, pr_list) {
4354                                 db_show_prison(pr);
4355                                 if (db_pager_quit)
4356                                         break;
4357                         }
4358                 }
4359                 return;
4360         }
4361
4362         if (addr == 0)
4363                 pr = &prison0;
4364         else {
4365                 /* Look for a prison with the ID and with references. */
4366                 TAILQ_FOREACH(pr, &allprison, pr_list)
4367                         if (pr->pr_id == addr && pr->pr_ref > 0)
4368                                 break;
4369                 if (pr == NULL)
4370                         /* Look again, without requiring a reference. */
4371                         TAILQ_FOREACH(pr, &allprison, pr_list)
4372                                 if (pr->pr_id == addr)
4373                                         break;
4374                 if (pr == NULL)
4375                         /* Assume address points to a valid prison. */
4376                         pr = (struct prison *)addr;
4377         }
4378         db_show_prison(pr);
4379 }
4380
4381 #endif /* DDB */