[PATCH weston] exposay: Fix use after free when a view is destroyed during animation

Derek Foreman derekf at osg.samsung.com
Tue May 26 14:21:05 PDT 2015


Moving the destroy listener setup allows the animation completion handler
to be called before we free any structures it needs.

Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
 desktop-shell/exposay.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c
index 78e45fb..4b03bb7 100644
--- a/desktop-shell/exposay.c
+++ b/desktop-shell/exposay.c
@@ -294,9 +294,6 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
 		esurface->eoutput = eoutput;
 		esurface->view = view;
 
-		esurface->view_destroy_listener.notify = handle_view_destroy;
-		wl_signal_add(&view->destroy_signal, &esurface->view_destroy_listener);
-
 		esurface->row = i / eoutput->grid_size;
 		esurface->column = i % eoutput->grid_size;
 
@@ -320,6 +317,15 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
 
 		exposay_animate_in(esurface);
 
+		/* We want our destroy handler to be after the animation
+		 * destroy handler in the list, this way when the view is
+		 * destroyed, the animation can safely call the animation
+		 * completion callback before we free the esurface in our
+		 * destroy handler.
+		 */
+		esurface->view_destroy_listener.notify = handle_view_destroy;
+		wl_signal_add(&view->destroy_signal, &esurface->view_destroy_listener);
+
 		i++;
 	}
 
-- 
2.1.4



More information about the wayland-devel mailing list