svn commit: r268509 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Thu Jul 10 21:46:57 UTC 2014


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);


More information about the svn-src-head mailing list