Commit d948974c authored by Stefano Brivio's avatar Stefano Brivio Committed by David S. Miller

ipv4/route: Allow NULL flowinfo in rt_fill_info()

In the next patch, we're going to use rt_fill_info() to dump exception
routes upon RTM_GETROUTE with NLM_F_ROOT, meaning userspace is requesting
a dump and not a specific route selection, which in turn implies the input
interface is not relevant. Update rt_fill_info() to handle a NULL
flowinfo.

v7: If fl4 is NULL, explicitly set r->rtm_tos to 0: it's not initialised
    otherwise (spotted by David Ahern)

v6: New patch
Suggested-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarStefano Brivio <sbrivio@redhat.com>
Reviewed-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b597ca6e
...@@ -2699,7 +2699,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, ...@@ -2699,7 +2699,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
r->rtm_family = AF_INET; r->rtm_family = AF_INET;
r->rtm_dst_len = 32; r->rtm_dst_len = 32;
r->rtm_src_len = 0; r->rtm_src_len = 0;
r->rtm_tos = fl4->flowi4_tos; r->rtm_tos = fl4 ? fl4->flowi4_tos : 0;
r->rtm_table = table_id < 256 ? table_id : RT_TABLE_COMPAT; r->rtm_table = table_id < 256 ? table_id : RT_TABLE_COMPAT;
if (nla_put_u32(skb, RTA_TABLE, table_id)) if (nla_put_u32(skb, RTA_TABLE, table_id))
goto nla_put_failure; goto nla_put_failure;
...@@ -2727,7 +2727,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, ...@@ -2727,7 +2727,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
nla_put_u32(skb, RTA_FLOW, rt->dst.tclassid)) nla_put_u32(skb, RTA_FLOW, rt->dst.tclassid))
goto nla_put_failure; goto nla_put_failure;
#endif #endif
if (!rt_is_input_route(rt) && if (fl4 && !rt_is_input_route(rt) &&
fl4->saddr != src) { fl4->saddr != src) {
if (nla_put_in_addr(skb, RTA_PREFSRC, fl4->saddr)) if (nla_put_in_addr(skb, RTA_PREFSRC, fl4->saddr))
goto nla_put_failure; goto nla_put_failure;
...@@ -2767,36 +2767,40 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, ...@@ -2767,36 +2767,40 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
if (rtnetlink_put_metrics(skb, metrics) < 0) if (rtnetlink_put_metrics(skb, metrics) < 0)
goto nla_put_failure; goto nla_put_failure;
if (fl4->flowi4_mark && if (fl4) {
nla_put_u32(skb, RTA_MARK, fl4->flowi4_mark)) if (fl4->flowi4_mark &&
goto nla_put_failure; nla_put_u32(skb, RTA_MARK, fl4->flowi4_mark))
goto nla_put_failure;
if (!uid_eq(fl4->flowi4_uid, INVALID_UID) &&
nla_put_u32(skb, RTA_UID,
from_kuid_munged(current_user_ns(), fl4->flowi4_uid)))
goto nla_put_failure;
error = rt->dst.error; if (!uid_eq(fl4->flowi4_uid, INVALID_UID) &&
nla_put_u32(skb, RTA_UID,
from_kuid_munged(current_user_ns(),
fl4->flowi4_uid)))
goto nla_put_failure;
if (rt_is_input_route(rt)) { if (rt_is_input_route(rt)) {
#ifdef CONFIG_IP_MROUTE #ifdef CONFIG_IP_MROUTE
if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) && if (ipv4_is_multicast(dst) &&
IPV4_DEVCONF_ALL(net, MC_FORWARDING)) { !ipv4_is_local_multicast(dst) &&
int err = ipmr_get_route(net, skb, IPV4_DEVCONF_ALL(net, MC_FORWARDING)) {
fl4->saddr, fl4->daddr, int err = ipmr_get_route(net, skb,
r, portid); fl4->saddr, fl4->daddr,
r, portid);
if (err <= 0) {
if (err == 0) if (err <= 0) {
return 0; if (err == 0)
goto nla_put_failure; return 0;
} goto nla_put_failure;
} else }
} else
#endif #endif
if (nla_put_u32(skb, RTA_IIF, fl4->flowi4_iif)) if (nla_put_u32(skb, RTA_IIF, fl4->flowi4_iif))
goto nla_put_failure; goto nla_put_failure;
}
} }
error = rt->dst.error;
if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, error) < 0) if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, error) < 0)
goto nla_put_failure; goto nla_put_failure;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment