summaryrefslogtreecommitdiffstats
path: root/lib/libjail
diff options
context:
space:
mode:
authorjamie <jamie@FreeBSD.org>2012-03-01 15:09:41 +0000
committerjamie <jamie@FreeBSD.org>2012-03-01 15:09:41 +0000
commitde23ce306ea185ae588271dc4d3cd22d0f1ddf4a (patch)
tree3ff3651127068250f09cfd0b14982f00355ac54c /lib/libjail
parent3cbbe366340c6373feb7db39794e25252a7b27fc (diff)
downloadFreeBSD-src-de23ce306ea185ae588271dc4d3cd22d0f1ddf4a.zip
FreeBSD-src-de23ce306ea185ae588271dc4d3cd22d0f1ddf4a.tar.gz
Handle the case where a boolean parameter is also a node.
PR: bin/165515 MFC after: 2 weeks
Diffstat (limited to 'lib/libjail')
-rw-r--r--lib/libjail/jail.c53
1 files changed, 23 insertions, 30 deletions
diff --git a/lib/libjail/jail.c b/lib/libjail/jail.c
index 69386e5..af0e40a 100644
--- a/lib/libjail/jail.c
+++ b/lib/libjail/jail.c
@@ -885,36 +885,20 @@ jailparam_type(struct jailparam *jp)
* the "no" counterpart to a boolean.
*/
nname = nononame(jp->jp_name);
- if (nname != NULL) {
- snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", nname);
- free(nname);
- miblen = sizeof(mib) - 2 * sizeof(int);
- if (sysctl(mib, 2, mib + 2, &miblen, desc.s,
- strlen(desc.s)) >= 0) {
- mib[1] = 4;
- desclen = sizeof(desc);
- if (sysctl(mib, (miblen / sizeof(int)) + 2,
- &desc, &desclen, NULL, 0) < 0) {
- snprintf(jail_errmsg,
- JAIL_ERRMSGLEN,
- "sysctl(0.4.%s): %s", desc.s,
- strerror(errno));
- return (-1);
- }
- if ((desc.i & CTLTYPE) == CTLTYPE_INT &&
- desc.s[0] == 'B') {
- jp->jp_ctltype = desc.i;
- jp->jp_flags |= JP_NOBOOL;
- jp->jp_valuelen = sizeof(int);
- return (0);
- }
- }
+ if (nname == NULL) {
+ unknown_parameter:
+ snprintf(jail_errmsg, JAIL_ERRMSGLEN,
+ "unknown parameter: %s", jp->jp_name);
+ errno = ENOENT;
+ return (-1);
}
- unknown_parameter:
- snprintf(jail_errmsg, JAIL_ERRMSGLEN,
- "unknown parameter: %s", jp->jp_name);
- errno = ENOENT;
- return (-1);
+ snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", nname);
+ free(nname);
+ miblen = sizeof(mib) - 2 * sizeof(int);
+ if (sysctl(mib, 2, mib + 2, &miblen, desc.s,
+ strlen(desc.s)) < 0)
+ goto unknown_parameter;
+ jp->jp_flags |= JP_NOBOOL;
}
mib_desc:
mib[1] = 4;
@@ -925,6 +909,16 @@ jailparam_type(struct jailparam *jp)
"sysctl(0.4.%s): %s", jp->jp_name, strerror(errno));
return (-1);
}
+ jp->jp_ctltype = desc.i;
+ /* If this came from removing a "no", it better be a boolean. */
+ if (jp->jp_flags & JP_NOBOOL) {
+ if ((desc.i & CTLTYPE) == CTLTYPE_INT && desc.s[0] == 'B') {
+ jp->jp_valuelen = sizeof(int);
+ return (0);
+ }
+ else if ((desc.i & CTLTYPE) != CTLTYPE_NODE)
+ goto unknown_parameter;
+ }
/* See if this is an array type. */
p = strchr(desc.s, '\0');
isarray = 0;
@@ -935,7 +929,6 @@ jailparam_type(struct jailparam *jp)
p[-2] = 0;
}
/* Look for types we understand. */
- jp->jp_ctltype = desc.i;
switch (desc.i & CTLTYPE) {
case CTLTYPE_INT:
if (desc.s[0] == 'B')
OpenPOWER on IntegriCloud