From 15f5811753c0be8d7e38c44dc1798740071ba5c1 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Thu, 31 May 2012 22:35:35 -0700 Subject: Free strings allocated by GetAtomName instead of letting them leak Fixes errors reported by Parfait 0.5.0.1 bug checking tool: Error: Memory leak (CWE 401) Memory leak of pointer '' 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). leaks when i >= info->num_classes at line 88. Error: Memory leak (CWE 401) Memory leak of pointer '' 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 '' 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 '' 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 '' 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 Signed-off-by: Peter Hutterer --- 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; } -- cgit v1.2.3