Skip to content

Commit

Permalink
Merge pull request #239 from cmazakas/feature/overflow-fix
Browse files Browse the repository at this point in the history
fix overflow bug when attempting to access match results
  • Loading branch information
jzmaddock authored Dec 21, 2024
2 parents 7af2aad + 093e135 commit 31f98f2
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 0 deletions.
4 changes: 4 additions & 0 deletions include/boost/regex/v5/match_results.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,10 @@ class match_results
{
if(m_is_singular && m_subs.empty())
raise_logic_error();

if (sub >= INT_MAX - 2 )
return m_null;

sub += 2;
if(sub < (int)m_subs.size() && (sub >= 0))
{
Expand Down
2 changes: 2 additions & 0 deletions include/boost/regex/v5/syntax_type.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
#define BOOST_REGEX_SYNTAX_TYPE_HPP

#include <boost/regex/config.hpp>

namespace boost{
namespace regex_constants{

Expand Down
1 change: 1 addition & 0 deletions test/Jamfile.v2
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,5 @@ run issue153.cpp : : : "<toolset>msvc:<linkflags>-STACK:2097152" ;
run issue227.cpp ;
run issue232.cpp ;
run lookbehind_recursion_stress_test.cpp ;
run regex_replace_overflow.cpp ;

29 changes: 29 additions & 0 deletions test/regex_replace_overflow.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include <boost/regex.hpp>

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

#include <boost/core/lightweight_test.hpp>

int main() {
std::string format_string = "$2$2147483647";
boost::regex e2("(<)|(>)|(&)|\\r");

std::string in =
"#include <iostream>"
""
"int main() { std::cout << \"Hello, world!\\n\"; }";

std::ostringstream t( std::ios::out | std::ios::binary );
std::ostream_iterator<char, char> oi( t );

boost::regex_replace(oi, in.begin(), in.end(), e2, format_string,
boost::match_default | boost::format_all);

std::string s(t.str());

BOOST_TEST(!s.empty());
return boost::report_errors();
}

0 comments on commit 31f98f2

Please sign in to comment.