changeset 5642:f06a25e04204 draft

(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.
author Darkvater <Darkvater@openttd.org>
date Sat, 13 Jan 2007 15:50:36 +0000
parents b6eba323824b
children 00155b55016f
files src/window.cpp
diffstat 1 files changed, 11 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -902,14 +902,19 @@
 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)