From 442e7caa49ef934eb4c8562e29442fa49775bd46 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sat, 4 Apr 2015 22:58:45 +0200 Subject: [PATCH] app_server: Reset current view also when deleting a parent view. The check that was in place only ensured that the current view was reset if the current view itself got deleted. Since deleting views works by token it is possible that a view other than the current view gets deleted. When a parent of the current view was deleted, which also deletes all its children, the current view pointer was not reset and the stale pointer would still be accessed. --- src/servers/app/ServerWindow.cpp | 4 +++- src/servers/app/View.h | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 3b6f3eb31d..242438faf2 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -1265,8 +1265,10 @@ fDesktop->UnlockSingleWindow(); EventTarget(), token); fDesktop->LockSingleWindow(); } - if (fCurrentView == view) + + if (fCurrentView == view || fCurrentView->HasParent(view)) _SetCurrentView(parent); + delete view; } // else we don't delete the root view } diff --git a/src/servers/app/View.h b/src/servers/app/View.h index c72cd57586..b2291afe47 100644 --- a/src/servers/app/View.h +++ b/src/servers/app/View.h @@ -83,6 +83,13 @@ public: void AddChild(View* view); bool RemoveChild(View* view); + inline bool HasParent(View* candidate) const + { + return fParent == candidate + || (fParent != NULL + && fParent->HasParent(candidate)); + } + inline View* Parent() const { return fParent; }