[PATCH] Destroy resources when destroying input and output

Mariusz Ceier mceier+wayland at gmail.com
Wed Dec 25 08:02:09 PST 2013


Some structures containing resources list are freed before resources
on that list are destroyed, and that triggers invalid read/write
in compositor.c:3103 indirectly called from text-backend.c:938
when running weston under valgrind.

This patch destroys resources on these lists before such
structures are freed.

That fixes at least x11 and freerds backend.

Signed-off-by: Mariusz Ceier <mceier+wayland at gmail.com>
---
 src/compositor.c |  4 ++++
 src/input.c      | 15 ++++++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index ff0f3ab..a4077e8 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -3183,6 +3183,7 @@ weston_compositor_verify_pointers(struct weston_compositor *ec)
 WL_EXPORT void
 weston_output_destroy(struct weston_output *output)
 {
+	struct wl_resource *resource, *next_resource;
 	output->destroying = 1;
 
 	weston_compositor_remove_output(output->compositor, output);
@@ -3192,6 +3193,9 @@ weston_output_destroy(struct weston_output *output)
 
 	wl_signal_emit(&output->destroy_signal, output);
 
+	wl_resource_for_each_safe(resource, next_resource, &output->resource_list)
+		wl_resource_destroy(resource);
+
 	free(output->name);
 	pixman_region32_fini(&output->region);
 	pixman_region32_fini(&output->previous_damage);
diff --git a/src/input.c b/src/input.c
index 07e9d6c..062a2cb 100644
--- a/src/input.c
+++ b/src/input.c
@@ -471,10 +471,13 @@ weston_pointer_create(struct weston_seat *seat)
 WL_EXPORT void
 weston_pointer_destroy(struct weston_pointer *pointer)
 {
+	struct wl_resource *resource, *next_resource;
+
 	if (pointer->sprite)
 		pointer_unmap_sprite(pointer);
 
-	/* XXX: What about pointer->resource_list? */
+	wl_resource_for_each_safe(resource, next_resource, &pointer->resource_list)
+		wl_resource_destroy(resource);
 
 	wl_list_remove(&pointer->focus_resource_listener.link);
 	wl_list_remove(&pointer->focus_view_listener.link);
@@ -520,7 +523,7 @@ weston_xkb_info_destroy(struct weston_xkb_info *xkb_info);
 WL_EXPORT void
 weston_keyboard_destroy(struct weston_keyboard *keyboard)
 {
-	/* XXX: What about keyboard->resource_list? */
+	struct wl_resource *resource, *next_resource;
 
 #ifdef ENABLE_XKBCOMMON
 	if (keyboard->seat->compositor->use_xkbcommon) {
@@ -533,6 +536,9 @@ weston_keyboard_destroy(struct weston_keyboard *keyboard)
 	}
 #endif
 
+	wl_resource_for_each_safe(resource, next_resource, &keyboard->resource_list)
+		wl_resource_destroy(resource);
+
 	wl_array_release(&keyboard->keys);
 	wl_list_remove(&keyboard->focus_resource_listener.link);
 	free(keyboard);
@@ -570,7 +576,10 @@ weston_touch_create(void)
 WL_EXPORT void
 weston_touch_destroy(struct weston_touch *touch)
 {
-	/* XXX: What about touch->resource_list? */
+	struct wl_resource *resource, *next_resource;
+
+	wl_resource_for_each_safe(resource, next_resource, &touch->resource_list)
+		wl_resource_destroy(resource);
 
 	wl_list_remove(&touch->focus_view_listener.link);
 	wl_list_remove(&touch->focus_resource_listener.link);
-- 
1.8.5.2



More information about the wayland-devel mailing list