[libvirt PATCH] esx: generator: fix free of elements in lists

Neal Gompa ngompa13 at gmail.com
Thu Sep 10 11:52:23 UTC 2020


On Thu, Sep 10, 2020 at 7:48 AM Pino Toscano <ptoscano at redhat.com> wrote:
>
> When a list is freed, we iterate through all the items, invoking the
> free function for each; the actual free function called for each element
> is the function of the actual type of each element, and thus the @_next
> pointer in the element struct has the same type as the element itself.
> Currently, the free function gets the parent of the current element
> type, and invoke its free function to continue freeing the list.
> However, in case the hierarchy of the classes has more than 1 level
> (i.e. Class <- SubClass <- SubSubClass), the invoked free function is
> only the parent class' one, and not the actual base class of the
> hierarchy.
>
> To fix that, change the generator to get the ancestor of a class, and
> invoking that instead.  Also, avoid to set the @_next back, as it is not
> needed.
>
> Fixes commits 5cff36e39ae691fbd7c40597df1732eecf294150 and
> f76c6dde2e33233566e886d96e76b5fe0c102d9a.
>
> Signed-off-by: Pino Toscano <ptoscano at redhat.com>
> ---
>  scripts/esx_vi_generator.py | 26 +++++++++++++++++++++-----
>  1 file changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/scripts/esx_vi_generator.py b/scripts/esx_vi_generator.py
> index 863c8af964..be9b3949e8 100755
> --- a/scripts/esx_vi_generator.py
> +++ b/scripts/esx_vi_generator.py
> @@ -751,13 +751,13 @@ class Object(GenericObject):
>          source += "{\n"
>
>          if self.features & Object.FEATURE__LIST:
> -            if self.extends is not None:
> +            ancestor = get_ancestor(self)
> +            if ancestor:
>                  # avoid "dereferencing type-punned pointer will break
>                  # strict-aliasing rules" warnings
> -                source += "    esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \
> -                          % (self.extends, self.extends)
> -                source += "    esxVI_%s_Free(&next);\n" % self.extends
> -                source += "    item->_next = (esxVI_%s *)next;\n\n" % self.name
> +                source += "    esxVI_%s *baseNext = (esxVI_%s *)item->_next;\n" \
> +                          % (ancestor, ancestor)
> +                source += "    esxVI_%s_Free(&baseNext);\n\n" % ancestor
>              else:
>                  source += "    esxVI_%s_Free(&item->_next);\n\n" % self.name
>
> @@ -1250,6 +1250,21 @@ def is_known_type(type):
>              type in enums_by_name)
>
>
> +def get_ancestor(obj):
> +    if not obj.extends:
> +        return None
> +    ancestor = None
> +    try:
> +        ancestor = ancestor_by_name[obj.extends]
> +    except KeyError:
> +        parent = objects_by_name[obj.extends]
> +        ancestor = get_ancestor(parent)
> +        if not ancestor:
> +            ancestor = parent.name
> +        ancestor_by_name[name] = ancestor
> +    return ancestor
> +
> +
>  def open_file(filename):
>      return open(filename, "wt")
>
> @@ -1341,6 +1356,7 @@ managed_objects_by_name = {}
>  enums_by_name = {}
>  methods_by_name = {}
>  block = None
> +ancestor_by_name = {}
>
>
>  # parse input file
> --
> 2.26.2
>

LGTM.

Reviewed-by: Neal Gompa <ngompa13 at gmail.com>

-- 
真実はいつも一つ!/ Always, there's only one truth!





More information about the libvir-list mailing list