git: 95a99019968c - stable/13 - tcp: Correctly compute the retransmit length for all 64-bit platforms.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 06 Jun 2022 20:00:07 UTC
The branch stable/13 has been updated by hselasky:
URL: https://cgit.FreeBSD.org/src/commit/?id=95a99019968c0112c0396cffe7da0f6eb2b00af4
commit 95a99019968c0112c0396cffe7da0f6eb2b00af4
Author: Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2022-06-02 18:33:21 +0000
Commit: Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2022-06-06 19:58:05 +0000
tcp: Correctly compute the retransmit length for all 64-bit platforms.
When the TCP sequence number subtracted is greater than 2**32 minus
the window size, or 2**31 minus the window size, the use of unsigned
long as an intermediate variable, may result in an incorrect retransmit
length computation on all 64-bit platforms.
While at it create a helper macro to facilitate the computation of
the difference between two TCP sequence numbers.
Differential Revision: https://reviews.freebsd.org/D35388
Reviewed by: rscheff
Sponsored by: NVIDIA Networking
(cherry picked from commit 28173d49dccb91e50be9c401dbad1da908a5dc75)
---
sys/netinet/tcp_output.c | 13 ++++++++-----
sys/netinet/tcp_seq.h | 1 +
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 9a395f593162..74721463e622 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -325,13 +325,16 @@ again:
*/
p = NULL;
goto after_sack_rexmit;
- } else
+ } else {
/* Can rexmit part of the current hole */
len = ((int32_t)ulmin(cwin,
- tp->snd_recover - p->rxmit));
- } else
- len = ((int32_t)ulmin(cwin, p->end - p->rxmit));
- off = p->rxmit - tp->snd_una;
+ SEQ_SUB(tp->snd_recover, p->rxmit)));
+ }
+ } else {
+ len = ((int32_t)ulmin(cwin,
+ SEQ_SUB(p->end, p->rxmit)));
+ }
+ off = SEQ_SUB(p->rxmit, tp->snd_una);
KASSERT(off >= 0,("%s: sack block to the left of una : %d",
__func__, off));
if (len > 0) {
diff --git a/sys/netinet/tcp_seq.h b/sys/netinet/tcp_seq.h
index b6e682ec1fe4..c77fd0fa1f6f 100644
--- a/sys/netinet/tcp_seq.h
+++ b/sys/netinet/tcp_seq.h
@@ -43,6 +43,7 @@
#define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0)
#define SEQ_GT(a,b) ((int)((a)-(b)) > 0)
#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0)
+#define SEQ_SUB(a,b) ((int)((a)-(b)))
#define SEQ_MIN(a, b) ((SEQ_LT(a, b)) ? (a) : (b))
#define SEQ_MAX(a, b) ((SEQ_GT(a, b)) ? (a) : (b))