[PATCH:xinput] Free strings allocated by GetAtomName instead of letting them leak

Peter Hutterer peter.hutterer at who-t.net
Thu May 31 23:06:31 PDT 2012


On Thu, May 31, 2012 at 10:35:35PM -0700, Alan Coopersmith wrote:
> Fixes errors reported by Parfait 0.5.0.1 bug checking tool:
> 
> Error: Memory leak (CWE 401)
>    Memory leak of pointer '<unknown>' allocated with XGetAtomName(dpy, info->type)
>         at line 122 of src/list.c in function 'print_info'.
>           pointer allocated at line 84 with XGetAtomName(dpy, info->type).
>           <unknown> leaks when i >= info->num_classes at line 88.
> Error: Memory leak (CWE 401)
>    Memory leak of pointer '<unknown>' allocated with XGetAtomName(dpy, a)
>         at line 160 of src/property.c in function 'print_property'.
>           pointer allocated at line 131 with XGetAtomName(dpy, a).
>    Memory leak of pointer '<unknown>' allocated with XGetAtomName(dpy, act_type)
>         at line 160 of src/property.c in function 'print_property'.
>           pointer allocated at line 143 with XGetAtomName(dpy, act_type).
>    Memory leak of pointer 'name' allocated with XGetAtomName(dpy, property)
>         at line 160 of src/property.c in function 'print_property'.
>           'name' allocated at line 61 with XGetAtomName(dpy, property).
> Error: Memory leak (CWE 401)
>    Memory leak of pointer '<unknown>' allocated with XGetAtomName(dpy, a)
>         at line 521 of src/property.c in function 'print_property_xi2'.
>           pointer allocated at line 491 with XGetAtomName(dpy, a).
>    Memory leak of pointer '<unknown>' allocated with XGetAtomName(dpy, act_type)
>         at line 521 of src/property.c in function 'print_property_xi2'.
>           pointer allocated at line 504 with XGetAtomName(dpy, act_type).
>    Memory leak of pointer 'name' allocated with XGetAtomName(dpy, property)
>         at line 521 of src/property.c in function 'print_property_xi2'.
>           'name' allocated at line 428 with XGetAtomName(dpy, property).
> 
> Confirmed with Solaris Studio runtime checker that "list-props" now has
> fewer leaks than before and "watch-props" no longer leaks a string every
> time a property changes.
> 
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>

   60fe84e..15f5811  master -> master

thanks

Cheers,
  Peter


> ---
>  src/list.c     |    7 +++++--
>  src/property.c |   25 +++++++++++++++----------
>  2 files changed, 20 insertions(+), 12 deletions(-)
> 
> diff --git a/src/list.c b/src/list.c
> index cc39bd3..3fa123b 100644
> --- a/src/list.c
> +++ b/src/list.c
> @@ -80,8 +80,11 @@ print_info(Display* dpy, XDeviceInfo	*info, enum print_format format)
>      if (format == FORMAT_SHORT)
>          return;
>  
> -    if(info->type != None)
> -	printf("\tType is %s\n", XGetAtomName(dpy, info->type));
> +    if (info->type != None) {
> +	char *type = XGetAtomName(dpy, info->type);
> +	printf("\tType is %s\n", type);
> +	XFree(type);
> +    }
>  
>      if (info->num_classes > 0) {
>  	any = (XAnyClassPtr) (info->inputclassinfo);
> diff --git a/src/property.c b/src/property.c
> index 14e4308..66a3842 100644
> --- a/src/property.c
> +++ b/src/property.c
> @@ -60,6 +60,7 @@ print_property(Display *dpy, XDevice* dev, Atom property)
>  
>      name = XGetAtomName(dpy, property);
>      printf("\t%s (%ld):\t", name, property);
> +    XFree(name);
>  
>      if (XGetDeviceProperty(dpy, dev, property, 0, 1000, False,
>                             AnyPropertyType, &act_type, &act_format,
> @@ -127,9 +128,9 @@ print_property(Display *dpy, XDevice* dev, Atom property)
>                  case XA_ATOM:
>                      {
>                          Atom a = *(Atom*)ptr;
> -                        printf("\"%s\" (%d)",
> -                                (a) ? XGetAtomName(dpy, a) : "None",
> -                                (int)a);
> +                        name = (a) ? XGetAtomName(dpy, a) : NULL;
> +                        printf("\"%s\" (%d)", name ? name : "None", (int)a);
> +                        XFree(name);
>                          break;
>                      }
>                  default:
> @@ -139,8 +140,9 @@ print_property(Display *dpy, XDevice* dev, Atom property)
>                          break;
>                      }
>  
> -                    printf("\t... of unknown type '%s'\n",
> -                            XGetAtomName(dpy, act_type));
> +                    name = XGetAtomName(dpy, act_type);
> +                    printf("\t... of unknown type '%s'\n", name);
> +                    XFree(name);
>                      done = True;
>                      break;
>              }
> @@ -250,6 +252,7 @@ int watch_props(Display *dpy, int argc, char** argv, char* n, char *desc)
>  
>          name = XGetAtomName(dpy, dpev->atom);
>          printf("Property '%s' changed.\n", name);
> +        XFree(name);
>          print_property(dpy, dev, dpev->atom);
>      }
>  
> @@ -427,6 +430,7 @@ print_property_xi2(Display *dpy, int deviceid, Atom property)
>  
>      name = XGetAtomName(dpy, property);
>      printf("\t%s (%ld):\t", name, property);
> +    XFree(name);
>  
>      if (XIGetProperty(dpy, deviceid, property, 0, 1000, False,
>                             AnyPropertyType, &act_type, &act_format,
> @@ -487,9 +491,9 @@ print_property_xi2(Display *dpy, int deviceid, Atom property)
>                  case XA_ATOM:
>                      {
>                          Atom a = *(uint32_t*)ptr;
> -                        printf("\"%s\" (%ld)",
> -                                (a) ? XGetAtomName(dpy, a) : "None",
> -                                a);
> +                        name = (a) ? XGetAtomName(dpy, a) : NULL;
> +                        printf("\"%s\" (%ld)", name ? name : "None", a);
> +                        XFree(name);
>                          break;
>                      }
>                      break;
> @@ -500,8 +504,9 @@ print_property_xi2(Display *dpy, int deviceid, Atom property)
>                          break;
>                      }
>  
> -                    printf("\t... of unknown type %s\n",
> -                            XGetAtomName(dpy, act_type));
> +                    name = XGetAtomName(dpy, act_type);
> +                    printf("\t... of unknown type %s\n", name);
> +                    XFree(name);
>                      done = True;
>                      break;
>              }
> -- 
> 1.7.9.2
> 


More information about the xorg-devel mailing list