Changeset - r9083:379c05474e7d
[Not reviewed]
master
0 1 0
rubidium - 16 years ago 2008-05-04 21:36:37
rubidium@openttd.org
(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.
1 file changed with 16 insertions and 14 deletions:
0 comments (0 inline, 0 general)
src/window.cpp
Show inline comments
 
@@ -416,16 +416,28 @@ void DeleteWindow(Window *w)
 
{
 
	if (w == NULL) return;
 

	
 
	/* Delete any children a window might have in a head-recursive manner */
 
	Window *v = FindChildWindow(w);
 
	if (v != NULL) DeleteWindow(v);
 

	
 
	if (_thd.place_mode != VHM_NONE &&
 
			_thd.window_class == w->window_class &&
 
			_thd.window_number == w->window_number) {
 
		ResetObjectToPlace();
 
	}
 

	
 
	/* Prevent Mouseover() from resetting mouse-over coordinates on a non-existing window */
 
	if (_mouseover_last_w == w) _mouseover_last_w = NULL;
 

	
 
	/* Find the window in the z-array, and effectively remove it
 
	 * by moving all windows after it one to the left. This must be
 
	 * done before removing the child so we cannot cause recursion
 
	 * between the deletion of the parent and the child. */
 
	Window **wz = FindWindowZPosition(w);
 
	if (wz == NULL) return;
 
	memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz);
 
	_last_z_window--;
 

	
 
	/* Delete any children a window might have in a head-recursive manner */
 
	Window *v = FindChildWindow(w);
 
	if (v != NULL) DeleteWindow(v);
 

	
 
	CallWindowEventNP(w, WE_DESTROY);
 
	if (w->viewport != NULL) DeleteWindowViewport(w);
 

	
 
@@ -435,16 +447,6 @@ void DeleteWindow(Window *w)
 
	w->widget_count = 0;
 
	w->parent = NULL;
 

	
 
	/* Prevent Mouseover() from resetting mouse-over coordinates on a non-existing window */
 
	if (_mouseover_last_w == w) _mouseover_last_w = NULL;
 

	
 
	/* Find the window in the z-array, and effectively remove it
 
	 * by moving all windows after it one to the left */
 
	Window **wz = FindWindowZPosition(w);
 
	if (wz == NULL) return;
 
	memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz);
 
	_last_z_window--;
 

	
 
	delete w;
 
}
 

	
0 comments (0 inline, 0 general)