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.

(cherry picked from commit e5430a182c)
This commit is contained in:
Beniamino Galvani 2016-07-01 14:54:42 +02:00
parent 751e8b8914
commit 132a8abdad
2 changed files with 20 additions and 8 deletions

View file

@ -52,6 +52,7 @@ typedef struct {
const char *def_leasefile;
char *lease_file;
char *pid_file;
NMDhcpListener *dhcp_listener;
} NMDhcpDhclientPrivate;
static const char *
@ -622,7 +623,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);
@ -633,9 +635,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);