Message ID | 20210922101654.7775-1-shaw.leon@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] net: ipv4: Fix rtnexthop len when RTA_FLOW is present | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | fail | 1 blamed authors not CCed: kafai@fb.com; 1 maintainers not CCed: kafai@fb.com |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 1 this patch: 1 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 52 lines checked |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 1 this patch: 1 |
netdev/header_inline | success | Link |
On 9/22/21 4:16 AM, Xiao Liang wrote: > @@ -1682,10 +1683,17 @@ int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc, > /* length of rtnetlink header + attributes */ > rtnh->rtnh_len = nlmsg_get_pos(skb) - (void *)rtnh; > > - return 0; > + return rtnh; > > nla_put_failure: > - return -EMSGSIZE; > + return ERR_PTR(-EMSGSIZE); > +} > + > +int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc, > + int nh_weight, u8 rt_family) Adding classid as an input to fib_add_nexthop and checking it for non-0 before adding to the message is a better way to resolve this.
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index b42c429cebbe..62b74edb5240 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -1660,8 +1660,9 @@ int fib_nexthop_info(struct sk_buff *skb, const struct fib_nh_common *nhc, EXPORT_SYMBOL_GPL(fib_nexthop_info); #if IS_ENABLED(CONFIG_IP_ROUTE_MULTIPATH) || IS_ENABLED(CONFIG_IPV6) -int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc, - int nh_weight, u8 rt_family) +static struct rtnexthop *__fib_add_nexthop(struct sk_buff *skb, + const struct fib_nh_common *nhc, + int nh_weight, u8 rt_family) { const struct net_device *dev = nhc->nhc_dev; struct rtnexthop *rtnh; @@ -1682,10 +1683,17 @@ int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc, /* length of rtnetlink header + attributes */ rtnh->rtnh_len = nlmsg_get_pos(skb) - (void *)rtnh; - return 0; + return rtnh; nla_put_failure: - return -EMSGSIZE; + return ERR_PTR(-EMSGSIZE); +} + +int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc, + int nh_weight, u8 rt_family) +{ + return PTR_ERR_OR_ZERO(__fib_add_nexthop(skb, nhc, nh_weight, + rt_family)); } EXPORT_SYMBOL_GPL(fib_add_nexthop); #endif @@ -1706,13 +1714,17 @@ static int fib_add_multipath(struct sk_buff *skb, struct fib_info *fi) } for_nexthops(fi) { - if (fib_add_nexthop(skb, &nh->nh_common, nh->fib_nh_weight, - AF_INET) < 0) + struct rtnexthop *rtnh = __fib_add_nexthop(skb, &nh->nh_common, + nh->fib_nh_weight, + AF_INET); + if (IS_ERR(rtnh)) goto nla_put_failure; #ifdef CONFIG_IP_ROUTE_CLASSID - if (nh->nh_tclassid && - nla_put_u32(skb, RTA_FLOW, nh->nh_tclassid)) - goto nla_put_failure; + if (nh->nh_tclassid) { + if (nla_put_u32(skb, RTA_FLOW, nh->nh_tclassid)) + goto nla_put_failure; + rtnh->rtnh_len += nla_total_size(4); + } #endif } endfor_nexthops(fi);
Multipath RTA_FLOW is embedded in nexthop, thus add it to rtnexthop length. Fixes: b0f60193632e ("ipv4: Refactor nexthop attributes in fib_dump_info") Signed-off-by: Xiao Liang <shaw.leon@gmail.com> --- net/ipv4/fib_semantics.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-)