From 2dba94eba9e7cecefccaeb35df5e4231ce5329ce Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 15 Jan 2013 09:00:34 +0100 Subject: [PATCH] Nitpicker: avoid potential dangling pointer --- os/src/server/nitpicker/common/view_stack.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/os/src/server/nitpicker/common/view_stack.cc b/os/src/server/nitpicker/common/view_stack.cc index ab8bc4d99a..af731c9bf1 100644 --- a/os/src/server/nitpicker/common/view_stack.cc +++ b/os/src/server/nitpicker/common/view_stack.cc @@ -305,15 +305,23 @@ View *View_stack::find_view(Point p) void View_stack::remove_view(View *view) { - /* reset focused view if necessary */ - _mode->forget(view); - /* remember geometry of view to remove */ Rect rect = _outline(view); /* exclude view from view stack */ _views.remove(view); + /* + * Reset focused and pointed-at view if necessary + * + * Thus must be done after calling '_views.remove' because the new focused + * pointer is determined by traversing the view stack. If the to-be-removed + * view would still be there, we would re-assign the old pointed-to view as + * the current one, resulting in a dangling pointer right after the view + * gets destructed by the caller of 'removed_view'. + */ + _mode->forget(view); + /* redraw area where the view was visible */ draw_rec(_first_view(), 0, 0, rect); }