From dce16306bc697874590208af232db8c6c72ca31a Mon Sep 17 00:00:00 2001 From: Tamas TEVESZ Date: Mon, 18 Apr 2011 20:39:06 +0200 Subject: [PATCH] Plug some (possible) memleaks PropGetWMClass() - XAllocClassHint()s a struct for class hint data - This is filled by XGetClassHint(), which in turn uses Xlib to allocate some more space for XClassHint members - Upon XGetClassHint() failure, "default" is libc malloc'd (via strdup), and is returned to the caller - Upon XGetClassHint() success, XClassHint members are returned raw -- these members must be freed with XFree() (see XAllocClassHint(3)) - Thus it's up to PropGetWMClass() callers to decide (based upon the return value) which method (libc free() or XFree()) to use to free res_name and res_class. This was done nowhere, thus leaking some memory on every failed PropGetWMClass() call. - So just strdup the successful res_name/res_class members, XFree() them while still in PropGetWMClass(), and allow callers to unconditionally libc free() whatever PropGetWMClass() returns. --- src/dock.c | 4 ++-- src/properties.c | 7 +++++-- src/session.c | 4 ++-- src/window.c | 8 ++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/dock.c b/src/dock.c index 5e7cc934..9d74b490 100644 --- a/src/dock.c +++ b/src/dock.c @@ -3015,9 +3015,9 @@ void wDockTrackWindowLaunch(WDock * dock, Window window) wfree(command); if (wm_class) - XFree(wm_class); + free(wm_class); if (wm_instance) - XFree(wm_instance); + free(wm_instance); } void wClipUpdateForWorkspaceChange(WScreen * scr, int workspace) diff --git a/src/properties.c b/src/properties.c index 7279de12..46bc3caa 100644 --- a/src/properties.c +++ b/src/properties.c @@ -71,10 +71,13 @@ int PropGetWMClass(Window window, char **wm_class, char **wm_instance) XFree(class_hint); return False; } - *wm_instance = class_hint->res_name; - *wm_class = class_hint->res_class; + *wm_instance = strdup(class_hint->res_name); + *wm_class = strdup(class_hint->res_class); + XFree(class_hint->res_name); + XFree(class_hint->res_class); XFree(class_hint); + return True; } diff --git a/src/session.c b/src/session.c index 4a50f78a..811aee3b 100644 --- a/src/session.c +++ b/src/session.c @@ -257,9 +257,9 @@ static WMPropList *makeWindowState(WWindow * wwin, WApplication * wapp) } if (instance) - XFree(instance); + free(instance); if (class) - XFree(class); + free(class); if (command) wfree(command); diff --git a/src/window.c b/src/window.c index bfc0ade4..7402b7de 100644 --- a/src/window.c +++ b/src/window.c @@ -830,9 +830,9 @@ WWindow *wManageWindow(WScreen *scr, Window window) wwin->main_window = fPtr->leader; } if (instance) - XFree(instance); + free(instance); if (class) - XFree(class); + free(class); #undef ADEQUATE } @@ -2654,9 +2654,9 @@ WMagicNumber wWindowGetSavedState(Window win) if (command) wfree(command); if (instance) - XFree(instance); + free(instance); if (class) - XFree(class); + free(class); return wstate; } -- 2.11.4.GIT