diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index a67401c3f5..445611ddca 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -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; diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 463822c7d9..e43f3033f2 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -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; diff --git a/src/rdisc/nm-lndp-rdisc.c b/src/rdisc/nm-lndp-rdisc.c index f5efa1ec7f..cf0267d1c6 100644 --- a/src/rdisc/nm-lndp-rdisc.c +++ b/src/rdisc/nm-lndp-rdisc.c @@ -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);