aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2021-02-27 22:27:30 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2021-02-27 22:27:30 +0000
commit70e95f0b6917a8b8cd4a2a5f883f3e9753fc86d8 (patch)
treed03140b07c0532d2a0c51fd8d077eac2ffb9c758
parentd656ce199d72f1aeeef1b2e28b4a284c968a8d03 (diff)
downloadsrc-70e95f0b6917a8b8cd4a2a5f883f3e9753fc86d8.tar.gz
src-70e95f0b6917a8b8cd4a2a5f883f3e9753fc86d8.zip
sctp: avoid integer overflow when starting the HB timer
MFC after: 3 days Reported by: syzbot+14b9d7c3c64208fae62f@syzkaller.appspotmail.com
-rw-r--r--sys/netinet/sctputil.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c
index 319344842d5f..7ddb4c3710df 100644
--- a/sys/netinet/sctputil.c
+++ b/sys/netinet/sctputil.c
@@ -2277,14 +2277,19 @@ sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
}
rndval = sctp_select_initial_TSN(&inp->sctp_ep);
jitter = rndval % to_ticks;
- if (jitter >= (to_ticks >> 1)) {
- to_ticks = to_ticks + (jitter - (to_ticks >> 1));
+ to_ticks >>= 1;
+ if (jitter < (UINT32_MAX - to_ticks)) {
+ to_ticks += jitter;
} else {
- to_ticks = to_ticks - jitter;
+ to_ticks = UINT32_MAX;
}
if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) &&
!(net->dest_state & SCTP_ADDR_PF)) {
- to_ticks += net->heart_beat_delay;
+ if (net->heart_beat_delay < (UINT32_MAX - to_ticks)) {
+ to_ticks += net->heart_beat_delay;
+ } else {
+ to_ticks = UINT32_MAX;
+ }
}
/*
* Now we must convert the to_ticks that are now in ms to