Re: [Libvirt-cim] [PATCH V4] Fix kvm support check logic
by Boris Fiuczynski
Xu Wang,
it looks like there is still a memory leak on variable type in method
has_kvm_domain_type.
Mit freundlichen Grüßen/Kind Regards
Boris Fiuczynski
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martina Köderitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294
> Now system_has_kvm() would check all type value of domain label in
> caps. If any of them type is "kvm", system_has_kvm() return 1 as
> true result.
>
> Signed-off-by: Xu Wang <cngesaint(a)gmail.com>
> ---
> libxkutil/device_parsing.c | 13 +++++--------
> libxkutil/device_parsing.h | 2 +-
> src/Virt_VirtualSystemManagementService.c | 7 +------
> 3 files changed, 7 insertions(+), 15 deletions(-)
>
> diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
> index 16195da..98c6c54 100644
> --- a/libxkutil/device_parsing.c
> +++ b/libxkutil/device_parsing.c
> @@ -396,7 +396,7 @@ err:
> return 0;
> }
>
> -int parse_domain_type(xmlNodePtr node, char **value)
> +int has_kvm_domain_type(xmlNodePtr node)
> {
> xmlNodePtr child = NULL;
> char *type = NULL;
> @@ -405,22 +405,19 @@ int parse_domain_type(xmlNodePtr node, char **value)
> while (child != NULL) {
> if (XSTREQ(child->name, "domain")) {
> type = get_attr_value(child, "type");
> - if (type != NULL) {
> - *value = strdup(type);
> - goto out;
> + if (XSTREQ(type, "kvm")) {
> + return 1;
When leaving the method here type is leaking memory.
> }
> }
>
> - if (parse_domain_type(child, value) == 1) {
> - goto out;
> + if (has_kvm_domain_type(child) == 1) {
> + return 1;
> }
>
> child = child->next;
> }
>
> return 0;
> -out:
> - return 1;
> }
>
> static int parse_net_device(xmlNode *inode, struct virt_device **vdevs)
> diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
> index 733324f..6abcf14 100644
> --- a/libxkutil/device_parsing.h
> +++ b/libxkutil/device_parsing.h
> @@ -221,7 +221,7 @@ int attach_device(virDomainPtr dom, struct virt_device *dev);
> int detach_device(virDomainPtr dom, struct virt_device *dev);
> int change_device(virDomainPtr dom, struct virt_device *dev);
>
> -int parse_domain_type(xmlNodePtr node, char **value);
> +int has_kvm_domain_type(xmlNodePtr node);
>
> #define XSTREQ(x, y) (STREQ((char *)x, y))
> #define STRPROP(d, p, n) (d->p = get_node_content(n))
> diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
> index 8e1e6b1..199ab2d 100644
> --- a/src/Virt_VirtualSystemManagementService.c
> +++ b/src/Virt_VirtualSystemManagementService.c
> @@ -394,7 +394,6 @@ static bool system_has_kvm(const char *pfx)
> virConnectPtr conn;
> char *caps = NULL;
> bool disable_kvm = get_disable_kvm();
> - char *val = NULL;
> xmlDocPtr doc = NULL;
> xmlNodePtr node = NULL;
> int len;
> @@ -427,19 +426,15 @@ static bool system_has_kvm(const char *pfx)
> goto out;
> }
>
> - if (parse_domain_type(node, &val) &&
> - STREQC(val, "kvm")) {
> + if (has_kvm_domain_type(node)) {
> CU_DEBUG("The system support kvm!");
> kvm = true;
> - } else {
> - CU_DEBUG("Domain type is %s.", val);
> }
> }
>
> out:
> free(caps);
> free(doc);
> - free(val);
>
> virConnectClose(conn);
>
> --
> 1.7.1
11 years, 5 months