[PATCH 1/2] Set to NULL event source after a call to wl_event_source_remove
This patch sets to NULL event sources after a call to wl_event_source_remove() has been made. --- src/clipboard.c | 3 ++- src/compositor-drm.c | 3 +++ src/compositor-rpi.c | 1 + src/compositor-x11.c | 2 ++ src/compositor.c | 6 +- src/evdev-touchpad.c | 1 + src/evdev.c | 4 +++- src/libinput-seat.c | 1 + src/logind-util.c| 2 ++ xwayland/launcher.c | 6 +- xwayland/selection.c | 9 +++-- 11 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/clipboard.c b/src/clipboard.c index 5a3a02d..0e25dc1 100644 --- a/src/clipboard.c +++ b/src/clipboard.c @@ -61,6 +61,7 @@ clipboard_source_unref(struct clipboard_source *source) if (source-event_source) { wl_event_source_remove(source-event_source); + source-event_source = NULL; close(source-fd); } wl_signal_emit(source-base.destroy_signal, @@ -90,8 +91,8 @@ clipboard_source_data(int fd, uint32_t mask, void *data) len = read(fd, p, size); if (len == 0) { wl_event_source_remove(source-event_source); - close(fd); source-event_source = NULL; + close(fd); } else if (len 0) { clipboard_source_unref(source); clipboard-source = NULL; diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 5f59789..0110f41 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -2379,7 +2379,9 @@ drm_destroy(struct weston_compositor *ec) udev_input_destroy(d-input); wl_event_source_remove(d-udev_drm_source); + d-udev_drm_source = NULL; wl_event_source_remove(d-drm_source); + d-drm_source = NULL; destroy_sprites(d); @@ -2849,6 +2851,7 @@ drm_compositor_create(struct wl_display *display, err_udev_monitor: wl_event_source_remove(ec-udev_drm_source); + ec-udev_drm_source = NULL; udev_monitor_unref(ec-udev_monitor); err_drm_source: wl_event_source_remove(ec-drm_source); diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c index 287451d..cbfb770 100644 --- a/src/compositor-rpi.c +++ b/src/compositor-rpi.c @@ -213,6 +213,7 @@ static void rpi_flippipe_release(struct rpi_flippipe *flippipe) { wl_event_source_remove(flippipe-source); + flippipe-source = NULL; close(flippipe-readfd); close(flippipe-writefd); } diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 56b3228..9f171e7 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -485,6 +485,7 @@ x11_output_destroy(struct weston_output *output_base) (struct x11_compositor *)output-base.compositor; wl_event_source_remove(output-finish_frame_timer); + output-finish_frame_timer = NULL; if (compositor-use_pixman) { pixman_renderer_output_destroy(output_base); @@ -1424,6 +1425,7 @@ x11_destroy(struct weston_compositor *ec) struct x11_compositor *compositor = (struct x11_compositor *)ec; wl_event_source_remove(compositor-xcb_source); + compositor-xcb_source = NULL; x11_input_destroy(compositor); weston_compositor_shutdown(ec); /* destroys outputs, too */ diff --git a/src/compositor.c b/src/compositor.c index cd1ca9a..6ad3387 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3736,8 +3736,12 @@ weston_compositor_shutdown(struct weston_compositor *ec) struct weston_output *output, *next; wl_event_source_remove(ec-idle_source); - if (ec-input_loop_source) + ec-idle_source = NULL; + + if (ec-input_loop_source) { wl_event_source_remove(ec-input_loop_source); + ec-input_loop_source = NULL; + } /* Destroy all outputs associated with this compositor */ wl_list_for_each_safe(output, next, ec-output_list, link) diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c index 69f913a..360f87f 100644 --- a/src/evdev-touchpad.c +++ b/src/evdev-touchpad.c @@ -663,6 +663,7 @@ touchpad_destroy(struct evdev_dispatch *dispatch) touchpad-filter-interface-destroy(touchpad-filter); wl_event_source_remove(touchpad-fsm.timer_source); + touchpad-fsm.timer_source = NULL; free(dispatch); } diff --git a/src/evdev.c b/src/evdev.c index 888dfbd..a1bce2c 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -697,8 +697,10 @@ evdev_device_destroy(struct evdev_device *device) if (dispatch) dispatch-interface-destroy(dispatch); - if (device-source) + if (device-source) { wl_event_source_remove(device-source); + device-source = NULL; + } if (device-output) wl_list_remove(device-output_destroy_listener.link); wl_list_remove(device-link); diff --git a/src/libinput-seat.c b/src/libinput-seat.c index a38d470..34f1aab 100644 --- a/src/libinput-seat.c +++ b/src/libinput-seat.c @@
Re: [PATCH 1/2] Set to NULL event source after a call to wl_event_source_remove
On Fri, May 09, 2014 at 04:03:51PM +0200, Hardening wrote: This patch sets to NULL event sources after a call to wl_event_source_remove() has been made. We don't generally set freed memory to NULL, unless we rely on testing that to decide whether the pointer points to an object or not. Kristian --- src/clipboard.c | 3 ++- src/compositor-drm.c | 3 +++ src/compositor-rpi.c | 1 + src/compositor-x11.c | 2 ++ src/compositor.c | 6 +- src/evdev-touchpad.c | 1 + src/evdev.c | 4 +++- src/libinput-seat.c | 1 + src/logind-util.c| 2 ++ xwayland/launcher.c | 6 +- xwayland/selection.c | 9 +++-- 11 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/clipboard.c b/src/clipboard.c index 5a3a02d..0e25dc1 100644 --- a/src/clipboard.c +++ b/src/clipboard.c @@ -61,6 +61,7 @@ clipboard_source_unref(struct clipboard_source *source) if (source-event_source) { wl_event_source_remove(source-event_source); + source-event_source = NULL; close(source-fd); } wl_signal_emit(source-base.destroy_signal, @@ -90,8 +91,8 @@ clipboard_source_data(int fd, uint32_t mask, void *data) len = read(fd, p, size); if (len == 0) { wl_event_source_remove(source-event_source); - close(fd); source-event_source = NULL; + close(fd); } else if (len 0) { clipboard_source_unref(source); clipboard-source = NULL; diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 5f59789..0110f41 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -2379,7 +2379,9 @@ drm_destroy(struct weston_compositor *ec) udev_input_destroy(d-input); wl_event_source_remove(d-udev_drm_source); + d-udev_drm_source = NULL; wl_event_source_remove(d-drm_source); + d-drm_source = NULL; destroy_sprites(d); @@ -2849,6 +2851,7 @@ drm_compositor_create(struct wl_display *display, err_udev_monitor: wl_event_source_remove(ec-udev_drm_source); + ec-udev_drm_source = NULL; udev_monitor_unref(ec-udev_monitor); err_drm_source: wl_event_source_remove(ec-drm_source); diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c index 287451d..cbfb770 100644 --- a/src/compositor-rpi.c +++ b/src/compositor-rpi.c @@ -213,6 +213,7 @@ static void rpi_flippipe_release(struct rpi_flippipe *flippipe) { wl_event_source_remove(flippipe-source); + flippipe-source = NULL; close(flippipe-readfd); close(flippipe-writefd); } diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 56b3228..9f171e7 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -485,6 +485,7 @@ x11_output_destroy(struct weston_output *output_base) (struct x11_compositor *)output-base.compositor; wl_event_source_remove(output-finish_frame_timer); + output-finish_frame_timer = NULL; if (compositor-use_pixman) { pixman_renderer_output_destroy(output_base); @@ -1424,6 +1425,7 @@ x11_destroy(struct weston_compositor *ec) struct x11_compositor *compositor = (struct x11_compositor *)ec; wl_event_source_remove(compositor-xcb_source); + compositor-xcb_source = NULL; x11_input_destroy(compositor); weston_compositor_shutdown(ec); /* destroys outputs, too */ diff --git a/src/compositor.c b/src/compositor.c index cd1ca9a..6ad3387 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3736,8 +3736,12 @@ weston_compositor_shutdown(struct weston_compositor *ec) struct weston_output *output, *next; wl_event_source_remove(ec-idle_source); - if (ec-input_loop_source) + ec-idle_source = NULL; + + if (ec-input_loop_source) { wl_event_source_remove(ec-input_loop_source); + ec-input_loop_source = NULL; + } /* Destroy all outputs associated with this compositor */ wl_list_for_each_safe(output, next, ec-output_list, link) diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c index 69f913a..360f87f 100644 --- a/src/evdev-touchpad.c +++ b/src/evdev-touchpad.c @@ -663,6 +663,7 @@ touchpad_destroy(struct evdev_dispatch *dispatch) touchpad-filter-interface-destroy(touchpad-filter); wl_event_source_remove(touchpad-fsm.timer_source); + touchpad-fsm.timer_source = NULL; free(dispatch); } diff --git a/src/evdev.c b/src/evdev.c index 888dfbd..a1bce2c 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -697,8 +697,10 @@ evdev_device_destroy(struct evdev_device *device) if (dispatch) dispatch-interface-destroy(dispatch); - if (device-source) + if (device-source) { wl_event_source_remove(device-source); + device-source = NULL; + } if (device-output)