(svn r12942) -Fix [FS#1979]: closing some windows caused recursion in the Window deletion causing the reading invalid/freed data which could cause crashes.

pull/155/head
rubidium 16 years ago
parent 0083ce9e1b
commit 4acb8f3a5e

@ -416,35 +416,37 @@ 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();
}
CallWindowEventNP(w, WE_DESTROY);
if (w->viewport != NULL) DeleteWindowViewport(w);
SetWindowDirty(w);
free(w->widget);
w->widget = NULL;
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 */
* 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);
SetWindowDirty(w);
free(w->widget);
w->widget = NULL;
w->widget_count = 0;
w->parent = NULL;
delete w;
}

Loading…
Cancel
Save