Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 75aed5e343cdfbd4713ff3267d7476a9b884648c
      
https://github.com/WebKit/WebKit/commit/75aed5e343cdfbd4713ff3267d7476a9b884648c
  Author: Mark Lam <mark....@apple.com>
  Date:   2025-10-08 (Wed, 08 Oct 2025)

  Changed paths:
    M Source/JavaScriptCore/bytecode/RepatchInlines.h
    M Source/JavaScriptCore/interpreter/CallFrame.cpp
    M Source/JavaScriptCore/interpreter/CallFrame.h
    M Source/JavaScriptCore/interpreter/CallFrameInlines.h
    M Source/JavaScriptCore/interpreter/StackVisitor.cpp
    M Source/JavaScriptCore/jit/JITOperations.cpp
    M Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
    M Source/JavaScriptCore/runtime/Error.cpp
    M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
    M Source/JavaScriptCore/runtime/JSGlobalObject.h
    M Source/JavaScriptCore/runtime/VMInlines.h

  Log Message:
  -----------
  Throwing TerminationException from a function prologue should zombify the top 
frame.
https://bugs.webkit.org/show_bug.cgi?id=298402
rdar://159864802

Reviewed by Keith Miller and Dan Hecht.

298805@main added the ability to check VMTraps via the stack check mechanism in 
function
prologues. As a result, it is now possible to throw a TerminationException from 
there.

However, the top CallFrame isn't fully initialized yet at the point of the 
stack check.
During the exception unwinding process and when WebInspector is engaged, 
ShadowChicken
is invoked to track the stack frame changes due to the unwinding.  
ShadowChicken assumes
that the top CallFrame is fully initialized, but it is not (as explained above).
As a result, ShadowChicken is sad, and some crashes may ensue.

This same problem already existed with StackOverflowError, which is also thrown 
from the
stack check point in function prologues.  However, the issue has already been 
solved for
StackOverflowErrors because stack overflow code will convert the top CallFrame 
into a
"PartiallyInitializedFrame" (with a partiallyInitializedFrameCallee) by calling
convertToStackOverflowFrame() on it.  StackVisitor already knows to ignore
PartiallyInitializedFrames, and that keeps ShadowChicken happy.  We just need 
to make
the relevant code that throws the TerminationException there do the same i.e. 
convert
the top CallFrame to a PartiallyInitializedFrame, and everything will just work.

This patch makes a few additional changes to improve the code:

1. Renamed PartiallyInitializedFrame to ZombieFrame.  PartiallyInitializedFrame 
doesn't
   really describe the purpose of the frame i.e. that StackVisitor should 
ignore this
   frame.  Calling it a ZombieFrame communicates better that the frame is 
effectively
   dead, and should not be visited.

   Additionally, the whole reason for needing the conversion is because the top 
CallFrame
   is a partially initialized frame to begin with.  Calling it a 
PartiallyInitializedFrame
   doesn't really communicate that we're converting anything here.  ZombieFrame 
is just
   a better name as it's clearly distinct from the "partially initialized" 
state that
   the frame already is in to begin with.

   Similarly, partiallyInitializedFrameCallee() is renamed to 
zombieFrameCallee().
   isPartiallyInitializedFrame() is renamed to isZombieFrame().

2. Renamed convertToStackOverflowFrame() to convertToZombieFrame().
   As a name, convertToStackOverflowFrame() used to make some sense back when 
the only
   reason a ZombieFrame can be produced was due to a StackOverflow.  That is 
now no longer
   the case.  So, calling it convertToZombieFrame() communicates better its 
intent, and
   does not inaccurately tie it to StackOverflows.

3. Fixed an ASSERT in operationLookupExceptionHandlerFromCallerFrame() that was 
assuming
   that it will only be called for StackOverflowErrors.  While this is still 
currently
   true (because JIT stack checks still don't check VMTraps yet), eventually, 
this ASSERT
   will be inaccurate.  So, we're preemptively updating it to allow the
   TerminationException as well.

This issue was found by random failures in pre-existing tests under
LayoutTests/inspector/worker due to workers being terminated.  Hence, existing 
tests
already cover this issue.

* Source/JavaScriptCore/bytecode/RepatchInlines.h:
(JSC::handleHostCall):
(JSC::linkFor):
(JSC::virtualForWithFunction):
* Source/JavaScriptCore/interpreter/CallFrame.cpp:
(JSC::CallFrame::convertToZombieFrame):
(JSC::CallFrame::convertToStackOverflowFrame): Deleted.
* Source/JavaScriptCore/interpreter/CallFrame.h:
* Source/JavaScriptCore/interpreter/CallFrameInlines.h:
(JSC::CallFrame::isZombieFrame const):
(JSC::CallFrame::isPartiallyInitializedFrame const): Deleted.
* Source/JavaScriptCore/interpreter/StackVisitor.cpp:
(JSC::StackVisitor::StackVisitor):
* Source/JavaScriptCore/jit/JITOperations.cpp:
(JSC::ICSlowPathCallFrameTracer::ICSlowPathCallFrameTracer):
(JSC::JSC_DEFINE_NOEXCEPT_JIT_OPERATION):
* Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:
(JSC::LLInt::llint_check_stack_and_vm_traps):
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
* Source/JavaScriptCore/runtime/Error.cpp:
(JSC::getBytecodeIndex):
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::init):
(JSC::JSGlobalObject::visitChildrenImpl):
* Source/JavaScriptCore/runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::zombieFrameCallee const):
(JSC::JSGlobalObject::partiallyInitializedFrameCallee const): Deleted.
* Source/JavaScriptCore/runtime/VMInlines.h:
(JSC::VM::topJSCallFrame const):

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



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

Reply via email to