summaryrefslogtreecommitdiffstats
path: root/lib/libjail
diff options
context:
space:
mode:
authorjamie <jamie@FreeBSD.org>2012-05-22 18:30:32 +0000
committerjamie <jamie@FreeBSD.org>2012-05-22 18:30:32 +0000
commit9243e0fcfd77d81bd05001344bad067e0d406e75 (patch)
treea4865b181c2ae444fdc6baa4b2ab064e3e0eeedb /lib/libjail
parentafb1c7fc4d9ee295a81625a01bb89732e973d603 (diff)
downloadFreeBSD-src-9243e0fcfd77d81bd05001344bad067e0d406e75.zip
FreeBSD-src-9243e0fcfd77d81bd05001344bad067e0d406e75.tar.gz
The fix in r235291 re-broke the "allow.nomount" case. Re-fix it
by testing for the right parameter name.
Diffstat (limited to 'lib/libjail')
-rw-r--r--lib/libjail/jail.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/libjail/jail.c b/lib/libjail/jail.c
index fa39edf..5cd2ad2 100644
--- a/lib/libjail/jail.c
+++ b/lib/libjail/jail.c
@@ -853,7 +853,7 @@ jailparam_free(struct jailparam *jp, unsigned njp)
static int
jailparam_type(struct jailparam *jp)
{
- char *p, *nname;
+ char *p, *name, *nname;
size_t miblen, desclen;
int i, isarray;
struct {
@@ -863,7 +863,8 @@ jailparam_type(struct jailparam *jp)
int mib[CTL_MAXNAME];
/* The "lastjid" parameter isn't real. */
- if (!strcmp(jp->jp_name, "lastjid")) {
+ name = jp->jp_name;
+ if (!strcmp(name, "lastjid")) {
jp->jp_valuelen = sizeof(int);
jp->jp_ctltype = CTLTYPE_INT | CTLFLAG_WR;
return (0);
@@ -872,19 +873,19 @@ jailparam_type(struct jailparam *jp)
/* Find the sysctl that describes the parameter. */
mib[0] = 0;
mib[1] = 3;
- snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", jp->jp_name);
+ snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", name);
miblen = sizeof(mib) - 2 * sizeof(int);
if (sysctl(mib, 2, mib + 2, &miblen, desc.s, strlen(desc.s)) < 0) {
if (errno != ENOENT) {
snprintf(jail_errmsg, JAIL_ERRMSGLEN,
- "sysctl(0.3.%s): %s", jp->jp_name, strerror(errno));
+ "sysctl(0.3.%s): %s", name, strerror(errno));
return (-1);
}
/*
* The parameter probably doesn't exist. But it might be
* the "no" counterpart to a boolean.
*/
- nname = nononame(jp->jp_name);
+ nname = nononame(name);
if (nname == NULL) {
unknown_parameter:
snprintf(jail_errmsg, JAIL_ERRMSGLEN,
@@ -892,8 +893,10 @@ jailparam_type(struct jailparam *jp)
errno = ENOENT;
return (-1);
}
- snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", nname);
+ name = alloca(strlen(nname) + 1);
+ strcpy(name, nname);
free(nname);
+ snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", name);
miblen = sizeof(mib) - 2 * sizeof(int);
if (sysctl(mib, 2, mib + 2, &miblen, desc.s,
strlen(desc.s)) < 0)
@@ -906,7 +909,7 @@ jailparam_type(struct jailparam *jp)
if (sysctl(mib, (miblen / sizeof(int)) + 2, &desc, &desclen,
NULL, 0) < 0) {
snprintf(jail_errmsg, JAIL_ERRMSGLEN,
- "sysctl(0.4.%s): %s", jp->jp_name, strerror(errno));
+ "sysctl(0.4.%s): %s", name, strerror(errno));
return (-1);
}
jp->jp_ctltype = desc.i;
@@ -952,7 +955,7 @@ jailparam_type(struct jailparam *jp)
if (sysctl(mib + 2, miblen / sizeof(int), desc.s, &desclen,
NULL, 0) < 0) {
snprintf(jail_errmsg, JAIL_ERRMSGLEN,
- "sysctl(" SJPARAM ".%s): %s", jp->jp_name,
+ "sysctl(" SJPARAM ".%s): %s", name,
strerror(errno));
return (-1);
}
@@ -970,7 +973,7 @@ jailparam_type(struct jailparam *jp)
if (sysctl(mib + 2, miblen / sizeof(int),
NULL, &jp->jp_valuelen, NULL, 0) < 0) {
snprintf(jail_errmsg, JAIL_ERRMSGLEN,
- "sysctl(" SJPARAM ".%s): %s", jp->jp_name,
+ "sysctl(" SJPARAM ".%s): %s", name,
strerror(errno));
return (-1);
}
@@ -995,10 +998,9 @@ jailparam_type(struct jailparam *jp)
"sysctl(0.1): %s", strerror(errno));
return (-1);
}
- if (desclen ==
- sizeof(SJPARAM) + strlen(jp->jp_name) + 2 &&
+ if (desclen == sizeof(SJPARAM) + strlen(name) + 2 &&
memcmp(SJPARAM ".", desc.s, sizeof(SJPARAM)) == 0 &&
- memcmp(jp->jp_name, desc.s + sizeof(SJPARAM),
+ memcmp(name, desc.s + sizeof(SJPARAM),
desclen - sizeof(SJPARAM) - 2) == 0 &&
desc.s[desclen - 2] == '.')
goto mib_desc;
OpenPOWER on IntegriCloud