mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-03 17:30:16 +01:00
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:
parent
5bded081a4
commit
e5430a182c
2 changed files with 20 additions and 8 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue