6949932 ddi_alias_to_currdip() and ddi_strdup() leaks
authorJerry Gilliam <Jerry.Gilliam@Sun.COM>
Thu, 06 May 2010 18:50:02 -0700
changeset 12329 edd9b6e1b428
parent 12328 3c94f669d87d
child 12330 e4f9a0025b49
6949932 ddi_alias_to_currdip() and ddi_strdup() leaks
usr/src/uts/common/os/devcfg.c
--- a/usr/src/uts/common/os/devcfg.c	Thu May 06 21:52:58 2010 -0400
+++ b/usr/src/uts/common/os/devcfg.c	Thu May 06 18:50:02 2010 -0700
@@ -8830,7 +8830,7 @@
 	char *curr;
 	dev_info_t *currdip = NULL;
 	char *aliasdup;
-	int len;
+	int rv, len;
 
 	pair = &(ddi_aliases.dali_alias_pairs[i]);
 	len = strlen(pair->pair_alias);
@@ -8848,7 +8848,6 @@
 	if (alias[len] != '/' && alias[len] != '\0')
 		goto out;
 
-
 	curr = kmem_alloc(MAXPATHLEN, KM_NOSLEEP);
 	if (curr == NULL) {
 		cmn_err(CE_PANIC, "curr alloc failed");
@@ -8864,11 +8863,18 @@
 
 out:
 	if (currdip) {
-		(void) mod_hash_insert(ddi_aliases.dali_alias_TLB,
+		rv = mod_hash_insert(ddi_aliases.dali_alias_TLB,
 		    (mod_hash_key_t)aliasdup, (mod_hash_val_t)curr);
+		if (rv != 0) {
+			kmem_free(curr, MAXPATHLEN);
+			strfree(aliasdup);
+		}
 	} else {
-		(void) mod_hash_insert(ddi_aliases.dali_alias_TLB,
+		rv = mod_hash_insert(ddi_aliases.dali_alias_TLB,
 		    (mod_hash_key_t)aliasdup, (mod_hash_val_t)NULL);
+		if (rv != 0) {
+			strfree(aliasdup);
+		}
 		if (curr)
 			kmem_free(curr, MAXPATHLEN);
 	}
@@ -8883,6 +8889,7 @@
 	char		*alias;
 	char		*currdup;
 	int		len;
+	int		rv;
 
 	pair = &(ddi_aliases.dali_curr_pairs[i]);
 
@@ -8920,8 +8927,11 @@
 	}
 
 out:
-	(void) mod_hash_insert(ddi_aliases.dali_curr_TLB,
+	rv = mod_hash_insert(ddi_aliases.dali_curr_TLB,
 	    (mod_hash_key_t)currdup, (mod_hash_val_t)alias);
+	if (rv != 0) {
+		strfree(currdup);
+	}
 
 	return (alias);
 }
@@ -8930,7 +8940,6 @@
 ddi_alias_redirect(char *alias)
 {
 	char		*curr;
-	char		*aliasdup;
 	dev_info_t	*currdip;
 	int		i;
 
@@ -8952,12 +8961,6 @@
 		goto out;
 	}
 
-	aliasdup = ddi_strdup(alias, KM_NOSLEEP);
-	if (aliasdup == NULL) {
-		cmn_err(CE_PANIC, "aliasdup alloc failed");
-		/*NOTREACHED*/
-	}
-
 	/* The TLB has no translation, do it the hard way */
 	currdip = NULL;
 	for (i = ddi_aliases.dali_num_pairs - 1; i >= 0; i--) {