Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
- net/ipv4/udp.c | 4 ++--
- net/ipv6/udp.c | 4 ++--
- tools/testing/selftests/net/udpgso.c | 26 ++++++++++++++++++++++++++
+ net/ipv4/udp.c | 4 ++--
+ net/ipv6/udp.c | 4 ++--
+ tools/testing/selftests/net/udpgso.c | 26 ++++++++++++++++++++++++++
3 files changed, 30 insertions(+), 4 deletions(-)
-diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
-index 1ccdb6a9ab892..f85c48858341d 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
-@@ -849,9 +849,9 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4,
+@@ -849,9 +849,9 @@ static int udp_send_skb(struct sk_buff *
const int hlen = skb_network_header_len(skb) +
sizeof(struct udphdr);
- if (hlen + cork->gso_size > cork->fragsize) {
-+ if (hlen + min(datalen, cork->gso_size) > cork->fragsize) {
++ if (hlen + min_t(int, datalen, cork->gso_size) > cork->fragsize) {
kfree_skb(skb);
- return -EINVAL;
+ return -EMSGSIZE;
}
if (datalen > cork->gso_size * UDP_MAX_SEGMENTS) {
kfree_skb(skb);
-diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
-index e6fdb842e89df..58793dd7ac2c4 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
-@@ -1141,9 +1141,9 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
+@@ -1141,9 +1141,9 @@ static int udp_v6_send_skb(struct sk_buf
const int hlen = skb_network_header_len(skb) +
sizeof(struct udphdr);
- if (hlen + cork->gso_size > cork->fragsize) {
-+ if (hlen + min(datalen, cork->gso_size) > cork->fragsize) {
++ if (hlen + min_t(int, datalen, cork->gso_size) > cork->fragsize) {
kfree_skb(skb);
- return -EINVAL;
+ return -EMSGSIZE;
}
if (datalen > cork->gso_size * UDP_MAX_SEGMENTS) {
kfree_skb(skb);
-diff --git a/tools/testing/selftests/net/udpgso.c b/tools/testing/selftests/net/udpgso.c
-index 7badaf215de28..0e137182a4f40 100644
--- a/tools/testing/selftests/net/udpgso.c
+++ b/tools/testing/selftests/net/udpgso.c
-@@ -94,6 +94,19 @@ struct testcase testcases_v4[] = {
- .gso_len = CONST_MSS_V4,
+@@ -95,6 +95,19 @@ struct testcase testcases_v4[] = {
.r_num_mss = 1,
},
-+ {
+ {
+ /* datalen <= MSS < gso_len: will fall back to no GSO */
+ .tlen = CONST_MSS_V4,
+ .gso_len = CONST_MSS_V4 + 1,
+ .gso_len = CONST_MSS_V4 + 2,
+ .tfail = true,
+ },
- {
++ {
/* send a single MSS + 1B */
.tlen = CONST_MSS_V4 + 1,
-@@ -197,6 +210,19 @@ struct testcase testcases_v6[] = {
- .gso_len = CONST_MSS_V6,
+ .gso_len = CONST_MSS_V4,
+@@ -198,6 +211,19 @@ struct testcase testcases_v6[] = {
.r_num_mss = 1,
},
-+ {
+ {
+ /* datalen <= MSS < gso_len: will fall back to no GSO */
+ .tlen = CONST_MSS_V6,
+ .gso_len = CONST_MSS_V6 + 1,
+ .gso_len = CONST_MSS_V6 + 2,
+ .tfail = true
+ },
- {
++ {
/* send a single MSS + 1B */
.tlen = CONST_MSS_V6 + 1,
---
-2.39.5
-
+ .gso_len = CONST_MSS_V6,