[libvirt] [PATCH] virBitmapFree: Change the function to a macro

Ján Tomko jtomko at redhat.com
Mon Sep 9 11:24:24 UTC 2013


On 09/09/2013 05:57 AM, Liuji (Jeremy) wrote:
> The virBitmapFree is:
>         void virBitmapFree(virBitmapPtr bitmap)
>         {
>             if (bitmap) {
>                 VIR_FREE(bitmap->map);
>                 VIR_FREE(bitmap);
>             }
>         }
> Bitmap is a parameter (formal parameter). The address which is pointed by Bitmap is the same as argument(actual parameter) pointed.
> In " VIR_FREE(bitmap);", it frees the same address. But only assigns the NULL to the Bitmap, not to the argument(actual parameter).
> After calling virBitmapFree, if there is not assigning NULL to the argument(actual parameter), and using this argument(actual parameter) to call
> the virBitmapFree again, it will free an already freed address. It will generate a crash.
> 
> There are 3 solutions:
> 1> After call virBitmapFree function, add a assignment which is assign NULL to the argument(actual parameter) of virBitmapFree.
> 2> Change the virBitmapFree to :
>         void virBitmapFree(virBitmapPtr *bitmap)
>         {
>             if (*bitmap) {
>                 VIR_FREE((*bitmap)->map);
>                 VIR_FREE(*bitmap);
>             }
>         }
> And change all virBitmapFree calling from 
>        virBitmapFree(abc)
> to
>        virBitmapFree(&abc)
> 3> change the virBitmapFree to a macro, like my first mail.
> 
> 
> Because the 1 and 2 solutions will modify the code in many code segment. So, I prefer the 3 solution.

Most of the code doesn't use the bitmap after it's freed, it seems it's just
the one case of numatune nodemask that needs to be fixed. I vote for option
(1). I think it's better to be consistent with what other *Free functions do.

Jan




More information about the libvir-list mailing list