mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-08 18:41:19 +01:00
Fix a bug in regex
Due to dereferencing a pointer which may be invalidated
This commit is contained in:
parent
8f4e99b2e5
commit
be352d9548
@ -468,17 +468,17 @@ private:
|
|||||||
static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; }
|
static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; }
|
||||||
|
|
||||||
void CloneTopOperand(Stack<Allocator>& operandStack) {
|
void CloneTopOperand(Stack<Allocator>& operandStack) {
|
||||||
const Frag *src = operandStack.template Top<Frag>();
|
const Frag src = *operandStack.template Top<Frag>(); // Copy constructor to prevent invalidation
|
||||||
SizeType count = stateCount_ - src->minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_)
|
SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_)
|
||||||
State* s = states_.template Push<State>(count);
|
State* s = states_.template Push<State>(count);
|
||||||
memcpy(s, &GetState(src->minIndex), count * sizeof(State));
|
memcpy(s, &GetState(src.minIndex), count * sizeof(State));
|
||||||
for (SizeType j = 0; j < count; j++) {
|
for (SizeType j = 0; j < count; j++) {
|
||||||
if (s[j].out != kRegexInvalidState)
|
if (s[j].out != kRegexInvalidState)
|
||||||
s[j].out += count;
|
s[j].out += count;
|
||||||
if (s[j].out1 != kRegexInvalidState)
|
if (s[j].out1 != kRegexInvalidState)
|
||||||
s[j].out1 += count;
|
s[j].out1 += count;
|
||||||
}
|
}
|
||||||
*operandStack.template Push<Frag>() = Frag(src->start + count, src->out + count, src->minIndex + count);
|
*operandStack.template Push<Frag>() = Frag(src.start + count, src.out + count, src.minIndex + count);
|
||||||
stateCount_ += count;
|
stateCount_ += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,4 +584,9 @@ TEST(Regex, Issue538) {
|
|||||||
EXPECT_TRUE(re.IsValid());
|
EXPECT_TRUE(re.IsValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Regex, Issue583) {
|
||||||
|
Regex re("[0-9]{99999}");
|
||||||
|
ASSERT_TRUE(re.IsValid());
|
||||||
|
}
|
||||||
|
|
||||||
#undef EURO
|
#undef EURO
|
||||||
|
Loading…
x
Reference in New Issue
Block a user