mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-29 01:16:26 -05:00
63 lines
2.0 KiB
Diff
63 lines
2.0 KiB
Diff
From beb39db59d14990e401e235faf66a6b9b31240b0 Mon Sep 17 00:00:00 2001
|
|
From: Eric Dumazet <edumazet@google.com>
|
|
Date: Sat, 30 May 2015 09:16:53 -0700
|
|
Subject: [PATCH] udp: fix behavior of wrong checksums
|
|
|
|
We have two problems in UDP stack related to bogus checksums :
|
|
|
|
1) We return -EAGAIN to application even if receive queue is not empty.
|
|
This breaks applications using edge trigger epoll()
|
|
|
|
2) Under UDP flood, we can loop forever without yielding to other
|
|
processes, potentially hanging the host, especially on non SMP.
|
|
|
|
This patch is an attempt to make things better.
|
|
|
|
We might in the future add extra support for rt applications
|
|
wanting to better control time spent doing a recv() in a hostile
|
|
environment. For example we could validate checksums before queuing
|
|
packets in socket receive queue.
|
|
|
|
Signed-off-by: Eric Dumazet <edumazet@google.com>
|
|
Cc: Willem de Bruijn <willemb@google.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
net/ipv4/udp.c | 6 ++----
|
|
net/ipv6/udp.c | 6 ++----
|
|
2 files changed, 4 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
index d10b7e0112ebd..1c92ea67baefe 100644
|
|
--- a/net/ipv4/udp.c
|
|
+++ b/net/ipv4/udp.c
|
|
@@ -1345,10 +1345,8 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
|
}
|
|
unlock_sock_fast(sk, slow);
|
|
|
|
- if (noblock)
|
|
- return -EAGAIN;
|
|
-
|
|
- /* starting over for a new packet */
|
|
+ /* starting over for a new packet, but check if we need to yield */
|
|
+ cond_resched();
|
|
msg->msg_flags &= ~MSG_TRUNC;
|
|
goto try_again;
|
|
}
|
|
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
|
index c2ec41617a354..e51fc3eee6dbd 100644
|
|
--- a/net/ipv6/udp.c
|
|
+++ b/net/ipv6/udp.c
|
|
@@ -525,10 +525,8 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|
}
|
|
unlock_sock_fast(sk, slow);
|
|
|
|
- if (noblock)
|
|
- return -EAGAIN;
|
|
-
|
|
- /* starting over for a new packet */
|
|
+ /* starting over for a new packet, but check if we need to yield */
|
|
+ cond_resched();
|
|
msg->msg_flags &= ~MSG_TRUNC;
|
|
goto try_again;
|
|
}
|