diff options
| author | Thomas Haller <thaller@redhat.com> | 2017-09-06 15:41:12 +0200 |
|---|---|---|
| committer | Thomas Haller <thaller@redhat.com> | 2017-09-08 11:05:04 +0200 |
| commit | 5c7e0654ebc64bc84b18f66854686f896d18e4ca (patch) | |
| tree | bf8c8455cbab7eb5ac9862a15dd94e46f77eccfd /src/nm-policy.c | |
| parent | f8cb6dcbb1b4fe985957e6349e6f97f642f9ff8e (diff) | |
| download | NetworkManager-5c7e0654ebc64bc84b18f66854686f896d18e4ca.tar.gz | |
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).
Diffstat (limited to 'src/nm-policy.c')
| -rw-r--r-- | src/nm-policy.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/src/nm-policy.c b/src/nm-policy.c index cde86c574a..f3c915db9d 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -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); |
