mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-04 01:40:16 +01:00
policy: take reference to best_device/activating_device
Don't rely on manager keeping them alive long enough. E.g. get-best-device() is used when resetting the best device, however, it accesses the current device (hence, it relies on manager removing the device from the list, but keeping it alive long enough).
This commit is contained in:
parent
f8cb6dcbb1
commit
5c7e0654eb
1 changed files with 17 additions and 21 deletions
|
|
@ -831,8 +831,7 @@ update_ip4_routing (NMPolicy *self, gboolean force_update)
|
|||
* so we can get (vpn != NULL && best == NULL).
|
||||
*/
|
||||
if (!get_best_ip4_config (self, FALSE, &ip_iface, &best_ac, &best, &vpn)) {
|
||||
if (priv->default_device4) {
|
||||
priv->default_device4 = NULL;
|
||||
if (nm_clear_g_object (&priv->default_device4)) {
|
||||
_LOGt (LOGD_DNS, "set-default-device-4: %p", NULL);
|
||||
_notify (self, PROP_DEFAULT_IP4_DEVICE);
|
||||
}
|
||||
|
|
@ -864,11 +863,10 @@ update_ip4_routing (NMPolicy *self, gboolean force_update)
|
|||
|
||||
update_default_ac (self, best_ac, nm_active_connection_set_default);
|
||||
|
||||
if (best == priv->default_device4)
|
||||
if (!nm_g_object_ref_set (&priv->default_device4, best))
|
||||
return;
|
||||
_LOGt (LOGD_DNS, "set-default-device-4: %p", priv->default_device4);
|
||||
|
||||
priv->default_device4 = best;
|
||||
_LOGt (LOGD_DNS, "set-default-device-4: %p", best);
|
||||
_LOGI (LOGD_CORE, "set '%s' (%s) as default for IPv4 routing and DNS",
|
||||
nm_connection_get_id (nm_active_connection_get_applied_connection (best_ac)),
|
||||
ip_iface);
|
||||
|
|
@ -957,8 +955,7 @@ update_ip6_routing (NMPolicy *self, gboolean force_update)
|
|||
* so we can get (vpn != NULL && best == NULL).
|
||||
*/
|
||||
if (!get_best_ip6_config (self, FALSE, &ip_iface, &best_ac, &best, &vpn)) {
|
||||
if (priv->default_device6) {
|
||||
priv->default_device6 = NULL;
|
||||
if (nm_clear_g_object (&priv->default_device6)) {
|
||||
_LOGt (LOGD_DNS, "set-default-device-6: %p", NULL);
|
||||
_notify (self, PROP_DEFAULT_IP6_DEVICE);
|
||||
}
|
||||
|
|
@ -990,18 +987,15 @@ update_ip6_routing (NMPolicy *self, gboolean force_update)
|
|||
|
||||
update_default_ac (self, best_ac, nm_active_connection_set_default6);
|
||||
|
||||
if (best == priv->default_device6)
|
||||
if (!nm_g_object_ref_set (&priv->default_device6, best))
|
||||
return;
|
||||
|
||||
priv->default_device6 = best;
|
||||
_LOGt (LOGD_DNS, "set-default-device-6: %p", best);
|
||||
_LOGt (LOGD_DNS, "set-default-device-6: %p", priv->default_device6);
|
||||
|
||||
update_ip6_prefix_delegation (self);
|
||||
|
||||
_LOGI (LOGD_CORE, "set '%s' (%s) as default for IPv6 routing and DNS",
|
||||
nm_connection_get_id (nm_active_connection_get_applied_connection (best_ac)),
|
||||
ip_iface);
|
||||
|
||||
_notify (self, PROP_DEFAULT_IP6_DEVICE);
|
||||
}
|
||||
|
||||
|
|
@ -1028,26 +1022,23 @@ static void
|
|||
check_activating_devices (NMPolicy *self)
|
||||
{
|
||||
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
|
||||
GObject *object = G_OBJECT (self);
|
||||
NMDevice *best4, *best6 = NULL;
|
||||
|
||||
best4 = get_best_ip4_device (self, FALSE);
|
||||
best6 = get_best_ip6_device (self, FALSE);
|
||||
|
||||
g_object_freeze_notify (object);
|
||||
g_object_freeze_notify (G_OBJECT (self));
|
||||
|
||||
if (best4 != priv->activating_device4) {
|
||||
_LOGt (LOGD_DNS, "set-activating-device-4: %p", best4);
|
||||
priv->activating_device4 = best4;
|
||||
if (nm_g_object_ref_set (&priv->activating_device4, best4)) {
|
||||
_LOGt (LOGD_DNS, "set-activating-device-4: %p", priv->activating_device4);
|
||||
_notify (self, PROP_ACTIVATING_IP4_DEVICE);
|
||||
}
|
||||
if (best6 != priv->activating_device6) {
|
||||
_LOGt (LOGD_DNS, "set-activating-device-6: %p", best4);
|
||||
priv->activating_device6 = best6;
|
||||
if (nm_g_object_ref_set (&priv->activating_device6, best6)) {
|
||||
_LOGt (LOGD_DNS, "set-activating-device-6: %p", priv->activating_device6);
|
||||
_notify (self, PROP_ACTIVATING_IP6_DEVICE);
|
||||
}
|
||||
|
||||
g_object_thaw_notify (object);
|
||||
g_object_thaw_notify (G_OBJECT (self));
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -2397,6 +2388,11 @@ dispose (GObject *object)
|
|||
g_clear_object (&priv->lookup.addr);
|
||||
g_clear_object (&priv->lookup.resolver);
|
||||
|
||||
nm_clear_g_object (&priv->default_device4);
|
||||
nm_clear_g_object (&priv->default_device6);
|
||||
nm_clear_g_object (&priv->activating_device4);
|
||||
nm_clear_g_object (&priv->activating_device6);
|
||||
|
||||
while (priv->pending_activation_checks)
|
||||
activate_data_free (priv->pending_activation_checks->data);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue