
Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com> --- libxkutil/device_parsing.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 53 insertions(+), 0 deletions(-) diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c index 7900e06..ea84d07 100644 --- a/libxkutil/device_parsing.c +++ b/libxkutil/device_parsing.c @@ -52,6 +52,49 @@ /* Device parse function */ typedef int (*dev_parse_func_t)(xmlNode *, struct virt_device **); +static void cleanup_node_of_others(struct others *others) +{ + if (others == NULL) { + return; + } + + if (others->name) { + free(others->name); + } + + if (others->parent) { + free(others->parent); + } + + if (others->value) { + free(others->value); + } + + free(others); +} + +static void cleanup_others(struct others *others) +{ + struct others *head = others; + + if (others == NULL) + return; + + while (head) { + head = others->next; + cleanup_node_of_others(others); + others = head; + } +} + +static void cleanup_unknown_device(struct unknown_device *dev) +{ + if (dev == NULL) + return; + + cleanup_others(dev->others); +} + static void cleanup_disk_device(struct disk_device *dev) { if (dev == NULL) @@ -66,6 +109,7 @@ static void cleanup_disk_device(struct disk_device *dev) free(dev->virtual_dev); free(dev->bus_type); free(dev->access_mode); + cleanup_others(dev->others); } static void cleanup_vsi_device(struct vsi_device *dev) @@ -94,6 +138,7 @@ static void cleanup_net_device(struct net_device *dev) free(dev->device); free(dev->net_mode); free(dev->filter_ref); + cleanup_others(dev->others); } static void cleanup_emu_device(struct emu_device *dev) @@ -102,6 +147,7 @@ static void cleanup_emu_device(struct emu_device *dev) return; free(dev->path); + cleanup_others(dev->others); } static void cleanup_vnc_device(struct graphics_device *dev) @@ -110,6 +156,7 @@ static void cleanup_vnc_device(struct graphics_device *dev) free(dev->dev.vnc.host); free(dev->dev.vnc.keymap); free(dev->dev.vnc.passwd); + cleanup_others(dev->dev.vnc.others); } static void cleanup_sdl_device(struct graphics_device *dev) @@ -117,6 +164,7 @@ static void cleanup_sdl_device(struct graphics_device *dev) free(dev->dev.sdl.display); free(dev->dev.sdl.xauth); free(dev->dev.sdl.fullscreen); + cleanup_others(dev->dev.sdl.others); } static void cleanup_graphics_device(struct graphics_device *dev) @@ -130,6 +178,7 @@ static void cleanup_graphics_device(struct graphics_device *dev) cleanup_vnc_device(dev); free(dev->type); + cleanup_others(dev->others); } static void cleanup_input_device(struct input_device *dev) @@ -139,6 +188,7 @@ static void cleanup_input_device(struct input_device *dev) free(dev->type); free(dev->bus); + cleanup_others(dev->others); } void cleanup_virt_device(struct virt_device *dev) @@ -156,6 +206,8 @@ void cleanup_virt_device(struct virt_device *dev) cleanup_graphics_device(&dev->dev.graphics); else if (dev->type == CIM_RES_TYPE_INPUT) cleanup_input_device(&dev->dev.input); + else if (dev->type == CIM_RES_TYPE_UNKNOWN) + cleanup_unknown_device(&dev->dev.unknown); free(dev->id); @@ -1351,6 +1403,7 @@ void cleanup_dominfo(struct domain **dominfo) cleanup_virt_devices(&dom->dev_vcpu, dom->dev_vcpu_ct); cleanup_virt_devices(&dom->dev_graphics, dom->dev_graphics_ct); cleanup_virt_devices(&dom->dev_input, dom->dev_input_ct); + cleanup_virt_devices(&dom->dev_unknown, dom->dev_unknown_ct); free(dom); -- 1.7.1