diff options
author | David Allan <dallan@redhat.com> | 2010-03-04 13:17:24 -0500 |
---|---|---|
committer | David Allan <dallan@redhat.com> | 2010-03-10 11:38:37 -0500 |
commit | b978f31a930d816fb1e25843afd0f6bd8f96b86f (patch) | |
tree | 3a64b966676b7d50b5e41aae6990fdab3ebaa075 /src/node_device/node_device_udev.c | |
parent | Make virsh reconnect when losing connection (diff) | |
download | libvirt-b978f31a930d816fb1e25843afd0f6bd8f96b86f.tar.gz libvirt-b978f31a930d816fb1e25843afd0f6bd8f96b86f.tar.bz2 libvirt-b978f31a930d816fb1e25843afd0f6bd8f96b86f.zip |
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.
Diffstat (limited to 'src/node_device/node_device_udev.c')
-rw-r--r-- | 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 eee44c47f..a6ca7856c 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; } |