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