diff --git a/chromecast/starboard/media/renderer/starboard_renderer.cc b/chromecast/starboard/media/renderer/starboard_renderer.cc index f456c8b6f26b4..5450bccd27d3c 100644 --- a/chromecast/starboard/media/renderer/starboard_renderer.cc +++ b/chromecast/starboard/media/renderer/starboard_renderer.cc @@ -61,11 +61,14 @@ void StarboardRenderer::Initialize(::media::MediaResource* media_resource, ::media::DemuxerStream* video_stream = media_resource->GetFirstStream(::media::DemuxerStream::Type::VIDEO); - player_manager_ = StarboardPlayerManager::Create( + // Create into a local first so a failed Create() does not destroy the + // existing player_manager_ (and the SbPlayer that + // geometry_change_handler_.sb_player_ still references). + auto new_player_manager = StarboardPlayerManager::Create( starboard_.get(), audio_stream, video_stream, client, cast_metrics_helper_, media_task_runner_, enable_buffering_); - if (!player_manager_) { + if (!new_player_manager) { LOG(ERROR) << "Unable to create StarboardPlayerManager"; media_task_runner_->PostTask( FROM_HERE, @@ -74,6 +77,10 @@ void StarboardRenderer::Initialize(::media::MediaResource* media_resource, return; } + player_manager_ = std::move(new_player_manager); + // Same-sequence: OnVideoGeometryChange cannot interleave between the + // move-assign above (which destroys the old SbPlayer) and the SetSbPlayer + // below, so sb_player_ is never observed dangling. geometry_change_handler_.SetSbPlayer(player_manager_->GetSbPlayer()); if (pending_volume_.has_value()) { diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc index f10c330b74968..6c44ecb186102 100644 --- a/media/mojo/services/mojo_renderer_service.cc +++ b/media/mojo/services/mojo_renderer_service.cc @@ -58,7 +58,9 @@ void MojoRendererService::Initialize( streams, InitializeCallback callback) { DVLOG(1) << __func__; - DCHECK_EQ(state_, STATE_UNINITIALIZED); + // A compromised renderer can call Initialize() repeatedly; downstream + // ::media::Renderer impls do not expect re-init. Enforce in release. + CHECK_EQ(state_, STATE_UNINITIALIZED); client_.Bind(std::move(client)); state_ = STATE_INITIALIZING;