git: 7169d3610d1c - stable/12 - 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:03:48 UTC
The branch stable/12 has been updated by hselasky: URL: https://cgit.FreeBSD.org/src/commit/?id=7169d3610d1cb2614aeebb8ae51f2da0314d27f2 commit 7169d3610d1cb2614aeebb8ae51f2da0314d27f2 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 20:00:58 +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 323d61c3e39a..b486f6250508 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -308,13 +308,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))