>From 23526641083527139548c68b4637bae8350d2f98 Mon Sep 17 00:00:00 2001 From: David Allan Date: Thu, 4 Mar 2010 13:17:24 -0500 Subject: [PATCH 1/1] Free resources on error in udev startup * The udev driver didn't properly free resources that it allocates when setting up the 'computer' device in the error case. --- src/node_device/node_device_udev.c | 67 +++++++++++++++++++++-------------- 1 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index eee44c4..a6ca785 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1440,33 +1440,15 @@ out: } -static int udevSetupSystemDev(void) +static void +udevGetDMIData(union _virNodeDevCapData *data) { - virNodeDeviceDefPtr def = NULL; - virNodeDeviceObjPtr dev = NULL; struct udev *udev = NULL; struct udev_device *device = NULL; - union _virNodeDevCapData *data = NULL; char *tmp = NULL; - int ret = -1; - - if (VIR_ALLOC(def) != 0) { - virReportOOMError(); - goto out; - } - - def->name = strdup("computer"); - if (def->name == NULL) { - virReportOOMError(); - goto out; - } - - if (VIR_ALLOC(def->caps) != 0) { - virReportOOMError(); - goto out; - } udev = udev_monitor_get_udev(DRV_STATE_UDEV_MONITOR(driverState)); + device = udev_device_new_from_syspath(udev, DMI_DEVPATH); if (device == NULL) { device = udev_device_new_from_syspath(udev, DMI_DEVPATH_FALLBACK); @@ -1477,8 +1459,6 @@ static int udevSetupSystemDev(void) } } - data = &def->caps->data; - if (udevGetStringSysfsAttr(device, "product_name", &data->system.product_name) == PROPERTY_ERROR) { @@ -1508,8 +1488,7 @@ static int udevSetupSystemDev(void) &tmp) == PROPERTY_ERROR) { goto out; } - virUUIDParse(tmp, def->caps->data.system.hardware.uuid); - VIR_FREE(tmp); + virUUIDParse(tmp, data->system.hardware.uuid); if (udevGetStringSysfsAttr(device, "bios_vendor", @@ -1530,12 +1509,42 @@ static int udevSetupSystemDev(void) goto out; } - udev_device_unref(device); +out: + VIR_FREE(tmp); + if (device != NULL) { + udev_device_unref(device); + } + return; +} + + +static int udevSetupSystemDev(void) +{ + virNodeDeviceDefPtr def = NULL; + virNodeDeviceObjPtr dev = NULL; + int ret = -1; + + if (VIR_ALLOC(def) != 0) { + virReportOOMError(); + goto out; + } + + def->name = strdup("computer"); + if (def->name == NULL) { + virReportOOMError(); + goto out; + } + + if (VIR_ALLOC(def->caps) != 0) { + virReportOOMError(); + goto out; + } + + udevGetDMIData(&def->caps->data); dev = virNodeDeviceAssignDef(&driverState->devs, def); if (dev == NULL) { VIR_ERROR("Failed to create device for '%s'", def->name); - virNodeDeviceDefFree(def); goto out; } @@ -1544,6 +1553,10 @@ static int udevSetupSystemDev(void) ret = 0; out: + if (ret == -1) { + virNodeDeviceDefFree(def); + } + return ret; } -- 1.6.5.5