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
This commit is contained in:
Dan Winship 2012-04-23 11:02:48 -04:00
parent 411cb36344
commit be18dd06cd
20 changed files with 98 additions and 186 deletions

View file

@ -42,6 +42,16 @@
g_simple_async_result_set_from_error (result, __error); \
g_error_free (__error); \
} G_STMT_END
#define g_clear_object(object_ptr) \
G_STMT_START { \
GObject **__obj_p = object_ptr; \
if (*__obj_p) { \
g_object_unref (*__obj_p); \
*__obj_p = NULL; \
} \
} G_STMT_END
#endif
#endif /* NM_GLIB_COMPAT_H */

View file

@ -41,7 +41,6 @@ G_DEFINE_TYPE (NMAccessPoint, nm_access_point, NM_TYPE_OBJECT)
#define NM_ACCESS_POINT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACCESS_POINT, NMAccessPointPrivate))
typedef struct {
gboolean disposed;
DBusGProxy *proxy;
NM80211ApFlags flags;
@ -431,14 +430,7 @@ dispose (GObject *object)
{
NMAccessPointPrivate *priv = NM_ACCESS_POINT_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_access_point_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_access_point_parent_class)->dispose (object);
}

View file

@ -49,7 +49,6 @@ G_DEFINE_TYPE_WITH_CODE (NMActiveConnection, nm_active_connection, NM_TYPE_OBJEC
#define NM_ACTIVE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionPrivate))
typedef struct {
gboolean disposed;
DBusGProxy *proxy;
char *connection;
@ -357,18 +356,13 @@ dispose (GObject *object)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_active_connection_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
if (priv->devices) {
g_ptr_array_foreach (priv->devices, (GFunc) g_object_unref, NULL);
g_ptr_array_free (priv->devices, TRUE);
priv->devices = NULL;
}
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_active_connection_parent_class)->dispose (object);
}

View file

@ -53,8 +53,6 @@ G_DEFINE_TYPE_WITH_CODE (NMClient, nm_client, NM_TYPE_OBJECT,
#define NM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CLIENT, NMClientPrivate))
typedef struct {
gboolean disposed;
DBusGProxy *client_proxy;
DBusGProxy *bus_proxy;
gboolean manager_running;
@ -1517,24 +1515,23 @@ dispose (GObject *object)
{
NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_client_parent_class)->dispose (object);
return;
if (priv->perm_call) {
dbus_g_proxy_cancel_call (priv->client_proxy, priv->perm_call);
priv->perm_call = NULL;
}
if (priv->perm_call)
dbus_g_proxy_cancel_call (priv->client_proxy, priv->perm_call);
g_object_unref (priv->client_proxy);
g_object_unref (priv->bus_proxy);
g_clear_object (&priv->client_proxy);
g_clear_object (&priv->bus_proxy);
free_object_array (&priv->devices);
dispose_and_free_object_array (&priv->active_connections);
g_slist_foreach (priv->pending_activations, (GFunc) activate_info_free, NULL);
g_slist_free (priv->pending_activations);
priv->pending_activations = NULL;
g_hash_table_destroy (priv->permissions);
priv->permissions = NULL;
G_OBJECT_CLASS (nm_client_parent_class)->dispose (object);
}

View file

@ -215,10 +215,7 @@ dispose (GObject *object)
{
NMDeviceBondPrivate *priv = NM_DEVICE_BOND_GET_PRIVATE (object);
if (priv->proxy) {
g_object_unref (priv->proxy);
priv->proxy = NULL;
}
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_bond_parent_class)->dispose (object);
}

View file

@ -42,8 +42,6 @@ typedef struct {
char *hw_address;
char *name;
guint32 bt_capabilities;
gboolean disposed;
} NMDeviceBtPrivate;
enum {
@ -273,13 +271,7 @@ dispose (GObject *object)
{
NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_device_bt_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_bt_parent_class)->dispose (object);
}

View file

@ -44,8 +44,6 @@ typedef struct {
char *perm_hw_address;
guint32 speed;
gboolean carrier;
gboolean disposed;
} NMDeviceEthernetPrivate;
enum {
@ -280,14 +278,7 @@ dispose (GObject *object)
{
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_device_ethernet_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_ethernet_parent_class)->dispose (object);
}

View file

@ -224,10 +224,7 @@ dispose (GObject *object)
{
NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (object);
if (priv->proxy) {
g_object_unref (priv->proxy);
priv->proxy = NULL;
}
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_infiniband_parent_class)->dispose (object);
}

View file

@ -44,8 +44,6 @@ typedef struct {
NMDeviceModemCapabilities caps;
NMDeviceModemCapabilities current_caps;
gboolean disposed;
} NMDeviceModemPrivate;
enum {
@ -225,14 +223,7 @@ dispose (GObject *object)
{
NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_device_modem_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_modem_parent_class)->dispose (object);
}

View file

@ -227,14 +227,8 @@ dispose (GObject *object)
{
NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (object);
if (priv->companion) {
g_object_unref (priv->companion);
priv->companion = NULL;
}
if (priv->proxy) {
g_object_unref (priv->proxy);
priv->proxy = NULL;
}
g_clear_object (&priv->companion);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class)->dispose (object);
}

View file

@ -238,10 +238,7 @@ dispose (GObject *object)
{
NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (object);
if (priv->proxy) {
g_object_unref (priv->proxy);
priv->proxy = NULL;
}
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_vlan_parent_class)->dispose (object);
}

View file

@ -43,7 +43,6 @@ G_DEFINE_TYPE (NMDeviceWifi, nm_device_wifi, NM_TYPE_DEVICE)
void _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, gboolean enabled);
typedef struct {
gboolean disposed;
DBusGProxy *proxy;
char *hw_address;
@ -608,15 +607,8 @@ dispose (GObject *object)
{
NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_device_wifi_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
clean_up_aps (NM_DEVICE_WIFI (object), FALSE);
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_wifi_parent_class)->dispose (object);
}

View file

@ -42,7 +42,6 @@ G_DEFINE_TYPE (NMDeviceWimax, nm_device_wimax, NM_TYPE_DEVICE)
void _nm_device_wimax_set_wireless_enabled (NMDeviceWimax *wimax, gboolean enabled);
typedef struct {
gboolean disposed;
DBusGProxy *proxy;
char *hw_address;
@ -593,18 +592,18 @@ dispose (GObject *object)
{
NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_device_wimax_parent_class)->dispose (object);
return;
if (priv->hw_address) {
g_free (priv->hw_address);
priv->hw_address = NULL;
}
priv->disposed = TRUE;
g_free (priv->hw_address);
g_free (priv->bsid);
if (priv->bsid) {
g_free (priv->bsid);
priv->bsid = NULL;
}
clean_up_nsps (NM_DEVICE_WIMAX (object), FALSE);
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_device_wimax_parent_class)->dispose (object);
}

View file

@ -60,7 +60,6 @@ G_DEFINE_TYPE_WITH_CODE (NMDevice, nm_device, NM_TYPE_OBJECT,
#define NM_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE, NMDevicePrivate))
typedef struct {
gboolean disposed;
DBusGProxy *proxy;
char *iface;
@ -265,26 +264,13 @@ dispose (GObject *object)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_device_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
g_object_unref (priv->proxy);
if (priv->ip4_config)
g_object_unref (priv->ip4_config);
if (priv->dhcp4_config)
g_object_unref (priv->dhcp4_config);
if (priv->ip6_config)
g_object_unref (priv->ip6_config);
if (priv->dhcp6_config)
g_object_unref (priv->dhcp6_config);
if (priv->client)
g_object_unref (priv->client);
if (priv->active_connection)
g_object_unref (priv->active_connection);
g_clear_object (&priv->proxy);
g_clear_object (&priv->ip4_config);
g_clear_object (&priv->dhcp4_config);
g_clear_object (&priv->ip6_config);
g_clear_object (&priv->dhcp6_config);
g_clear_object (&priv->client);
g_clear_object (&priv->active_connection);
G_OBJECT_CLASS (nm_device_parent_class)->dispose (object);
}

View file

@ -78,7 +78,7 @@ typedef struct {
GSList *notify_props;
guint32 notify_id;
gboolean inited, disposed;
gboolean inited;
GSList *reload_results;
guint reload_remaining;
@ -194,13 +194,6 @@ dispose (GObject *object)
{
NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_object_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
if (priv->notify_id) {
g_source_remove (priv->notify_id);
priv->notify_id = 0;
@ -208,12 +201,18 @@ dispose (GObject *object)
g_slist_foreach (priv->notify_props, (GFunc) g_free, NULL);
g_slist_free (priv->notify_props);
priv->notify_props = NULL;
g_slist_foreach (priv->property_interfaces, (GFunc) g_free, NULL);
g_slist_free (priv->property_interfaces);
priv->property_interfaces = NULL;
g_object_unref (priv->properties_proxy);
dbus_g_connection_unref (priv->connection);
g_clear_object (&priv->properties_proxy);
if (priv->connection) {
dbus_g_connection_unref (priv->connection);
priv->connection = NULL;
}
G_OBJECT_CLASS (nm_object_parent_class)->dispose (object);
}

View file

@ -72,7 +72,6 @@ typedef struct {
GSList *calls;
gboolean visible;
gboolean disposed;
} NMRemoteConnectionPrivate;
#define NM_REMOTE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_REMOTE_CONNECTION, NMRemoteConnectionPrivate))
@ -477,14 +476,14 @@ dispose (GObject *object)
NMRemoteConnection *self = NM_REMOTE_CONNECTION (object);
NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (object);
if (!priv->disposed) {
priv->disposed = TRUE;
while (g_slist_length (priv->calls))
remote_call_complete (self, priv->calls->data);
while (g_slist_length (priv->calls))
remote_call_complete (self, priv->calls->data);
g_clear_object (&priv->proxy);
g_object_unref (priv->proxy);
if (priv->bus) {
dbus_g_connection_unref (priv->bus);
priv->bus = NULL;
}
G_OBJECT_CLASS (nm_remote_connection_parent_class)->dispose (object);

View file

@ -61,8 +61,6 @@ typedef struct {
DBusGProxy *dbus_proxy;
guint fetch_id;
gboolean disposed;
} NMRemoteSettingsPrivate;
enum {
@ -1043,29 +1041,35 @@ dispose (GObject *object)
NMRemoteSettings *self = NM_REMOTE_SETTINGS (object);
NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self);
if (priv->disposed)
return;
priv->disposed = TRUE;
if (priv->fetch_id)
if (priv->fetch_id) {
g_source_remove (priv->fetch_id);
priv->fetch_id = 0;
}
while (g_slist_length (priv->add_list))
add_connection_info_dispose (self, (AddConnectionInfo *) priv->add_list->data);
if (priv->connections)
if (priv->connections) {
g_hash_table_destroy (priv->connections);
priv->connections = NULL;
}
if (priv->pending)
if (priv->pending) {
g_hash_table_destroy (priv->pending);
priv->pending = NULL;
}
g_free (priv->hostname);
priv->hostname = NULL;
g_object_unref (priv->dbus_proxy);
g_object_unref (priv->proxy);
g_object_unref (priv->props_proxy);
dbus_g_connection_unref (priv->bus);
g_clear_object (&priv->dbus_proxy);
g_clear_object (&priv->proxy);
g_clear_object (&priv->props_proxy);
if (priv->bus) {
dbus_g_connection_unref (priv->bus);
priv->bus = NULL;
}
G_OBJECT_CLASS (nm_remote_settings_parent_class)->dispose (object);
}

View file

@ -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->registered)
nm_secret_agent_unregister (self);
if (priv->auto_register_id) {
g_source_remove (priv->auto_register_id);
priv->auto_register_id = 0;
}
if (priv->auto_register_id)
g_source_remove (priv->auto_register_id);
g_free (priv->identifier);
priv->identifier = NULL;
g_free (priv->nm_owner);
priv->nm_owner = NULL;
g_free (priv->identifier);
g_free (priv->nm_owner);
while (priv->pending_gets)
get_secrets_info_finalize (self, priv->pending_gets->data);
while (priv->pending_gets)
get_secrets_info_finalize (self, priv->pending_gets->data);
g_clear_object (&priv->dbus_proxy);
g_clear_object (&priv->manager_proxy);
if (priv->dbus_proxy)
g_object_unref (priv->dbus_proxy);
if (priv->manager_proxy)
g_object_unref (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);

View file

@ -63,9 +63,6 @@ typedef struct {
DBusGConnection *connection;
char *dbus_service_name;
/* GObject-y stuff */
gboolean disposed;
/* Temporary stuff */
guint connect_timer;
guint quit_timer;
@ -590,15 +587,10 @@ dispose (GObject *object)
NMVPNServiceState state;
GError *err = NULL;
if (priv->disposed) {
G_OBJECT_CLASS (nm_vpn_plugin_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
if (priv->fail_stop_id)
if (priv->fail_stop_id) {
g_source_remove (priv->fail_stop_id);
priv->fail_stop_id = 0;
}
state = nm_vpn_plugin_get_state (plugin);

View file

@ -37,7 +37,6 @@ G_DEFINE_TYPE (NMWimaxNsp, nm_wimax_nsp, NM_TYPE_OBJECT)
#define NM_WIMAX_NSP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_WIMAX_NSP, NMWimaxNspPrivate))
typedef struct {
gboolean disposed;
DBusGProxy *proxy;
char *name;
@ -217,14 +216,7 @@ dispose (GObject *object)
{
NMWimaxNspPrivate *priv = NM_WIMAX_NSP_GET_PRIVATE (object);
if (priv->disposed) {
G_OBJECT_CLASS (nm_wimax_nsp_parent_class)->dispose (object);
return;
}
priv->disposed = TRUE;
g_object_unref (priv->proxy);
g_clear_object (&priv->proxy);
G_OBJECT_CLASS (nm_wimax_nsp_parent_class)->dispose (object);
}