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