summaryrefslogtreecommitdiff
path: root/src/network/networkd-route.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-10-03 11:54:20 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-10-04 02:52:46 +0900
commitaf2aea8bb64b0dc42ecbe5549216eb567681a803 (patch)
tree642e29825207ed394c71bb1129beec805c96b7c6 /src/network/networkd-route.c
parent0cf1fe88885bd5ae1944c331ee1a5ec80b0ddfbc (diff)
downloadsystemd-af2aea8bb64b0dc42ecbe5549216eb567681a803.tar.gz
network: ndisc: drop addresses and friends when RA with zero lifetime is received
Routers may send options with zero lifetime if previously announced information is outdated. Hence, if we receive such messages, then we need to drop relevant addresses or friends. See e.g. https://www.rfc-editor.org/rfc/rfc4861#section-12. Follow-up for 2ccada8dc4a3571468a335808fd6fe49b8c6c6dd.
Diffstat (limited to 'src/network/networkd-route.c')
-rw-r--r--src/network/networkd-route.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index 2b17959ca2..514845f7c5 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -1426,7 +1426,7 @@ int link_request_route(
route_netlink_handler_t netlink_handler,
Request **ret) {
- Route *existing;
+ Route *existing = NULL;
int r;
assert(link);
@@ -1435,7 +1435,13 @@ int link_request_route(
assert(route->source != NETWORK_CONFIG_SOURCE_FOREIGN);
assert(!route_needs_convert(route));
- if (route_get(link->manager, link, route, &existing) < 0) {
+ (void) route_get(link->manager, link, route, &existing);
+
+ if (route->lifetime_usec == 0)
+ /* The requested route is outdated. Let's remove it. */
+ return route_remove_and_drop(existing);
+
+ if (!existing) {
_cleanup_(route_freep) Route *tmp = NULL;
if (consume_object)