On 03/06/2013 02:24 PM, Osier Yang wrote:
On 2013年03月04日 14:01, Han Cheng wrote:
> @@ -2928,6 +2929,96 @@ virDomainParseLegacyDeviceAddress(char *devaddr,
> }
>
> static int
> +virDomainHostdevSubsysScsiDefParseXML(const xmlNodePtr node,
> + virDomainHostdevDefPtr def)
> +{
> + int ret = -1;
> + xmlNodePtr cur;
If you define those variables here:
char *bus, *target, *unit;
> +
> + cur = node->children;
> + while (cur != NULL) {
> + if (cur->type == XML_ELEMENT_NODE) {
> + if (xmlStrEqual(cur->name, BAD_CAST "address")) {
> + char *bus, *target, *unit;
> +
> + bus=virXMLPropString(cur, "bus");
> + if (bus) {
These codes can be simplified as:
if ((bus = virXMLPropString(cur, "bus"))< 0) {
virReportError(...);
goto out;
}
if (virStrToLong_ui(bus, NULL, 0,&def->source.subsys.u.scsi.bus)< 0) {
virReportError(...);
goto out;
}
With freeing the strings in "out". [1]
> + ret = virStrToLong_ui(bus, NULL, 0,
> +&def->source.subsys.u.scsi.bus);
> + VIR_FREE(bus);
> + if (ret< 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("cannot parse bus %s"), bus);
> + goto out;
...
> + }
> + }
> + cur = cur->next;
> + }
> +
> + ret = 0;
> +out:
[1]
VIR_FREE(bus);
VIR_FREE(target);
VIR_FREE(unit);
> + return ret;
> +}
> +
This may cause memory leak if someone add more than one <address> by
mistake.
Regards,
Cheng