Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 424c8d8832690078419ba0586eb81416d7f16f9d
      
https://github.com/WebKit/WebKit/commit/424c8d8832690078419ba0586eb81416d7f16f9d
  Author: Mark Lam <[email protected]>
  Date:   2025-02-10 (Mon, 10 Feb 2025)

  Changed paths:
    M JSTests/stress/regexp-huge-oom.js
    M Source/JavaScriptCore/runtime/OptionsList.h
    M Source/JavaScriptCore/yarr/YarrErrorCode.cpp
    M Source/JavaScriptCore/yarr/YarrErrorCode.h
    M Source/JavaScriptCore/yarr/YarrInterpreter.cpp
    M Source/JavaScriptCore/yarr/YarrInterpreter.h
    M Source/WTF/wtf/BumpPointerAllocator.h
    M Tools/TestWebKitAPI/Tests/WTF/BumpPointerAllocator.cpp

  Log Message:
  -----------
  Prevent Yarr::Interpreter's evaluation stack from growing unboundedly.
https://bugs.webkit.org/show_bug.cgi?id=287074
rdar://143786123

Reviewed by Keith Miller and Michael Saboff.

Currently, Yarr::Interpreter's evaluation stack (see 
BytecodePattern::m_allocator) is allowed
to grow unboundedly until we exhaust all memory.  We should bound it instead to 
a max capacity
limit.

1. The evaluation stack uses the BumpPointerAllocator class.  We enhanced 
BumpPointerAllocator's
   startAllocator() to take a maxCapacity value.  This maxCapacity value is 
used internally
   to compute a remainingCapacity value.

   The BumpPointerAllocator works by creating a link list of BumpPointerPools.  
Each BumpPointerPool
   will now track the remainingCapacity should it needs to allocate the next 
BumpPointerPool in
   the link.  The size of the current BumpPointerPool will be deducted from 
remainingCapacity.
   When requested growth exceeds the remainingCapacity, 
BumpPointerPool::create() will fail to
   create another pool.

2. Introduced JSC::Options::maxRegExpStackSize() to define the max capacity.  
The current default
   for this option value is 4M.

3. Yarr::interpret() has always returned offsetNoMatch if any errors occur 
during evaluation.
   When we encounter this new error condition where we've exhausted the 
evaluation stack, we'll
   do the same thing.

4. Fixed a potential memory leak in freeParenthesesDisjunctionContext().  It 
was freeing the
   ParenthesesDisjunctionContext memory without calling its destructor.  This 
used to be fine
   because ParenthesesDisjunctionContext used to be trivially destructible.  
That is no longer
   the case since a BitVector field got added into it.  Hence, we fixed
   freeParenthesesDisjunctionContext() to also call 
~ParenthesesDisjunctionContext() before
   we dealloc its memory.

5. Also removed 2 unused variants of the Yarr::interpret() method.

* JSTests/stress/regexp-huge-oom.js:
* Source/JavaScriptCore/runtime/OptionsList.h:
* Source/JavaScriptCore/yarr/YarrErrorCode.cpp:
(JSC::Yarr::errorMessage):
* Source/JavaScriptCore/yarr/YarrErrorCode.h:
* Source/JavaScriptCore/yarr/YarrInterpreter.cpp:
(JSC::Yarr::Interpreter::allocDisjunctionContext):
(JSC::Yarr::Interpreter::freeDisjunctionContext):
(JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext):
(JSC::Yarr::Interpreter::freeParenthesesDisjunctionContext):
(JSC::Yarr::Interpreter::matchParentheses):
(JSC::Yarr::Interpreter::backtrackParentheses):
(JSC::Yarr::interpret):
* Source/JavaScriptCore/yarr/YarrInterpreter.h:
* Source/WTF/wtf/BumpPointerAllocator.h:
(WTF::BumpPointerPool::BumpPointerPool):
(WTF::BumpPointerPool::create):
(WTF::BumpPointerPool::ensureCapacityCrossPool):
(WTF::BumpPointerAllocator::startAllocator):
* Tools/TestWebKitAPI/Tests/WTF/BumpPointerAllocator.cpp:
(TestWebKitAPI::TEST(WTF_BumpPointerAllocator, 
AllocationWithOnlySmallerPoolsAvailable)):

Canonical link: https://commits.webkit.org/290198@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to