Fix integer overflow in port allocation causing permanent allocation failure #1724
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a critical issue where Coturn would permanently stop allocating ports after approximately 4 billion allocation/release operations due to uint32_t integer overflow.
Problem
The
_turnportsstructure uses twouint32_tcounters (lowandhigh) to track port allocation state:lowincrements on each port allocationhighincrements on each port releaseAfter ~4 billion operations, these counters would overflow. When
highwraps around to a small value whilelowremains large, the conditiontp->high <= tp->lowinturnports_allocate()would become permanently true, preventing all future port allocations.Solution
Changed the overflow-sensitive condition from:
To an overflow-safe condition using unsigned arithmetic:
This works correctly in all scenarios:
high=2000, low=1000→2000-1000=1000(ports available)high=low→high-low=0(correctly identifies exhaustion)high=100, low=4294967000→100-4294967000=large number(correctly identifies available ports due to unsigned underflow)Testing
The server can now handle unlimited allocation/release cycles without the cumulative limit issue.
Fixes #1649.
Warning
Firewall rules blocked me from connecting to one or more addresses
I tried to connect to the following addresses, but was blocked by firewall rules:
esm.ubuntu.com/usr/lib/apt/methods/https(dns block)If you need me to access, download, or install something from one of these locations, you can either:
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.