Changeset 32533 in webkit
- Timestamp:
- Apr 24, 2008, 10:00:43 PM (17 years ago)
- Location:
- branches/squirrelfish/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/squirrelfish/JavaScriptCore/ChangeLog
r32522 r32533 1 2008-04-24 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Maciej. 4 5 Bug 18628: SQUIRRELFISH: need to support recursion limit 6 <https://bugs.webkit.org/show_bug.cgi?id=18628> 7 8 Partial fix -- this gets us some of the required bounds checking, but not 9 complete coverage. But it does manage to do them without regressing :D 10 11 * VM/ExceptionHelpers.cpp: 12 (KJS::createError): 13 (KJS::createStackOverflowError): 14 * VM/ExceptionHelpers.h: 15 * VM/Machine.cpp: 16 (KJS::slideRegisterWindowForCall): 17 (KJS::Machine::execute): 18 (KJS::Machine::privateExecute): 19 * VM/RegisterFile.cpp: 20 * VM/RegisterFile.h: 21 (KJS::RegisterFile::): 22 (KJS::RegisterFile::RegisterFile): 23 (KJS::RegisterFile::grow): 24 1 25 2008-04-24 Geoffrey Garen <ggaren@apple.com> 2 26 -
branches/squirrelfish/JavaScriptCore/VM/ExceptionHelpers.cpp
r32377 r32533 45 45 string = newString; 46 46 } 47 48 JSValue* createError(ExecState* exec, ErrorType e, const char* msg) 49 { 50 return Error::create(exec, e, msg, -1, -1, 0); // lineNo(), currentSourceId(exec), currentSourceURL(exec) 51 } 47 52 48 53 JSValue* createError(ExecState* exec, ErrorType e, const char* msg, const Identifier& label) … … 62 67 substitute(message, "<<no string for expression>>"); 63 68 return Error::create(exec, e, message, -1, -1, 0); //, lineNo(), currentSourceId(exec), currentSourceURL(exec)); 69 } 70 71 JSValue* createStackOverflowError(ExecState* exec) 72 { 73 return createError(exec, RangeError, "Stack overflow"); 64 74 } 65 75 -
branches/squirrelfish/JavaScriptCore/VM/ExceptionHelpers.h
r32377 r32533 34 34 namespace KJS { 35 35 class Node; 36 JSValue* createStackOverflowError(ExecState*); 36 37 JSValue* createUndefinedVariableError(ExecState*, const Identifier&); 37 38 JSValue* createNotAnObjectError(ExecState*, JSValue*, Node*); -
branches/squirrelfish/JavaScriptCore/VM/Machine.cpp
r32493 r32533 378 378 } 379 379 380 ALWAYS_INLINE Register* slideRegisterWindowForCall(CodeBlock* newCodeBlock, RegisterFile* registerFile, Register** registerBase, int registerOffset, int argv, int argc) 381 { 382 Register* r; 380 ALWAYS_INLINE Register* slideRegisterWindowForCall(ExecState* exec, CodeBlock* newCodeBlock, RegisterFile* registerFile, Register** registerBase, int registerOffset, int argv, int argc, JSValue*& exceptionValue) 381 { 382 Register* r = 0; 383 int oldOffset = registerOffset; 383 384 registerOffset += argv + argc + newCodeBlock->numVars; 384 385 385 386 if (argc == newCodeBlock->numParameters) { // correct number of arguments 386 387 size_t size = registerOffset + newCodeBlock->numTemporaries; 387 registerFile->grow(size); 388 if (!registerFile->grow(size)) { 389 exceptionValue = createStackOverflowError(exec); 390 return *registerBase + oldOffset; 391 } 388 392 r = (*registerBase) + registerOffset; 389 393 } else if (argc < newCodeBlock->numParameters) { // too few arguments -- fill in the blanks 390 394 int omittedArgCount = newCodeBlock->numParameters - argc; 391 395 size_t size = registerOffset + omittedArgCount + newCodeBlock->numTemporaries; 392 registerFile->grow(size); 396 if (!registerFile->grow(size)) { 397 exceptionValue = createStackOverflowError(exec); 398 return *registerBase + oldOffset; 399 } 393 400 r = (*registerBase) + omittedArgCount + registerOffset; 394 401 … … 398 405 } else { // too many arguments -- copy return info and expected arguments, leaving the extra arguments behind 399 406 size_t size = registerOffset + Machine::CallFrameHeaderSize + newCodeBlock->numParameters + newCodeBlock->numTemporaries; 400 registerFile->grow(size); 407 if (!registerFile->grow(size)) { 408 exceptionValue = createStackOverflowError(exec); 409 return *registerBase + oldOffset; 410 } 401 411 r = (*registerBase) + Machine::CallFrameHeaderSize + newCodeBlock->numParameters + registerOffset; 402 412 … … 562 572 size_t oldSize = registerFile->size(); 563 573 registerFile->grow(oldSize + CallFrameHeaderSize + argc); 564 565 574 Register** registerBase = registerFile->basePointer(); 566 575 int registerOffset = oldSize; … … 580 589 581 590 CodeBlock* newCodeBlock = &functionBodyNode->code(scopeChain); 582 Register* r = slideRegisterWindowForCall(newCodeBlock, registerFile, registerBase, registerOffset, argv, argc); 591 Register* r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, registerBase, registerOffset, argv, argc, *exception); 592 583 593 callFrame = (*registerBase) + callFrameOffset; // registerBase may have moved, recompute callFrame 584 594 scopeChain = scopeChainForCall(newCodeBlock, scopeChain, functionBodyNode, callFrame, registerBase, r); … … 587 597 registerFile->shrink(oldSize); 588 598 return result; 599 589 600 } 590 601 … … 613 624 size_t oldSize = registerFile->size(); 614 625 size_t newSize = registerOffset + codeBlock->numVars + codeBlock->numTemporaries + CallFrameHeaderSize; 615 registerFile->grow(newSize); 626 if (!registerFile->grow(newSize)) { 627 *exception = createStackOverflowError(exec); 628 return 0; 629 } 616 630 Register* r = (*registerFile->basePointer()) + registerOffset + codeBlock->numVars + CallFrameHeaderSize; 617 631 … … 1325 1339 FunctionBodyNode* functionBodyNode = callData.js.functionBody; 1326 1340 1327 codeBlock = &functionBodyNode->code(callDataScopeChain); 1328 r = slideRegisterWindowForCall(codeBlock, registerFile, registerBase, registerOffset, argv, argc); 1341 CodeBlock* newCodeBlock = &functionBodyNode->code(callDataScopeChain); 1342 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, registerBase, registerOffset, argv, argc, exceptionValue); 1343 if (UNLIKELY(exceptionValue != 0)) 1344 goto vm_throw; 1345 1346 codeBlock = newCodeBlock; 1329 1347 callFrame = (*registerBase) + callFrameOffset; // registerBase may have moved, recompute callFrame 1330 1348 scopeChain = scopeChainForCall(codeBlock, callDataScopeChain, functionBodyNode, callFrame, registerBase, r); … … 1427 1445 FunctionBodyNode* functionBodyNode = constructData.js.functionBody; 1428 1446 1429 codeBlock = &functionBodyNode->code(callDataScopeChain); 1430 r = slideRegisterWindowForCall(codeBlock, registerFile, registerBase, registerOffset, argv, argc); 1447 CodeBlock* newCodeBlock = &functionBodyNode->code(callDataScopeChain); 1448 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, registerBase, registerOffset, argv, argc, exceptionValue); 1449 if (exceptionValue) 1450 goto vm_throw; 1451 1452 codeBlock = newCodeBlock; 1431 1453 callFrame = (*registerBase) + callFrameOffset; // registerBase may have moved, recompute callFrame 1432 1454 scopeChain = scopeChainForCall(codeBlock, callDataScopeChain, functionBodyNode, callFrame, registerBase, r); -
branches/squirrelfish/JavaScriptCore/VM/RegisterFile.cpp
r32169 r32533 39 39 size_t RegisterFile::newBuffer(size_t size, size_t capacity, size_t minCapacity, size_t offset) 40 40 { 41 capacity = (max(minCapacity, m ax<size_t>(16, capacity + capacity / 4 + 1)));41 capacity = (max(minCapacity, min(m_maxSize, max<size_t>(16, capacity + capacity / 4 + 1)))); 42 42 Register* newBuffer = static_cast<Register*>(fastCalloc(capacity, sizeof(Register))); // zero-filled memory 43 43 -
branches/squirrelfish/JavaScriptCore/VM/RegisterFile.h
r32164 r32533 87 87 class RegisterFile : Noncopyable { 88 88 public: 89 RegisterFile(RegisterFileStack* stack) 89 enum { DefaultRegisterFileSize = 8 * 1024 * 1024 }; 90 RegisterFile(RegisterFileStack* stack, size_t maxSize = DefaultRegisterFileSize) 90 91 : m_size(0) 91 92 , m_capacity(0) 93 , m_maxSize(maxSize) 92 94 , m_base(0) 93 95 , m_buffer(0) … … 110 112 } 111 113 112 voidgrow(size_t size)114 bool grow(size_t size) 113 115 { 114 116 if (size > m_size) { 115 if (size > m_capacity) 117 if (size > m_capacity) { 118 if (size > DefaultRegisterFileSize) 119 return false; 116 120 growBuffer(size); 121 } 117 122 m_size = size; 118 123 } 124 return true; 119 125 } 120 126 … … 148 154 size_t m_size; 149 155 size_t m_capacity; 156 size_t m_maxSize; 150 157 Register* m_base; 151 158 Register* m_buffer;
Note:
See TracChangeset
for help on using the changeset viewer.