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