Mercurial > illumos > illumos-gate
changeset 10872:2b1d93d31553
6802542 memory leak in fabric-xlate
author | Daniel Ice <Daniel.Ice@Sun.COM> |
---|---|
date | Mon, 26 Oct 2009 08:37:11 -0700 |
parents | f225409e4233 |
children | 4145146e1cfb |
files | usr/src/cmd/fm/modules/common/fabric-xlate/fabric-xlate.c |
diffstat | 1 files changed, 21 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/fm/modules/common/fabric-xlate/fabric-xlate.c Mon Oct 26 07:40:04 2009 -0600 +++ b/usr/src/cmd/fm/modules/common/fabric-xlate/fabric-xlate.c Mon Oct 26 08:37:11 2009 -0700 @@ -445,6 +445,7 @@ #define HAS_PROP(node, name) xmlHasProp(node, (const xmlChar *)name) #define GET_PROP(node, name) ((char *)xmlGetProp(node, (const xmlChar *)name)) +#define FREE_PROP(prop) xmlFree((xmlChar *)prop) #define STRCMP(s1, s2) (strcmp((const char *)s1, (const char *)s2) == 0) #define FAB_LOOKUP(sz, name, field) \ @@ -673,12 +674,13 @@ nvlist_free(erpt); goto done; } - (void) nvlist_add_string(detector, FM_VERSION, + (void) nvlist_add_uint8(detector, FM_VERSION, FM_DEV_SCHEME_VERSION); (void) nvlist_add_string(detector, FM_FMRI_SCHEME, FM_FMRI_SCHEME_DEV); (void) nvlist_add_string(detector, FM_FMRI_DEV_PATH, fmri); (void) nvlist_add_nvlist(erpt, FM_EREPORT_DETECTOR, detector); + nvlist_free(detector); /* Add the address payload */ (void) nvlist_add_uint64(erpt, PCI_PA, tgt_addr); @@ -1774,17 +1776,21 @@ /* Decode the list of assigned addresses xml nodes for each device */ for (i = 0; i < size; i++) { + char *tprop; + devNode = nodes->nodeTab[i]; if (!HAS_PROP(devNode, "value")) continue; /* Convert "string" assigned-addresses to pci_regspec_t */ j = 0; - for (token = strtok(GET_PROP(devNode, "value"), " "); token; + tprop = GET_PROP(devNode, "value"); + for (token = strtok(tprop, " "); token; token = strtok(NULL, " ")) { prop[j++] = strtoul(token, (char **)NULL, 16); } prop[j] = (uint32_t)-1; + FREE_PROP(tprop); /* Check if address belongs to this device */ for (assign_p = (pci_regspec_t *)prop; @@ -1803,22 +1809,33 @@ /* Traverse up the xml tree and back down to find the right propgroup */ for (devNode = devNode->parent->parent->children; devNode; devNode = devNode->next) { + char *tprop; + + tprop = GET_PROP(devNode, "name"); if (STRCMP(devNode->name, "propgroup") && - STRCMP(GET_PROP(devNode, "name"), "io")) + STRCMP(tprop, "io")) { + FREE_PROP(tprop); goto propgroup; + } + FREE_PROP(tprop); } goto fail; propgroup: /* Retrive the "dev" propval and return */ for (devNode = devNode->children; devNode; devNode = devNode->next) { + char *tprop; + + tprop = GET_PROP(devNode, "name"); if (STRCMP(devNode->name, "propval") && - STRCMP(GET_PROP(devNode, "name"), "dev")) { + STRCMP(tprop, "dev")) { + FREE_PROP(tprop); retval = GET_PROP(devNode, "value"); fmd_hdl_debug(hdl, "Addr Dev Path: %s\n", retval); xmlXPathFreeObject(xpathObj); return (retval); } + FREE_PROP(tprop); } fail: if (xpathObj != NULL)