1
0
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:
Tamas TEVESZ
2011-04-18 20:39:06 +02:00
committed by Carlos R. Mafra
parent f6fefbd9b6
commit dce16306bc
4 changed files with 13 additions and 10 deletions

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}