Message ID | 1308689020-1873-4-git-send-email-paul.gortmaker@windriver.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Le mardi 21 juin 2011 à 16:43 -0400, Paul Gortmaker a écrit : > From: Xufeng Zhang <xufeng.zhang@windriver.com> > > Consider this scenario: When the size of the first received udp packet > is bigger than the receive buffer, MSG_TRUNC bit is set in msg->msg_flags. > However, if checksum error happens and this is a blocking socket, it will > goto try_again loop to receive the next packet. But if the size of the > next udp packet is smaller than receive buffer, MSG_TRUNC flag should not > be set, but because MSG_TRUNC bit is not cleared in msg->msg_flags before > receive the next packet, MSG_TRUNC is still set, which is wrong. > > Fix this problem by clearing MSG_TRUNC flag when starting over for a > new packet. > > Signed-off-by: Xufeng Zhang <xufeng.zhang@windriver.com> > Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> > --- > net/ipv4/udp.c | 3 +++ > net/ipv6/udp.c | 3 +++ > 2 files changed, 6 insertions(+), 0 deletions(-) Acked-by: Eric Dumazet <eric.dumazet@gmail.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 6f53a5a..15d550c 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1249,6 +1249,9 @@ csum_copy_err: if (noblock) return -EAGAIN; + + /* starting over for a new packet */ + msg->msg_flags &= ~MSG_TRUNC; goto try_again; } diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 1e7a43f..328985c 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -455,6 +455,9 @@ csum_copy_err: if (noblock) return -EAGAIN; + + /* starting over for a new packet */ + msg->msg_flags &= ~MSG_TRUNC; goto try_again; }