Print this page
9637 Memleak in pcibus.so`pci_slot_label_lookup.

@@ -219,11 +219,11 @@
 char *
 pci_slot_label_lookup(topo_mod_t *mod, tnode_t *node, did_t *dp, did_t *pdp)
 {
         tnode_t *anode, *apnode;
         did_t *adp, *apdp;
-        char *plat, *pp, *l, *ancestor_l = NULL, *new_l = NULL;
+        char *plat, *pp, *l = NULL, *ancestor_l = NULL, *new_l = NULL;
         int err, b, d, f, done = 0;
         size_t len;
 
         did_BDF(dp, &b, &d, &f);
 

@@ -350,20 +350,13 @@
                     __func__, node, ancestor_l, l);
                 len = strlen(ancestor_l) + strlen(l) + 2;
                 new_l = alloca(len);
                 (void) snprintf(new_l, len, "%s/%s", ancestor_l, l);
                 l = new_l;
-        } else {
+        } else if (topo_prop_get_string(node, FM_FMRI_AUTHORITY,
+            FM_FMRI_AUTH_PRODUCT, &plat, &err) == 0) {
                 /*
-                 * Get platform name used for lookups.
-                 */
-                if (topo_prop_get_string(node, FM_FMRI_AUTHORITY,
-                    FM_FMRI_AUTH_PRODUCT, &plat, &err) < 0) {
-                        (void) topo_mod_seterrno(mod, err);
-                        return (NULL);
-                }
-                /*
                  * Trim SUNW, from the platform name
                  */
                 pp = strchr(plat, ',');
                 if (pp == NULL)
                         pp = plat;

@@ -394,12 +387,17 @@
                                 l = (char *)
                                     pci_label_missing_lookup(mod, pp, dp);
                         }
                 }
                 topo_mod_strfree(mod, plat);
+        } else {
+                (void) topo_mod_seterrno(mod, err);
+                l = NULL;
         }
 
+        topo_mod_strfree(mod, ancestor_l);
+
         /*
          * If we calculated a slot label,  then save it in the
          * node's data structure so we can free it later.
          */
         if (l) {