aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Allan <dallan@redhat.com>2010-03-04 13:17:24 -0500
committerDavid Allan <dallan@redhat.com>2010-03-10 11:38:37 -0500
commitb978f31a930d816fb1e25843afd0f6bd8f96b86f (patch)
tree3a64b966676b7d50b5e41aae6990fdab3ebaa075 /src/node_device/node_device_udev.c
parentMake virsh reconnect when losing connection (diff)
downloadlibvirt-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.c67
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;
}