Opened 5 years ago
Closed 5 years ago
#13036 closed Bugs (fixed)
Boost.Regex: Integer overflow during calculation of max_state_count
| Reported by: | anonymous | Owned by: | John Maddock |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | regex |
| Version: | Boost Development Trunk | Severity: | Problem |
| Keywords: | regex max_state_count | Cc: |
Description
template <class BidiIterator, class Allocator, class traits>
void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(std::random_access_iterator_tag*)
{
...
std::ptrdiff_t states = re.size();
if(states == 0)
states = 1;
states *= states; // overflows here on 32bit platforms
// if regex string length greater than 2**16
Attachments (1)
Change History (4)
by , 5 years ago
| Attachment: | bug_13036.cc added |
|---|
comment:1 by , 5 years ago
I did not report this issue, but have attached a reproducer. A patch: https://github.com/boostorg/regex/pull/32.
FWIW, overflow occurs when the states variable is greater than sqrt(231) (on a 32-bit platform).
The value of the states variable is implementation dependent whenever re.size() returns a value greater than std::numeric_limits<std::ptrdiff_t>::max() (size() method returns a value of type std::size_t.)
comment:3 by , 5 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Fixed in https://github.com/boostorg/regex/commit/bc9b25b5d3c3784543158510c6087d41739ab64a.
I didn't use your PR because the change from signed to unsigned integer introduces other pitfalls (signed/unsigned comparisons).

reproducer