Author: mjg
Date: Thu Jul 10 21:46:57 2014
New Revision: 268509
URL: http://svnweb.freebsd.org/changeset/base/268509

Log:
  Don't make a temporary copy of fixed sysctl strings.

Modified:
  head/sys/kern/kern_sysctl.c

Modified: head/sys/kern/kern_sysctl.c
==============================================================================
--- head/sys/kern/kern_sysctl.c Thu Jul 10 21:11:48 2014        (r268508)
+++ head/sys/kern/kern_sysctl.c Thu Jul 10 21:46:57 2014        (r268509)
@@ -1216,26 +1216,33 @@ int
 sysctl_handle_string(SYSCTL_HANDLER_ARGS)
 {
        size_t outlen;
-       int error = 0;
+       int error = 0, ro_string = 0;
 
        /*
         * A zero-length buffer indicates a fixed size read-only
         * string:
         */
-       if (arg2 == 0)
+       if (arg2 == 0) {
                arg2 = strlen((char *)arg1) + 1;
+               ro_string = 1;
+       }
 
        if (req->oldptr != NULL) {
                char *tmparg;
 
-               /* try to make a coherent snapshot of the string */
-               tmparg = malloc(arg2, M_SYSCTLTMP, M_WAITOK);
-               memcpy(tmparg, arg1, arg2);
+               if (ro_string) {
+                       tmparg = arg1;
+               } else {
+                       /* try to make a coherent snapshot of the string */
+                       tmparg = malloc(arg2, M_SYSCTLTMP, M_WAITOK);
+                       memcpy(tmparg, arg1, arg2);
+               }
 
                outlen = strnlen(tmparg, arg2 - 1) + 1;
                error = SYSCTL_OUT(req, tmparg, outlen);
 
-               free(tmparg, M_SYSCTLTMP);
+               if (!ro_string)
+                       free(tmparg, M_SYSCTLTMP);
        } else {
                outlen = strnlen((char *)arg1, arg2 - 1) + 1;
                error = SYSCTL_OUT(req, NULL, outlen);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to