svn commit: r196989 - in stable/8/sys: . amd64/include/xen
cddl/contrib/opensolaris contrib/dev/acpica contrib/pf
dev/xen/xenpci kern
Jamie Gritton
jamie at FreeBSD.org
Tue Sep 8 19:18:03 UTC 2009
Author: jamie
Date: Tue Sep 8 19:18:02 2009
New Revision: 196989
URL: http://svn.freebsd.org/changeset/base/196989
Log:
MFC r196835:
Allow a jail's name to be the same as its jid (which is the default if
no name is specified), and let a numeric name specify the jid for a new
jail when the jid isn't otherwise set. Still disallow other numeric
names.
Reviewed by: zec
Approved by: re (kib), bz (mentor)
Modified:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/kern/kern_jail.c
Modified: stable/8/sys/kern/kern_jail.c
==============================================================================
--- stable/8/sys/kern/kern_jail.c Tue Sep 8 19:15:29 2009 (r196988)
+++ stable/8/sys/kern/kern_jail.c Tue Sep 8 19:18:02 2009 (r196989)
@@ -478,7 +478,7 @@ kern_jail_set(struct thread *td, struct
struct vfsoptlist *opts;
struct prison *pr, *deadpr, *mypr, *ppr, *tpr;
struct vnode *root;
- char *domain, *errmsg, *host, *name, *p, *path, *uuid;
+ char *domain, *errmsg, *host, *name, *namelc, *p, *path, *uuid;
#if defined(INET) || defined(INET6)
struct prison *tppr;
void *op;
@@ -907,6 +907,13 @@ kern_jail_set(struct thread *td, struct
goto done_unlock_list;
}
pr = NULL;
+ namelc = NULL;
+ if (cuflags == JAIL_CREATE && jid == 0 && name != NULL) {
+ namelc = strrchr(name, '.');
+ jid = strtoul(namelc != NULL ? namelc + 1 : name, &p, 10);
+ if (*p != '\0')
+ jid = 0;
+ }
if (jid != 0) {
/*
* See if a requested jid already exists. There is an
@@ -973,17 +980,19 @@ kern_jail_set(struct thread *td, struct
* because that is the jail being updated).
*/
if (name != NULL) {
- p = strrchr(name, '.');
- if (p != NULL) {
+ namelc = strrchr(name, '.');
+ if (namelc == NULL)
+ namelc = name;
+ else {
/*
* This is a hierarchical name. Split it into the
* parent and child names, and make sure the parent
* exists or matches an already found jail.
*/
- *p = '\0';
+ *namelc = '\0';
if (pr != NULL) {
- if (strncmp(name, ppr->pr_name, p - name) ||
- ppr->pr_name[p - name] != '\0') {
+ if (strncmp(name, ppr->pr_name, namelc - name)
+ || ppr->pr_name[namelc - name] != '\0') {
mtx_unlock(&pr->pr_mtx);
error = EINVAL;
vfs_opterror(opts,
@@ -1000,7 +1009,7 @@ kern_jail_set(struct thread *td, struct
}
mtx_unlock(&ppr->pr_mtx);
}
- name = p + 1;
+ name = ++namelc;
}
if (name[0] != '\0') {
namelen =
@@ -1412,9 +1421,11 @@ kern_jail_set(struct thread *td, struct
/* Give a default name of the jid. */
if (name[0] == '\0')
snprintf(name = numbuf, sizeof(numbuf), "%d", jid);
- else if (strtoul(name, &p, 10) != jid && *p == '\0') {
+ else if (*namelc == '0' || (strtoul(namelc, &p, 10) != jid &&
+ *p == '\0')) {
error = EINVAL;
- vfs_opterror(opts, "name cannot be numeric");
+ vfs_opterror(opts,
+ "name cannot be numeric (unless it is the jid)");
goto done_deref_locked;
}
/*
More information about the svn-src-stable-8
mailing list