diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2016-07-01 14:54:42 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-07-01 14:57:18 +0200 |
commit | e5430a182cde94033931bbf6605b5388560c4e60 (patch) | |
tree | 7417c1d58567c73ba0bc4a8c542d3302beb7ddb8 | |
parent | 5bded081a44d75d297a82c7d696678807c65119f (diff) | |
download | NetworkManager-e5430a182cde94033931bbf6605b5388560c4e60.tar.gz |
dhcp: let dhcp clients hold a reference to NMDhcpListener
The dhclient and dhcpcd clients can be destroyed during disposal of
the DHCP manager singleton and at that point the NMDhcpListener
singleton can be already gone. Reference it in the clients.
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhclient.c | 13 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-dhcpcd.c | 15 |
2 files changed, 20 insertions, 8 deletions
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c index ade206bad9..bd02062426 100644 --- a/src/dhcp-manager/nm-dhcp-dhclient.c +++ b/src/dhcp-manager/nm-dhcp-dhclient.c @@ -53,6 +53,7 @@ typedef struct { const char *def_leasefile; char *lease_file; char *pid_file; + NMDhcpListener *dhcp_listener; } NMDhcpDhclientPrivate; static const char * @@ -626,7 +627,8 @@ nm_dhcp_dhclient_init (NMDhcpDhclient *self) if (!priv->def_leasefile) priv->def_leasefile = SYSCONFDIR "/dhclient6.leases"; - g_signal_connect (nm_dhcp_listener_get (), + priv->dhcp_listener = g_object_ref (nm_dhcp_listener_get ()); + g_signal_connect (priv->dhcp_listener, NM_DHCP_LISTENER_EVENT, G_CALLBACK (nm_dhcp_client_handle_event), self); @@ -637,9 +639,12 @@ dispose (GObject *object) { NMDhcpDhclientPrivate *priv = NM_DHCP_DHCLIENT_GET_PRIVATE (object); - g_signal_handlers_disconnect_by_func (nm_dhcp_listener_get (), - G_CALLBACK (nm_dhcp_client_handle_event), - NM_DHCP_DHCLIENT (object)); + if (priv->dhcp_listener) { + g_signal_handlers_disconnect_by_func (priv->dhcp_listener, + G_CALLBACK (nm_dhcp_client_handle_event), + NM_DHCP_DHCLIENT (object)); + g_clear_object (&priv->dhcp_listener); + } g_free (priv->pid_file); g_free (priv->conf_file); diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c index 8bbb6e4c71..17ec993a5f 100644 --- a/src/dhcp-manager/nm-dhcp-dhcpcd.c +++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c @@ -44,6 +44,7 @@ G_DEFINE_TYPE (NMDhcpDhcpcd, nm_dhcp_dhcpcd, NM_TYPE_DHCP_CLIENT) typedef struct { char *pid_file; + NMDhcpListener *dhcp_listener; } NMDhcpDhcpcdPrivate; static const char * @@ -191,7 +192,10 @@ stop (NMDhcpClient *client, gboolean release, const GByteArray *duid) static void nm_dhcp_dhcpcd_init (NMDhcpDhcpcd *self) { - g_signal_connect (nm_dhcp_listener_get (), + NMDhcpDhcpcdPrivate *priv = NM_DHCP_DHCPCD_GET_PRIVATE (self); + + priv->dhcp_listener = g_object_ref (nm_dhcp_listener_get ()); + g_signal_connect (priv->dhcp_listener, NM_DHCP_LISTENER_EVENT, G_CALLBACK (nm_dhcp_client_handle_event), self); @@ -202,9 +206,12 @@ dispose (GObject *object) { NMDhcpDhcpcdPrivate *priv = NM_DHCP_DHCPCD_GET_PRIVATE (object); - g_signal_handlers_disconnect_by_func (nm_dhcp_listener_get (), - G_CALLBACK (nm_dhcp_client_handle_event), - NM_DHCP_DHCPCD (object)); + if (priv->dhcp_listener) { + g_signal_handlers_disconnect_by_func (priv->dhcp_listener, + G_CALLBACK (nm_dhcp_client_handle_event), + NM_DHCP_DHCPCD (object)); + g_clear_object (&priv->dhcp_listener); + } g_free (priv->pid_file); |