Overview

High
Severity
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactUse after free in Media
DescriptionUse after free in Media
ComponentMedia
Bug ClassUAF
Tracker420150619
Fix commit5d1549a771f8 (chromium/src) +22/-23
CISA KEVNot listed
CreditedHuang Xilin of Ant Group Light-Year Security Lab
Disclosed2025-06-10

Changed Functions

FunctionChangeNotes
WebAudioSourceProviderImplTest
third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
modified
if
third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
modified

Files Changed

  • third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc
  • third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
From 5d1549a771f8a35b9c1e02df27013dc4e1d4ec30 Mon Sep 17 00:00:00 2001
From: Dale Curtis <[email protected]>
Date: Wed, 28 May 2025 08:20:20 -0700
Subject: [PATCH] Disable DelayStopForMediaElementSourceNode feature.

It's leading to some crashes that need to be fixed first.

R=mjwilson

Bug: 420150619
Change-Id: Ia0cee190bd08dda26f27d2e36fa42ff0b1da5438
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6594254
Commit-Queue: Michael Wilson <[email protected]>
Auto-Submit: Dale Curtis <[email protected]>
Reviewed-by: Michael Wilson <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1466488}
---

diff --git a/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc b/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc
index 6c7f782..4352b65 100644
--- a/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc
@@ -24,9 +24,10 @@
 
 namespace blink {
 
+// TODO(crbug.com/420150619): Re-enable this feature.
 BASE_FEATURE(kDelayStopForMediaElementSourceNode,
              "DelayStopForMediaElementSourceNode",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // TeeFilter is a RenderCallback implementation that allows for a client to get
 // a copy of the data being rendered by the |renderer_| on Render(). This class
diff --git a/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc b/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
index e64eb0d..26b5c20c 100644
--- a/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
+++ b/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
@@ -13,6 +13,7 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "media/base/audio_glitch_info.h"
 #include "media/base/audio_parameters.h"
@@ -36,6 +37,10 @@
 
 const float kTestVolume = 0.25;
 const int kTestSampleRate = 48000;
+
+// TODO(crbug.com/420150619): Re-enable this and make it a global feature.
+constexpr bool kDelayStopForMediaElementSourceNode = false;
+
 }  // namespace
 
 class WebAudioSourceProviderImplTest : public testing::Test,
@@ -79,12 +84,17 @@
     testing::Mock::VerifyAndClear(mock_sink_.get());
   }
 
-  void SetClient(WebAudioSourceProviderClient* client) {
+  void SetClient(WebAudioSourceProviderClient* client,
+                 bool expect_format = true) {
     testing::InSequence s;
 
     if (client) {
-      EXPECT_CALL(*mock_sink_, Stop()).Times(0);
-      EXPECT_CALL(*this, SetFormat(params_.channels(), params_.sample_rate()));
+      EXPECT_CALL(*mock_sink_, Stop())
+          .Times(kDelayStopForMediaElementSourceNode ? 0 : 1);
+      if (expect_format) {
+        EXPECT_CALL(*this,
+                    SetFormat(params_.channels(), params_.sample_rate()));
+      }
     }
     wasp_impl_->SetClient(client);
     base::RunLoop().RunUntilIdle();
@@ -134,12 +144,7 @@
   // setClient() with a nullptr client should do nothing if no client is set.
   wasp_impl_->SetClient(nullptr);
 
-  // `mock_sink_` should not be stopped during setClient(this).
-  if (mock_sink_)
-    EXPECT_CALL(*mock_sink_.get(), Stop()).Times(0);
-
-  wasp_impl_->SetClient(this);
-  base::RunLoop().RunUntilIdle();
+  SetClient(this, /*expect_format=*/false);
 
   wasp_impl_->SetClient(nullptr);
   base::RunLoop().RunUntilIdle();
@@ -172,7 +177,7 @@
 
   // Removing the client should cause WASP to revert to the underlying sink.
   SetClient(nullptr);
-  CallAllSinkMethodsAndVerify(true);
+  CallAllSinkMethodsAndVerify(kDelayStopForMediaElementSourceNode);
 }
 
 // Test tainting effects on Render().
@@ -365,9 +370,7 @@
   wasp_impl_->Initialize(params_, &fake_callback_);
   base::RunLoop().RunUntilIdle();
 
-  // `mock_sink_` should not be stopped during setClient(this).
-  if (mock_sink_)
-    EXPECT_CALL(*mock_sink_.get(), Stop()).Times(0);
+  SetClient(this, /*expect_format=*/false);
 
   // setClient() with the same client should do nothing.
   wasp_impl_->SetClient(this);
@@ -458,10 +461,7 @@
 
   // SetClient when called with a valid client should trigger the callback once.
   EXPECT_CALL(*this, OnClientSet()).Times(1);
-  EXPECT_CALL(*mock_sink_, Stop()).Times(0);
-  wasp_impl_->SetClient(this);
-  base::RunLoop().RunUntilIdle();
-  ::testing::Mock::VerifyAndClearExpectations(this);
+  SetClient(this, /*expect_format=*/false);
 
   // Future calls to set client should not trigger the callback.
   EXPECT_CALL(*this, OnClientSet()).Times(0);
@@ -485,13 +485,11 @@
   wasp_impl_->ConnectToDestinationReady();
 
   EXPECT_CALL(*this, OnClientSet()).Times(1);
-  EXPECT_CALL(*mock_sink_, Stop()).Times(0);
-  wasp_impl_->SetClient(this);
-  base::RunLoop().RunUntilIdle();
-  ::testing::Mock::VerifyAndClearExpectations(this);
+  SetClient(this, /*expect_format=*/false);
 
   // ConnectToDestinationReady after client calls sink stop()
-  EXPECT_CALL(*mock_sink_, Stop()).Times(1);
+  EXPECT_CALL(*mock_sink_, Stop())
+      .Times(kDelayStopForMediaElementSourceNode ? 1 : 0);
   wasp_impl_->ConnectToDestinationReady();
   base::RunLoop().RunUntilIdle();
 
Loading diff…

Regression Test / PoC

shipped with the fix
diff --git a/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc b/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
index e64eb0d..26b5c20c 100644
--- a/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
+++ b/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc
@@ -13,6 +13,7 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "media/base/audio_glitch_info.h"
 #include "media/base/audio_parameters.h"
@@ -36,6 +37,10 @@
 
 const float kTestVolume = 0.25;
 const int kTestSampleRate = 48000;
+
+// TODO(crbug.com/420150619): Re-enable this and make it a global feature.
+constexpr bool kDelayStopForMediaElementSourceNode = false;
+
 }  // namespace
 
 class WebAudioSourceProviderImplTest : public testing::Test,
@@ -79,12 +84,17 @@
     testing::Mock::VerifyAndClear(mock_sink_.get());
   }
 
-  void SetClient(WebAudioSourceProviderClient* client) {
+  void SetClient(WebAudioSourceProviderClient* client,
+                 bool expect_format = true) {
     testing::InSequence s;
 
     if (client) {
-      EXPECT_CALL(*mock_sink_, Stop()).Times(0);
-      EXPECT_CALL(*this, SetFormat(params_.channels(), params_.sample_rate()));
+      EXPECT_CALL(*mock_sink_, Stop())
+          .Times(kDelayStopForMediaElementSourceNode ? 0 : 1);
+      if (expect_format) {
+        EXPECT_CALL(*this,
+                    SetFormat(params_.channels(), params_.sample_rate()));
+      }
     }
     wasp_impl_->SetClient(client);
     base::RunLoop().RunUntilIdle();
@@ -134,12 +144,7 @@
   // setClient() with a nullptr client should do nothing if no client is set.
   wasp_impl_->SetClient(nullptr);
 
-  // `mock_sink_` should not be stopped during setClient(this).
-  if (mock_sink_)
-    EXPECT_CALL(*mock_sink_.get(), Stop()).Times(0);
-
-  wasp_impl_->SetClient(this);
-  base::RunLoop().RunUntilIdle();
+  SetClient(this, /*expect_format=*/false);
 
   wasp_impl_->SetClient(nullptr);
   base::RunLoop().RunUntilIdle();
@@ -172,7 +177,7 @@
 
   // Removing the client should cause WASP to revert to the underlying sink.
   SetClient(nullptr);
-  CallAllSinkMethodsAndVerify(true);
+  CallAllSinkMethodsAndVerify(kDelayStopForMediaElementSourceNode);
 }
 
 // Test tainting effects on Render().
@@ -365,9 +370,7 @@
   wasp_impl_->Initialize(params_, &fake_callback_);
   base::RunLoop().RunUntilIdle();
 
-  // `mock_sink_` should not be stopped during setClient(this).
-  if (mock_sink_)
-    EXPECT_CALL(*mock_sink_.get(), Stop()).Times(0);
+  SetClient(this, /*expect_format=*/false);
 
   // setClient() with the same client should do nothing.
   wasp_impl_->SetClient(this);
@@ -458,10 +461,7 @@
 
   // SetClient when called with a valid client should trigger the callback once.
   EXPECT_CALL(*this, OnClientSet()).Times(1);
-  EXPECT_CALL(*mock_sink_, Stop()).Times(0);
-  wasp_impl_->SetClient(this);
-  base::RunLoop().RunUntilIdle();
-  ::testing::Mock::VerifyAndClearExpectations(this);
+  SetClient(this, /*expect_format=*/false);
 
   // Future calls to set client should not trigger the callback.
   EXPECT_CALL(*this, OnClientSet()).Times(0);
@@ -485,13 +485,11 @@
   wasp_impl_->ConnectToDestinationReady();
 
   EXPECT_CALL(*this, OnClientSet()).Times(1);
-  EXPECT_CALL(*mock_sink_, Stop()).Times(0);
-  wasp_impl_->SetClient(this);
-  base::RunLoop().RunUntilIdle();
-  ::testing::Mock::VerifyAndClearExpectations(this);
+  SetClient(this, /*expect_format=*/false);
 
   // ConnectToDestinationReady after client calls sink stop()
-  EXPECT_CALL(*mock_sink_, Stop()).Times(1);
+  EXPECT_CALL(*mock_sink_, Stop())
+      .Times(kDelayStopForMediaElementSourceNode ? 1 : 0);
   wasp_impl_->ConnectToDestinationReady();
   base::RunLoop().RunUntilIdle();
Loading diff…

Original Bug Report

reported by [email protected]

Security: Race condition in AudioRendererImpl

Steps to reproduce the problem

  1. fetch asan-linux-release-1460407
  2. serve poc.html and big-buck-bunny_trailer.webm on port 8080
  3. ./chrome –autoplay-policy=no-user-gesture-required http://127.0.0.1:8080/poc.html

Since this is a race condition issue, the POC cannot guarantee stable triggering. You can try a few more times.

Problem Description

When the HTMLMediaElement loads a resource file, it creates a WebMediaPlayerImpl object in HTMLMediaElement::StartPlayerLoad, and subsequently calls WebMediaPlayerImpl::Load.

void HTMLMediaElement::StartPlayerLoad() {
  ...

  web_media_player_ =
      frame->Client()->CreateWebMediaPlayer(*this, source, this);

  ...

  auto load_timing = web_media_player_->Load(GetLoadType(), source, CorsMode(),
                                             is_cache_disabled);
  ...
}

In WebMediaPlayerImpl::Load, WebMediaPlayerImpl::StartPipeline is invoked to start the rendering pipeline. Then, RendererImplFactory::CreateRenderer is called to create an AudioRendererImpl object. The pointer to the AudioRendererImpl object is passed to RendererImpl.

std::unique_ptr<Renderer> RendererImplFactory::CreateRenderer(
    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
    const scoped_refptr<base::TaskRunner>& worker_task_runner,
    AudioRendererSink* audio_renderer_sink,
    VideoRendererSink* video_renderer_sink,
    RequestOverlayInfoCB request_overlay_info_cb,
    const gfx::ColorSpace& target_color_space) {
  DCHECK(audio_renderer_sink);

  std::unique_ptr<AudioRenderer> audio_renderer(new AudioRendererImpl(
      media_task_runner, audio_renderer_sink,
      // Unretained is safe here, because the RendererFactory is guaranteed to
      // outlive the RendererImpl. The RendererImpl is destroyed when WMPI
      // destructor calls pipeline_controller_.Stop() -> PipelineImpl::Stop() ->
      // RendererWrapper::Stop -> RendererWrapper::DestroyRenderer(). And the
      // RendererFactory is owned by WMPI and gets called after WMPI destructor
      // finishes.
      base::BindRepeating(&RendererImplFactory::CreateAudioDecoders,
                          base::Unretained(this), media_task_runner),
      media_log_, media_player_id_
#if BUILDFLAG(IS_ANDROID)
      ));
#else
      ,
      speech_recognition_client_.get()));
#endif
  
  ...
  
  return std::make_unique<RendererImpl>(
      media_task_runner, std::move(audio_renderer), std::move(video_renderer));
}

When the Iframe is destroyed, that is, after LocalDOMWindow::FrameDestroyed is called, it triggers the callback media::PipelineImpl::RendererWrapper::CompleteSuspend. In this callback, PipelineImpl::RendererWrapper::DestroyRenderer is called to release the previously allocated RendererImpl object, and the corresponding AudioRendererImpl is also released. PipelineImpl::RendererWrapper::DestroyRenderer is executed in the Media thread.

void PipelineImpl::RendererWrapper::DestroyRenderer() {
  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());

  // Destroy the renderer outside the lock scope to avoid holding the lock
  // while renderer is being destroyed (in case Renderer destructor is costly).
  std::unique_ptr<Renderer> renderer;
  {
    base::AutoLock auto_lock(shared_state_lock_);
    renderer.swap(shared_state_.renderer);
  }
}

At this time, the pointer to the AudioRendererImpl object is still being used in the AudioOutputDevice thread, causing a UAF issue.

int Render(base::TimeDelta delay,
            base::TimeTicks delay_timestamp,
            const media::AudioGlitchInfo& glitch_info,
            media::AudioBus* audio_bus) override {
  ...

  const int num_rendered_frames =
      renderer_->Render(delay, delay_timestamp, glitch_info, audio_bus);

  ...
}

Summary

Security: Race condition in AudioRendererImpl

Custom Questions

Type of crash:

tab

Crash state:

=================================================================
==1==ERROR: AddressSanitizer: heap-use-after-free on address 0x756ff4952e98 at pc 0x572c7929ef02 bp 0x72c4e73fced0 sp 0x72c4e73fcec8
READ of size 1 at 0x756ff4952e98 thread T3144 (AudioOutputDevi)
==1==WARNING: invalid path to external symbolizer!
==1==WARNING: Failed to use and restart external symbolizer!
    #0 0x572c7929ef01 in base::internal::(anonymous namespace)::CrashImmediatelyOnUseAfterFree(unsigned long) _asan_rtl_:17
    #1 0x572c7929ea85 in base::internal::(anonymous namespace)::SafelyUnwrapForDereference(unsigned long) _asan_rtl_:5
    #2 0x572c88865663 in SafelyUnwrapPtrForDereference<media::AudioRendererSink::RenderCallback> ./../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h:84:9
    #3 0x572c88865663 in GetForDereference ./../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h:996:12
    #4 0x572c88865663 in operator-> ./../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h:665:12
    #5 0x572c88865663 in blink::WebAudioSourceProviderImpl::TeeFilter::Render(base::TimeDelta, base::TimeTicks, media::AudioGlitchInfo const&, media::AudioBus*) ./../../third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc:62:9
    #6 0x572c8d80d4af in blink::AudioRendererMixerInput::ProvideInput(media::AudioBus*, unsigned int, media::AudioGlitchInfo const&) ./../../third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_input.cc:241:18
    #7 0x572c66603e51 in media::AudioConverter::SourceCallback(int, media::AudioBus*) ./../../media/base/audio_converter.cc:224:33
    #8 0x572c66603537 in media::AudioConverter::ProvideInput(int, media::AudioBus*) ./../../media/base/audio_converter.cc:266:5
    #9 0x572c66606046 in Invoke<void (AudioConverter::*)(int, media::AudioBus *), media::AudioConverter *, int, media::AudioBus *> ./../../base/functional/bind_internal.h:731:12
    #10 0x572c66606046 in MakeItSo<void (AudioConverter::*const &)(int, media::AudioBus *), const std::__Cr::tuple<base::internal::UnretainedWrapper<media::AudioConverter, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0> > &, int, media::AudioBus *> ./../../base/functional/bind_internal.h:923:12
    #11 0x572c66606046 in RunImpl<void (AudioConverter::*const &)(int, media::AudioBus *), const std::__Cr::tuple<base::internal::UnretainedWrapper<media::AudioConverter, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0> > &, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #12 0x572c66606046 in base::internal::Invoker<base::internal::FunctorTraits<void (media::AudioConverter::* const&)(int, media::AudioBus*), media::AudioConverter*>, base::internal::BindState<true, true, false, void (media::AudioConverter::*)(int, media::AudioBus*), base::internal::UnretainedWrapper<media::AudioConverter, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>>, void (int, media::AudioBus*)>::Run(base::internal::BindStateBase*, int, media::AudioBus*) ./../../base/functional/bind_internal.h:980:12
    #13 0x572c66619950 in base::RepeatingCallback<void (int, media::AudioBus*)>::Run(int, media::AudioBus*) const & ./../../base/functional/callback.h:344:12
    #14 0x572c6669cf0c in media::MultiChannelResampler::ProvideInput(int, int, float*) ./../../media/base/multi_channel_resampler.cc:105:14
    #15 0x572c6669e3cd in Invoke<void (MultiChannelResampler::*)(int, int, float *), media::MultiChannelResampler *, const int &, int, float *> ./../../base/functional/bind_internal.h:731:12
    #16 0x572c6669e3cd in MakeItSo<void (MultiChannelResampler::*const &)(int, int, float *), const std::__Cr::tuple<base::internal::UnretainedWrapper<media::MultiChannelResampler, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>, int> &, int, float *> ./../../base/functional/bind_internal.h:923:12
    #17 0x572c6669e3cd in RunImpl<void (MultiChannelResampler::*const &)(int, int, float *), const std::__Cr::tuple<base::internal::UnretainedWrapper<media::MultiChannelResampler, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>, int> &, 0UL, 1UL> ./../../base/functional/bind_internal.h:1060:14
    #18 0x572c6669e3cd in base::internal::Invoker<base::internal::FunctorTraits<void (media::MultiChannelResampler::* const&)(int, int, float*), media::MultiChannelResampler*, int const&>, base::internal::BindState<true, true, false, void (media::MultiChannelResampler::*)(int, int, float*), base::internal::UnretainedWrapper<media::MultiChannelResampler, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>, int>, void (int, float*)>::Run(base::internal::BindStateBase*, int, float*) ./../../base/functional/bind_internal.h:980:12
    #19 0x572c666e73c0 in base::RepeatingCallback<void (int, float*)>::Run(int, float*) const & ./../../base/functional/callback.h:344:12
    #20 0x572c666e6ea2 in media::SincResampler::Resample(int, float*) ./../../media/base/sinc_resampler.cc:348:14
    #21 0x572c6669d4ba in media::MultiChannelResampler::Resample(int, media::AudioBus*) ./../../media/base/multi_channel_resampler.cc:59:21
    #22 0x572c66605b7a in media::AudioConverter::ConvertWithInfo(unsigned int, media::AudioGlitchInfo const&, media::AudioBus*) ./../../media/base/audio_converter.cc:160:19
    #23 0x572c6668269d in media::LoopbackAudioConverter::ProvideInput(media::AudioBus*, unsigned int, media::AudioGlitchInfo const&) ./../../media/base/loopback_audio_converter.cc:21:20
    #24 0x572c66603e51 in media::AudioConverter::SourceCallback(int, media::AudioBus*) ./../../media/base/audio_converter.cc:224:33
    #25 0x572c66605bf9 in media::AudioConverter::ConvertWithInfo(unsigned int, media::AudioGlitchInfo const&, media::AudioBus*) ./../../media/base/audio_converter.cc:157:5
    #26 0x572c8d8108fc in blink::AudioRendererMixer::Render(base::TimeDelta, base::TimeTicks, media::AudioGlitchInfo const&, media::AudioBus*) ./../../third_party/blink/renderer/modules/media/audio/audio_renderer_mixer.cc:155:24
    #27 0x572c66583d5b in media::AudioOutputDeviceThreadCallback::Process(unsigned int) ./../../media/audio/audio_output_device_thread_callback.cc:96:21
    #28 0x572c66554072 in media::AudioDeviceThread::ThreadMain() ./../../media/audio/audio_device_thread.cc:114:18
    #29 0x572c79531ede in base::(anonymous namespace)::ThreadFunc(void*) ./../../base/threading/platform_thread_posix.cc:103:13
    #30 0x572c6389b186 in asan_thread_start(void*) _asan_rtl_:28

0x756ff4952e98 is located 24 bytes inside of 552-byte region [0x756ff4952e80,0x756ff49530a8)
freed by thread T10 (Media) here:
    #0 0x572c638d7492 in operator delete(void*, unsigned long) _asan_rtl_:3
    #1 0x572c67c13a71 in operator() ./../../third_party/libc++/src/include/__memory/unique_ptr.h:76:5
    #2 0x572c67c13a71 in reset ./../../third_party/libc++/src/include/__memory/unique_ptr.h:287:7
    #3 0x572c67c13a71 in media::RendererImpl::~RendererImpl() ./../../media/renderers/renderer_impl.cc:128:19
    #4 0x572c67c14ab3 in media::RendererImpl::~RendererImpl() ./../../media/renderers/renderer_impl.cc:116:31
    #5 0x572c666ab313 in operator() ./../../third_party/libc++/src/include/__memory/unique_ptr.h:76:5
    #6 0x572c666ab313 in reset ./../../third_party/libc++/src/include/__memory/unique_ptr.h:287:7
    #7 0x572c666ab313 in ~unique_ptr ./../../third_party/libc++/src/include/__memory/unique_ptr.h:256:71
    #8 0x572c666ab313 in DestroyRenderer ./../../media/base/pipeline_impl.cc:1191:1
    #9 0x572c666ab313 in media::PipelineImpl::RendererWrapper::CompleteSuspend(media::TypedStatus<media::PipelineStatusTraits>) ./../../media/base/pipeline_impl.cc:1083:3
    #10 0x572c666bd754 in void base::internal::DecayedFunctorTraits<void (media::PipelineImpl::RendererWrapper::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::PipelineImpl::RendererWrapper>&&>::Invoke<void (media::PipelineImpl::RendererWrapper::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::PipelineImpl::RendererWrapper> const&, media::TypedStatus<media::PipelineStatusTraits>>(void (media::PipelineImpl::RendererWrapper::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::PipelineImpl::RendererWrapper> const&, media::TypedStatus<media::PipelineStatusTraits>&&) ./../../base/functional/bind_internal.h:731:12
    #11 0x572c666bd4f4 in MakeItSo<void (RendererWrapper::*)(media::TypedStatus<media::PipelineStatusTraits>), std::__Cr::tuple<base::WeakPtr<media::PipelineImpl::RendererWrapper> >, media::TypedStatus<media::PipelineStatusTraits> > ./../../base/functional/bind_internal.h:947:5
    #12 0x572c666bd4f4 in RunImpl<void (RendererWrapper::*)(media::TypedStatus<media::PipelineStatusTraits>), std::__Cr::tuple<base::WeakPtr<media::PipelineImpl::RendererWrapper> >, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #13 0x572c666bd4f4 in base::internal::Invoker<base::internal::FunctorTraits<void (media::PipelineImpl::RendererWrapper::*&&)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::PipelineImpl::RendererWrapper>&&>, base::internal::BindState<true, true, false, void (media::PipelineImpl::RendererWrapper::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::PipelineImpl::RendererWrapper>>, void (media::TypedStatus<media::PipelineStatusTraits>)>::RunOnce(base::internal::BindStateBase*, media::TypedStatus<media::PipelineStatusTraits>&&) ./../../base/functional/bind_internal.h:973:12
    #14 0x572c666d6403 in Run ./../../base/functional/callback.h:156:12
    #15 0x572c666d6403 in media::SerialRunner::RunNextInSeries(media::TypedStatus<media::PipelineStatusTraits>) ./../../media/base/serial_runner.cc:100:25
    #16 0x572c666d7fb2 in void base::internal::DecayedFunctorTraits<void (media::SerialRunner::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::SerialRunner>&&, media::PipelineStatusCodes&&>::Invoke<void (media::SerialRunner::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::SerialRunner> const&, media::PipelineStatusCodes>(void (media::SerialRunner::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::SerialRunner> const&, media::PipelineStatusCodes&&) ./../../base/functional/bind_internal.h:731:12
    #17 0x572c666d7d4c in MakeItSo<void (SerialRunner::*)(media::TypedStatus<media::PipelineStatusTraits>), std::__Cr::tuple<base::WeakPtr<media::SerialRunner>, media::PipelineStatusCodes> > ./../../base/functional/bind_internal.h:947:5
    #18 0x572c666d7d4c in RunImpl<void (SerialRunner::*)(media::TypedStatus<media::PipelineStatusTraits>), std::__Cr::tuple<base::WeakPtr<media::SerialRunner>, media::PipelineStatusCodes>, 0UL, 1UL> ./../../base/functional/bind_internal.h:1060:14
    #19 0x572c666d7d4c in base::internal::Invoker<base::internal::FunctorTraits<void (media::SerialRunner::*&&)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::SerialRunner>&&, media::PipelineStatusCodes&&>, base::internal::BindState<true, true, false, void (media::SerialRunner::*)(media::TypedStatus<media::PipelineStatusTraits>), base::WeakPtr<media::SerialRunner>, media::PipelineStatusCodes>, void ()>::RunOnce(base::internal::BindStateBase*) ./../../base/functional/bind_internal.h:973:12
    #20 0x572c793e2086 in Run ./../../base/functional/callback.h:156:12
    #21 0x572c793e2086 in base::TaskAnnotator::RunTaskImpl(base::PendingTask&) ./../../base/task/common/task_annotator.cc:209:34
    #22 0x572c79454b77 in RunTask<(lambda at ../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:458:11)> ./../../base/task/common/task_annotator.h:106:5
    #23 0x572c79454b77 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::LazyNow*) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:456:23
    #24 0x572c79453a5c in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:330:40
    #25 0x572c7945566a in non-virtual thunk to base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:0:0
    #26 0x572c792aae63 in base::MessagePumpDefault::Run(base::MessagePump::Delegate*) ./../../base/message_loop/message_pump_default.cc:42:55
    #27 0x572c79456224 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool, base::TimeDelta) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:629:12
    #28 0x572c79364e0f in base::RunLoop::Run(base::Location const&) ./../../base/run_loop.cc:134:14
    #29 0x572c794d9ffc in base::Thread::Run(base::RunLoop*) ./../../base/threading/thread.cc:344:13
    #30 0x572c794da591 in base::Thread::ThreadMain() ./../../base/threading/thread.cc:419:3
    #31 0x572c79531ede in base::(anonymous namespace)::ThreadFunc(void*) ./../../base/threading/platform_thread_posix.cc:103:13
    #32 0x572c6389b186 in asan_thread_start(void*) _asan_rtl_:28

previously allocated by thread T0 (chrome) here:
    #0 0x572c638d682d in operator new(unsigned long) _asan_rtl_:3
    #1 0x572c67c28763 in media::RendererImplFactory::CreateRenderer(scoped_refptr<base::SequencedTaskRunner> const&, scoped_refptr<base::TaskRunner> const&, media::AudioRendererSink*, media::VideoRendererSink*, base::RepeatingCallback<void (bool, base::RepeatingCallback<void (media::OverlayInfo const&)>)>, gfx::ColorSpace const&) ./../../media/renderers/renderer_impl_factory.cc:89:49
    #2 0x572c8e32e7d9 in blink::WebMediaPlayerImpl::CreateRenderer(std::__Cr::optional<media::RendererType>) ./../../third_party/blink/renderer/platform/media/web_media_player_impl.cc:2999:59
    #3 0x572c8e35e110 in Invoke<std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer> > (WebMediaPlayerImpl::*)(std::__Cr::optional<media::RendererType>), blink::WebMediaPlayerImpl *, std::__Cr::optional<media::RendererType> > ./../../base/functional/bind_internal.h:731:12
    #4 0x572c8e35e110 in MakeItSo<std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer> > (WebMediaPlayerImpl::*const &)(std::__Cr::optional<media::RendererType>), const std::__Cr::tuple<WTF::UnretainedWrapper<blink::WebMediaPlayerImpl> > &, std::__Cr::optional<media::RendererType> > ./../../base/functional/bind_internal.h:923:12
    #5 0x572c8e35e110 in RunImpl<std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer> > (WebMediaPlayerImpl::*const &)(std::__Cr::optional<media::RendererType>), const std::__Cr::tuple<WTF::UnretainedWrapper<blink::WebMediaPlayerImpl> > &, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #6 0x572c8e35e110 in base::internal::Invoker<base::internal::FunctorTraits<std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer>> (blink::WebMediaPlayerImpl::* const&)(std::__Cr::optional<media::RendererType>), blink::WebMediaPlayerImpl*>, base::internal::BindState<true, true, false, std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer>> (blink::WebMediaPlayerImpl::*)(std::__Cr::optional<media::RendererType>), WTF::UnretainedWrapper<blink::WebMediaPlayerImpl>>, std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer>> (std::__Cr::optional<media::RendererType>)>::Run(base::internal::BindStateBase*, std::__Cr::optional<media::RendererType>&&) ./../../base/functional/bind_internal.h:980:12
    #7 0x572c666b870d in base::RepeatingCallback<std::__Cr::unique_ptr<media::Renderer, std::__Cr::default_delete<media::Renderer>> (std::__Cr::optional<media::RendererType>)>::Run(std::__Cr::optional<media::RendererType>) const & ./../../base/functional/callback.h:344:12
    #8 0x572c666b810e in media::PipelineImpl::Start(media::Pipeline::StartType, media::Demuxer*, media::Pipeline::Client*, base::OnceCallback<void (media::TypedStatus<media::PipelineStatusTraits>)>) ./../../media/base/pipeline_impl.cc:1310:44
    #9 0x572c67a7dce1 in media::PipelineController::Start(media::Pipeline::StartType, media::Demuxer*, media::Pipeline::Client*, bool, bool) ./../../media/filters/pipeline_controller.cc:56:14
    #10 0x572c8e354c30 in blink::WebMediaPlayerImpl::OnDemuxerCreated(media::Demuxer*, media::Pipeline::StartType, bool, bool) ./../../third_party/blink/renderer/platform/media/web_media_player_impl.cc:3027:25
    #11 0x572c8e365a65 in Invoke<media::TypedStatus<media::PipelineStatusTraits> (WebMediaPlayerImpl::*)(media::Demuxer *, media::Pipeline::StartType, bool, bool), blink::WebMediaPlayerImpl *, media::Demuxer *, media::Pipeline::StartType, bool, bool> ./../../base/functional/bind_internal.h:731:12
    #12 0x572c8e365a65 in MakeItSo<media::TypedStatus<media::PipelineStatusTraits> (WebMediaPlayerImpl::*)(media::Demuxer *, media::Pipeline::StartType, bool, bool), std::__Cr::tuple<WTF::UnretainedWrapper<blink::WebMediaPlayerImpl> >, media::Demuxer *, media::Pipeline::StartType, bool, bool> ./../../base/functional/bind_internal.h:923:12
    #13 0x572c8e365a65 in RunImpl<media::TypedStatus<media::PipelineStatusTraits> (WebMediaPlayerImpl::*)(media::Demuxer *, media::Pipeline::StartType, bool, bool), std::__Cr::tuple<WTF::UnretainedWrapper<blink::WebMediaPlayerImpl> >, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #14 0x572c8e365a65 in base::internal::Invoker<base::internal::FunctorTraits<media::TypedStatus<media::PipelineStatusTraits> (blink::WebMediaPlayerImpl::*&&)(media::Demuxer*, media::Pipeline::StartType, bool, bool), blink::WebMediaPlayerImpl*>, base::internal::BindState<true, true, false, media::TypedStatus<media::PipelineStatusTraits> (blink::WebMediaPlayerImpl::*)(media::Demuxer*, media::Pipeline::StartType, bool, bool), WTF::UnretainedWrapper<blink::WebMediaPlayerImpl>>, media::TypedStatus<media::PipelineStatusTraits> (media::Demuxer*, media::Pipeline::StartType, bool, bool)>::RunOnce(base::internal::BindStateBase*, media::Demuxer*, media::Pipeline::StartType, bool, bool) ./../../base/functional/bind_internal.h:973:12
    #15 0x572c67a5f442 in Run ./../../base/functional/callback.h:156:12
    #16 0x572c67a5f442 in media::DemuxerManager::CreateDemuxer(bool, media::DataSource::Preload, bool, base::OnceCallback<media::TypedStatus<media::PipelineStatusTraits> (media::Demuxer*, media::Pipeline::StartType, bool, bool)>, base::flat_map<std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>>, std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>>, std::__Cr::less<void>, std::__Cr::vector<std::__Cr::pair<std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>>, std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>>>, std::__Cr::allocator<std::__Cr::pair<std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>>, std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>>>>>>) ./../../media/filters/demuxer_manager.cc:368:10
    #17 0x572c8e33b96e in blink::WebMediaPlayerImpl::StartPipeline() ./../../third_party/blink/renderer/platform/media/web_media_player_impl.cc:3054:49
    #18 0x572c8e354851 in blink::WebMediaPlayerImpl::DataSourceInitialized(bool) ./../../third_party/blink/renderer/platform/media/web_media_player_impl.cc:2846:3
    #19 0x572c8e33c400 in blink::WebMediaPlayerImpl::MultiBufferDataSourceInitialized(bool) ./../../third_party/blink/renderer/platform/media/web_media_player_impl.cc:2860:3
    #20 0x572c8e361cb9 in Invoke<void (WebMediaPlayerImpl::*)(bool), const base::WeakPtr<blink::WebMediaPlayerImpl> &, bool> ./../../base/functional/bind_internal.h:731:12
    #21 0x572c8e361cb9 in MakeItSo<void (WebMediaPlayerImpl::*)(bool), std::__Cr::tuple<base::WeakPtr<blink::WebMediaPlayerImpl> >, bool> ./../../base/functional/bind_internal.h:947:5
    #22 0x572c8e361cb9 in RunImpl<void (WebMediaPlayerImpl::*)(bool), std::__Cr::tuple<base::WeakPtr<blink::WebMediaPlayerImpl> >, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #23 0x572c8e361cb9 in base::internal::Invoker<base::internal::FunctorTraits<void (blink::WebMediaPlayerImpl::*&&)(bool), base::WeakPtr<blink::WebMediaPlayerImpl>&&>, base::internal::BindState<true, true, false, void (blink::WebMediaPlayerImpl::*)(bool), base::WeakPtr<blink::WebMediaPlayerImpl>>, void (bool)>::RunOnce(base::internal::BindStateBase*, bool) ./../../base/functional/bind_internal.h:973:12
    #24 0x572c640290cb in Run ./../../base/functional/callback.h:156:12
    #25 0x572c640290cb in Invoke<base::OnceCallback<void (bool)>, bool> ./../../base/functional/bind_internal.h:806:49
    #26 0x572c640290cb in MakeItSo<base::OnceCallback<void (bool)>, std::__Cr::tuple<bool> > ./../../base/functional/bind_internal.h:923:12
    #27 0x572c640290cb in RunImpl<base::OnceCallback<void (bool)>, std::__Cr::tuple<bool>, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #28 0x572c640290cb in base::internal::Invoker<base::internal::FunctorTraits<base::OnceCallback<void (bool)>&&, bool&&>, base::internal::BindState<false, true, true, base::OnceCallback<void (bool)>, bool>, void ()>::RunOnce(base::internal::BindStateBase*) ./../../base/functional/bind_internal.h:973:12
    #29 0x572c793e2086 in Run ./../../base/functional/callback.h:156:12
    #30 0x572c793e2086 in base::TaskAnnotator::RunTaskImpl(base::PendingTask&) ./../../base/task/common/task_annotator.cc:209:34
    #31 0x572c79454b77 in RunTask<(lambda at ../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:458:11)> ./../../base/task/common/task_annotator.h:106:5
    #32 0x572c79454b77 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::LazyNow*) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:456:23
    #33 0x572c79453a5c in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:330:40
    #34 0x572c7945566a in non-virtual thunk to base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:0:0
    #35 0x572c792aae63 in base::MessagePumpDefault::Run(base::MessagePump::Delegate*) ./../../base/message_loop/message_pump_default.cc:42:55
    #36 0x572c79456224 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool, base::TimeDelta) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:629:12
    #37 0x572c79364e0f in base::RunLoop::Run(base::Location const&) ./../../base/run_loop.cc:134:14
    #38 0x572c844d2d05 in content::RendererMain(content::MainFunctionParams) ./../../content/renderer/renderer_main.cc:356:16
    #39 0x572c760a7adc in content::RunZygote(content::ContentMainDelegate*) ./../../content/app/content_main_runner_impl.cc:699:14
    #40 0x572c760a8aac in content::RunOtherNamedProcessTypeMain(std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>> const&, content::MainFunctionParams, content::ContentMainDelegate*) ./../../content/app/content_main_runner_impl.cc:803:12
    #41 0x572c760ab461 in content::ContentMainRunnerImpl::Run() ./../../content/app/content_main_runner_impl.cc:1183:10
    #42 0x572c760a5819 in content::RunContentProcess(content::ContentMainParams, content::ContentMainRunner*) ./../../content/app/content_main.cc:374:36
    #43 0x572c760a5d3b in content::ContentMain(content::ContentMainParams) ./../../content/app/content_main.cc:387:10
    #44 0x572c638d8157 in ChromeMain ./../../chrome/app/chrome_main.cc:222:12
    #45 0x780ff5a29d8f in errx ??:?

Thread T3144 (AudioOutputDevi) created by T4 (Chrome_ChildIOT) here:
    #0 0x572c63881891 in ___interceptor_pthread_create _asan_rtl_:3
    #1 0x572c795314c8 in base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThreadBase::Delegate*, base::PlatformThreadHandle*, base::ThreadType, base::MessagePumpType) ./../../base/threading/platform_thread_posix.cc:151:13
    #2 0x572c665538b7 in media::AudioDeviceThread::AudioDeviceThread(media::AudioDeviceThread::Callback*, base::ScopedGeneric<int, base::internal::ScopedFDCloseTraits>, char const*, base::ThreadType) ./../../media/audio/audio_device_thread.cc:66:3
    #3 0x572c6657d368 in std::__Cr::unique_ptr<media::AudioDeviceThread, std::__Cr::default_delete<media::AudioDeviceThread>> std::__Cr::make_unique<media::AudioDeviceThread, media::AudioOutputDeviceThreadCallback*, base::ScopedGeneric<int, base::internal::ScopedFDCloseTraits>, char const (&) [18], base::ThreadType, 0>(media::AudioOutputDeviceThreadCallback*&&, base::ScopedGeneric<int, base::internal::ScopedFDCloseTraits>&&, char const (&) [18], base::ThreadType&&) ./../../third_party/libc++/src/include/__memory/unique_ptr.h:754:30
    #4 0x572c6657cf61 in media::AudioOutputDevice::OnStreamCreated(base::UnsafeSharedMemoryRegion, base::ScopedGeneric<int, base::internal::ScopedFDCloseTraits>, bool) ./../../media/audio/audio_output_device.cc:430:21
    #5 0x572c8d82569d in blink::MojoAudioOutputIPC::Created(mojo::PendingRemote<media::mojom::blink::AudioOutputStream>, mojo::StructPtr<media::mojom::blink::ReadWriteAudioDataPipe>) ./../../third_party/blink/renderer/modules/media/audio/mojo_audio_output_ipc.cc:243:14
    #6 0x572c72f96264 in media::mojom::blink::AudioOutputStreamProviderClientStubDispatch::Accept(media::mojom::blink::AudioOutputStreamProviderClient*, mojo::Message*) ./gen/media/mojo/mojom/audio_output_stream.mojom-blink.cc:1156:13
    #7 0x572c791bd6ef in mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message*) ./../../mojo/public/cpp/bindings/lib/interface_endpoint_client.cc:1059:54
    #8 0x572c791db13a in mojo::MessageDispatcher::Accept(mojo::Message*) ./../../mojo/public/cpp/bindings/lib/message_dispatcher.cc:43:19
    #9 0x572c791c3434 in mojo::InterfaceEndpointClient::HandleIncomingMessage(mojo::Message*) ./../../mojo/public/cpp/bindings/lib/interface_endpoint_client.cc:731:20
    #10 0x572c791eaf5a in mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper*, mojo::internal::MultiplexRouter::ClientCallBehavior, base::SequencedTaskRunner*) ./../../mojo/public/cpp/bindings/lib/multiplex_router.cc:1120:42
    #11 0x572c791e9466 in mojo::internal::MultiplexRouter::Accept(mojo::Message*) ./../../mojo/public/cpp/bindings/lib/multiplex_router.cc:733:7
    #12 0x572c791db13a in mojo::MessageDispatcher::Accept(mojo::Message*) ./../../mojo/public/cpp/bindings/lib/message_dispatcher.cc:43:19
    #13 0x572c791b4858 in mojo::Connector::DispatchMessage(mojo::ScopedHandleBase<mojo::MessageHandle>) ./../../mojo/public/cpp/bindings/lib/connector.cc:561:49
    #14 0x572c791b5fd0 in mojo::Connector::ReadAllAvailableMessages() ./../../mojo/public/cpp/bindings/lib/connector.cc:619:14
    #15 0x572c791b59f9 in OnHandleReadyInternal ./../../mojo/public/cpp/bindings/lib/connector.cc:450:3
    #16 0x572c791b59f9 in mojo::Connector::OnWatcherHandleReady(char const*, unsigned int) ./../../mojo/public/cpp/bindings/lib/connector.cc:416:3
    #17 0x572c791b787a in Invoke<void (Connector::*)(const char *, unsigned int), mojo::Connector *, const char *, unsigned int> ./../../base/functional/bind_internal.h:731:12
    #18 0x572c791b787a in MakeItSo<void (Connector::*const &)(const char *, unsigned int), const std::__Cr::tuple<base::internal::UnretainedWrapper<mojo::Connector, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>, base::internal::UnretainedWrapper<const char, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0> > &, unsigned int> ./../../base/functional/bind_internal.h:923:12
    #19 0x572c791b787a in RunImpl<void (Connector::*const &)(const char *, unsigned int), const std::__Cr::tuple<base::internal::UnretainedWrapper<mojo::Connector, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>, base::internal::UnretainedWrapper<const char, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0> > &, 0UL, 1UL> ./../../base/functional/bind_internal.h:1060:14
    #20 0x572c791b787a in base::internal::Invoker<base::internal::FunctorTraits<void (mojo::Connector::* const&)(char const*, unsigned int), mojo::Connector*, char const* const&>, base::internal::BindState<true, true, false, void (mojo::Connector::*)(char const*, unsigned int), base::internal::UnretainedWrapper<mojo::Connector, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>, base::internal::UnretainedWrapper<char const, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>>, void (unsigned int)>::Run(base::internal::BindStateBase*, unsigned int) ./../../base/functional/bind_internal.h:980:12
    #21 0x572c68b1648e in base::RepeatingCallback<void (unsigned int)>::Run(unsigned int) const & ./../../base/functional/callback.h:344:12
    #22 0x572c68b1621f in Invoke<void (*const &)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &), const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &> ./../../base/functional/bind_internal.h:664:12
    #23 0x572c68b1621f in MakeItSo<void (*const &)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &), const std::__Cr::tuple<base::RepeatingCallback<void (unsigned int)> > &, unsigned int, const mojo::HandleSignalsState &> ./../../base/functional/bind_internal.h:923:12
    #24 0x572c68b1621f in RunImpl<void (*const &)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &), const std::__Cr::tuple<base::RepeatingCallback<void (unsigned int)> > &, 0UL> ./../../base/functional/bind_internal.h:1060:14
    #25 0x572c68b1621f in base::internal::Invoker<base::internal::FunctorTraits<void (* const&)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)> const&>, base::internal::BindState<false, true, false, void (*)(base::RepeatingCallback<void (unsigned int)> const&, unsigned int, mojo::HandleSignalsState const&), base::RepeatingCallback<void (unsigned int)>>, void (unsigned int, mojo::HandleSignalsState const&)>::Run(base::internal::BindStateBase*, unsigned int, mojo::HandleSignalsState const&) ./../../base/functional/bind_internal.h:980:12
    #26 0x572c79f2c560 in base::RepeatingCallback<void (unsigned int, mojo::HandleSignalsState const&)>::Run(unsigned int, mojo::HandleSignalsState const&) const & ./../../base/functional/callback.h:344:12
    #27 0x572c79f2be98 in mojo::SimpleWatcher::OnHandleReady(int, unsigned int, mojo::HandleSignalsState const&) ./../../mojo/public/cpp/system/simple_watcher.cc:278:14
    #28 0x572c79f2c946 in mojo::SimpleWatcher::Context::Notify(unsigned int, MojoHandleSignalsState, unsigned int) ./../../mojo/public/cpp/system/simple_watcher.cc:96:22
    #29 0x572c79f291e5 in mojo::SimpleWatcher::Context::CallNotify(MojoTrapEvent const*) ./../../mojo/public/cpp/system/simple_watcher.cc:61:14
    #30 0x572c63ec781d in DispatchEvent ./../../mojo/core/ipcz_driver/mojo_trap.cc:612:3
    #31 0x572c63ec781d in mojo::core::ipcz_driver::MojoTrap::DispatchOrQueueEvent(mojo::core::ipcz_driver::MojoTrap::Trigger&, MojoTrapEvent const&) ./../../mojo/core/ipcz_driver/mojo_trap.cc:584:5
    #32 0x572c63eca17a in mojo::core::ipcz_driver::MojoTrap::HandleEvent(IpczTrapEvent const&) ./../../mojo/core/ipcz_driver/mojo_trap.cc:466:3
    #33 0x572c64434e81 in DispatchAll ./../../third_party/ipcz/src/ipcz/trap_event_dispatcher.cc:30:5
    #34 0x572c64434e81 in ipcz::TrapEventDispatcher::~TrapEventDispatcher() ./../../third_party/ipcz/src/ipcz/trap_event_dispatcher.cc:12:3
    #35 0x572c64417621 in ipcz::Router::AcceptInboundParcel(std::__Cr::unique_ptr<ipcz::Parcel, std::__Cr::default_delete<ipcz::Parcel>>) ./../../third_party/ipcz/src/ipcz/router.cc:274:1
    #36 0x572c643e5c45 in ipcz::NodeLink::AcceptCompleteParcel(ipcz::StrongAlias<ipcz::SublinkIdTag, unsigned long>, std::__Cr::unique_ptr<ipcz::Parcel, std::__Cr::default_delete<ipcz::Parcel>>) ./../../third_party/ipcz/src/ipcz/node_link.cc:1051:31
    #37 0x572c643e47bb in ipcz::NodeLink::OnAcceptParcel(ipcz::msg::AcceptParcel&) ./../../third_party/ipcz/src/ipcz/node_link.cc:642:10
    #38 0x572c64404939 in ipcz::msg::NodeMessageListener::OnTransportMessage(ipcz::DriverTransport::RawMessage const&, ipcz::DriverTransport const&, unsigned long) ./../../third_party/ipcz/src/ipcz/node_messages_generator.h:357:1
    #39 0x572c643a80cc in Notify ./../../third_party/ipcz/src/ipcz/driver_transport.cc:129:20
    #40 0x572c643a80cc in ipcz::(anonymous namespace)::NotifyTransport(unsigned long, void const*, unsigned long, unsigned long const*, unsigned long, unsigned int, IpczTransportActivityOptions const*) ./../../third_party/ipcz/src/ipcz/driver_transport.cc:47:11
    #41 0x572c63ede75e in mojo::core::ipcz_driver::Transport::OnChannelMessage(void const*, unsigned long, std::__Cr::vector<mojo::PlatformHandle, std::__Cr::allocator<mojo::PlatformHandle>>, scoped_refptr<mojo::core::ipcz_driver::Envelope>) ./../../mojo/core/ipcz_driver/transport.cc:738:29
    #42 0x572c63e9cf3e in mojo::core::Channel::TryDispatchMessage(base::span<char const, 18446744073709551615ul, char const*>, std::__Cr::optional<std::__Cr::vector<mojo::PlatformHandle, std::__Cr::allocator<mojo::PlatformHandle>>>, scoped_refptr<mojo::core::ipcz_driver::Envelope>, unsigned long*) ./../../mojo/core/channel.cc:1056:16
    #43 0x572c63e9b4b7 in TryDispatchMessage ./../../mojo/core/channel.cc:1000:10
    #44 0x572c63e9b4b7 in mojo::core::Channel::OnReadComplete(unsigned long, unsigned long*) ./../../mojo/core/channel.cc:977:9
    #45 0x572c63eea2df in mojo::core::ChannelPosix::OnFdReadable(int) ./../../mojo/core/channel_posix.cc:307:12
    #46 0x572c795c0fb5 in OnFdReadable ./../../base/message_loop/message_pump_epoll.cc:764:13
    #47 0x572c795c0fb5 in base::MessagePumpEpoll::HandleEvent(int, bool, bool, base::MessagePumpEpoll::FdWatchController*) ./../../base/message_loop/message_pump_epoll.cc:672:17
    #48 0x572c795bff5a in base::MessagePumpEpoll::OnEpollEvent(base::MessagePumpEpoll::EpollEventEntry&, unsigned int) ./../../base/message_loop/message_pump_epoll.cc:618:7
    #49 0x572c795be276 in base::MessagePumpEpoll::WaitForEpollEvents(base::TimeDelta) ./../../base/message_loop/message_pump_epoll.cc:509:7
    #50 0x572c795bcdd9 in base::MessagePumpEpoll::Run(base::MessagePump::Delegate*) ./../../base/message_loop/message_pump_epoll.cc:288:5
    #51 0x572c79456224 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool, base::TimeDelta) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:629:12
    #52 0x572c79364e0f in base::RunLoop::Run(base::Location const&) ./../../base/run_loop.cc:134:14
    #53 0x572c794d9ffc in base::Thread::Run(base::RunLoop*) ./../../base/threading/thread.cc:344:13
    #54 0x572c842d4637 in content::(anonymous namespace)::ChildIOThread::Run(base::RunLoop*) ./../../content/child/child_process.cc:60:19
    #55 0x572c794da591 in base::Thread::ThreadMain() ./../../base/threading/thread.cc:419:3
    #56 0x572c79531ede in base::(anonymous namespace)::ThreadFunc(void*) ./../../base/threading/platform_thread_posix.cc:103:13
    #57 0x572c6389b186 in asan_thread_start(void*) _asan_rtl_:28

Thread T4 (Chrome_ChildIOT) created by T0 (chrome) here:
    #0 0x572c63881891 in ___interceptor_pthread_create _asan_rtl_:3
    #1 0x572c795314c8 in base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThreadBase::Delegate*, base::PlatformThreadHandle*, base::ThreadType, base::MessagePumpType) ./../../base/threading/platform_thread_posix.cc:151:13
    #2 0x572c794d9303 in base::Thread::StartWithOptions(base::Thread::Options) ./../../base/threading/thread.cc:211:26
    #3 0x572c842d34a9 in content::ChildProcess::ChildProcess(base::ThreadType, std::__Cr::unique_ptr<base::ThreadPoolInstance::InitParams, std::__Cr::default_delete<base::ThreadPoolInstance::InitParams>>) ./../../content/child/child_process.cc:125:3
    #4 0x572c8444a7cb in content::RenderProcess::RenderProcess(std::__Cr::unique_ptr<base::ThreadPoolInstance::InitParams, std::__Cr::default_delete<base::ThreadPoolInstance::InitParams>>) ./../../content/renderer/render_process.cc:18:7
    #5 0x572c8444a055 in content::RenderProcessImpl::RenderProcessImpl() ./../../content/renderer/render_process_impl.cc:112:7
    #6 0x572c8444a5b0 in content::RenderProcessImpl::Create() ./../../content/renderer/render_process_impl.cc:231:31
    #7 0x572c844d27e9 in content::RendererMain(content::MainFunctionParams) ./../../content/renderer/renderer_main.cc:274:53
    #8 0x572c760a7adc in content::RunZygote(content::ContentMainDelegate*) ./../../content/app/content_main_runner_impl.cc:699:14
    #9 0x572c760a8aac in content::RunOtherNamedProcessTypeMain(std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>> const&, content::MainFunctionParams, content::ContentMainDelegate*) ./../../content/app/content_main_runner_impl.cc:803:12
    #10 0x572c760ab461 in content::ContentMainRunnerImpl::Run() ./../../content/app/content_main_runner_impl.cc:1183:10
    #11 0x572c760a5819 in content::RunContentProcess(content::ContentMainParams, content::ContentMainRunner*) ./../../content/app/content_main.cc:374:36
    #12 0x572c760a5d3b in content::ContentMain(content::ContentMainParams) ./../../content/app/content_main.cc:387:10
    #13 0x572c638d8157 in ChromeMain ./../../chrome/app/chrome_main.cc:222:12
    #14 0x780ff5a29d8f in errx ??:?

Thread T10 (Media) created by T0 (chrome) here:
    #0 0x572c63881891 in ___interceptor_pthread_create _asan_rtl_:3
    #1 0x572c795314c8 in base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThreadBase::Delegate*, base::PlatformThreadHandle*, base::ThreadType, base::MessagePumpType) ./../../base/threading/platform_thread_posix.cc:151:13
    #2 0x572c794d9303 in base::Thread::StartWithOptions(base::Thread::Options) ./../../base/threading/thread.cc:211:26
    #3 0x572c8445835a in content::RenderThreadImpl::GetMediaSequencedTaskRunner() ./../../content/renderer/render_thread_impl.cc:1698:20
    #4 0x572c843c8361 in content::MediaFactory::CreateMediaPlayer(blink::WebMediaPlayerSource const&, blink::WebMediaPlayerClient*, blink::MediaInspectorContext*, blink::WebMediaPlayerEncryptedMediaClient*, blink::WebContentDecryptionModule*, blink::WebString const&, viz::FrameSinkId, cc::LayerTreeSettings const&, scoped_refptr<base::SingleThreadTaskRunner>, scoped_refptr<base::TaskRunner>) ./../../content/renderer/media/media_factory.cc:465:22
    #5 0x572c843353e8 in content::RenderFrameImpl::CreateMediaPlayer(blink::WebMediaPlayerSource const&, blink::WebMediaPlayerClient*, blink::MediaInspectorContext*, blink::WebMediaPlayerEncryptedMediaClient*, blink::WebContentDecryptionModule*, blink::WebString const&, cc::LayerTreeSettings const*, scoped_refptr<base::TaskRunner>) ./../../content/renderer/render_frame_impl.cc:3546:25
    #6 0x572c8a0e412a in blink::ModulesInitializer::CreateWebMediaPlayer(blink::WebLocalFrameClient*, blink::HTMLMediaElement&, blink::WebMediaPlayerSource const&, blink::WebMediaPlayerClient*) const ./../../third_party/blink/renderer/modules/modules_initializer.cc:357:28
    #7 0x572c861a0196 in blink::HTMLMediaElement::StartPlayerLoad() ./../../third_party/blink/renderer/core/html/media/html_media_element.cc:1625:24
    #8 0x572c8619c4a3 in blink::HTMLMediaElement::LoadResource(blink::WebMediaPlayerSource const&, WTF::String const&) ./../../third_party/blink/renderer/core/html/media/html_media_element.cc:1480:7
    #9 0x572c8619833f in blink::HTMLMediaElement::LoadSourceFromAttribute() ./../../third_party/blink/renderer/core/html/media/html_media_element.cc:1342:3
    #10 0x572c86196a6b in blink::HTMLMediaElement::SelectMediaResource() ./../../third_party/blink/renderer/core/html/media/html_media_element.cc:1269:7
    #11 0x572c86192262 in blink::HTMLMediaElement::LoadInternal() ./../../third_party/blink/renderer/core/html/media/html_media_element.cc:1204:3
    #12 0x572c86187ec8 in blink::HTMLMediaElement::LoadTimerFired(blink::TimerBase*) ./../../third_party/blink/renderer/core/html/media/html_media_element.cc:930:7
    #13 0x572c888f96ad in blink::TimerBase::RunInternal() ./../../third_party/blink/renderer/platform/timer.cc:166:3
    #14 0x572c861d26c1 in Invoke<void (*)(blink::HeapTaskRunnerTimer<blink::HTMLMediaElement> *, blink::HTMLMediaElement *), blink::HeapTaskRunnerTimer<blink::HTMLMediaElement> *, cppgc::internal::BasicPersistent<blink::HTMLMediaElement, cppgc::internal::WeakPersistentPolicy, cppgc::internal::IgnoreLocationPolicy, cppgc::internal::DisabledCheckingPolicy> > ./../../base/functional/bind_internal.h:664:12
    #15 0x572c861d26c1 in MakeItSo<void (*)(blink::HeapTaskRunnerTimer<blink::HTMLMediaElement> *, blink::HTMLMediaElement *), std::__Cr::tuple<WTF::UnretainedWrapper<blink::HeapTaskRunnerTimer<blink::HTMLMediaElement> >, cppgc::internal::BasicPersistent<blink::HTMLMediaElement, cppgc::internal::WeakPersistentPolicy, cppgc::internal::IgnoreLocationPolicy, cppgc::internal::DisabledCheckingPolicy> > > ./../../base/functional/bind_internal.h:923:12
    #16 0x572c861d26c1 in RunImpl<void (*)(blink::HeapTaskRunnerTimer<blink::HTMLMediaElement> *, blink::HTMLMediaElement *), std::__Cr::tuple<WTF::UnretainedWrapper<blink::HeapTaskRunnerTimer<blink::HTMLMediaElement> >, cppgc::internal::BasicPersistent<blink::HTMLMediaElement, cppgc::internal::WeakPersistentPolicy, cppgc::internal::IgnoreLocationPolicy, cppgc::internal::DisabledCheckingPolicy> >, 0UL, 1UL> ./../../base/functional/bind_internal.h:1060:14
    #17 0x572c861d26c1 in base::internal::Invoker<base::internal::FunctorTraits<void (*&&)(blink::HeapTaskRunnerTimer<blink::HTMLMediaElement>*, blink::HTMLMediaElement*), blink::HeapTaskRunnerTimer<blink::HTMLMediaElement>*, cppgc::internal::BasicPersistent<blink::HTMLMediaElement, cppgc::internal::WeakPersistentPolicy, cppgc::internal::IgnoreLocationPolicy, cppgc::internal::DisabledCheckingPolicy>&&>, base::internal::BindState<false, true, false, void (*)(blink::HeapTaskRunnerTimer<blink::HTMLMediaElement>*, blink::HTMLMediaElement*), WTF::UnretainedWrapper<blink::HeapTaskRunnerTimer<blink::HTMLMediaElement>>, cppgc::internal::BasicPersistent<blink::HTMLMediaElement, cppgc::internal::WeakPersistentPolicy, cppgc::internal::IgnoreLocationPolicy, cppgc::internal::DisabledCheckingPolicy>>, void ()>::RunOnce(base::internal::BindStateBase*) ./../../base/functional/bind_internal.h:973:12
    #18 0x572c793e2086 in Run ./../../base/functional/callback.h:156:12
    #19 0x572c793e2086 in base::TaskAnnotator::RunTaskImpl(base::PendingTask&) ./../../base/task/common/task_annotator.cc:209:34
    #20 0x572c79454b77 in RunTask<(lambda at ../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:458:11)> ./../../base/task/common/task_annotator.h:106:5
    #21 0x572c79454b77 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::LazyNow*) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:456:23
    #22 0x572c79453a5c in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:330:40
    #23 0x572c7945566a in non-virtual thunk to base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:0:0
    #24 0x572c792aae63 in base::MessagePumpDefault::Run(base::MessagePump::Delegate*) ./../../base/message_loop/message_pump_default.cc:42:55
    #25 0x572c79456224 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool, base::TimeDelta) ./../../base/task/sequence_manager/thread_controller_with_message_pump_impl.cc:629:12
    #26 0x572c79364e0f in base::RunLoop::Run(base::Location const&) ./../../base/run_loop.cc:134:14
    #27 0x572c844d2d05 in content::RendererMain(content::MainFunctionParams) ./../../content/renderer/renderer_main.cc:356:16
    #28 0x572c760a7adc in content::RunZygote(content::ContentMainDelegate*) ./../../content/app/content_main_runner_impl.cc:699:14
    #29 0x572c760a8aac in content::RunOtherNamedProcessTypeMain(std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>> const&, content::MainFunctionParams, content::ContentMainDelegate*) ./../../content/app/content_main_runner_impl.cc:803:12
    #30 0x572c760ab461 in content::ContentMainRunnerImpl::Run() ./../../content/app/content_main_runner_impl.cc:1183:10
    #31 0x572c760a5819 in content::RunContentProcess(content::ContentMainParams, content::ContentMainRunner*) ./../../content/app/content_main.cc:374:36
    #32 0x572c760a5d3b in content::ContentMain(content::ContentMainParams) ./../../content/app/content_main.cc:387:10
    #33 0x572c638d8157 in ChromeMain ./../../chrome/app/chrome_main.cc:222:12
    #34 0x780ff5a29d8f in errx ??:?

SUMMARY: AddressSanitizer: heap-use-after-free (asan-linux-release-1460407/chrome+0x2550cf01) (BuildId: 07ee9f0d0206f4b6)
Shadow bytes around the buggy address:
  0x756ff4952c00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x756ff4952c80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x756ff4952d00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x756ff4952d80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x756ff4952e00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa f7 fa
=>0x756ff4952e80: fd fd fd[fd]fd fd fd fd fd fd fd fd fd fd fd fd
  0x756ff4952f00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x756ff4952f80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x756ff4953000: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x756ff4953080: fd fd fd fd fd fa fa fa fa fa fa fa fa fa fa fa
  0x756ff4953100: fa fa fa fa fa fa fa fa fa fa fa fa fa fa f7 fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb

==1==ADDITIONAL INFO

==1==Note: Please include this section with the ASan report.
Task trace:

Command line: `/proc/self/exe --type=renderer --crashpad-handler-pid=123756 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --autoplay-policy=no-user-gesture-required --file-url-path-alias=/gen=asan-linux-release-1460407/gen --ozone-platform=wayland --disable-gpu-compositing --lang=en-US --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=5 --time-ticks-at-unix-epoch=-1747394574300974 --launch-time-ticks=251374854937 --shared-files=v8_context_snapshot_data:100 --metrics-shmem-handle=4,i,14665207153857744594,12260671244325860807,2097152 --field-trial-handle=3,i,12642760950729403537,12599755197160342593,262144 --disable-features=EyeDropper --variations-seed-version`

MiraclePtr Status: MANUAL ANALYSIS REQUIRED
This crash occurred while a raw_ptr<T> object containing a dangling pointer was being dereferenced.
The "use" and "free" threads don't match. This crash is likely to have been caused by a race condition that is mislabeled as a use-after-free. Make sure that the "free" is sequenced after the "use" (e.g. both are on the same sequence, or the "free" is in a task posted after the "use"). Otherwise, the crash is still exploitable with MiraclePtr.
Refer to https://chromium.googlesource.com/chromium/src/+/main/base/memory/raw_ptr.md for details.

==1==END OF ADDITIONAL INFO
==1==ABORTING

Reporter credit:

Huang Xilin of Ant Group Light-Year Security Lab

Additional Data

Category: Security
Chrome Channel: Dev
Regression: N/A

View on issue tracker