svn commit: r359975 - head/sys/kern
Pawel Biernacki
kaktus at FreeBSD.org
Wed Apr 15 16:33:56 UTC 2020
Author: kaktus
Date: Wed Apr 15 16:33:55 2020
New Revision: 359975
URL: https://svnweb.freebsd.org/changeset/base/359975
Log:
sysctl(9): fix handling string tunables.
r357614 changed internals of handling string sysctls, and inadvertently
broke setting string tunables. Take them into account.
PR: 245463
Reported by: jhb, np
Reviewed by: imp, jhb, kib
Approved by: kib (mentor)
Differential Revision: https://reviews.freebsd.org/D24429
Modified:
head/sys/kern/kern_sysctl.c
Modified: head/sys/kern/kern_sysctl.c
==============================================================================
--- head/sys/kern/kern_sysctl.c Wed Apr 15 16:33:27 2020 (r359974)
+++ head/sys/kern/kern_sysctl.c Wed Apr 15 16:33:55 2020 (r359975)
@@ -1648,13 +1648,15 @@ sysctl_handle_string(SYSCTL_HANDLER_ARGS)
int error = 0, ro_string = 0;
/*
- * If the sysctl isn't writable, microoptimise and treat it as a
- * const string.
+ * If the sysctl isn't writable and isn't a preallocated tunable that
+ * can be modified by kenv(2), microoptimise and treat it as a
+ * read-only string.
* A zero-length buffer indicates a fixed size read-only
* string. In ddb, don't worry about trying to make a malloced
* snapshot.
*/
- if (!(oidp->oid_kind & CTLFLAG_WR) || arg2 == 0 || kdb_active) {
+ if ((oidp->oid_kind & CTLFLAG_WR | CTLFLAG_TUN) == 0 || arg2 == 0
+ || kdb_active) {
arg2 = strlen((char *)arg1) + 1;
ro_string = 1;
}
@@ -1697,8 +1699,7 @@ sysctl_handle_string(SYSCTL_HANDLER_ARGS)
arg2 = req->newlen - req->newidx;
tmparg = malloc(arg2, M_SYSCTLTMP, M_WAITOK);
- error = copyin((const char *)req->newptr + req->newidx,
- tmparg, arg2);
+ error = SYSCTL_IN(req, tmparg, arg2);
if (error) {
free(tmparg, M_SYSCTLTMP);
return (error);
More information about the svn-src-all
mailing list