Commit 4d838433 by Tim Shen Committed by Tim Shen

re PR libstdc++/63497 (std::regex can't handle [^class] correctly and cause runtime crash)

	PR libstdc++/63497
	include/bits/regex_executor.h (_Executor::_M_word_boundary): Remove
	unused parameter.
	include/bits/regex_executor.tcc (_Executor::_M_dfs,
	_Executor::_M_word_boundary): Avoid dereferecing _M_current at _M_end
	or other invalid position.

From-SVN: r216572
parent a3317c92
2014-10-23 Tim Shen <timshen@google.com>
PR libstdc++/63497
include/bits/regex_executor.h (_Executor::_M_word_boundary): Remove
unused parameter.
include/bits/regex_executor.tcc (_Executor::_M_dfs,
_Executor::_M_word_boundary): Avoid dereferecing _M_current at _M_end
or other invalid position.
2014-10-21 Joern Rennecke <joern.rennecke@embecosm.com> 2014-10-21 Joern Rennecke <joern.rennecke@embecosm.com>
* testsuite/util/io/prog_bar.cc: Qualify size_t. * testsuite/util/io/prog_bar.cc: Qualify size_t.
......
...@@ -145,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -145,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
} }
bool bool
_M_word_boundary(_State<_TraitsT> __state) const; _M_word_boundary() const;
bool bool
_M_lookahead(_State<_TraitsT> __state); _M_lookahead(_State<_TraitsT> __state);
......
...@@ -274,7 +274,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -274,7 +274,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_dfs(__match_mode, __state._M_next); _M_dfs(__match_mode, __state._M_next);
break; break;
case _S_opcode_word_boundary: case _S_opcode_word_boundary:
if (_M_word_boundary(__state) == !__state._M_neg) if (_M_word_boundary() == !__state._M_neg)
_M_dfs(__match_mode, __state._M_next); _M_dfs(__match_mode, __state._M_next);
break; break;
// Here __state._M_alt offers a single start node for a sub-NFA. // Here __state._M_alt offers a single start node for a sub-NFA.
...@@ -284,9 +284,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -284,9 +284,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_dfs(__match_mode, __state._M_next); _M_dfs(__match_mode, __state._M_next);
break; break;
case _S_opcode_match: case _S_opcode_match:
if (_M_current == _M_end)
break;
if (__dfs_mode) if (__dfs_mode)
{ {
if (_M_current != _M_end && __state._M_matches(*_M_current)) if (__state._M_matches(*_M_current))
{ {
++_M_current; ++_M_current;
_M_dfs(__match_mode, __state._M_next); _M_dfs(__match_mode, __state._M_next);
...@@ -407,25 +409,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -407,25 +409,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _BiIter, typename _Alloc, typename _TraitsT, template<typename _BiIter, typename _Alloc, typename _TraitsT,
bool __dfs_mode> bool __dfs_mode>
bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>:: bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
_M_word_boundary(_State<_TraitsT>) const _M_word_boundary() const
{ {
// By definition. bool __left_is_word = false;
bool __ans = false; if (_M_current != _M_begin
auto __pre = _M_current; || (_M_flags & regex_constants::match_prev_avail))
--__pre;
if (!(_M_at_begin() && _M_at_end()))
{ {
if (_M_at_begin()) auto __prev = _M_current;
__ans = _M_is_word(*_M_current) if (_M_is_word(*std::prev(__prev)))
&& !(_M_flags & regex_constants::match_not_bow); __left_is_word = true;
else if (_M_at_end())
__ans = _M_is_word(*__pre)
&& !(_M_flags & regex_constants::match_not_eow);
else
__ans = _M_is_word(*_M_current)
!= _M_is_word(*__pre);
} }
return __ans; bool __right_is_word =
_M_current != _M_end && _M_is_word(*_M_current);
if (__left_is_word == __right_is_word)
return false;
if (__left_is_word && !(_M_flags & regex_constants::match_not_eow))
return true;
if (__right_is_word && !(_M_flags & regex_constants::match_not_bow))
return true;
return false;
} }
_GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment