Skip to content
This repository has been archived by the owner on Aug 4, 2022. It is now read-only.

Commit

Permalink
Bug 616491 - Limit YARR stack size to 1MB. r=mjrosenb
Browse files Browse the repository at this point in the history
  • Loading branch information
Sean Stangl committed Mar 26, 2014
1 parent adc5e6d commit 1317ff1
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions js/src/yarr/YarrPattern.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ class YarrPatternConstructor {
public:
YarrPatternConstructor(YarrPattern& pattern)
: m_pattern(pattern)
, m_stackBase(nullptr)
, m_characterClassConstructor(pattern.m_ignoreCase)
, m_invertParentheticalAssertion(false)
{
Expand Down Expand Up @@ -573,6 +574,14 @@ class YarrPatternConstructor {
ErrorCode setupAlternativeOffsets(PatternAlternative* alternative, unsigned currentCallFrameSize, unsigned initialInputPosition,
unsigned *callFrameSizeOut)
{
/*
* Attempt detection of over-recursion:
* "1MB should be enough stack for anyone."
*/
uint8_t stackDummy_;
if (m_stackBase - &stackDummy_ > 1024*1024)
return PatternTooLarge;

alternative->m_hasFixedSize = true;
Checked<unsigned> currentInputPosition = initialInputPosition;

Expand Down Expand Up @@ -841,8 +850,13 @@ class YarrPatternConstructor {
}
}

void setStackBase(uint8_t *stackBase) {
m_stackBase = stackBase;
}

private:
YarrPattern& m_pattern;
uint8_t * m_stackBase;
PatternAlternative* m_alternative;
CharacterClassConstructor m_characterClassConstructor;
bool m_invertCharacterClass;
Expand Down Expand Up @@ -873,6 +887,9 @@ ErrorCode YarrPattern::compile(const String& patternString)
ASSERT(numSubpatterns == m_numSubpatterns);
}

uint8_t stackDummy_;
constructor.setStackBase(&stackDummy_);

constructor.checkForTerminalParentheses();
constructor.optimizeDotStarWrappedExpressions();
constructor.optimizeBOL();
Expand Down

0 comments on commit 1317ff1

Please sign in to comment.