diff options
author | Dan Winship <danw@gnome.org> | 2014-10-21 11:05:26 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-10-29 09:13:36 -0400 |
commit | 9f739d0c61c303ae2bb72afc86a74583773ed6a5 (patch) | |
tree | dc8c4d74ab7ca184bfb9842d8b45313cec9248ec | |
parent | f1a0b4afd20d03b047977b7715df9e557ee24d76 (diff) | |
download | NetworkManager-9f739d0c61c303ae2bb72afc86a74583773ed6a5.tar.gz |
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.)
-rw-r--r-- | src/rdisc/nm-lndp-rdisc.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/rdisc/nm-lndp-rdisc.c b/src/rdisc/nm-lndp-rdisc.c index bd599ca18a..d265076999 100644 --- a/src/rdisc/nm-lndp-rdisc.c +++ b/src/rdisc/nm-lndp-rdisc.c @@ -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); |