提交 b978f31a 编写于 作者: D David Allan

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.
上级 056623f3
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册