]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Free resources on error in udev startup
authorDavid Allan <dallan@redhat.com>
Thu, 4 Mar 2010 18:17:24 +0000 (13:17 -0500)
committerDavid Allan <dallan@redhat.com>
Wed, 10 Mar 2010 16:38:37 +0000 (11:38 -0500)
* 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

index eee44c47f8b4b7798fe4706998d7d7c9e9f39412..a6ca7856cef7de7b187a21085a9e2a965ac07912 100644 (file)
@@ -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;
 }