Changeset - r5429:fdcdacfe53ee
[Not reviewed]
master
0 2 0
Darkvater - 17 years ago 2006-12-30 01:08:12
darkvater@openttd.org
(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...
2 files changed with 10 insertions and 3 deletions:
0 comments (0 inline, 0 general)
misc_gui.c
Show inline comments
 
@@ -1226,7 +1226,10 @@ static void QueryWndProc(Window *w, Wind
 
			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;
 
	}
 
}
window.c
Show inline comments
 
@@ -308,10 +308,13 @@ Window **FindWindowZPosition(const Windo
 
{
 
	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--;
 
}
0 comments (0 inline, 0 general)