[webkit-changes] [WebKit/WebKit] cf8997: [JSC] Prevent GC from collecting plan dependencies...

Dan Hecht noreply at github.com
Wed Jul 24 09:21:06 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: cf8997ca4715f44b3a402db14914b720c29772c9
      https://github.com/WebKit/WebKit/commit/cf8997ca4715f44b3a402db14914b720c29772c9
  Author: Dan Hecht <dan.hecht at apple.com>
  Date:   2024-07-24 (Wed, 24 Jul 2024)

  Changed paths:
    M Source/JavaScriptCore/bytecode/CodeBlock.cpp
    M Source/JavaScriptCore/dfg/DFGGraphSafepoint.cpp
    M Source/JavaScriptCore/dfg/DFGGraphSafepoint.h
    M Source/JavaScriptCore/dfg/DFGPlan.cpp
    M Source/JavaScriptCore/ftl/FTLCompile.cpp
    M Source/JavaScriptCore/jit/BaselineJITPlan.cpp
    M Source/JavaScriptCore/jit/JITPlan.cpp
    M Source/JavaScriptCore/jit/JITPlan.h
    M Source/JavaScriptCore/jit/JITSafepoint.cpp
    M Source/JavaScriptCore/jit/JITSafepoint.h
    M Source/JavaScriptCore/jit/JITWorklistThread.h

  Log Message:
  -----------
  [JSC] Prevent GC from collecting plan dependencies while inside B3::generate()
https://bugs.webkit.org/show_bug.cgi?id=276911
rdar://122517397

Reviewed by Yusuke Suzuki.

B3::generate() is executed inside a safepoint, meaning the GC is allowed
to run concurrently. However, patchpoint generation may reference GCed
objects, potentially leading to UAF.

Change 272710 at main reduced the race window between GC and patchpoint
generation for a known case, however the window was not eliminated.

In order to elminate this race, extend the Safepoint mechanism to
include a mode where GC is allowed to run but the current plan's
dependencies are kept live during the safepoint. Then use this in
the safepoint around B3::generate() so that patchpoints can safely
access dependencies of the plan while the GC is still allowed to
collect/cancel other plans and unrelated objects.

Note that in practice, marking the plan's dependencies as live also
means that this plan will not be canceled during this safepoint,
since the liveness predicates for determining whether a plan can be
canceled are themselves dependencies of the plan. So the tradeoff to
allowing B3::generate() to run inside a safepoint is that the current
plan cannot be canceled during a GC cycle that completes during the
B3::generate() safepoint. Make this implication explicit with some asserts.

Revert most of 272710 at main except for its test case which continues to
be the regression test for this race.

* Source/JavaScriptCore/bytecode/CodeBlock.cpp:
(JSC::CodeBlock::globalObjectFor):
* Source/JavaScriptCore/dfg/DFGGraphSafepoint.cpp:
(JSC::DFG::GraphSafepoint::GraphSafepoint):
* Source/JavaScriptCore/dfg/DFGGraphSafepoint.h:
* Source/JavaScriptCore/dfg/DFGPlan.cpp:
(JSC::DFG::Plan::cancel):
(JSC::DFG::Plan::isKnownToBeLiveDuringGC):
(JSC::DFG::Plan::isKnownToBeLiveAfterGC):
* Source/JavaScriptCore/ftl/FTLCompile.cpp:
(JSC::FTL::compile):
* Source/JavaScriptCore/jit/BaselineJITPlan.cpp:
(JSC::BaselineJITPlan::compileInThreadImpl):
* Source/JavaScriptCore/jit/JITPlan.cpp:
(JSC::JITPlan::cancel):
(JSC::JITPlan::safepointKeepsDependenciesLive const):
* Source/JavaScriptCore/jit/JITPlan.h:
* Source/JavaScriptCore/jit/JITSafepoint.cpp:
(JSC::Safepoint::isKnownToBeLiveDuringGC):
(JSC::Safepoint::keepDependenciesLive const):
* Source/JavaScriptCore/jit/JITSafepoint.h:
* Source/JavaScriptCore/jit/JITWorklistThread.h:

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



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list