diff options
author | Dan Winship <danw@gnome.org> | 2012-04-23 11:02:48 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2012-04-23 16:09:58 -0400 |
commit | be18dd06cd138be232ff68ec7af19cfcf2f969ed (patch) | |
tree | 79142d51b6ada6abde403cdb3095d6e4558cad6f /libnm-glib/nm-secret-agent.c | |
parent | 411cb363444177369e55e98d613ae35ae7bddd81 (diff) | |
download | NetworkManager-be18dd06cd138be232ff68ec7af19cfcf2f969ed.tar.gz |
libnm-glib: NULL out priv fields on dispose()
In some situations, objects might get used after being disposed, so
clear out their various priv fields so we don't try to access unreffed
objects, freed strings, etc.
https://bugzilla.gnome.org/show_bug.cgi?id=674473
Diffstat (limited to 'libnm-glib/nm-secret-agent.c')
-rw-r--r-- | libnm-glib/nm-secret-agent.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/libnm-glib/nm-secret-agent.c b/libnm-glib/nm-secret-agent.c index 19f55c0e2d..02f7419b90 100644 --- a/libnm-glib/nm-secret-agent.c +++ b/libnm-glib/nm-secret-agent.c @@ -79,8 +79,6 @@ typedef struct { gboolean auto_register; gboolean suppress_auto; gboolean auto_register_id; - - gboolean disposed; } NMSecretAgentPrivate; enum { @@ -878,29 +876,28 @@ dispose (GObject *object) NMSecretAgent *self = NM_SECRET_AGENT (object); NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - if (!priv->disposed) { - priv->disposed = TRUE; - - if (priv->registered) - nm_secret_agent_unregister (self); - - if (priv->auto_register_id) - g_source_remove (priv->auto_register_id); + if (priv->registered) + nm_secret_agent_unregister (self); - g_free (priv->identifier); - g_free (priv->nm_owner); + if (priv->auto_register_id) { + g_source_remove (priv->auto_register_id); + priv->auto_register_id = 0; + } - while (priv->pending_gets) - get_secrets_info_finalize (self, priv->pending_gets->data); + g_free (priv->identifier); + priv->identifier = NULL; + g_free (priv->nm_owner); + priv->nm_owner = NULL; - if (priv->dbus_proxy) - g_object_unref (priv->dbus_proxy); + while (priv->pending_gets) + get_secrets_info_finalize (self, priv->pending_gets->data); - if (priv->manager_proxy) - g_object_unref (priv->manager_proxy); + g_clear_object (&priv->dbus_proxy); + g_clear_object (&priv->manager_proxy); - if (priv->bus) - dbus_g_connection_unref (priv->bus); + if (priv->bus) { + dbus_g_connection_unref (priv->bus); + priv->bus = NULL; } G_OBJECT_CLASS (nm_secret_agent_parent_class)->dispose (object); |