aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-04-18 16:09:30 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-04-19 18:32:01 +0000
commit4342ba184c15f3b8912e95f93fe313731963f065 (patch)
tree67fc6bdfe61175d5886979c5cfe778bc64e27063
parent578c26f31c0c90c9e6b2f7125a8539c307a51dff (diff)
downloadsrc-4342ba184c15f3b8912e95f93fe313731963f065.tar.gz
src-4342ba184c15f3b8912e95f93fe313731963f065.zip
sysctl_handle_string: do not malloc when SYSCTL_IN cannot fault
In particular, this avoids malloc(9) calls when from early tunable handling, with no working malloc yet. Reported and tested by: mav Sponsored by: The FreeBSD Foundation MFC after: 1 week
-rw-r--r--sys/kern/kern_sysctl.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 011e3f44a124..e46584758c9b 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1785,6 +1785,15 @@ sysctl_handle_string(SYSCTL_HANDLER_ARGS)
sx_xlock(&sysctlstringlock);
((char *)arg1)[0] = '\0';
sx_xunlock(&sysctlstringlock);
+ } else if (req->newfunc == sysctl_new_kernel) {
+ arg2 = req->newlen - req->newidx;
+ sx_xlock(&sysctlstringlock);
+ error = SYSCTL_IN(req, arg1, arg2);
+ if (error == 0) {
+ ((char *)arg1)[arg2] = '\0';
+ req->newidx += arg2;
+ }
+ sx_xunlock(&sysctlstringlock);
} else {
arg2 = req->newlen - req->newidx;
tmparg = malloc(arg2, M_SYSCTLTMP, M_WAITOK);