From a64f7dc354572a4e60c8b8f28e04759c9621877d Mon Sep 17 00:00:00 2001 From: Darkvater Date: Sat, 30 Dec 2006 01:08:12 +0000 Subject: [PATCH] (svn r7635) -Fix (r7618, r7621): Guard against recursive deletion. It is possible that when a parent window is deleted it deletes its child (always) and in turn, through some code the child initiates the deletion of the parent which, if not guarded against, deletes the child and so on... --- misc_gui.c | 5 ++++- window.c | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/misc_gui.c b/misc_gui.c index 2f2a8d3bfe..92ba1b4fa1 100644 --- a/misc_gui.c +++ b/misc_gui.c @@ -1226,7 +1226,10 @@ static void QueryWndProc(Window *w, WindowEvent *e) break; case WE_DESTROY: /* Call callback function (if any) on window close if not yet called */ - if (!q->calledback && q->proc != NULL) q->proc(w->parent, false); + if (!q->calledback && q->proc != NULL) { + q->calledback = true; + q->proc(w->parent, false); + } break; } } diff --git a/window.c b/window.c index 75da457b5e..1a12c7c6b9 100644 --- a/window.c +++ b/window.c @@ -308,10 +308,13 @@ Window **FindWindowZPosition(const Window *w) { Window **wz; - for (wz = _z_windows;; wz++) { - assert(wz < _last_z_window); + for (wz = _z_windows; wz != _last_z_window; wz++) { if (*wz == w) return wz; } + + DEBUG(misc, 3, "Window (class %d, number %d) is not open, probably removed by recursive calls", + w->window_class, w->window_number); + return NULL; } void DeleteWindow(Window *w) @@ -342,6 +345,7 @@ void DeleteWindow(Window *w) /* Find the window in the z-array, and effectively remove it * by moving all windows after it one to the left */ wz = FindWindowZPosition(w); + if (wz == NULL) return; memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz); _last_z_window--; }