summarylogtreecommitdiffstats
path: root/0008-compositor-Do-not-trigger-invalid-destructors-when-h.patch
diff options
context:
space:
mode:
Diffstat (limited to '0008-compositor-Do-not-trigger-invalid-destructors-when-h.patch')
-rw-r--r--0008-compositor-Do-not-trigger-invalid-destructors-when-h.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/0008-compositor-Do-not-trigger-invalid-destructors-when-h.patch b/0008-compositor-Do-not-trigger-invalid-destructors-when-h.patch
new file mode 100644
index 000000000000..424dab6971b7
--- /dev/null
+++ b/0008-compositor-Do-not-trigger-invalid-destructors-when-h.patch
@@ -0,0 +1,53 @@
+From 760828c01641d6900e2a63125a558df3b54b01b4 Mon Sep 17 00:00:00 2001
+From: "Miguel A. Vico" <mvicomoya@nvidia.com>
+Date: Wed, 25 Sep 2019 11:28:13 -0700
+Subject: [PATCH 8/8] compositor: Do not trigger invalid destructors when
+ hotunplugging
+X-NVConfidentiality: public
+
+When hotunplugging a display, the compositor will tear the top-level
+wet_output object down, freeing its memory.
+
+However, destruction of the backend output might be delayed in certain
+situations (e.g. destroying DRM output while in the middle of a page
+flip).
+
+When the backend output is finally destroyed, it will trigger a
+destruction callback previously added by the compositor, which point to
+data belonging to the top-level wet_output object.
+
+In order to avoid access to invalid data when the backend output is
+destroyed after the top-level wet_output object, remove the destruction
+callback from the corresponding list before freeing the object.
+
+Signed-off-by: Miguel A Vico Moya <mvicomoya@nvidia.com>
+---
+ compositor/main.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/compositor/main.c b/compositor/main.c
+index bb6bd84b..2f253f40 100644
+--- a/compositor/main.c
++++ b/compositor/main.c
+@@ -1860,8 +1860,16 @@ wet_output_from_weston_output(struct weston_output *base)
+ static void
+ wet_output_destroy(struct wet_output *output)
+ {
+- if (output->output)
+- weston_output_destroy(output->output);
++ if (output->output) {
++ /* output->output destruction may be deferred in some cases (see
++ * drm_output_destroy()), so we need to forcibly trigger the
++ * destruction callback now, or otherwise would later access
++ * data that we are about to free
++ */
++ struct weston_output *save = output->output;
++ wet_output_handle_destroy(&output->output_destroy_listener, save);
++ weston_output_destroy(save);
++ }
+
+ wl_list_remove(&output->link);
+ free(output);
+--
+2.21.0
+