diff options
author | Ray Strode <rstrode@redhat.com> | 2020-04-30 14:23:09 +0000 |
---|---|---|
committer | Jonas Ã…dahl <jadahl@gmail.com> | 2020-10-15 09:43:40 +0000 |
commit | e736b5234f617b3d2cfcf0d4cc87bc76fc9ee86a (patch) | |
tree | 0cf8eb6a6d69a93e437c2183c263b0c705ca4ac4 | |
parent | c2e12b3434967e520dcda76bf1d562676e8961ff (diff) | |
download | mutter-cherry-pick-79e5ec57-6.tar.gz |
cally: fix state set leakcherry-pick-79e5ec57-6
cally_actor_action_do_action leaks a state set object in the
case where the actor is defunct, insensitive, or hidden.
This commit plugs the leak.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1225
(cherry picked from commit 79e5ec57d24f1650cdb2f23e68c9f8bf6a494283)
-rw-r--r-- | clutter/clutter/cally/cally-actor.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/clutter/clutter/cally/cally-actor.c b/clutter/clutter/cally/cally-actor.c index 548615f48..ad28703ee 100644 --- a/clutter/clutter/cally/cally-actor.c +++ b/clutter/clutter/cally/cally-actor.c @@ -817,10 +817,11 @@ static gboolean cally_actor_action_do_action (AtkAction *action, gint index) { - CallyActor *cally_actor = NULL; - AtkStateSet *set = NULL; - CallyActorPrivate *priv = NULL; - CallyActorActionInfo *info = NULL; + CallyActor *cally_actor = NULL; + AtkStateSet *set = NULL; + CallyActorPrivate *priv = NULL; + CallyActorActionInfo *info = NULL; + gboolean did_action = FALSE; cally_actor = CALLY_ACTOR (action); priv = cally_actor->priv; @@ -828,21 +829,19 @@ cally_actor_action_do_action (AtkAction *action, set = atk_object_ref_state_set (ATK_OBJECT (cally_actor)); if (atk_state_set_contains_state (set, ATK_STATE_DEFUNCT)) - return FALSE; + goto out; if (!atk_state_set_contains_state (set, ATK_STATE_SENSITIVE) || !atk_state_set_contains_state (set, ATK_STATE_SHOWING)) - return FALSE; - - g_object_unref (set); + goto out; info = _cally_actor_get_action_info (cally_actor, index); if (info == NULL) - return FALSE; + goto out; if (info->do_action_func == NULL) - return FALSE; + goto out; if (!priv->action_queue) priv->action_queue = g_queue_new (); @@ -852,7 +851,12 @@ cally_actor_action_do_action (AtkAction *action, if (!priv->action_idle_handler) priv->action_idle_handler = g_idle_add (idle_do_action, cally_actor); - return TRUE; + did_action = TRUE; + +out: + g_clear_object (&set); + + return did_action; } static gboolean |