changeset 25234:75715aa4fe66

11911 Inconsistent case handling for properties in dladm Reviewed by: Andrew Stormont <astormont@racktopsystems.com> Reviewed by: Albert Lee <alee@racktopsystems.com> Reviewed by: Paul Winder <paul@winder.uk.net> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Robert Mustacchi <rm@fingolfin.org>
author Garrett D'Amore <garrett@damore.org>
date Fri, 01 Nov 2019 12:39:34 -0700
parents bf151a4cdf4e
children cb6c7dac98cb
files usr/src/lib/libdladm/common/linkprop.c
diffstat 1 files changed, 26 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/libdladm/common/linkprop.c	Mon Apr 13 20:00:45 2020 +0300
+++ b/usr/src/lib/libdladm/common/linkprop.c	Fri Nov 01 12:39:34 2019 -0700
@@ -1107,6 +1107,21 @@
 	}
 
 	/*
+	 * For well-known property names, normalize the case.  We can also
+	 * save the property name itself, so that we can just do a pointer
+	 * equality test later and avoid an extra strcmp.
+	 */
+	if (prop_name != NULL) {
+		int i;
+		for (i = 0; i < DLADM_MAX_PROPS; i++) {
+			if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) {
+				prop_name = prop_table[i].pd_name;
+				break;
+			}
+		}
+	}
+
+	/*
 	 * Check for valid link property against the flags passed
 	 * and set the link property when active flag is passed.
 	 */
@@ -1136,7 +1151,7 @@
 				if (!(pdp->pd_flags & PD_AFTER_PERM))
 					continue;
 				if (prop_name != NULL &&
-				    strcasecmp(prop_name, pdp->pd_name) != 0)
+				    prop_name != pdp->pd_name)
 					continue;
 				status = pdp->pd_set(handle, pdp, linkid, NULL,
 				    0, flags, 0);
@@ -1216,9 +1231,12 @@
 	    prop_val == NULL || val_cntp == NULL || *val_cntp == 0)
 		return (DLADM_STATUS_BADARG);
 
-	for (i = 0; i < DLADM_MAX_PROPS; i++)
-		if (strcasecmp(prop_name, prop_table[i].pd_name) == 0)
+	for (i = 0; i < DLADM_MAX_PROPS; i++) {
+		if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) {
+			prop_name = prop_table[i].pd_name;
 			break;
+		}
+	}
 
 	if (i == DLADM_MAX_PROPS) {
 		if (prop_name[0] == '_') {
@@ -1348,9 +1366,12 @@
 	    ret_val == NULL || val_cntp == NULL || *val_cntp == 0)
 		return (DLADM_STATUS_BADARG);
 
-	for (pdp = prop_table; pdp < prop_table + DLADM_MAX_PROPS; pdp++)
-		if (strcasecmp(prop_name, pdp->pd_name) == 0)
+	for (pdp = prop_table; pdp < prop_table + DLADM_MAX_PROPS; pdp++) {
+		if (strcasecmp(prop_name, pdp->pd_name) == 0) {
+			prop_name = pdp->pd_name;
 			break;
+		}
+	}
 
 	if (pdp == prop_table + DLADM_MAX_PROPS)
 		return (DLADM_STATUS_NOTFOUND);