Author: kaktus
Date: Sat May 16 17:05:44 2020
New Revision: 361113
URL: https://svnweb.freebsd.org/changeset/base/361113

Log:
  sysctl: fix setting net.isr.dispatch during early boot
  
  Fix another collateral damage of r357614: netisr is initialised way before
  malloc() is available hence it can't use sysctl_handle_string() that
  allocates temporary buffer.  Handle that internally in
  sysctl_netisr_dispatch_policy().
  
  PR:           246114
  Reported by:  delphij
  Reviewed by:  kib
  Approved by:  kib (mentor)
  Differential Revision:        https://reviews.freebsd.org/D24858

Modified:
  head/sys/net/netisr.c

Modified: head/sys/net/netisr.c
==============================================================================
--- head/sys/net/netisr.c       Sat May 16 16:29:23 2020        (r361112)
+++ head/sys/net/netisr.c       Sat May 16 17:05:44 2020        (r361113)
@@ -345,19 +345,34 @@ static int
 sysctl_netisr_dispatch_policy(SYSCTL_HANDLER_ARGS)
 {
        char tmp[NETISR_DISPATCH_POLICY_MAXSTR];
+       size_t len;
        u_int dispatch_policy;
        int error;
 
        netisr_dispatch_policy_to_str(netisr_dispatch_policy, tmp,
            sizeof(tmp));
-       error = sysctl_handle_string(oidp, tmp, sizeof(tmp), req);
-       if (error == 0 && req->newptr != NULL) {
-               error = netisr_dispatch_policy_from_str(tmp,
-                   &dispatch_policy);
-               if (error == 0 && dispatch_policy == NETISR_DISPATCH_DEFAULT)
-                       error = EINVAL;
-               if (error == 0)
-                       netisr_dispatch_policy = dispatch_policy;
+       /*
+        * netisr is initialised very early during the boot when malloc isn't
+        * available yet so we can't use sysctl_handle_string() to process
+        * any non-default value that was potentially set via loader.
+        */
+       if (req->newptr != NULL) {
+               len = req->newlen - req->newidx;
+               if (len >= NETISR_DISPATCH_POLICY_MAXSTR)
+                       return (EINVAL);
+               error = SYSCTL_IN(req, tmp, len);
+               if (error == 0) {
+                       tmp[len] = '\0';
+                       error = netisr_dispatch_policy_from_str(tmp,
+                           &dispatch_policy);
+                       if (error == 0 &&
+                           dispatch_policy == NETISR_DISPATCH_DEFAULT)
+                               error = EINVAL;
+                       if (error == 0)
+                               netisr_dispatch_policy = dispatch_policy;
+               }
+       } else {
+               error = sysctl_handle_string(oidp, tmp, sizeof(tmp), req);
        }
        return (error);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to