rdisc: properly handle RDNSS/DNSSL forced expiration

If the router sends an RA with an RDNSS or DNSSL lifetime of "0", that
means to immediately stop using the corresponding server/domain name.
NMLNDPRDisc knew this, but messed up its handling of it, and so if
this happened, it might end up sending out an RS to get new data every
0 seconds...

(Noticed while investigating bgo 735325, though it turned out to be
irrelevant there.)
This commit is contained in:
Dan Winship 2014-10-21 11:05:26 -04:00
parent f1a0b4afd2
commit 9f739d0c61

View file

@ -176,8 +176,15 @@ add_dns_server (NMRDisc *rdisc, const NMRDiscDNSServer *new)
NMRDiscDNSServer *item = &g_array_index (rdisc->dns_servers, NMRDiscDNSServer, i);
if (IN6_ARE_ADDR_EQUAL (&item->address, &new->address)) {
gboolean changed = item->timestamp != new->timestamp ||
item->lifetime != new->lifetime;
gboolean changed;
if (new->lifetime == 0) {
g_array_remove_index (rdisc->dns_servers, i);
return TRUE;
}
changed = (item->timestamp != new->timestamp ||
item->lifetime != new->lifetime);
if (changed) {
item->timestamp = new->timestamp;
item->lifetime = new->lifetime;
@ -186,10 +193,6 @@ add_dns_server (NMRDisc *rdisc, const NMRDiscDNSServer *new)
}
}
/* DNS server should no longer be used */
if (new->lifetime == 0)
return FALSE;
g_array_insert_val (rdisc->dns_servers, i, *new);
return TRUE;
}
@ -205,8 +208,15 @@ add_dns_domain (NMRDisc *rdisc, const NMRDiscDNSDomain *new)
item = &g_array_index (rdisc->dns_domains, NMRDiscDNSDomain, i);
if (!g_strcmp0 (item->domain, new->domain)) {
gboolean changed = item->timestamp != new->timestamp ||
item->lifetime != new->lifetime;
gboolean changed;
if (new->lifetime == 0) {
g_array_remove_index (rdisc->dns_domains, i);
return TRUE;
}
changed = (item->timestamp != new->timestamp ||
item->lifetime != new->lifetime);
if (changed) {
item->timestamp = new->timestamp;
item->lifetime = new->lifetime;
@ -215,10 +225,6 @@ add_dns_domain (NMRDisc *rdisc, const NMRDiscDNSDomain *new)
}
}
/* Domain should no longer be used */
if (new->lifetime == 0)
return FALSE;
g_array_insert_val (rdisc->dns_domains, i, *new);
item = &g_array_index (rdisc->dns_domains, NMRDiscDNSDomain, i);
item->domain = g_strdup (new->domain);