diff --git a/ChangeLog b/ChangeLog index f9202532b..ea42255f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-12-07 Dan Williams + + Noticed by Christian Persch + + Always chain up to parent object in dispose and finalize handlers. + (gnome.org #433112) + 2007-12-07 Dan Williams * src/nm-device-802-11-wireless.c diff --git a/libnm-glib/nm-access-point.c b/libnm-glib/nm-access-point.c index 380248950..5db9ee770 100644 --- a/libnm-glib/nm-access-point.c +++ b/libnm-glib/nm-access-point.c @@ -316,8 +316,11 @@ dispose (GObject *object) { NMAccessPointPrivate *priv = NM_ACCESS_POINT_GET_PRIVATE (object); - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_access_point_parent_class)->dispose (object); return; + } + priv->disposed = TRUE; g_object_unref (priv->ap_proxy); diff --git a/libnm-glib/nm-client.c b/libnm-glib/nm-client.c index 34b29d9c1..94b955ed6 100644 --- a/libnm-glib/nm-client.c +++ b/libnm-glib/nm-client.c @@ -166,6 +166,8 @@ finalize (GObject *object) g_object_unref (priv->client_proxy); g_object_unref (priv->bus_proxy); g_hash_table_destroy (priv->devices); + + G_OBJECT_CLASS (nm_client_parent_class)->finalize (object); } static void diff --git a/libnm-glib/nm-device-802-11-wireless.c b/libnm-glib/nm-device-802-11-wireless.c index a2e64abeb..d5b9aa82e 100644 --- a/libnm-glib/nm-device-802-11-wireless.c +++ b/libnm-glib/nm-device-802-11-wireless.c @@ -489,8 +489,10 @@ dispose (GObject *object) { NMDevice80211WirelessPrivate *priv = NM_DEVICE_802_11_WIRELESS_GET_PRIVATE (object); - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_device_802_11_wireless_parent_class)->dispose (object); return; + } priv->disposed = TRUE; diff --git a/libnm-glib/nm-device-802-3-ethernet.c b/libnm-glib/nm-device-802-3-ethernet.c index 9db608209..4c5e66c97 100644 --- a/libnm-glib/nm-device-802-3-ethernet.c +++ b/libnm-glib/nm-device-802-3-ethernet.c @@ -50,8 +50,10 @@ dispose (GObject *object) { NMDevice8023EthernetPrivate *priv = NM_DEVICE_802_3_ETHERNET_GET_PRIVATE (object); - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_device_802_3_ethernet_parent_class)->dispose (object); return; + } priv->disposed = TRUE; diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c index 82d9b3fb3..606510639 100644 --- a/libnm-glib/nm-device.c +++ b/libnm-glib/nm-device.c @@ -93,8 +93,10 @@ dispose (GObject *object) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object); - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_device_parent_class)->dispose (object); return; + } priv->disposed = TRUE; diff --git a/libnm-glib/nm-object.c b/libnm-glib/nm-object.c index a7d13439e..f2e0e5838 100644 --- a/libnm-glib/nm-object.c +++ b/libnm-glib/nm-object.c @@ -64,8 +64,10 @@ dispose (GObject *object) { NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_object_parent_class)->dispose (object); return; + } priv->disposed = TRUE; diff --git a/libnm-glib/nm-umts-device.c b/libnm-glib/nm-umts-device.c index bf91ce745..d40f6f50a 100644 --- a/libnm-glib/nm-umts-device.c +++ b/libnm-glib/nm-umts-device.c @@ -45,8 +45,10 @@ dispose (GObject *object) { NMUmtsDevicePrivate *priv = NM_UMTS_DEVICE_GET_PRIVATE (object); - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_umts_device_parent_class)->dispose (object); return; + } priv->disposed = TRUE; diff --git a/libnm-glib/nm-vpn-connection.c b/libnm-glib/nm-vpn-connection.c index e524bcb06..c684052f5 100644 --- a/libnm-glib/nm-vpn-connection.c +++ b/libnm-glib/nm-vpn-connection.c @@ -204,6 +204,7 @@ finalize (GObject *object) g_free (priv->banner); g_object_unref (priv->proxy); + G_OBJECT_CLASS (nm_vpn_connection_parent_class)->finalize (object); } static void diff --git a/libnm-glib/nm-vpn-manager.c b/libnm-glib/nm-vpn-manager.c index 18f2a1fdc..fc46ceee6 100644 --- a/libnm-glib/nm-vpn-manager.c +++ b/libnm-glib/nm-vpn-manager.c @@ -120,6 +120,7 @@ static void finalize (GObject *object) { g_object_unref (NM_VPN_MANAGER_GET_PRIVATE (object)->manager_proxy); + G_OBJECT_CLASS (nm_vpn_manager_parent_class)->finalize (object); } static void diff --git a/libnm-glib/nm-vpn-plugin.c b/libnm-glib/nm-vpn-plugin.c index f89206b83..e42b0b495 100644 --- a/libnm-glib/nm-vpn-plugin.c +++ b/libnm-glib/nm-vpn-plugin.c @@ -565,8 +565,10 @@ dispose (GObject *object) NMVPNServiceState state; GError *err = NULL; - if (priv->disposed) + if (priv->disposed) { + G_OBJECT_CLASS (nm_vpn_plugin_parent_class)->dispose (object); return; + } priv->disposed = TRUE; diff --git a/src/named-manager/nm-named-manager.c b/src/named-manager/nm-named-manager.c index 53ad2f901..2a32ecde7 100644 --- a/src/named-manager/nm-named-manager.c +++ b/src/named-manager/nm-named-manager.c @@ -776,12 +776,17 @@ nm_named_manager_dispose (GObject *object) NMNamedManager *mgr = NM_NAMED_MANAGER (object); GSList *elt; - if (mgr->priv->disposed) + if (mgr->priv->disposed) { + G_OBJECT_CLASS (nm_named_manager_parent_class)->dispose (object); return; + } + mgr->priv->disposed = TRUE; for (elt = mgr->priv->configs; elt; elt = g_slist_next (elt)) remove_ip4_config_from_named (mgr, (NMIP4Config *)(elt->data)); + + G_OBJECT_CLASS (nm_named_manager_parent_class)->dispose (object); } static void diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c index e68c7cbca..f09c57bcf 100644 --- a/src/nm-device-802-11-wireless.c +++ b/src/nm-device-802-11-wireless.c @@ -2862,9 +2862,10 @@ nm_device_802_11_wireless_dispose (GObject *object) NMDevice80211Wireless *self = NM_DEVICE_802_11_WIRELESS (object); NMDevice80211WirelessPrivate *priv = NM_DEVICE_802_11_WIRELESS_GET_PRIVATE (self); - /* Make sure dispose does not run twice. */ - if (priv->dispose_has_run) + if (priv->dispose_has_run) { + G_OBJECT_CLASS (nm_device_802_11_wireless_parent_class)->dispose (object); return; + } priv->dispose_has_run = TRUE; diff --git a/src/nm-device-802-3-ethernet.c b/src/nm-device-802-3-ethernet.c index 84c46fd9e..431462715 100644 --- a/src/nm-device-802-3-ethernet.c +++ b/src/nm-device-802-3-ethernet.c @@ -395,6 +395,13 @@ nm_device_802_3_ethernet_dispose (GObject *object) NMDevice8023EthernetPrivate *priv = NM_DEVICE_802_3_ETHERNET_GET_PRIVATE (object); NMNetlinkMonitor *monitor; + if (priv->dispose_has_run) { + G_OBJECT_CLASS (nm_device_802_3_ethernet_parent_class)->dispose (object); + return; + } + + priv->dispose_has_run = TRUE; + monitor = nm_netlink_monitor_get (); if (priv->link_connected_id) { g_signal_handler_disconnect (monitor, priv->link_connected_id); diff --git a/src/nm-device.c b/src/nm-device.c index da4a3e687..9a83b99c3 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -1543,17 +1543,9 @@ nm_device_dispose (GObject *object) { NMDevice *self = NM_DEVICE (object); - if (self->priv->dispose_has_run) { - /* If dispose already ran, return. */ - return; - } - - if (!self->priv->initialized) { - /* Don't tear down stuff that might not yet be set up */ + if (self->priv->dispose_has_run || !self->priv->initialized) goto out; - } - /* Make sure dispose does not run twice. */ self->priv->dispose_has_run = TRUE; /* diff --git a/src/supplicant-manager/nm-supplicant-interface.c b/src/supplicant-manager/nm-supplicant-interface.c index a4bf10911..d633a7e6b 100644 --- a/src/supplicant-manager/nm-supplicant-interface.c +++ b/src/supplicant-manager/nm-supplicant-interface.c @@ -305,20 +305,12 @@ nm_supplicant_interface_dispose (GObject *object) guint32 sm_state; if (priv->dispose_has_run) { - /* If dispose did already run, return. */ + G_OBJECT_CLASS (nm_supplicant_interface_parent_class)->dispose (object); return; } - /* Make sure dispose does not run twice. */ priv->dispose_has_run = TRUE; - /* - * In dispose, you are supposed to free all types referenced from this - * object which might themselves hold a reference to self. Generally, - * the most simple solution is to unref all members on which you own a - * reference. - */ - /* Ask wpa_supplicant to remove this interface */ sm_state = nm_supplicant_manager_get_state (priv->smgr); if (sm_state == NM_SUPPLICANT_MANAGER_STATE_IDLE) { diff --git a/src/supplicant-manager/nm-supplicant-manager.c b/src/supplicant-manager/nm-supplicant-manager.c index 55b9dd554..21bd505a2 100644 --- a/src/supplicant-manager/nm-supplicant-manager.c +++ b/src/supplicant-manager/nm-supplicant-manager.c @@ -141,11 +141,10 @@ nm_supplicant_manager_dispose (GObject *object) NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (object); if (priv->dispose_has_run) { - /* If dispose did already run, return. */ + G_OBJECT_CLASS (nm_supplicant_manager_parent_class)->dispose (object); return; } - /* Make sure dispose does not run twice. */ priv->dispose_has_run = TRUE; if (priv->poke_id) { @@ -153,12 +152,6 @@ nm_supplicant_manager_dispose (GObject *object) priv->poke_id = 0; } - /* - * In dispose, you are supposed to free all types referenced from this - * object which might themselves hold a reference to self. Generally, - * the most simple solution is to unref all members on which you own a - * reference. - */ if (priv->dbus_mgr) { g_object_unref (G_OBJECT (priv->dbus_mgr)); priv->dbus_mgr = NULL;