]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ndisc: ignore invalid SLAAC prefix lengths (#4923)
authorJörg Thalheim <joerg@higgsboson.tk>
Tue, 20 Dec 2016 19:27:06 +0000 (20:27 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 20 Dec 2016 19:27:06 +0000 (20:27 +0100)
- linux does not accept prefixes for SLAAC unequal to 64 bits: http://lxr.free-electrons.com/source/net/ipv6/addrconf.c#L2741
- when networkd tries export such a route to the kernel it will get -EINVAL and
  set the whole device into a failed state.
- this patch will make networkd ignore such prefixes for SLAAC,
  but process other informations which may contain other prefixes.
- Note that rfc4862 does not forbid prefix length != 64 bit

src/libsystemd-network/ndisc-router.c

index cf56c89d760d3e9590ebd4f04d8fa4b4f8d77719..845a6b7c6c5110b045fc69be88a0a3860e9f8467 100644 (file)
@@ -459,6 +459,7 @@ _public_ int sd_ndisc_router_prefix_get_preferred_lifetime(sd_ndisc_router *rt,
 
 _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret) {
         struct nd_opt_prefix_info *pi;
+        uint8_t flags;
         int r;
 
         assert_return(rt, -EINVAL);
@@ -468,7 +469,14 @@ _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret)
         if (r < 0)
                 return r;
 
-        *ret = pi->nd_opt_pi_flags_reserved;
+        flags = pi->nd_opt_pi_flags_reserved;
+
+        if ((flags & ND_OPT_PI_FLAG_AUTO) && (pi->nd_opt_pi_prefix_len != 64)) {
+                log_ndisc("Invalid prefix length, ignoring prefix for stateless autoconfiguration.");
+                flags &= ~ND_OPT_PI_FLAG_AUTO;
+        }
+
+        *ret = flags;
         return 0;
 }