[PATCH wayland v4 05/11] client: Use refcount exclusively for destruction
Derek Foreman
derekf at osg.samsung.com
Wed Jan 3 21:44:57 UTC 2018
On 2017-12-28 01:53 PM, Daniel Stone wrote:
> Commit e273c7cde added a refcount to wl_proxy. The refcount is set to 1
> on creation, decreased when the client explicitly destroys the proxy,
> and is increased and decreased every time an event referencing that
> proxy is queued.
>
> Assuming no bugs, this means the refcount cannot reach 0 without the
> proxy being explicitly destroyed. However, some (not all) of the
> proxy-unref paths were only destroying the proxy if it had already been
> deleted. This should already be enforced by refcounting, so remove the
> check and rely solely on the refcount as the arbiter of when to free a
> proxy.
>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Cc: Jonas Ã…dahl <jadahl at gmail.com>
> Cc: Derek Foreman <derekf at osg.samsung.com>
> ---
> src/wayland-client.c | 11 ++++-------
> 1 file changed, 4 insertions(+), 7 deletions(-)
>
> diff --git a/src/wayland-client.c b/src/wayland-client.c
> index 21ef5b04..55838cd9 100644
> --- a/src/wayland-client.c
> +++ b/src/wayland-client.c
> @@ -258,7 +258,6 @@ wl_event_queue_release(struct wl_event_queue *queue)
> {
> struct wl_closure *closure;
> struct wl_proxy *proxy;
> - bool proxy_destroyed;
>
> while (!wl_list_empty(&queue->event_list)) {
> closure = container_of(queue->event_list.next,
> @@ -268,10 +267,8 @@ wl_event_queue_release(struct wl_event_queue *queue)
> decrease_closure_args_refcount(closure);
>
> proxy = closure->proxy;
> - proxy_destroyed = !!(proxy->flags & WL_PROXY_FLAG_DESTROYED);
> -
> proxy->refcount--;
> - if (proxy_destroyed && !proxy->refcount)
> + if (!proxy->refcount)
> free(proxy);
>
> wl_closure_destroy(closure);
> @@ -1310,10 +1307,10 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
> proxy_destroyed = !!(proxy->flags & WL_PROXY_FLAG_DESTROYED);
>
> proxy->refcount--;
> - if (proxy_destroyed) {
> - if (!proxy->refcount)
> - free(proxy);
> + if (!proxy->refcount)
> + free(proxy);
This descends into use after free in the case the patch is concerned with?
I see you've turned that into an assert in the follow up patch though,
which looks like a solid idea to me.
This and the follow up are
Reviewed-by: Derek Foreman <derekf at osg.samsung.com>
> + if (proxy_destroyed) {
> wl_closure_destroy(closure);
> return;
> }
>
More information about the wayland-devel
mailing list