ipv4: Check attribute length for RTA_FLOW in multipath route
authorDavid Ahern <dsahern@kernel.org>
Fri, 31 Dec 2021 00:36:32 +0000 (17:36 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 31 Dec 2021 14:31:59 +0000 (14:31 +0000)
Make sure RTA_FLOW is at least 4B before using.

Fixes: 4e902c57417c ("[IPv4]: FIB configuration using struct fib_config")
Signed-off-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/fib_semantics.c

index f1caa2c..36bc429 100644 (file)
@@ -731,8 +731,13 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,
                        }
 
                        nla = nla_find(attrs, attrlen, RTA_FLOW);
-                       if (nla)
+                       if (nla) {
+                               if (nla_len(nla) < sizeof(u32)) {
+                                       NL_SET_ERR_MSG(extack, "Invalid RTA_FLOW");
+                                       return -EINVAL;
+                               }
                                fib_cfg.fc_flow = nla_get_u32(nla);
+                       }
 
                        fib_cfg.fc_encap = nla_find(attrs, attrlen, RTA_ENCAP);
                        nla = nla_find(attrs, attrlen, RTA_ENCAP_TYPE);
@@ -963,8 +968,14 @@ int fib_nh_match(struct net *net, struct fib_config *cfg, struct fib_info *fi,
 
 #ifdef CONFIG_IP_ROUTE_CLASSID
                        nla = nla_find(attrs, attrlen, RTA_FLOW);
-                       if (nla && nla_get_u32(nla) != nh->nh_tclassid)
-                               return 1;
+                       if (nla) {
+                               if (nla_len(nla) < sizeof(u32)) {
+                                       NL_SET_ERR_MSG(extack, "Invalid RTA_FLOW");
+                                       return -EINVAL;
+                               }
+                               if (nla_get_u32(nla) != nh->nh_tclassid)
+                                       return 1;
+                       }
 #endif
                }