core/platform: limit the preferred time to address lifetime

Related: https://bugzilla.redhat.com/show_bug.cgi?id=1082041

Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
Thomas Haller 2014-04-01 22:46:46 +02:00
parent 8310a039d8
commit 84cfd06d6a
3 changed files with 10 additions and 0 deletions

View file

@ -3601,6 +3601,8 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, NMDevice *device
address.timestamp = discovered_address->timestamp;
address.lifetime = discovered_address->lifetime;
address.preferred = discovered_address->preferred;
if (address.preferred > address.lifetime)
address.preferred = address.lifetime;
address.source = NM_PLATFORM_SOURCE_RDISC;
address.flags = ifa_flags;

View file

@ -1425,6 +1425,7 @@ nm_platform_ip4_address_add (int ifindex,
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
g_return_val_if_fail (lifetime > 0, FALSE);
g_return_val_if_fail (preferred <= lifetime, FALSE);
g_return_val_if_fail (klass->ip4_address_add, FALSE);
g_return_val_if_fail (!label || strlen (label) < sizeof (((NMPlatformIP4Address *) NULL)->label), FALSE);
@ -1459,6 +1460,7 @@ nm_platform_ip6_address_add (int ifindex,
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
g_return_val_if_fail (lifetime > 0, FALSE);
g_return_val_if_fail (preferred <= lifetime, FALSE);
g_return_val_if_fail (klass->ip6_address_add, FALSE);
if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
@ -1610,6 +1612,8 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses)
lifetime = subtract_guint32 (known_address->lifetime, shift);
preferred = subtract_guint32 (known_address->lifetime, shift);
g_warn_if_fail (known_address->preferred <= known_address->lifetime);
} else
lifetime = preferred = NM_PLATFORM_LIFETIME_PERMANENT;
@ -1667,6 +1671,8 @@ nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses)
lifetime = subtract_guint32 (known_address->lifetime, shift);
preferred = subtract_guint32 (known_address->lifetime, shift);
g_warn_if_fail (known_address->preferred <= known_address->lifetime);
} else
lifetime = preferred = NM_PLATFORM_LIFETIME_PERMANENT;

View file

@ -547,6 +547,8 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
address.timestamp = now;
address.lifetime = ndp_msg_opt_prefix_valid_time (msg, offset);
address.preferred = ndp_msg_opt_prefix_preferred_time (msg, offset);
if (address.preferred > address.lifetime)
address.preferred = address.lifetime;
fill_address_from_mac (&address.address, lladdr);