When inet_getpeer_v4() fails to allocate a peer entry under memory pressure
or tree size caps, ip_rt_send_redirect() previously fell back to sending an
un-rate-limited ICMP Redirect.
Because ICMP Redirect is not part of the global rate limit mask (sysctl_icmp_ratemask),
sending ICMP Redirects when peer == NULL creates an un-rate-limited ICMP packet storm.
Fix this by failing closed in ip_rt_send_redirect() when peer == NULL.
Fixes: a853c609504e ("inetpeer: do not get a refcount in inet_getpeer()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/ipv4/route.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 3f3de5164d6e5854cae3ebe6fcecbac10fb63418..152d8cb28f65aacee378521e16885c9cf1a4870e 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -892,8 +892,6 @@ void ip_rt_send_redirect(struct sk_buff *skb)
peer = inet_getpeer_v4(net->ipv4.peers, ip_hdr(skb)->saddr, vif);
if (!peer) {
rcu_read_unlock();
- icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST,
- rt_nexthop(rt, ip_hdr(skb)->daddr));
return;
}
--
2.55.0.229.g6434b31f56-goog