Fix incorrect use of subject end/begin in regex execution

This could lead to reading past subject string end in certain
conditions

Fixes #4794
This commit is contained in:
Maxime Coste 2023-01-23 17:38:02 +11:00
parent a02bd19533
commit f5d5274c5f
3 changed files with 11 additions and 2 deletions

View File

@ -220,6 +220,7 @@ private:
m_results.values().clear(); m_results.values().clear();
std::move(m_vm.captures().begin(), m_vm.captures().end(), std::back_inserter(m_results.values())); std::move(m_vm.captures().begin(), m_vm.captures().end(), std::back_inserter(m_results.values()));
m_next_pos = forward ? m_results[0].second : m_results[0].first; m_next_pos = forward ? m_results[0].second : m_results[0].first;
kak_assert(forward ? (m_next_pos <= m_end) : (m_next_pos >= m_begin));
return true; return true;
} }

View File

@ -1204,6 +1204,8 @@ struct TestVM : CompiledRegex, ThreadedRegexVM<const char*, mode>
{ {
return TestVM::ThreadedRegexVM::exec(re.begin(), re.end(), re.begin(), re.end(), flags); return TestVM::ThreadedRegexVM::exec(re.begin(), re.end(), re.begin(), re.end(), flags);
} }
using TestVM::ThreadedRegexVM::exec;
}; };
} }
@ -1564,6 +1566,12 @@ auto test_regex = UnitTest{[]{
kak_assert(vm.exec("д", RegexExecFlags::None)); kak_assert(vm.exec("д", RegexExecFlags::None));
} }
{
TestVM<RegexMode::Forward | RegexMode::Search> vm{"ab"};
const char str[] = "fa😄ab";
kak_assert(not vm.exec(str, str+4, str, str + sizeof(str)-1, RegexExecFlags::None));
}
{ {
TestVM<> vm{R"(\0\x0A\u00260e\u00260F)"}; TestVM<> vm{R"(\0\x0A\u00260e\u00260F)"};
const char str[] = "\0\n☎☏"; // work around the null byte in the literal const char str[] = "\0\n☎☏"; // work around the null byte in the literal

View File

@ -492,8 +492,8 @@ private:
return m_found_match; return m_found_match;
} }
forward ? utf8::to_next(pos, config.subject_end) forward ? utf8::to_next(pos, config.end)
: utf8::to_previous(pos, config.subject_begin); : utf8::to_previous(pos, config.end);
if (search and not m_found_match) if (search and not m_found_match)
{ {