# HG changeset patch # User Darkvater # Date 1167440892 0 # Node ID b0bae92a162008e355538875ec689df81354da89 # Parent a478b04c1fd0082ab81e2382cbf02d3e1daafce9 (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... diff -r a478b04c1fd0 -r b0bae92a1620 misc_gui.c --- a/misc_gui.c Sat Dec 30 00:46:48 2006 +0000 +++ b/misc_gui.c Sat Dec 30 01:08:12 2006 +0000 @@ -1226,7 +1226,10 @@ 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 -r a478b04c1fd0 -r b0bae92a1620 window.c --- a/window.c Sat Dec 30 00:46:48 2006 +0000 +++ b/window.c Sat Dec 30 01:08:12 2006 +0000 @@ -308,10 +308,13 @@ { 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 @@ /* 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--; }