mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-20 04:48:06 +01:00
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.
This commit is contained in:
committed by
Carlos R. Mafra
parent
f6fefbd9b6
commit
dce16306bc
@@ -3015,9 +3015,9 @@ void wDockTrackWindowLaunch(WDock * dock, Window window)
|
|||||||
wfree(command);
|
wfree(command);
|
||||||
|
|
||||||
if (wm_class)
|
if (wm_class)
|
||||||
XFree(wm_class);
|
free(wm_class);
|
||||||
if (wm_instance)
|
if (wm_instance)
|
||||||
XFree(wm_instance);
|
free(wm_instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wClipUpdateForWorkspaceChange(WScreen * scr, int workspace)
|
void wClipUpdateForWorkspaceChange(WScreen * scr, int workspace)
|
||||||
|
|||||||
@@ -71,10 +71,13 @@ int PropGetWMClass(Window window, char **wm_class, char **wm_instance)
|
|||||||
XFree(class_hint);
|
XFree(class_hint);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
*wm_instance = class_hint->res_name;
|
*wm_instance = strdup(class_hint->res_name);
|
||||||
*wm_class = class_hint->res_class;
|
*wm_class = strdup(class_hint->res_class);
|
||||||
|
|
||||||
|
XFree(class_hint->res_name);
|
||||||
|
XFree(class_hint->res_class);
|
||||||
XFree(class_hint);
|
XFree(class_hint);
|
||||||
|
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -257,9 +257,9 @@ static WMPropList *makeWindowState(WWindow * wwin, WApplication * wapp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (instance)
|
if (instance)
|
||||||
XFree(instance);
|
free(instance);
|
||||||
if (class)
|
if (class)
|
||||||
XFree(class);
|
free(class);
|
||||||
if (command)
|
if (command)
|
||||||
wfree(command);
|
wfree(command);
|
||||||
|
|
||||||
|
|||||||
@@ -830,9 +830,9 @@ WWindow *wManageWindow(WScreen *scr, Window window)
|
|||||||
wwin->main_window = fPtr->leader;
|
wwin->main_window = fPtr->leader;
|
||||||
}
|
}
|
||||||
if (instance)
|
if (instance)
|
||||||
XFree(instance);
|
free(instance);
|
||||||
if (class)
|
if (class)
|
||||||
XFree(class);
|
free(class);
|
||||||
#undef ADEQUATE
|
#undef ADEQUATE
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2654,9 +2654,9 @@ WMagicNumber wWindowGetSavedState(Window win)
|
|||||||
if (command)
|
if (command)
|
||||||
wfree(command);
|
wfree(command);
|
||||||
if (instance)
|
if (instance)
|
||||||
XFree(instance);
|
free(instance);
|
||||||
if (class)
|
if (class)
|
||||||
XFree(class);
|
free(class);
|
||||||
|
|
||||||
return wstate;
|
return wstate;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user