diff options
author | jamie <jamie@FreeBSD.org> | 2012-05-22 18:30:32 +0000 |
---|---|---|
committer | jamie <jamie@FreeBSD.org> | 2012-05-22 18:30:32 +0000 |
commit | 9243e0fcfd77d81bd05001344bad067e0d406e75 (patch) | |
tree | a4865b181c2ae444fdc6baa4b2ab064e3e0eeedb /lib | |
parent | afb1c7fc4d9ee295a81625a01bb89732e973d603 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | lib/libjail/jail.c | 26 |
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; |