Re: [PATCH 1/2] Set to NULL event source after a call to wl_event_source_remove

2014-05-09 Thread Kristian Høgsberg
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)
> 

[PATCH 1/2] Set to NULL event source after a call to wl_event_source_remove

2014-05-09 Thread Hardening
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
--