diff options
author | Darkvater <Darkvater@openttd.org> | 2007-01-13 15:50:36 +0000 |
---|---|---|
committer | Darkvater <Darkvater@openttd.org> | 2007-01-13 15:50:36 +0000 |
commit | 330f9e0c4ef84585294c22bf4d13add61bfbcce6 (patch) | |
tree | 990cf89b0a0cdb0bffff39bb88714144d71659cb /src | |
parent | bcc9ad37c2a03ed5dee69aed8fa030acbee6219e (diff) | |
download | openttd-330f9e0c4ef84585294c22bf4d13add61bfbcce6.tar.xz |
(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.
Diffstat (limited to 'src')
-rw-r--r-- | src/window.cpp | 17 |
1 files 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) |