FAILED: patch "[PATCH] ipv4: Check attribute length for RTA_GATEWAY in multipath" failed to apply to 4.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 7a3429bace0e08d94c39245631ea6bc109dafa49 Mon Sep 17 00:00:00 2001
From: David Ahern <[email protected]>
Date: Thu, 30 Dec 2021 17:36:31 -0700
Subject: [PATCH] ipv4: Check attribute length for RTA_GATEWAY in multipath
route
syzbot reported uninit-value:
============================================================
BUG: KMSAN: uninit-value in fib_get_nhs+0xac4/0x1f80 net/ipv4/fib_semantics.c:708 fib_get_nhs+0xac4/0x1f80 net/ipv4/fib_semantics.c:708 fib_create_info+0x2411/0x4870 net/ipv4/fib_semantics.c:1453 fib_table_insert+0x45c/0x3a10 net/ipv4/fib_trie.c:1224 inet_rtm_newroute+0x289/0x420 net/ipv4/fib_frontend.c:886
Add helper to validate RTA_GATEWAY length before using the attribute.
Fixes 4e902c57417c ("[IPv4]: FIB configuration using struct fib_config")
Reported-by [email protected]
Signed-off-by David Ahern <[email protected]>
Cc Thomas Graf <[email protected]>
Signed-off-by David S. Miller <[email protected]>
net/ipv4/fib_semantics.c +26 -3
@@ -662,6 +662,19 @@ static int fib_count_nexthops(struct rtnexthop *rtnh, int remaining,return nhs; } +static int fib_gw_from_attr (__be32 *gw,struct nlattr *nla, +struct netlink_ext_ack *extack) +{ +if (nla_len (nla) <sizeof (*gw)) { +NL_SET_ERR_MSG (extack,"Invalid IPv4 address in RTA_GATEWAY" ); +return -EINVAL ; + } + + *gw =nla_get_in_addr (nla); + +return 0 ; +} +/* only called when fib_nh is integrated into fib_info */ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh, int remaining, struct fib_config *cfg,
@@ -704,7 +717,11 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,return -EINVAL ; }if (nla) { - fib_cfg.fc_gw4 =nla_get_in_addr (nla); + ret =fib_gw_from_attr (&fib_cfg.fc_gw4, nla, + extack); +if (ret) + goto errout; +if (fib_cfg.fc_gw4) fib_cfg.fc_gw_family =AF_INET ; }else if (nlav) {
@@ -902,6 +919,7 @@ int fib_nh_match(struct net *net, struct fib_config *cfg, struct fib_info *fi, attrlen =rtnh_attrlen (rtnh);if (attrlen >0 ) {struct nlattr *nla, *nlav, *attrs =rtnh_attrs (rtnh); +int err; nla =nla_find (attrs, attrlen,RTA_GATEWAY ); nlav =nla_find (attrs, attrlen,RTA_VIA );
@@ -912,12 +930,17 @@ int fib_nh_match(struct net *net, struct fib_config *cfg, struct fib_info *fi, }if (nla) { +__be32 gw; + + err =fib_gw_from_attr (&gw, nla, extack); +if (err) +return err; +if (nh->fib_nh_gw_family !=AF_INET || -nla_get_in_addr (nla) != nh->fib_nh_gw4) + gw != nh->fib_nh_gw4)return 1 ; }else if (nlav) {struct fib_config cfg2; -int err; err =fib_gw_from_via (&cfg2, nlav, extack);if (err)