<?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>229014</bug_id>
          
          <creation_ts>2021-08-11 15:47:40 -0700</creation_ts>
          <short_desc>ThreadSanitizer: data race in WebCore::CARingBufferStorageVector::setCurrentFrameBounds() / getCurrentFrameBounds()</short_desc>
          <delta_ts>2021-08-12 18:13:29 -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>Media</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="David Kilzer (:ddkilzer)">ddkilzer</reporter>
          <assigned_to name="David Kilzer (:ddkilzer)">ddkilzer</assigned_to>
          <cc>cdumez</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>ggaren</cc>
    
    <cc>glenn</cc>
    
    <cc>gsnedders</cc>
    
    <cc>jer.noble</cc>
    
    <cc>philipj</cc>
    
    <cc>sergio</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1783664</commentid>
    <comment_count>0</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 15:47:40 -0700</bug_when>
    <thetext>ThreadSanitizer: data race in WebCore::CARingBufferStorageVector::setCurrentFrameBounds() / getCurrentFrameBounds().

The issue is that setCurrentFrameBounds() uses a Locker, but getCurrentFrameBounds().

Both currentStartFrame() and currentEndFrame() are also missing a Locker.  I did not catch explicit races there, but they exist based on source code inspection.

WARNING: ThreadSanitizer: data race (pid=55586)
  Write of size 8 at 0x7b58000622f8 by thread T17:
    #0 WebCore::CARingBufferStorageVector::setCurrentFrameBounds(unsigned long long, unsigned long long) &lt;null&gt; (WebCore:x86_64+0x2f166ca)
    #1 WebCore::CARingBuffer::setCurrentFrameBounds(unsigned long long, unsigned long long) &lt;null&gt; (WebCore:x86_64+0x2f1641d)
    #2 WebCore::CARingBuffer::store(AudioBufferList const*, unsigned long, unsigned long long) &lt;null&gt; (WebCore:x86_64+0x2f16386)
    #3 WebCore::AudioSampleDataSource::pushSamplesInternal(AudioBufferList const&amp;, WTF::MediaTime const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x1151119)
    #4 WebCore::AudioSampleDataSource::pushSamples(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x11513d0)
    #5 WebCore::WebAudioSourceProviderCocoa::receivedNewAudioSamples(WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x16f17b1)
    #6 WebCore::MediaStreamTrackAudioSourceProviderCocoa::audioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x32b7d85)
    #7 non-virtual thunk to WebCore::MediaStreamTrackAudioSourceProviderCocoa::audioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x32b7dd7)
    #8 WebCore::RealtimeMediaSource::audioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x32581aa)
    #9 WebKit::RemoteRealtimeAudioSource::remoteAudioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebKit:x86_64+0x1c724a9)
    #10 WebKit::RemoteCaptureSampleManager::RemoteAudio::startThread()::$_3::operator()() &lt;null&gt; (WebKit:x86_64+0x1c8e38c)
    #11 WTF::Detail::CallableWrapper&lt;WebKit::RemoteCaptureSampleManager::RemoteAudio::startThread()::$_3, void&gt;::call() &lt;null&gt; (WebKit:x86_64+0x1c8e1ad)
    #12 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (JavaScriptCore:x86_64+0x2620d)
    #13 WTF::Thread::entryPoint(WTF::Thread::NewThreadContext*) &lt;null&gt; (JavaScriptCore:x86_64+0xbccf0)
    #14 WTF::wtfThreadEntryPoint(void*) &lt;null&gt; (JavaScriptCore:x86_64+0xc5719)

  Previous read of size 8 at 0x7b58000622f8 by thread T16:
    #0 WebCore::CARingBufferStorageVector::getCurrentFrameBounds(unsigned long long&amp;, unsigned long long&amp;) &lt;null&gt; (WebCore:x86_64+0x2f168e7)
    #1 WebCore::CARingBuffer::getCurrentFrameBoundsWithoutUpdate(unsigned long long&amp;, unsigned long long&amp;) &lt;null&gt; (WebCore:x86_64+0x2f1688d)
    #2 WebCore::CARingBuffer::getCurrentFrameBounds(unsigned long long&amp;, unsigned long long&amp;) &lt;null&gt; (WebCore:x86_64+0x2f167f1)
    #3 WebCore::AudioSampleDataSource::pullSamplesInternal(AudioBufferList&amp;, unsigned long, unsigned long long, double, WebCore::AudioSampleDataSource::PullMode) &lt;null&gt; (WebCore:x86_64+0x1151549)
    #4 WebCore::AudioSampleDataSource::pullSamples(AudioBufferList&amp;, unsigned long, unsigned long long, double, WebCore::AudioSampleDataSource::PullMode) &lt;null&gt; (WebCore:x86_64+0x1151ef9)
    #5 WebCore::WebAudioSourceProviderCocoa::provideInput(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x16f0ff5)
    #6 WebCore::MediaStreamAudioSourceNode::provideInput(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x1949f03)
    #7 WebCore::MediaStreamAudioSourceNode::process(unsigned long) &lt;null&gt; (WebCore:x86_64+0x194a08d)
    #8 WebCore::AudioNode::processIfNecessary(unsigned long) &lt;null&gt; (WebCore:x86_64+0x18aa734)
    #9 WebCore::AudioNodeOutput::pull(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9c92)
    #10 WebCore::AudioNodeInput::pull(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9d35)
    #11 WebCore::AudioBasicInspectorNode::pullInputs(unsigned long) &lt;null&gt; (WebCore:x86_64+0x189e407)
    #12 WebCore::AudioNode::processIfNecessary(unsigned long) &lt;null&gt; (WebCore:x86_64+0x18aa660)
    #13 WebCore::AudioNodeOutput::pull(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9c92)
    #14 WebCore::AudioNodeInput::pull(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9d35)
    #15 WebCore::AudioNode::pullInputs(unsigned long) &lt;null&gt; (WebCore:x86_64+0x18aa984)
    #16 WebCore::AudioNode::processIfNecessary(unsigned long) &lt;null&gt; (WebCore:x86_64+0x18aa660)
    #17 WebCore::AudioNodeOutput::pull(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9c92)
    #18 WebCore::AudioNodeInput::sumAllConnections(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9b64)
    #19 WebCore::AudioNodeInput::pull(WebCore::AudioBus*, unsigned long) &lt;null&gt; (WebCore:x86_64+0x18c9d11)
    #20 WebCore::AudioDestinationNode::renderQuantum(WebCore::AudioBus*, unsigned long, WebCore::AudioIOPosition const&amp;) &lt;null&gt; (WebCore:x86_64+0x18a6dee)
    #21 WebCore::DefaultAudioDestinationNode::render(WebCore::AudioBus*, WebCore::AudioBus*, unsigned long, WebCore::AudioIOPosition const&amp;) &lt;null&gt; (WebCore:x86_64+0x19206f0)
    #22 non-virtual thunk to WebCore::DefaultAudioDestinationNode::render(WebCore::AudioBus*, WebCore::AudioBus*, unsigned long, WebCore::AudioIOPosition const&amp;) &lt;null&gt; (WebCore:x86_64+0x19207c7)
    #23 WebCore::AudioDestination::callRenderCallback(WebCore::AudioBus*, WebCore::AudioBus*, unsigned long, WebCore::AudioIOPosition const&amp;) &lt;null&gt; (WebCore:x86_64+0x2f04614)
    #24 WebCore::AudioDestinationCocoa::renderOnRenderingThead(unsigned long) &lt;null&gt; (WebCore:x86_64+0x2f0450e)
    #25 WebCore::AudioDestinationCocoa::renderOnRenderingTheadIfPlaying(unsigned long) &lt;null&gt; (WebCore:x86_64+0x2f0438d)
    #26 WebCore::AudioDestinationCocoa::render(double, unsigned long long, unsigned int, AudioBufferList*) &lt;null&gt; (WebCore:x86_64+0x2f041e2)
    #27 WebKit::RemoteAudioDestinationProxy::renderQuantum() &lt;null&gt; (WebKit:x86_64+0x1979fc1)
    #28 WebKit::RemoteAudioDestinationProxy::startRenderingThread()::$_10::operator()() &lt;null&gt; (WebKit:x86_64+0x19a14cb)
    #29 WTF::Detail::CallableWrapper&lt;WebKit::RemoteAudioDestinationProxy::startRenderingThread()::$_10, void&gt;::call() &lt;null&gt; (WebKit:x86_64+0x19a143d)
    #30 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (JavaScriptCore:x86_64+0x2620d)
    #31 WTF::Thread::entryPoint(WTF::Thread::NewThreadContext*) &lt;null&gt; (JavaScriptCore:x86_64+0xbccf0)
    #32 WTF::wtfThreadEntryPoint(void*) &lt;null&gt; (JavaScriptCore:x86_64+0xc5719)

  Location is heap block of size 768 at 0x7b5800062100 allocated by thread T17:
    #0 __sanitizer_mz_malloc &lt;null&gt; (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x5168a)
    #1 _malloc_zone_malloc &lt;null&gt; (libsystem_malloc.dylib:x86_64+0x1cf80)
    #2 bmalloc::Cache::allocateSlowCaseNullCache(bmalloc::HeapKind, unsigned long) &lt;null&gt; (JavaScriptCore:x86_64+0x11d240)
    #3 bmalloc::Cache::allocate(bmalloc::HeapKind, unsigned long) &lt;null&gt; (JavaScriptCore:x86_64+0x37629)
    #4 WTF::fastMalloc(unsigned long) &lt;null&gt; (JavaScriptCore:x86_64+0x36e5b)
    #5 WTF::FastMalloc::malloc(unsigned long) &lt;null&gt; (WebCore:x86_64+0x1a059)
    #6 bool WTF::VectorBufferBase&lt;WebCore::CARingBufferStorageVector::TimeBounds, WTF::FastMalloc&gt;::allocateBuffer&lt;(WTF::FailureAction)0&gt;(unsigned long) &lt;null&gt; (WebCore:x86_64+0x2f1b4d1)
    #7 WTF::VectorBuffer&lt;WebCore::CARingBufferStorageVector::TimeBounds, 0ul, WTF::FastMalloc&gt;::VectorBuffer(unsigned long, unsigned long) &lt;null&gt; (WebCore:x86_64+0x2f1b3f0)
    #8 WTF::Vector&lt;WebCore::CARingBufferStorageVector::TimeBounds, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc&gt;::Vector(unsigned long) &lt;null&gt; (WebCore:x86_64+0x2f1b363)
    #9 WTF::Vector&lt;WebCore::CARingBufferStorageVector::TimeBounds, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc&gt;::Vector(unsigned long) &lt;null&gt; (WebCore:x86_64+0x2f154b0)
    #10 WebCore::CARingBufferStorageVector::CARingBufferStorageVector() &lt;null&gt; (WebCore:x86_64+0x2f15426)
    #11 WebCore::CARingBufferStorageVector::CARingBufferStorageVector() &lt;null&gt; (WebCore:x86_64+0x2f154d9)
    #12 WTF::UniqueRef&lt;WebCore::CARingBufferStorageVector&gt; WTF::makeUniqueRefWithoutFastMallocCheck&lt;WebCore::CARingBufferStorageVector&gt;() &lt;null&gt; (WebCore:x86_64+0x2f1b617)
    #13 WTF::UniqueRef&lt;WebCore::CARingBufferStorageVector&gt; WTF::makeUniqueRef&lt;WebCore::CARingBufferStorageVector&gt;() &lt;null&gt; (WebCore:x86_64+0x2f155a9)
    #14 WebCore::CARingBuffer::CARingBuffer() &lt;null&gt; (WebCore:x86_64+0x2f15512)
    #15 WebCore::CARingBuffer::CARingBuffer() &lt;null&gt; (WebCore:x86_64+0x2f15669)
    #16 WTF::UniqueRef&lt;WebCore::CARingBuffer&gt; WTF::makeUniqueRefWithoutFastMallocCheck&lt;WebCore::CARingBuffer&gt;() &lt;null&gt; (WebCore:x86_64+0x353f7)
    #17 WTF::UniqueRef&lt;WebCore::CARingBuffer&gt; WTF::makeUniqueRef&lt;WebCore::CARingBuffer&gt;() &lt;null&gt; (WebCore:x86_64+0x353a9)
    #18 WebCore::AudioSampleDataSource::AudioSampleDataSource(unsigned long, WTF::LoggerHelper&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x11503aa)
    #19 WebCore::AudioSampleDataSource::AudioSampleDataSource(unsigned long, WTF::LoggerHelper&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x1150280)
    #20 WebCore::AudioSampleDataSource::create(unsigned long, WTF::LoggerHelper&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x11501c0)
    #21 WebCore::WebAudioSourceProviderCocoa::prepare(AudioStreamBasicDescription const&amp;) &lt;null&gt; (WebCore:x86_64+0x16f12ac)
    #22 WebCore::WebAudioSourceProviderCocoa::receivedNewAudioSamples(WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x16f173b)
    #23 WebCore::MediaStreamTrackAudioSourceProviderCocoa::audioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x32b7d85)
    #24 non-virtual thunk to WebCore::MediaStreamTrackAudioSourceProviderCocoa::audioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x32b7dd7)
    #25 WebCore::RealtimeMediaSource::audioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebCore:x86_64+0x32581aa)
    #26 WebKit::RemoteRealtimeAudioSource::remoteAudioSamplesAvailable(WTF::MediaTime const&amp;, WebCore::PlatformAudioData const&amp;, WebCore::AudioStreamDescription const&amp;, unsigned long) &lt;null&gt; (WebKit:x86_64+0x1c724a9)
    #27 WebKit::RemoteCaptureSampleManager::RemoteAudio::startThread()::$_3::operator()() &lt;null&gt; (WebKit:x86_64+0x1c8e38c)
    #28 WTF::Detail::CallableWrapper&lt;WebKit::RemoteCaptureSampleManager::RemoteAudio::startThread()::$_3, void&gt;::call() &lt;null&gt; (WebKit:x86_64+0x1c8e1ad)
    #29 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (JavaScriptCore:x86_64+0x2620d)
    #30 WTF::Thread::entryPoint(WTF::Thread::NewThreadContext*) &lt;null&gt; (JavaScriptCore:x86_64+0xbccf0)
    #31 WTF::wtfThreadEntryPoint(void*) &lt;null&gt; (JavaScriptCore:x86_64+0xc5719)

  Thread T17 (tid=13416394, running) created by thread T5 at:
    #0 pthread_create &lt;null&gt; (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x2bffd)
    #1 WTF::Thread::establishHandle(WTF::Thread::NewThreadContext*, std::__1::optional&lt;unsigned long&gt;, WTF::Thread::QOS) &lt;null&gt; (JavaScriptCore:x86_64+0xc565e)
    #2 WTF::Thread::create(char const*, WTF::Function&lt;void ()&gt;&amp;&amp;, WTF::ThreadType, WTF::Thread::QOS) &lt;null&gt; (JavaScriptCore:x86_64+0xbcea7)
    #3 WebKit::RemoteCaptureSampleManager::RemoteAudio::startThread() &lt;null&gt; (WebKit:x86_64+0x1c718e8)
    #4 WebKit::RemoteCaptureSampleManager::RemoteAudio::setStorage(WebKit::SharedMemory::Handle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long) &lt;null&gt; (WebKit:x86_64+0x1c7125d)
    #5 WebKit::RemoteCaptureSampleManager::audioStorageChanged(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long) &lt;null&gt; (WebKit:x86_64+0x1c70f15)
    #6 void IPC::callMemberFunctionImpl&lt;WebKit::RemoteCaptureSampleManager, void (WebKit::RemoteCaptureSampleManager::*)(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long), std::__1::tuple&lt;WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle, WebCore::CAAudioStreamDescription, unsigned long long, IPC::Semaphore, WTF::MediaTime, unsigned long&gt;, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul&gt;(WebKit::RemoteCaptureSampleManager*, void (WebKit::RemoteCaptureSampleManager::*)(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long), std::__1::tuple&lt;WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle, WebCore::CAAudioStreamDescription, unsigned long long, IPC::Semaphore, WTF::MediaTime, unsigned long&gt;&amp;&amp;, std::__1::integer_sequence&lt;unsigned long, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul&gt;) &lt;null&gt; (WebKit:x86_64+0x494848)
    #7 void IPC::callMemberFunction&lt;WebKit::RemoteCaptureSampleManager, void (WebKit::RemoteCaptureSampleManager::*)(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long), std::__1::tuple&lt;WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle, WebCore::CAAudioStreamDescription, unsigned long long, IPC::Semaphore, WTF::MediaTime, unsigned long&gt;, std::__1::integer_sequence&lt;unsigned long, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul&gt; &gt;(std::__1::tuple&lt;WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle, WebCore::CAAudioStreamDescription, unsigned long long, IPC::Semaphore, WTF::MediaTime, unsigned long&gt;&amp;&amp;, WebKit::RemoteCaptureSampleManager*, void (WebKit::RemoteCaptureSampleManager::*)(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long)) &lt;null&gt; (WebKit:x86_64+0x48ab48)
    #8 void IPC::handleMessage&lt;Messages::RemoteCaptureSampleManager::AudioStorageChanged, WebKit::RemoteCaptureSampleManager, void (WebKit::RemoteCaptureSampleManager::*)(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long)&gt;(IPC::Decoder&amp;, WebKit::RemoteCaptureSampleManager*, void (WebKit::RemoteCaptureSampleManager::*)(WTF::ObjectIdentifier&lt;WebCore::RealtimeMediaSourceIdentifierType&gt;, WebKit::SharedMemory::IPCHandle const&amp;, WebCore::CAAudioStreamDescription const&amp;, unsigned long long, IPC::Semaphore&amp;&amp;, WTF::MediaTime const&amp;, unsigned long)) &lt;null&gt; (WebKit:x86_64+0x48a97b)
    #9 WebKit::RemoteCaptureSampleManager::didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;) &lt;null&gt; (WebKit:x86_64+0x48a8b0)
    #10 IPC::Connection::dispatchMessageReceiverMessage(IPC::MessageReceiver&amp;, std::__1::unique_ptr&lt;IPC::Decoder, std::__1::default_delete&lt;IPC::Decoder&gt; &gt;&amp;&amp;) &lt;null&gt; (WebKit:x86_64+0x8d271)
    #11 IPC::ThreadMessageReceiverQueue::enqueueMessage(IPC::Connection&amp;, std::__1::unique_ptr&lt;IPC::Decoder, std::__1::default_delete&lt;IPC::Decoder&gt; &gt;&amp;&amp;)::&apos;lambda&apos;()::operator()() &lt;null&gt; (WebKit:x86_64+0x9632e)
    #12 WTF::Detail::CallableWrapper&lt;IPC::ThreadMessageReceiverQueue::enqueueMessage(IPC::Connection&amp;, std::__1::unique_ptr&lt;IPC::Decoder, std::__1::default_delete&lt;IPC::Decoder&gt; &gt;&amp;&amp;)::&apos;lambda&apos;(), void&gt;::call() &lt;null&gt; (WebKit:x86_64+0x9610d)
    #13 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (JavaScriptCore:x86_64+0x2620d)
    #14 WTF::(anonymous namespace)::DispatchWorkItem::operator()() &lt;null&gt; (JavaScriptCore:x86_64+0x11285d)
    #15 void WTF::dispatchWorkItem&lt;WTF::(anonymous namespace)::DispatchWorkItem&gt;(void*) &lt;null&gt; (JavaScriptCore:x86_64+0x111849)
    #16 __tsan::dispatch_callback_wrap(void*) &lt;null&gt; (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x734d1)
    #17 _dispatch_client_callout &lt;null&gt; (libdispatch.dylib:x86_64+0x34ff)

  Thread T16 (tid=13416360, running) created by main thread at:
    #0 pthread_create &lt;null&gt; (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x2bffd)
    #1 WTF::Thread::establishHandle(WTF::Thread::NewThreadContext*, std::__1::optional&lt;unsigned long&gt;, WTF::Thread::QOS) &lt;null&gt; (JavaScriptCore:x86_64+0xc565e)
    #2 WTF::Thread::create(char const*, WTF::Function&lt;void ()&gt;&amp;&amp;, WTF::ThreadType, WTF::Thread::QOS) &lt;null&gt; (JavaScriptCore:x86_64+0xbcea7)
    #3 WebKit::RemoteAudioDestinationProxy::startRenderingThread() &lt;null&gt; (WebKit:x86_64+0x1978f4a)
    #4 WebKit::RemoteAudioDestinationProxy::connection() &lt;null&gt; (WebKit:x86_64+0x1979246)
    #5 WebKit::RemoteAudioDestinationProxy::startRendering(WTF::CompletionHandler&lt;void (bool)&gt;&amp;&amp;) &lt;null&gt; (WebKit:x86_64+0x1979a65)
    #6 WebCore::AudioDestinationCocoa::start(WTF::Function&lt;void (WTF::Function&lt;void ()&gt;&amp;&amp;)&gt;&amp;&amp;, WTF::CompletionHandler&lt;void (bool)&gt;&amp;&amp;) &lt;null&gt; (WebCore:x86_64+0x2f03b7b)
    #7 WebCore::DefaultAudioDestinationNode::startRendering(WTF::CompletionHandler&lt;void (std::__1::optional&lt;WebCore::Exception&gt;&amp;&amp;)&gt;&amp;&amp;) &lt;null&gt; (WebCore:x86_64+0x191fdc7)
    #8 WebCore::AudioContext::startRendering() &lt;null&gt; (WebCore:x86_64+0x18a59dd)
    #9 WebCore::AudioContext::lazyInitialize() &lt;null&gt; (WebCore:x86_64+0x18a4e35)
    #10 WebCore::AudioContext::AudioContext(WebCore::Document&amp;, WebCore::AudioContextOptions const&amp;)::$_1::operator()() const &lt;null&gt; (WebCore:x86_64+0x18c0a30)
    #11 WTF::Detail::CallableWrapper&lt;WebCore::AudioContext::AudioContext(WebCore::Document&amp;, WebCore::AudioContextOptions const&amp;)::$_1, void&gt;::call() &lt;null&gt; (WebCore:x86_64+0x18c087d)
    #12 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (WebCore:x86_64+0x1c7dd)
    #13 void WebCore::ActiveDOMObject::queueTaskKeepingObjectAlive&lt;WebCore::BaseAudioContext&gt;(WebCore::BaseAudioContext&amp;, WebCore::TaskSource, WTF::Function&lt;void ()&gt;&amp;&amp;)::&apos;lambda&apos;()::operator()() const &lt;null&gt; (WebCore:x86_64+0x19126ed)
    #14 WTF::Detail::CallableWrapper&lt;void WebCore::ActiveDOMObject::queueTaskKeepingObjectAlive&lt;WebCore::BaseAudioContext&gt;(WebCore::BaseAudioContext&amp;, WebCore::TaskSource, WTF::Function&lt;void ()&gt;&amp;&amp;)::&apos;lambda&apos;(), void&gt;::call() &lt;null&gt; (WebCore:x86_64+0x19124fd)
    #15 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (WebCore:x86_64+0x1c7dd)
    #16 WebCore::EventLoopFunctionDispatchTask::execute() &lt;null&gt; (WebCore:x86_64+0x21e4e9d)
    #17 WebCore::EventLoop::run() &lt;null&gt; (WebCore:x86_64+0x21dac58)
    #18 WebCore::WindowEventLoop::didReachTimeToRun() &lt;null&gt; (WebCore:x86_64+0x22f302d)
    #19 decltype(*(std::__1::forward&lt;WebCore::WindowEventLoop*&amp;&gt;(fp0)).*fp()) std::__1::__invoke&lt;void (WebCore::WindowEventLoop::*&amp;)(), WebCore::WindowEventLoop*&amp;, void&gt;(void (WebCore::WindowEventLoop::*&amp;)(), WebCore::WindowEventLoop*&amp;) &lt;null&gt; (WebCore:x86_64+0x22f4f0d)
    #20 std::__1::__bind_return&lt;void (WebCore::WindowEventLoop::*)(), std::__1::tuple&lt;WebCore::WindowEventLoop*&gt;, std::__1::tuple&lt;&gt;, __is_valid_bind_return&lt;void (WebCore::WindowEventLoop::*)(), std::__1::tuple&lt;WebCore::WindowEventLoop*&gt;, std::__1::tuple&lt;&gt; &gt;::value&gt;::type std::__1::__apply_functor&lt;void (WebCore::WindowEventLoop::*)(), std::__1::tuple&lt;WebCore::WindowEventLoop*&gt;, 0ul, std::__1::tuple&lt;&gt; &gt;(void (WebCore::WindowEventLoop::*&amp;)(), std::__1::tuple&lt;WebCore::WindowEventLoop*&gt;&amp;, std::__1::__tuple_indices&lt;0ul&gt;, std::__1::tuple&lt;&gt;&amp;&amp;) &lt;null&gt; (WebCore:x86_64+0x22f4e89)
    #21 std::__1::__bind_return&lt;void (WebCore::WindowEventLoop::*)(), std::__1::tuple&lt;WebCore::WindowEventLoop*&gt;, std::__1::tuple&lt;&gt;, __is_valid_bind_return&lt;void (WebCore::WindowEventLoop::*)(), std::__1::tuple&lt;WebCore::WindowEventLoop*&gt;, std::__1::tuple&lt;&gt; &gt;::value&gt;::type std::__1::__bind&lt;void (WebCore::WindowEventLoop::*&amp;)(), WebCore::WindowEventLoop*&gt;::operator()&lt;&gt;() &lt;null&gt; (WebCore:x86_64+0x22f4e41)
    #22 WTF::Detail::CallableWrapper&lt;std::__1::__bind&lt;void (WebCore::WindowEventLoop::*&amp;)(), WebCore::WindowEventLoop*&gt;, void&gt;::call() &lt;null&gt; (WebCore:x86_64+0x22f4d7d)
    #23 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (WebCore:x86_64+0x1c7dd)
    #24 WebCore::Timer::fired() &lt;null&gt; (WebCore:x86_64+0x5d35d)
    #25 WebCore::ThreadTimers::sharedTimerFiredInternal() &lt;null&gt; (WebCore:x86_64+0x2eb8247)
    #26 WebCore::ThreadTimers::setSharedTimer(WebCore::SharedTimer*)::$_0::operator()() const &lt;null&gt; (WebCore:x86_64+0x2ebfb11)
    #27 WTF::Detail::CallableWrapper&lt;WebCore::ThreadTimers::setSharedTimer(WebCore::SharedTimer*)::$_0, void&gt;::call() &lt;null&gt; (WebCore:x86_64+0x2ebfab1)
    #28 WTF::Function&lt;void ()&gt;::operator()() const &lt;null&gt; (WebCore:x86_64+0x1c7dd)
    #29 WebCore::MainThreadSharedTimer::fired() &lt;null&gt; (WebCore:x86_64+0x2e7ad6d)
    #30 WebCore::timerFired(__CFRunLoopTimer*, void*) &lt;null&gt; (WebCore:x86_64+0x2f22677)
    #31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ &lt;null&gt; (CoreFoundation:x86_64+0x99f28)
    #32 WKXPCServiceMain &lt;null&gt; (WebKit:x86_64+0x22543fe)
    #33 main &lt;null&gt; (com.apple.WebKit.WebContent.Development:x86_64+0x100003e3e)

SUMMARY: ThreadSanitizer: data race (WebKitBuild/WebCore.framework/Versions/A/WebCore:x86_64+0x2f166ca) in WebCore::CARingBufferStorageVector::setCurrentFrameBounds(unsigned long long, unsigned long long)+0x6a</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783665</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-08-11 15:48:00 -0700</bug_when>
    <thetext>&lt;rdar://problem/81817224&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783666</commentid>
    <comment_count>2</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 15:48:24 -0700</bug_when>
    <thetext>Seen in these layout tests:

fast/mediastream/getUserMedia-webaudio.html
fast/mediastream/mediastreamtrack-audio-clone.html
imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https.html
imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-iceConnectionState.https.html
imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html
imported/w3c/web-platform-tests/webrtc/protocol/missing-fields.html
webrtc/audio-peer-connection-g722.html
webrtc/audio-peer-connection-webaudio.html
webrtc/audio-replace-track.html
webrtc/peer-connection-audio-mute.html
webrtc/peer-connection-audio-mute2.html
webrtc/peer-connection-createMediaStreamDestination.html
webrtc/peer-connection-remote-audio-mute.html
webrtc/peer-connection-remote-audio-mute2.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783667</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-08-11 15:51:35 -0700</bug_when>
    <thetext>cc&apos;ing Jer for visibility here. I remember there are some constraints here as we don&apos;t want to be locking on the audio thread. My understanding was that CARingBuffer had some code that was intentionally racy to avoid locking.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783668</commentid>
    <comment_count>4</comment_count>
      <attachid>435381</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 15:53:31 -0700</bug_when>
    <thetext>Created attachment 435381
Patch v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783671</commentid>
    <comment_count>5</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 15:56:40 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #3)
&gt; cc&apos;ing Jer for visibility here. I remember there are some constraints here
&gt; as we don&apos;t want to be locking on the audio thread. My understanding was
&gt; that CARingBuffer had some code that was intentionally racy to avoid locking.

Good to know.  I think getCurrentFrameBounds() definitely needs locking (otherwise you get inconsistent values for start/end), but I could see an argument for not locking currentStartFrame() and currentEndFrame().

We can also tell TSan to ignore individual methods via the `SUPPRESS_TSAN` attribute.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783672</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-08-11 15:58:35 -0700</bug_when>
    <thetext>(In reply to David Kilzer (:ddkilzer) from comment #5)
&gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; cc&apos;ing Jer for visibility here. I remember there are some constraints here
&gt; &gt; as we don&apos;t want to be locking on the audio thread. My understanding was
&gt; &gt; that CARingBuffer had some code that was intentionally racy to avoid locking.
&gt; 
&gt; Good to know.  I think getCurrentFrameBounds() definitely needs locking
&gt; (otherwise you get inconsistent values for start/end), but I could see an
&gt; argument for not locking currentStartFrame() and currentEndFrame().
&gt; 
&gt; We can also tell TSan to ignore individual methods via the `SUPPRESS_TSAN`
&gt; attribute.

I defer to Eric and Jer here. The locking may be fine in this particular instance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783673</commentid>
    <comment_count>7</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 16:00:44 -0700</bug_when>
    <thetext>(In reply to David Kilzer (:ddkilzer) from comment #4)
&gt; Created attachment 435381 [details]
&gt; Patch v1

Hmmm...can&apos;t use WTF::Locker in a const method?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783674</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-08-11 16:02:01 -0700</bug_when>
    <thetext>(In reply to David Kilzer (:ddkilzer) from comment #7)
&gt; (In reply to David Kilzer (:ddkilzer) from comment #4)
&gt; &gt; Created attachment 435381 [details]
&gt; &gt; Patch v1
&gt; 
&gt; Hmmm...can&apos;t use WTF::Locker in a const method?

Mark Lock as mutable?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783686</commentid>
    <comment_count>9</comment_count>
      <attachid>435385</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 16:47:30 -0700</bug_when>
    <thetext>Created attachment 435385
Patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783687</commentid>
    <comment_count>10</comment_count>
      <attachid>435385</attachid>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2021-08-11 16:50:00 -0700</bug_when>
    <thetext>Comment on attachment 435385
Patch v2

The entire point of the CARingBuffer is for it to be lockless; adding a lock to address this race would be very bad for high-priority audio thread performance. We should find another way to address this race.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783689</commentid>
    <comment_count>11</comment_count>
    <who name="Jer Noble">jer.noble</who>
    <bug_when>2021-08-11 16:52:08 -0700</bug_when>
    <thetext>I&apos;m not sure this is worth fixing; CARingBuffer is inherently racy, and that&apos;s fine. Can we just disable this warning somehow?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783690</commentid>
    <comment_count>12</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 16:53:58 -0700</bug_when>
    <thetext>(In reply to Jer Noble from comment #11)
&gt; I&apos;m not sure this is worth fixing; CARingBuffer is inherently racy, and
&gt; that&apos;s fine. Can we just disable this warning somehow?

Yes, with TSAN_SUPPRESS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783691</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-08-11 16:57:04 -0700</bug_when>
    <thetext>```
        volatile uint64_t m_startFrame;
        volatile uint64_t m_endFrame;
        volatile uint32_t m_updateCounter;
```

Should we mark these as atomic instead of volatile? I believe they are marked as volatile exactly to deal with this threading race. However, iirc, using volatile for such things is not entirely correct. cc&apos;ing Geoff / Yusuke who probably know for sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783703</commentid>
    <comment_count>14</comment_count>
      <attachid>435389</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-11 18:01:22 -0700</bug_when>
    <thetext>Created attachment 435389
Patch v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783716</commentid>
    <comment_count>15</comment_count>
    <who name="Sam Sneddon [:gsnedders]">gsnedders</who>
    <bug_when>2021-08-11 19:58:40 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #13)
&gt; ```
&gt;         volatile uint64_t m_startFrame;
&gt;         volatile uint64_t m_endFrame;
&gt;         volatile uint32_t m_updateCounter;
&gt; ```
&gt; 
&gt; Should we mark these as atomic instead of volatile? I believe they are
&gt; marked as volatile exactly to deal with this threading race. However, iirc,
&gt; using volatile for such things is not entirely correct. cc&apos;ing Geoff /
&gt; Yusuke who probably know for sure.

volatile is unsafe here and can give us races (e.g. on 32-bit we could in principle read while only the half of m_startFrame has been written); in the majority of cases like this we should be using atomics with relaxed ordering which shouldn&apos;t have any perf penalty.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783888</commentid>
    <comment_count>16</comment_count>
      <attachid>435435</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-12 11:03:26 -0700</bug_when>
    <thetext>Created attachment 435435
Patch v4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1783890</commentid>
    <comment_count>17</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-12 11:05:14 -0700</bug_when>
    <thetext>(In reply to David Kilzer (:ddkilzer) from comment #16)
&gt; Created attachment 435435 [details]
&gt; Patch v4

Use the correct macro (SUPPRESS_TSAN, not TSAN_SUPPRESS) and put it in a location to make GCC happy?!

Also removed the ASSERT() macros as this patch is only focused on suppressing the false positive TSan reports now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1784005</commentid>
    <comment_count>18</comment_count>
      <attachid>435435</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2021-08-12 17:54:04 -0700</bug_when>
    <thetext>Comment on attachment 435435
Patch v4

Setting cq+ because this change has no impact on non-TSan builds, so the api-ios test failure is unrelated:
&lt;https://ews-build.webkit.org/#/builders/9/builds/52389&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1784006</commentid>
    <comment_count>19</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-08-12 18:13:26 -0700</bug_when>
    <thetext>Committed r281001 (240494@main): &lt;https://commits.webkit.org/240494@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 435435.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>435381</attachid>
            <date>2021-08-11 15:53:31 -0700</date>
            <delta_ts>2021-08-11 16:12:19 -0700</delta_ts>
            <desc>Patch v1</desc>
            <filename>bug-229014-20210811155330.patch</filename>
            <type>text/plain</type>
            <size>3459</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwMDIwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWMyOGYxNjI2ZjQ5OGE3
NTc1ZDliNjU4NGYxOTk1ZjgxM2E4ZWJlOS4uNTg4NjFiNjM2NWJhNjA5NGQzYWI3OWIwYzdjNjIy
YjU0MDZhNjllOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM0IEBACisyMDIxLTA4LTExICBEYXZp
ZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CisKKyAgICAgICAgVGhyZWFkU2FuaXRpemVy
OiBkYXRhIHJhY2UgaW4gV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6c2V0Q3Vy
cmVudEZyYW1lQm91bmRzKCkgLyBnZXRDdXJyZW50RnJhbWVCb3VuZHMoKQorICAgICAgICA8aHR0
cHM6Ly93ZWJraXQub3JnL2IvMjI5MDE0PgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODE4MTcy
MjQ+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292
ZXJlZCBieSBsYXlvdXQgdGVzdHMgcnVubmluZyB3aXRoIFRTYW46CisgICAgICAgICAgICBmYXN0
L21lZGlhc3RyZWFtL2dldFVzZXJNZWRpYS13ZWJhdWRpby5odG1sCisgICAgICAgICAgICBmYXN0
L21lZGlhc3RyZWFtL21lZGlhc3RyZWFtdHJhY2stYXVkaW8tY2xvbmUuaHRtbAorICAgICAgICAg
ICAgaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy93ZWJydGMvUlRDRFRNRlNlbmRlci1p
bnNlcnREVE1GLmh0dHBzLmh0bWwKKyAgICAgICAgICAgIGltcG9ydGVkL3czYy93ZWItcGxhdGZv
cm0tdGVzdHMvd2VicnRjL1JUQ1BlZXJDb25uZWN0aW9uLWljZUNvbm5lY3Rpb25TdGF0ZS5odHRw
cy5odG1sCisgICAgICAgICAgICBpbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL3dlYnJ0
Yy9SVENQZWVyQ29ubmVjdGlvbi10cmFjay1zdGF0cy5odHRwcy5odG1sCisgICAgICAgICAgICBp
bXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL3dlYnJ0Yy9wcm90b2NvbC9taXNzaW5nLWZp
ZWxkcy5odG1sCisgICAgICAgICAgICB3ZWJydGMvYXVkaW8tcGVlci1jb25uZWN0aW9uLWc3MjIu
aHRtbAorICAgICAgICAgICAgd2VicnRjL2F1ZGlvLXBlZXItY29ubmVjdGlvbi13ZWJhdWRpby5o
dG1sCisgICAgICAgICAgICB3ZWJydGMvYXVkaW8tcmVwbGFjZS10cmFjay5odG1sCisgICAgICAg
ICAgICB3ZWJydGMvcGVlci1jb25uZWN0aW9uLWF1ZGlvLW11dGUuaHRtbAorICAgICAgICAgICAg
d2VicnRjL3BlZXItY29ubmVjdGlvbi1hdWRpby1tdXRlMi5odG1sCisgICAgICAgICAgICB3ZWJy
dGMvcGVlci1jb25uZWN0aW9uLWNyZWF0ZU1lZGlhU3RyZWFtRGVzdGluYXRpb24uaHRtbAorICAg
ICAgICAgICAgd2VicnRjL3BlZXItY29ubmVjdGlvbi1yZW1vdGUtYXVkaW8tbXV0ZS5odG1sCisg
ICAgICAgICAgICB3ZWJydGMvcGVlci1jb25uZWN0aW9uLXJlbW90ZS1hdWRpby1tdXRlMi5odG1s
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9jb2NvYS9DQVJpbmdCdWZmZXIuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Z2V0Q3VycmVudEZyYW1l
Qm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkNBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1
cnJlbnRTdGFydEZyYW1lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNBUmluZ0J1ZmZlclN0
b3JhZ2VWZWN0b3I6OmN1cnJlbnRFbmRGcmFtZSBjb25zdCk6CisgICAgICAgIC0gQWRkIExvY2tl
ciB1c2luZyBtX2N1cnJlbnRGcmFtZUJvdW5kc0xvY2sgdG8gcHJvdGVjdCByZWFkcyBvZgorICAg
ICAgICAgIG1fdGltZUJvdW5kc1F1ZXVlLCBub3QganVzdCB3cml0ZXMuCisKIDIwMjEtMDctMTgg
IERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAogICAgICAgICBHZXRJZGVudGlm
aWVyU3RyaW5nRm9yUHJlZmVycmVkVm9pY2VJbkxpc3RXaXRoTG9jYWxlKCkgaXMgZGVwcmVjYXRl
ZCBpbiBNb250ZXJleQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
Y29jb2EvQ0FSaW5nQnVmZmVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL2Nv
Y29hL0NBUmluZ0J1ZmZlci5jcHAKaW5kZXggNTViMDA0YzAxYTM3NzAzZjNjYzk0ZDRhY2E5M2Ew
ZDlmMjQxYmE4YS4uMjMwYzZiMmE3ZmI4MjE2NjY4Y2FkNDFiMThlZDQ5MzE1MzY1MWUwMCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVy
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9jb2NvYS9DQVJpbmdCdWZm
ZXIuY3BwCkBAIC0zMjcsNiArMzI3LDcgQEAgdm9pZCBDQVJpbmdCdWZmZXI6OmdldEN1cnJlbnRG
cmFtZUJvdW5kc1dpdGhvdXRVcGRhdGUodWludDY0X3QmIHN0YXJ0RnJhbWUsIHVpbnQKIAogdm9p
ZCBDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9yOjpnZXRDdXJyZW50RnJhbWVCb3VuZHModWludDY0
X3QmIHN0YXJ0RnJhbWUsIHVpbnQ2NF90JiBlbmRGcmFtZSkKIHsKKyAgICBMb2NrZXIgbG9ja2Vy
IHsgbV9jdXJyZW50RnJhbWVCb3VuZHNMb2NrIH07CiAgICAgdWludDMyX3QgY3VyUHRyID0gbV90
aW1lQm91bmRzUXVldWVQdHIubG9hZCgpOwogICAgIHVpbnQzMl90IGluZGV4ID0gY3VyUHRyICYg
a0dlbmVyYWxSaW5nVGltZUJvdW5kc1F1ZXVlTWFzazsKICAgICBhdXRvJiBib3VuZHMgPSBtX3Rp
bWVCb3VuZHNRdWV1ZVtpbmRleF07CkBAIC0zNTksNiArMzYwLDcgQEAgdWludDY0X3QgQ0FSaW5n
QnVmZmVyOjpjdXJyZW50U3RhcnRGcmFtZSgpIGNvbnN0CiAKIHVpbnQ2NF90IENBUmluZ0J1ZmZl
clN0b3JhZ2VWZWN0b3I6OmN1cnJlbnRTdGFydEZyYW1lKCkgY29uc3QKIHsKKyAgICBMb2NrZXIg
bG9ja2VyIHsgbV9jdXJyZW50RnJhbWVCb3VuZHNMb2NrIH07CiAgICAgdWludDMyX3QgaW5kZXgg
PSBtX3RpbWVCb3VuZHNRdWV1ZVB0ci5sb2FkKCkgJiBrR2VuZXJhbFJpbmdUaW1lQm91bmRzUXVl
dWVNYXNrOwogICAgIHJldHVybiBtX3RpbWVCb3VuZHNRdWV1ZVtpbmRleF0ubV9zdGFydEZyYW1l
OwogfQpAQCAtMzcwLDYgKzM3Miw3IEBAIHVpbnQ2NF90IENBUmluZ0J1ZmZlcjo6Y3VycmVudEVu
ZEZyYW1lKCkgY29uc3QKIAogdWludDY0X3QgQ0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Y3Vy
cmVudEVuZEZyYW1lKCkgY29uc3QKIHsKKyAgICBMb2NrZXIgbG9ja2VyIHsgbV9jdXJyZW50RnJh
bWVCb3VuZHNMb2NrIH07CiAgICAgdWludDMyX3QgaW5kZXggPSBtX3RpbWVCb3VuZHNRdWV1ZVB0
ci5sb2FkKCkgJiBrR2VuZXJhbFJpbmdUaW1lQm91bmRzUXVldWVNYXNrOwogICAgIHJldHVybiBt
X3RpbWVCb3VuZHNRdWV1ZVtpbmRleF0ubV9lbmRGcmFtZTsKIH0K
</data>
<flag name="commit-queue"
          id="458175"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>435385</attachid>
            <date>2021-08-11 16:47:30 -0700</date>
            <delta_ts>2021-08-11 18:01:39 -0700</delta_ts>
            <desc>Patch v2</desc>
            <filename>bug-229014-20210811164729.patch</filename>
            <type>text/plain</type>
            <size>4173</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwMDIwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWMyOGYxNjI2ZjQ5OGE3
NTc1ZDliNjU4NGYxOTk1ZjgxM2E4ZWJlOS4uN2Y5ZWRjNzM5MmMyMzg1M2ZkNzQ0MGNmZTBiMTE0
OGRiMTUzZDVmZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM3IEBACisyMDIxLTA4LTExICBEYXZp
ZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CisKKyAgICAgICAgVGhyZWFkU2FuaXRpemVy
OiBkYXRhIHJhY2UgaW4gV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6c2V0Q3Vy
cmVudEZyYW1lQm91bmRzKCkgLyBnZXRDdXJyZW50RnJhbWVCb3VuZHMoKQorICAgICAgICA8aHR0
cHM6Ly93ZWJraXQub3JnL2IvMjI5MDE0PgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODE4MTcy
MjQ+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292
ZXJlZCBieSBsYXlvdXQgdGVzdHMgcnVubmluZyB3aXRoIFRTYW46CisgICAgICAgICAgICBmYXN0
L21lZGlhc3RyZWFtL2dldFVzZXJNZWRpYS13ZWJhdWRpby5odG1sCisgICAgICAgICAgICBmYXN0
L21lZGlhc3RyZWFtL21lZGlhc3RyZWFtdHJhY2stYXVkaW8tY2xvbmUuaHRtbAorICAgICAgICAg
ICAgaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy93ZWJydGMvUlRDRFRNRlNlbmRlci1p
bnNlcnREVE1GLmh0dHBzLmh0bWwKKyAgICAgICAgICAgIGltcG9ydGVkL3czYy93ZWItcGxhdGZv
cm0tdGVzdHMvd2VicnRjL1JUQ1BlZXJDb25uZWN0aW9uLWljZUNvbm5lY3Rpb25TdGF0ZS5odHRw
cy5odG1sCisgICAgICAgICAgICBpbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL3dlYnJ0
Yy9SVENQZWVyQ29ubmVjdGlvbi10cmFjay1zdGF0cy5odHRwcy5odG1sCisgICAgICAgICAgICBp
bXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL3dlYnJ0Yy9wcm90b2NvbC9taXNzaW5nLWZp
ZWxkcy5odG1sCisgICAgICAgICAgICB3ZWJydGMvYXVkaW8tcGVlci1jb25uZWN0aW9uLWc3MjIu
aHRtbAorICAgICAgICAgICAgd2VicnRjL2F1ZGlvLXBlZXItY29ubmVjdGlvbi13ZWJhdWRpby5o
dG1sCisgICAgICAgICAgICB3ZWJydGMvYXVkaW8tcmVwbGFjZS10cmFjay5odG1sCisgICAgICAg
ICAgICB3ZWJydGMvcGVlci1jb25uZWN0aW9uLWF1ZGlvLW11dGUuaHRtbAorICAgICAgICAgICAg
d2VicnRjL3BlZXItY29ubmVjdGlvbi1hdWRpby1tdXRlMi5odG1sCisgICAgICAgICAgICB3ZWJy
dGMvcGVlci1jb25uZWN0aW9uLWNyZWF0ZU1lZGlhU3RyZWFtRGVzdGluYXRpb24uaHRtbAorICAg
ICAgICAgICAgd2VicnRjL3BlZXItY29ubmVjdGlvbi1yZW1vdGUtYXVkaW8tbXV0ZS5odG1sCisg
ICAgICAgICAgICB3ZWJydGMvcGVlci1jb25uZWN0aW9uLXJlbW90ZS1hdWRpby1tdXRlMi5odG1s
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9jb2NvYS9DQVJpbmdCdWZmZXIuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Z2V0Q3VycmVudEZyYW1l
Qm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkNBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1
cnJlbnRTdGFydEZyYW1lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNBUmluZ0J1ZmZlclN0
b3JhZ2VWZWN0b3I6OmN1cnJlbnRFbmRGcmFtZSBjb25zdCk6CisgICAgICAgIC0gQWRkIExvY2tl
ciB1c2luZyBtX2N1cnJlbnRGcmFtZUJvdW5kc0xvY2sgdG8gcHJvdGVjdCByZWFkcyBvZgorICAg
ICAgICAgIG1fdGltZUJvdW5kc1F1ZXVlLCBub3QganVzdCB3cml0ZXMuCisgICAgICAgICogcGxh
dGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmg6CisgICAgICAgIC0gTWFrZSBtX2N1cnJl
bnRGcmFtZUJvdW5kc0xvY2sgbXV0YWJsZSBzbyBpdCBjYW4gYmUgdXNlZCBpbgorICAgICAgICAg
IGNvbnN0IG1ldGhvZHMuCisKIDIwMjEtMDctMTggIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFw
cGxlLmNvbT4KIAogICAgICAgICBHZXRJZGVudGlmaWVyU3RyaW5nRm9yUHJlZmVycmVkVm9pY2VJ
bkxpc3RXaXRoTG9jYWxlKCkgaXMgZGVwcmVjYXRlZCBpbiBNb250ZXJleQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL2NvY29hL0NBUmluZ0J1ZmZlci5jcHAKaW5kZXgg
NTViMDA0YzAxYTM3NzAzZjNjYzk0ZDRhY2E5M2EwZDlmMjQxYmE4YS4uMjMwYzZiMmE3ZmI4MjE2
NjY4Y2FkNDFiMThlZDQ5MzE1MzY1MWUwMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9hdWRpby9jb2NvYS9DQVJpbmdCdWZmZXIuY3BwCkBAIC0zMjcsNiArMzI3LDcgQEAg
dm9pZCBDQVJpbmdCdWZmZXI6OmdldEN1cnJlbnRGcmFtZUJvdW5kc1dpdGhvdXRVcGRhdGUodWlu
dDY0X3QmIHN0YXJ0RnJhbWUsIHVpbnQKIAogdm9pZCBDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9y
OjpnZXRDdXJyZW50RnJhbWVCb3VuZHModWludDY0X3QmIHN0YXJ0RnJhbWUsIHVpbnQ2NF90JiBl
bmRGcmFtZSkKIHsKKyAgICBMb2NrZXIgbG9ja2VyIHsgbV9jdXJyZW50RnJhbWVCb3VuZHNMb2Nr
IH07CiAgICAgdWludDMyX3QgY3VyUHRyID0gbV90aW1lQm91bmRzUXVldWVQdHIubG9hZCgpOwog
ICAgIHVpbnQzMl90IGluZGV4ID0gY3VyUHRyICYga0dlbmVyYWxSaW5nVGltZUJvdW5kc1F1ZXVl
TWFzazsKICAgICBhdXRvJiBib3VuZHMgPSBtX3RpbWVCb3VuZHNRdWV1ZVtpbmRleF07CkBAIC0z
NTksNiArMzYwLDcgQEAgdWludDY0X3QgQ0FSaW5nQnVmZmVyOjpjdXJyZW50U3RhcnRGcmFtZSgp
IGNvbnN0CiAKIHVpbnQ2NF90IENBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1cnJlbnRTdGFy
dEZyYW1lKCkgY29uc3QKIHsKKyAgICBMb2NrZXIgbG9ja2VyIHsgbV9jdXJyZW50RnJhbWVCb3Vu
ZHNMb2NrIH07CiAgICAgdWludDMyX3QgaW5kZXggPSBtX3RpbWVCb3VuZHNRdWV1ZVB0ci5sb2Fk
KCkgJiBrR2VuZXJhbFJpbmdUaW1lQm91bmRzUXVldWVNYXNrOwogICAgIHJldHVybiBtX3RpbWVC
b3VuZHNRdWV1ZVtpbmRleF0ubV9zdGFydEZyYW1lOwogfQpAQCAtMzcwLDYgKzM3Miw3IEBAIHVp
bnQ2NF90IENBUmluZ0J1ZmZlcjo6Y3VycmVudEVuZEZyYW1lKCkgY29uc3QKIAogdWludDY0X3Qg
Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Y3VycmVudEVuZEZyYW1lKCkgY29uc3QKIHsKKyAg
ICBMb2NrZXIgbG9ja2VyIHsgbV9jdXJyZW50RnJhbWVCb3VuZHNMb2NrIH07CiAgICAgdWludDMy
X3QgaW5kZXggPSBtX3RpbWVCb3VuZHNRdWV1ZVB0ci5sb2FkKCkgJiBrR2VuZXJhbFJpbmdUaW1l
Qm91bmRzUXVldWVNYXNrOwogICAgIHJldHVybiBtX3RpbWVCb3VuZHNRdWV1ZVtpbmRleF0ubV9l
bmRGcmFtZTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL2Nv
Y29hL0NBUmluZ0J1ZmZlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2Ev
Q0FSaW5nQnVmZmVyLmgKaW5kZXggZTE1N2MyMTI5MTcwZTdlYjVmZTJiNzNiOTA3OWViZmQ1NDAw
ZTdhYy4uNjE3YzE4MTdjMTUxNzNiYmU3ZDc5MjQ3M2MwNDM1NmY3MDRkODZjMSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmgKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmgKQEAg
LTg0LDcgKzg0LDcgQEAgcHJpdmF0ZToKIAogICAgIFZlY3Rvcjx1aW50OF90PiBtX2J1ZmZlcjsK
ICAgICBWZWN0b3I8VGltZUJvdW5kcz4gbV90aW1lQm91bmRzUXVldWU7Ci0gICAgTG9jayBtX2N1
cnJlbnRGcmFtZUJvdW5kc0xvY2s7CisgICAgbXV0YWJsZSBMb2NrIG1fY3VycmVudEZyYW1lQm91
bmRzTG9jazsKICAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBtX3RpbWVCb3VuZHNRdWV1ZVB0ciB7
IDAgfTsKIH07CiAK
</data>
<flag name="review"
          id="458181"
          type_id="1"
          status="-"
          setter="jer.noble"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>435389</attachid>
            <date>2021-08-11 18:01:22 -0700</date>
            <delta_ts>2021-08-12 11:03:24 -0700</delta_ts>
            <desc>Patch v3</desc>
            <filename>bug-229014-20210811180121.patch</filename>
            <type>text/plain</type>
            <size>4965</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwMDIwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWMyOGYxNjI2ZjQ5OGE3
NTc1ZDliNjU4NGYxOTk1ZjgxM2E4ZWJlOS4uNmIxODY3ZmI3YTRhNDBhYjBjNjY1YjJhYzVlZGNl
YjAzODFhYjYwMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM4IEBACisyMDIxLTA4LTExICBEYXZp
ZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CisKKyAgICAgICAgVGhyZWFkU2FuaXRpemVy
OiBkYXRhIHJhY2UgaW4gV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6c2V0Q3Vy
cmVudEZyYW1lQm91bmRzKCkgLyBnZXRDdXJyZW50RnJhbWVCb3VuZHMoKQorICAgICAgICA8aHR0
cHM6Ly93ZWJraXQub3JnL2IvMjI5MDE0PgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODE4MTcy
MjQ+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292
ZXJlZCBieSBsYXlvdXQgdGVzdHMgcnVubmluZyB3aXRoIFRTYW46CisgICAgICAgICAgICBmYXN0
L21lZGlhc3RyZWFtL2dldFVzZXJNZWRpYS13ZWJhdWRpby5odG1sCisgICAgICAgICAgICBmYXN0
L21lZGlhc3RyZWFtL21lZGlhc3RyZWFtdHJhY2stYXVkaW8tY2xvbmUuaHRtbAorICAgICAgICAg
ICAgaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy93ZWJydGMvUlRDRFRNRlNlbmRlci1p
bnNlcnREVE1GLmh0dHBzLmh0bWwKKyAgICAgICAgICAgIGltcG9ydGVkL3czYy93ZWItcGxhdGZv
cm0tdGVzdHMvd2VicnRjL1JUQ1BlZXJDb25uZWN0aW9uLWljZUNvbm5lY3Rpb25TdGF0ZS5odHRw
cy5odG1sCisgICAgICAgICAgICBpbXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL3dlYnJ0
Yy9SVENQZWVyQ29ubmVjdGlvbi10cmFjay1zdGF0cy5odHRwcy5odG1sCisgICAgICAgICAgICBp
bXBvcnRlZC93M2Mvd2ViLXBsYXRmb3JtLXRlc3RzL3dlYnJ0Yy9wcm90b2NvbC9taXNzaW5nLWZp
ZWxkcy5odG1sCisgICAgICAgICAgICB3ZWJydGMvYXVkaW8tcGVlci1jb25uZWN0aW9uLWc3MjIu
aHRtbAorICAgICAgICAgICAgd2VicnRjL2F1ZGlvLXBlZXItY29ubmVjdGlvbi13ZWJhdWRpby5o
dG1sCisgICAgICAgICAgICB3ZWJydGMvYXVkaW8tcmVwbGFjZS10cmFjay5odG1sCisgICAgICAg
ICAgICB3ZWJydGMvcGVlci1jb25uZWN0aW9uLWF1ZGlvLW11dGUuaHRtbAorICAgICAgICAgICAg
d2VicnRjL3BlZXItY29ubmVjdGlvbi1hdWRpby1tdXRlMi5odG1sCisgICAgICAgICAgICB3ZWJy
dGMvcGVlci1jb25uZWN0aW9uLWNyZWF0ZU1lZGlhU3RyZWFtRGVzdGluYXRpb24uaHRtbAorICAg
ICAgICAgICAgd2VicnRjL3BlZXItY29ubmVjdGlvbi1yZW1vdGUtYXVkaW8tbXV0ZS5odG1sCisg
ICAgICAgICAgICB3ZWJydGMvcGVlci1jb25uZWN0aW9uLXJlbW90ZS1hdWRpby1tdXRlMi5odG1s
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9jb2NvYS9DQVJpbmdCdWZmZXIuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Zmx1c2gpOgorICAgICAg
ICAoV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6c2V0Q3VycmVudEZyYW1lQm91
bmRzKToKKyAgICAgICAgLSBBZGQgRGVidWcgYXNzZXJ0aW9uIHRoYXQgdGhlIGxvY2sgaXMgbm90
IGhlbGQgYmVmb3JlIGJlaW5nIHRha2VuLgorICAgICAgICAgIEFsbCB3cml0aW5nIHNob3VsZCBo
YXBwZW4gb24gYSBzaW5nbGUgdGhyZWFkLgorICAgICAgICAoV2ViQ29yZTo6Q0FSaW5nQnVmZmVy
U3RvcmFnZVZlY3Rvcjo6Z2V0Q3VycmVudEZyYW1lQm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkNBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1cnJlbnRTdGFydEZyYW1lIGNvbnN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkNBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1cnJlbnRFbmRGcmFt
ZSBjb25zdCk6CisgICAgICAgIC0gQWRkIFRTQU5fU1VQUFJFU1MgYXMgdGhlc2UgbWV0aG9kcyBh
cmUgcHJvdGVjdGVkIGJ5CisgICAgICAgICAgc3RkOjphdG9taWM8aW50MzJfdD4gbV90aW1lQm91
bmRzUXVldWVQdHIuCisKIDIwMjEtMDctMTggIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxl
LmNvbT4KIAogICAgICAgICBHZXRJZGVudGlmaWVyU3RyaW5nRm9yUHJlZmVycmVkVm9pY2VJbkxp
c3RXaXRoTG9jYWxlKCkgaXMgZGVwcmVjYXRlZCBpbiBNb250ZXJleQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL2NvY29hL0NBUmluZ0J1ZmZlci5jcHAKaW5kZXggNTVi
MDA0YzAxYTM3NzAzZjNjYzk0ZDRhY2E5M2EwZDlmMjQxYmE4YS4uYjhlMjg1ZWY5MzFmYjRlMjc4
YjU1ZTU5NjA2OWFhYjFkYWZlNjY3OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9jb2NvYS9DQVJpbmdCdWZmZXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTQtMjAyMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIzMCw2ICsyMzAsNyBAQCBib29sIENB
UmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmFsbG9jYXRlKHNpemVfdCBieXRlQ291bnQsIGNvbnN0
IENBQXVkaW9TdHJlYW1EZQogCiB2b2lkIENBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmZsdXNo
KCkKIHsKKyAgICBBU1NFUlQoIW1fY3VycmVudEZyYW1lQm91bmRzTG9jay5pc0hlbGQoKSk7CiAg
ICAgTG9ja2VyIGxvY2tlciB7IG1fY3VycmVudEZyYW1lQm91bmRzTG9jayB9OwogICAgIGZvciAo
YXV0byYgdGltZUJvdW5kcyA6IG1fdGltZUJvdW5kc1F1ZXVlKSB7CiAgICAgICAgIHRpbWVCb3Vu
ZHMubV9zdGFydEZyYW1lID0gMDsKQEAgLTMwNCw2ICszMDUsNyBAQCB2b2lkIENBUmluZ0J1ZmZl
cjo6c2V0Q3VycmVudEZyYW1lQm91bmRzKHVpbnQ2NF90IHN0YXJ0VGltZSwgdWludDY0X3QgZW5k
VGltZSkKIAogdm9pZCBDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9yOjpzZXRDdXJyZW50RnJhbWVC
b3VuZHModWludDY0X3Qgc3RhcnRUaW1lLCB1aW50NjRfdCBlbmRUaW1lKQogeworICAgIEFTU0VS
VCghbV9jdXJyZW50RnJhbWVCb3VuZHNMb2NrLmlzSGVsZCgpKTsKICAgICBMb2NrZXIgbG9ja2Vy
IHsgbV9jdXJyZW50RnJhbWVCb3VuZHNMb2NrIH07CiAgICAgdWludDMyX3QgbmV4dFB0ciA9IG1f
dGltZUJvdW5kc1F1ZXVlUHRyLmxvYWQoKSArIDE7CiAgICAgdWludDMyX3QgaW5kZXggPSBuZXh0
UHRyICYga0dlbmVyYWxSaW5nVGltZUJvdW5kc1F1ZXVlTWFzazsKQEAgLTMyNSw3ICszMjcsNyBA
QCB2b2lkIENBUmluZ0J1ZmZlcjo6Z2V0Q3VycmVudEZyYW1lQm91bmRzV2l0aG91dFVwZGF0ZSh1
aW50NjRfdCYgc3RhcnRGcmFtZSwgdWludAogICAgIG1fYnVmZmVycy0+Z2V0Q3VycmVudEZyYW1l
Qm91bmRzKHN0YXJ0RnJhbWUsIGVuZEZyYW1lKTsKIH0KIAotdm9pZCBDQVJpbmdCdWZmZXJTdG9y
YWdlVmVjdG9yOjpnZXRDdXJyZW50RnJhbWVCb3VuZHModWludDY0X3QmIHN0YXJ0RnJhbWUsIHVp
bnQ2NF90JiBlbmRGcmFtZSkKK3ZvaWQgQ0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Z2V0Q3Vy
cmVudEZyYW1lQm91bmRzKHVpbnQ2NF90JiBzdGFydEZyYW1lLCB1aW50NjRfdCYgZW5kRnJhbWUp
IFRTQU5fU1VQUFJFU1MKIHsKICAgICB1aW50MzJfdCBjdXJQdHIgPSBtX3RpbWVCb3VuZHNRdWV1
ZVB0ci5sb2FkKCk7CiAgICAgdWludDMyX3QgaW5kZXggPSBjdXJQdHIgJiBrR2VuZXJhbFJpbmdU
aW1lQm91bmRzUXVldWVNYXNrOwpAQCAtMzU3LDcgKzM1OSw3IEBAIHVpbnQ2NF90IENBUmluZ0J1
ZmZlcjo6Y3VycmVudFN0YXJ0RnJhbWUoKSBjb25zdAogICAgIHJldHVybiBtX2J1ZmZlcnMtPmN1
cnJlbnRTdGFydEZyYW1lKCk7CiB9CiAKLXVpbnQ2NF90IENBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0
b3I6OmN1cnJlbnRTdGFydEZyYW1lKCkgY29uc3QKK3VpbnQ2NF90IENBUmluZ0J1ZmZlclN0b3Jh
Z2VWZWN0b3I6OmN1cnJlbnRTdGFydEZyYW1lKCkgY29uc3QgVFNBTl9TVVBQUkVTUwogewogICAg
IHVpbnQzMl90IGluZGV4ID0gbV90aW1lQm91bmRzUXVldWVQdHIubG9hZCgpICYga0dlbmVyYWxS
aW5nVGltZUJvdW5kc1F1ZXVlTWFzazsKICAgICByZXR1cm4gbV90aW1lQm91bmRzUXVldWVbaW5k
ZXhdLm1fc3RhcnRGcmFtZTsKQEAgLTM2OCw3ICszNzAsNyBAQCB1aW50NjRfdCBDQVJpbmdCdWZm
ZXI6OmN1cnJlbnRFbmRGcmFtZSgpIGNvbnN0CiAgICAgcmV0dXJuIG1fYnVmZmVycy0+Y3VycmVu
dEVuZEZyYW1lKCk7CiB9CiAKLXVpbnQ2NF90IENBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1
cnJlbnRFbmRGcmFtZSgpIGNvbnN0Cit1aW50NjRfdCBDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9y
OjpjdXJyZW50RW5kRnJhbWUoKSBjb25zdCBUU0FOX1NVUFBSRVNTCiB7CiAgICAgdWludDMyX3Qg
aW5kZXggPSBtX3RpbWVCb3VuZHNRdWV1ZVB0ci5sb2FkKCkgJiBrR2VuZXJhbFJpbmdUaW1lQm91
bmRzUXVldWVNYXNrOwogICAgIHJldHVybiBtX3RpbWVCb3VuZHNRdWV1ZVtpbmRleF0ubV9lbmRG
cmFtZTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>435435</attachid>
            <date>2021-08-12 11:03:26 -0700</date>
            <delta_ts>2021-08-12 18:13:27 -0700</delta_ts>
            <desc>Patch v4</desc>
            <filename>bug-229014-20210812110325.patch</filename>
            <type>text/plain</type>
            <size>4366</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgwMDIwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWMyOGYxNjI2ZjQ5OGE3
NTc1ZDliNjU4NGYxOTk1ZjgxM2E4ZWJlOS4uYzRhYTM5NjZlNjZmYjA2MTUyOGU2YzQzMDgwOGU0
YjgwMmUwNDAwMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQyIEBACisyMDIxLTA4LTEyICBEYXZp
ZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CisKKyAgICAgICAgVGhyZWFkU2FuaXRpemVy
OiBkYXRhIHJhY2UgaW4gV2ViQ29yZTo6Q0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6c2V0Q3Vy
cmVudEZyYW1lQm91bmRzKCkgLyBnZXRDdXJyZW50RnJhbWVCb3VuZHMoKQorICAgICAgICA8aHR0
cHM6Ly93ZWJraXQub3JnL2IvMjI5MDE0PgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODE4MTcy
MjQ+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhp
cyB0dXJuZWQgb3V0IHRvIGJlIGEgZmFsc2UtcG9zaXRpdmUgc2luY2UgcmVhZHMgYW5kIHdyaXRl
cworICAgICAgICBhcmUgcHJvdGVjdGVkIGRpZmZlcmVudGx5LCBhbmQgaXQncyBva2F5IGlmIGEg
cmVhZCByZXR1cm5zIGRhdGEKKyAgICAgICAgZnJvbSB0aGUgcmluZyBidWZmZXIgdGhhdCBpcyBv
bmUgc2xvdCBvbGRlciB0aGFuIHRoZSBjdXJyZW50CisgICAgICAgIHdyaXRlLgorCisgICAgICAg
IENvdmVyZWQgYnkgbGF5b3V0IHRlc3RzIHJ1bm5pbmcgd2l0aCBUU2FuOgorICAgICAgICAgICAg
ZmFzdC9tZWRpYXN0cmVhbS9nZXRVc2VyTWVkaWEtd2ViYXVkaW8uaHRtbAorICAgICAgICAgICAg
ZmFzdC9tZWRpYXN0cmVhbS9tZWRpYXN0cmVhbXRyYWNrLWF1ZGlvLWNsb25lLmh0bWwKKyAgICAg
ICAgICAgIGltcG9ydGVkL3czYy93ZWItcGxhdGZvcm0tdGVzdHMvd2VicnRjL1JUQ0RUTUZTZW5k
ZXItaW5zZXJ0RFRNRi5odHRwcy5odG1sCisgICAgICAgICAgICBpbXBvcnRlZC93M2Mvd2ViLXBs
YXRmb3JtLXRlc3RzL3dlYnJ0Yy9SVENQZWVyQ29ubmVjdGlvbi1pY2VDb25uZWN0aW9uU3RhdGUu
aHR0cHMuaHRtbAorICAgICAgICAgICAgaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy93
ZWJydGMvUlRDUGVlckNvbm5lY3Rpb24tdHJhY2stc3RhdHMuaHR0cHMuaHRtbAorICAgICAgICAg
ICAgaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy93ZWJydGMvcHJvdG9jb2wvbWlzc2lu
Zy1maWVsZHMuaHRtbAorICAgICAgICAgICAgd2VicnRjL2F1ZGlvLXBlZXItY29ubmVjdGlvbi1n
NzIyLmh0bWwKKyAgICAgICAgICAgIHdlYnJ0Yy9hdWRpby1wZWVyLWNvbm5lY3Rpb24td2ViYXVk
aW8uaHRtbAorICAgICAgICAgICAgd2VicnRjL2F1ZGlvLXJlcGxhY2UtdHJhY2suaHRtbAorICAg
ICAgICAgICAgd2VicnRjL3BlZXItY29ubmVjdGlvbi1hdWRpby1tdXRlLmh0bWwKKyAgICAgICAg
ICAgIHdlYnJ0Yy9wZWVyLWNvbm5lY3Rpb24tYXVkaW8tbXV0ZTIuaHRtbAorICAgICAgICAgICAg
d2VicnRjL3BlZXItY29ubmVjdGlvbi1jcmVhdGVNZWRpYVN0cmVhbURlc3RpbmF0aW9uLmh0bWwK
KyAgICAgICAgICAgIHdlYnJ0Yy9wZWVyLWNvbm5lY3Rpb24tcmVtb3RlLWF1ZGlvLW11dGUuaHRt
bAorICAgICAgICAgICAgd2VicnRjL3BlZXItY29ubmVjdGlvbi1yZW1vdGUtYXVkaW8tbXV0ZTIu
aHRtbAorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FSaW5nQnVmZmVyLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkNBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmdldEN1cnJlbnRG
cmFtZUJvdW5kcyk6CisgICAgICAgIChXZWJDb3JlOjpDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9y
OjpjdXJyZW50U3RhcnRGcmFtZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDQVJpbmdCdWZm
ZXJTdG9yYWdlVmVjdG9yOjpjdXJyZW50RW5kRnJhbWUgY29uc3QpOgorICAgICAgICAtIEFkZCBT
VVBQUkVTU19UU0FOIGF0dHJpYnV0ZSBzaW5jZSByZWFkcyBhcmUgcHJvdGVjdGVkIGJ5CisgICAg
ICAgICAgc3RkOjphdG9taWM8aW50MzJfdD4gbV90aW1lQm91bmRzUXVldWVQdHIgb25seSBiZWlu
ZworICAgICAgICAgIGluY3JlbWVudGVkIGFmdGVyIHRoZSBuZXh0IG1fdGltZUJvdW5kc1F1ZXVl
IHNsb3QgaXMgdXBkYXRlZC4KKyAgICAgICAgICBXcml0ZXMgYXJlIHBvdGVjdGVkIGJ5CisgICAg
ICAgICAgTG9ja2VyIGxvY2tlciB7IG1fY3VycmVudEZyYW1lQm91bmRzTG9jayB9LgorCiAyMDIx
LTA3LTE4ICBEYXZpZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CiAKICAgICAgICAgR2V0
SWRlbnRpZmllclN0cmluZ0ZvclByZWZlcnJlZFZvaWNlSW5MaXN0V2l0aExvY2FsZSgpIGlzIGRl
cHJlY2F0ZWQgaW4gTW9udGVyZXkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL2NvY29hL0NBUmluZ0J1ZmZlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9h
dWRpby9jb2NvYS9DQVJpbmdCdWZmZXIuY3BwCmluZGV4IDU1YjAwNGMwMWEzNzcwM2YzY2M5NGQ0
YWNhOTNhMGQ5ZjI0MWJhOGEuLjQyMDcyMzgzZmFlMDk2N2EwMjRkMTE4YzA5NzAxNjdlZTgzYTFh
MjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL2NvY29hL0NBUmlu
Z0J1ZmZlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vY29jb2EvQ0FS
aW5nQnVmZmVyLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIw
MjEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zMjUsNyArMzI1LDcgQEAgdm9pZCBDQVJpbmdCdWZmZXI6OmdldEN1cnJl
bnRGcmFtZUJvdW5kc1dpdGhvdXRVcGRhdGUodWludDY0X3QmIHN0YXJ0RnJhbWUsIHVpbnQKICAg
ICBtX2J1ZmZlcnMtPmdldEN1cnJlbnRGcmFtZUJvdW5kcyhzdGFydEZyYW1lLCBlbmRGcmFtZSk7
CiB9CiAKLXZvaWQgQ0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Z2V0Q3VycmVudEZyYW1lQm91
bmRzKHVpbnQ2NF90JiBzdGFydEZyYW1lLCB1aW50NjRfdCYgZW5kRnJhbWUpCitTVVBQUkVTU19U
U0FOIHZvaWQgQ0FSaW5nQnVmZmVyU3RvcmFnZVZlY3Rvcjo6Z2V0Q3VycmVudEZyYW1lQm91bmRz
KHVpbnQ2NF90JiBzdGFydEZyYW1lLCB1aW50NjRfdCYgZW5kRnJhbWUpCiB7CiAgICAgdWludDMy
X3QgY3VyUHRyID0gbV90aW1lQm91bmRzUXVldWVQdHIubG9hZCgpOwogICAgIHVpbnQzMl90IGlu
ZGV4ID0gY3VyUHRyICYga0dlbmVyYWxSaW5nVGltZUJvdW5kc1F1ZXVlTWFzazsKQEAgLTM1Nyw3
ICszNTcsNyBAQCB1aW50NjRfdCBDQVJpbmdCdWZmZXI6OmN1cnJlbnRTdGFydEZyYW1lKCkgY29u
c3QKICAgICByZXR1cm4gbV9idWZmZXJzLT5jdXJyZW50U3RhcnRGcmFtZSgpOwogfQogCi11aW50
NjRfdCBDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9yOjpjdXJyZW50U3RhcnRGcmFtZSgpIGNvbnN0
CitTVVBQUkVTU19UU0FOIHVpbnQ2NF90IENBUmluZ0J1ZmZlclN0b3JhZ2VWZWN0b3I6OmN1cnJl
bnRTdGFydEZyYW1lKCkgY29uc3QKIHsKICAgICB1aW50MzJfdCBpbmRleCA9IG1fdGltZUJvdW5k
c1F1ZXVlUHRyLmxvYWQoKSAmIGtHZW5lcmFsUmluZ1RpbWVCb3VuZHNRdWV1ZU1hc2s7CiAgICAg
cmV0dXJuIG1fdGltZUJvdW5kc1F1ZXVlW2luZGV4XS5tX3N0YXJ0RnJhbWU7CkBAIC0zNjgsNyAr
MzY4LDcgQEAgdWludDY0X3QgQ0FSaW5nQnVmZmVyOjpjdXJyZW50RW5kRnJhbWUoKSBjb25zdAog
ICAgIHJldHVybiBtX2J1ZmZlcnMtPmN1cnJlbnRFbmRGcmFtZSgpOwogfQogCi11aW50NjRfdCBD
QVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9yOjpjdXJyZW50RW5kRnJhbWUoKSBjb25zdAorU1VQUFJF
U1NfVFNBTiB1aW50NjRfdCBDQVJpbmdCdWZmZXJTdG9yYWdlVmVjdG9yOjpjdXJyZW50RW5kRnJh
bWUoKSBjb25zdAogewogICAgIHVpbnQzMl90IGluZGV4ID0gbV90aW1lQm91bmRzUXVldWVQdHIu
bG9hZCgpICYga0dlbmVyYWxSaW5nVGltZUJvdW5kc1F1ZXVlTWFzazsKICAgICByZXR1cm4gbV90
aW1lQm91bmRzUXVldWVbaW5kZXhdLm1fZW5kRnJhbWU7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>