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);