From 576cd87a5bc7d5abe22d1d20b00f4ace13dde050 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 26 Aug 2013 16:22:08 -0400 Subject: [PATCH] idle-monitor: Fix a warning when a callback removes the user active watch The user active watch is a one-fire watch, but it is valid in the API for the callback to explicitly remove the watch itself. In that case, the watch will be invalid after the user removes it, and the memory potentially freed. So make sure to not dereference the watch after the callback is called. https://bugzilla.gnome.org/show_bug.cgi?id=706825 --- src/core/meta-idle-monitor.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/core/meta-idle-monitor.c b/src/core/meta-idle-monitor.c index 568e6db72..0d841c4e1 100644 --- a/src/core/meta-idle-monitor.c +++ b/src/core/meta-idle-monitor.c @@ -104,19 +104,20 @@ static void fire_watch (MetaIdleMonitorWatch *watch) { MetaIdleMonitor *monitor; + guint id; + gboolean is_user_active_watch; monitor = watch->monitor; g_object_ref (monitor); - if (watch->callback) - { - watch->callback (watch->monitor, - watch->id, - watch->user_data); - } + id = watch->id; + is_user_active_watch = (watch->timeout_msec == 0); - if (watch->timeout_msec == 0) - meta_idle_monitor_remove_watch (watch->monitor, watch->id); + if (watch->callback) + watch->callback (monitor, id, watch->user_data); + + if (is_user_active_watch) + meta_idle_monitor_remove_watch (monitor, id); g_object_unref (monitor); }