[PATCH net] net: ipv4: fix path MTU for multi path routes
From: Vadim Fedorenko <hidden>
Date: 2021-07-31 01:17:48
Bug 213729 showed that MTU check could be used against route that will not be used in actual transmit if source ip is not specified. But path MTU update is always done on route with defined source ip. Fix route selection by updating flow info in case when source ip is not explicitly defined in raw and udp sockets. Signed-off-by: Vadim Fedorenko <redacted> --- net/ipv4/raw.c | 11 +++++++++++ net/ipv4/udp.c | 13 +++++++++++++ 2 files changed, 24 insertions(+)
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index bb446e60cf58..e4008416dfc1 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c@@ -640,6 +640,17 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) goto done; } + if (!saddr) { + rt = __ip_route_output_key(net, &fl4); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); + rt = NULL; + goto done; + } + ip_rt_put(rt); + flowi4_update_output(&fl4, ipc.oif, tos, fl4.daddr, fl4.saddr); + } + security_sk_classify_flow(sk, flowi4_to_flowi_common(&fl4)); rt = ip_route_output_flow(net, &fl4, sk); if (IS_ERR(rt)) {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 1a742b710e54..c6db5c3aa294 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c@@ -1215,6 +1215,19 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) faddr, saddr, dport, inet->inet_sport, sk->sk_uid); + if (!saddr) { + rt = __ip_route_output_key(net, fl4); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); + rt = NULL; + if (err == -ENETUNREACH) + IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); + goto out; + } + ip_rt_put(rt); + flowi4_update_output(fl4, ipc.oif, tos, fl4->daddr, fl4->saddr); + } + security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4)); rt = ip_route_output_flow(net, fl4, sk); if (IS_ERR(rt)) {
--
2.18.4