From e832a1d046ea4ea948aab122d5aa8ea9097a9b6a Mon Sep 17 00:00:00 2001 From: Darkvater Date: Sat, 13 Jan 2007 15:50:36 +0000 Subject: (svn r8101) -Fix (runknown): Plug potential memleaks when calling UnInitWindowSystem. The function directly deleted all windows instead of calling their respective deallocators which could then in turn any used memory. --- src/window.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/window.cpp b/src/window.cpp index 7977bed0c..045a80c65 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -902,14 +902,19 @@ void InitWindowSystem(void) void UnInitWindowSystem(void) { Window **wz; - /* Delete all malloced widgets, and reset z-array */ + +restart_search: + /* Delete all windows, reset z-array. + *When we find the window to delete, we need to restart the search + * as deleting this window could cascade in deleting (many) others + * anywhere in the z-array. We call DeleteWindow() so that it can properly + * release own alloc'd memory, which otherwise could result in memleaks */ FOR_ALL_WINDOWS(wz) { - free((*wz)->widget); - (*wz)->widget = NULL; - (*wz)->widget_count = 0; - *wz = NULL; + DeleteWindow(*wz); + goto restart_search; } - _last_z_window = _z_windows; + + assert(_last_z_window == _z_windows); } void ResetWindowSystem(void) -- cgit v1.2.3-70-g09d2