summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-07-01 14:54:42 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2016-07-01 14:57:18 +0200
commite5430a182cde94033931bbf6605b5388560c4e60 (patch)
tree7417c1d58567c73ba0bc4a8c542d3302beb7ddb8
parent5bded081a44d75d297a82c7d696678807c65119f (diff)
downloadNetworkManager-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.c13
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.c15
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);