cally: fix state set leak

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
This commit is contained in:
Ray Strode 2020-04-30 10:23:09 -04:00 committed by Jonas Ådahl
parent 3bc15ade04
commit 79e5ec57d2

View File

@ -767,10 +767,11 @@ static gboolean
cally_actor_action_do_action (AtkAction *action, cally_actor_action_do_action (AtkAction *action,
gint index) gint index)
{ {
CallyActor *cally_actor = NULL; CallyActor *cally_actor = NULL;
AtkStateSet *set = NULL; AtkStateSet *set = NULL;
CallyActorPrivate *priv = NULL; CallyActorPrivate *priv = NULL;
CallyActorActionInfo *info = NULL; CallyActorActionInfo *info = NULL;
gboolean did_action = FALSE;
cally_actor = CALLY_ACTOR (action); cally_actor = CALLY_ACTOR (action);
priv = cally_actor->priv; priv = cally_actor->priv;
@ -778,21 +779,19 @@ cally_actor_action_do_action (AtkAction *action,
set = atk_object_ref_state_set (ATK_OBJECT (cally_actor)); set = atk_object_ref_state_set (ATK_OBJECT (cally_actor));
if (atk_state_set_contains_state (set, ATK_STATE_DEFUNCT)) if (atk_state_set_contains_state (set, ATK_STATE_DEFUNCT))
return FALSE; goto out;
if (!atk_state_set_contains_state (set, ATK_STATE_SENSITIVE) || if (!atk_state_set_contains_state (set, ATK_STATE_SENSITIVE) ||
!atk_state_set_contains_state (set, ATK_STATE_SHOWING)) !atk_state_set_contains_state (set, ATK_STATE_SHOWING))
return FALSE; goto out;
g_object_unref (set);
info = _cally_actor_get_action_info (cally_actor, index); info = _cally_actor_get_action_info (cally_actor, index);
if (info == NULL) if (info == NULL)
return FALSE; goto out;
if (info->do_action_func == NULL) if (info->do_action_func == NULL)
return FALSE; goto out;
if (!priv->action_queue) if (!priv->action_queue)
priv->action_queue = g_queue_new (); priv->action_queue = g_queue_new ();
@ -802,7 +801,12 @@ cally_actor_action_do_action (AtkAction *action,
if (!priv->action_idle_handler) if (!priv->action_idle_handler)
priv->action_idle_handler = g_idle_add (idle_do_action, cally_actor); 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 static gboolean