<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>298798</bug_id>
          
          <creation_ts>2025-09-12 15:04:10 -0700</creation_ts>
          <short_desc>Make VM::setHasTerminationRequest() thread-safe.</short_desc>
          <delta_ts>2025-09-16 13:43:24 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2142689</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2025-09-12 15:04:10 -0700</bug_when>
    <thetext>VM::setHasTerminationRequest() should be thread-safe but is not because it sets a bit on the VM::m_entryScopeServices OptionSet, which is not thread-safe.

For the record, this is how the concurrent access works:
1. VM::m_entryScopeServices is normally set by the mutator thread running that VM.
2. However, the Worker.terminate() API can be used by the main thread to terminate worker threads.
    Worker.terminate() calls ...
        WorkerMessagingProxy::terminateWorkerGlobalScope(), which calls ...
            WorkerOrWorkletThread::stop(), which calls ...
                WorkerOrWorkletScriptController::scheduleExecutionTermination(), which calls ...
                    VM::notifyNeedTermination(), which calls ...
                        VM::setHasTerminationRequest(), which calls ...
                            VM::requestEntryScopeService(), and ...

VM::requestEntryScopeService() does bitwise OR of the EntryScopeService::ResetTerminationRequest bit into the worker thread&apos;s VM::m_entryScopeServices.  This is not thread safe because it may collide with the worker thread writing values into its VM::m_entryScopeServices.

We can fix this by moving the EntryScopeService::ResetTerminationRequest bit into a separate byte that is safe to write to concurrently.

In practice, the bug never manifests because it is extremely rare for VM::m_entryScopeServices to ever be written to, and the impact is benign.

Regardless, we should fix this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2142691</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2025-09-12 15:04:49 -0700</bug_when>
    <thetext>&lt;rdar://problem/160494627&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2142704</commentid>
    <comment_count>2</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2025-09-12 16:11:06 -0700</bug_when>
    <thetext>Pull request: https://github.com/WebKit/WebKit/pull/50684</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2143417</commentid>
    <comment_count>3</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2025-09-16 13:43:22 -0700</bug_when>
    <thetext>Committed 300049@main (9ea05fa06f20): &lt;https://commits.webkit.org/300049@main&gt;

Reviewed commits have been landed. Closing PR #50684 and removing active labels.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>