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.
This commit is contained in:
Beniamino Galvani 2016-07-01 14:54:42 +02:00
parent 5bded081a4
commit e5430a182c
2 changed files with 20 additions and 8 deletions

View file

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

View file

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