server: Add special case destroy signal emitter
authorDerek Foreman <derekf@osg.samsung.com>
Mon, 16 Apr 2018 20:00:59 +0000 (15:00 -0500)
committerDerek Foreman <derekf@osg.samsung.com>
Fri, 20 Apr 2018 18:19:13 +0000 (13:19 -0500)
commit5e0f7ad1bfcaadcc9cfaa1bd3fa78a1442b873a2
tree939211c4f95ce27cd2261a3e61bc179f105ab3fb
parent58ee271bff499b6b0d865fa0126990dc478bff24
server: Add special case destroy signal emitter

In the past much code (weston, efl/enlightenment, mutter) has
freed structures containing wl_listeners from destroy handlers
without first removing the listener from the signal.  As the
destroy notifier only fires once, this has largely gone
unnoticed until recently.

Other code does not (Qt, wlroots) - and removes itself from
the signal before free.

If somehow a destroy signal is listened to by code from both
kinds of callers, those that free will corrupt the lists for
those that don't, and Bad Things will happen.

To avoid these bad things, remove every item from the signal list
during destroy emit, and put it in a list all its own.  This way
whether the listener is removed or not has no impact on the
following emits.

Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Simon Ser <contact@emersion.fr>
Reviewed-by: Markus Ongyerth <wl@ongy.net>
src/wayland-private.h
src/wayland-server.c