summaryrefslogtreecommitdiff
path: root/atspi/atspi-event-listener.c
diff options
context:
space:
mode:
authorMike Gorse <mgorse@suse.com>2020-06-16 15:17:39 -0500
committerMike Gorse <mgorse@suse.com>2020-06-16 15:17:39 -0500
commit61babdee488bbd7c39567fdeb69743182c6bcb26 (patch)
treef2d31e113e3075d2e840c7072f1286a0b7eb9531 /atspi/atspi-event-listener.c
parentb0bf47c85ca221471eb366729cab37e38b60f722 (diff)
downloadat-spi2-core-61babdee488bbd7c39567fdeb69743182c6bcb26.tar.gz
Fix use after free when an event listener is destroyed
Properly remove event listeners from the list when they are deregistered. Fixes a crash that can happen when orca exits. Similar issue to https://gitlab.gnome.org/GNOME/at-spi2-core/issues/22
Diffstat (limited to 'atspi/atspi-event-listener.c')
-rw-r--r--atspi/atspi-event-listener.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/atspi/atspi-event-listener.c b/atspi/atspi-event-listener.c
index 03e930ae..7d2db6a7 100644
--- a/atspi/atspi-event-listener.c
+++ b/atspi/atspi-event-listener.c
@@ -785,12 +785,9 @@ atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
is_superset (name, e->name) &&
is_superset (detail, e->detail))
{
- gboolean need_replace;
DBusMessage *message, *reply;
- need_replace = (l == event_listeners);
- l = g_list_remove (l, e);
- if (need_replace)
- event_listeners = l;
+ l = g_list_next (l);
+ event_listeners = g_list_remove (event_listeners, e);
for (i = 0; i < matchrule_array->len; i++)
{
char *matchrule = g_ptr_array_index (matchrule_array, i);
@@ -809,7 +806,8 @@ atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
listener_entry_free (e);
}
- else l = g_list_next (l);
+ else
+ l = g_list_next (l);
}
g_free (category);
g_free (name);