diff --git c/src/platform/nm-platform.c i/src/platform/nm-platform.c
index ebc5720..eb413ee 100644
--- c/src/platform/nm-platform.c
+++ i/src/platform/nm-platform.c
@@ -1198,13 +1198,10 @@ get_time (void)
 	return tp.tv_sec;
 }
 
-/* Compute (a - b) in an overflow-safe manner. */
+/* Compute MAX(a - b, 0) in an overflow-safe manner. */
 static guint32
 substract_guint32 (guint32 a, guint32 b)
 {
-	if (a == G_MAXUINT32)
-		return G_MAXUINT32;
-
 	return a > b ? a - b : 0;
 }
 
@@ -1245,7 +1242,7 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses)
 		const NMPlatformIP4Address *known_address = &g_array_index (known_addresses, NMPlatformIP4Address, i);
 		guint32 lifetime, preferred;
 
-		if (known_address->lifetime) {
+		if (known_address->lifetime && known_address->lifetime != NM_PLATFORM_LIFETIME_PERMANENT) {
 			/* Pad the timestamp by 5 seconds to avoid potential races. */
 			guint32 shift = substract_guint32 (now, known_address->timestamp + 5);
 
@@ -1302,7 +1299,7 @@ nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses)
 		const NMPlatformIP6Address *known_address = &g_array_index (known_addresses, NMPlatformIP6Address, i);
 		guint32 lifetime, preferred;
 
-		if (known_address->lifetime) {
+		if (known_address->lifetime && known_address->lifetime != NM_PLATFORM_LIFETIME_PERMANENT) {
 			/* Pad the timestamp by 5 seconds to avoid potential races. */
 			guint32 shift = substract_guint32 (now, known_address->timestamp + 5);
 
