diff --git a/components/cast_streaming/browser/control/playback_command_dispatcher.cc b/components/cast_streaming/browser/control/playback_command_dispatcher.cc index af3deceb75ba9..ab9fe1548a501 100644 --- a/components/cast_streaming/browser/control/playback_command_dispatcher.cc +++ b/components/cast_streaming/browser/control/playback_command_dispatcher.cc @@ -135,9 +135,13 @@ void PlaybackCommandDispatcher::OnRemotingSessionNegotiated( task_runner_, this, base::BindRepeating(&PlaybackCommandDispatcher::AcquireHandle, base::Unretained(this)), + // SendRemotingRpcMessageToRemote is posted to |task_runner_| via + // PostDelayedTask in MessageProcessor::OnNoBuffersAvailable(), which can + // fire after |this| is destroyed. Bind to a WeakPtr so the posted task + // becomes a no-op once the dispatcher is gone. base::BindRepeating( &PlaybackCommandDispatcher::SendRemotingRpcMessageToRemote, - base::Unretained(this))); + weak_factory_.GetWeakPtr())); } void PlaybackCommandDispatcher::ConfigureRemotingAsync( diff --git a/components/cast_streaming/browser/control/remoting/rpc_demuxer_stream_handler.cc b/components/cast_streaming/browser/control/remoting/rpc_demuxer_stream_handler.cc index c6d6625f057ca..32d79f14f4a9f 100644 --- a/components/cast_streaming/browser/control/remoting/rpc_demuxer_stream_handler.cc +++ b/components/cast_streaming/browser/control/remoting/rpc_demuxer_stream_handler.cc @@ -305,9 +305,22 @@ void RpcDemuxerStreamHandler::MessageProcessor::OnNoBuffersAvailable() { remaining_time = base::Microseconds(0); } + // |process_message_cb_| may be (and in production is) bound via Unretained() + // to an object whose lifetime matches this MessageProcessor. Guard the posted + // task with this object's WeakPtr so it does not run after destruction. task_runner_->PostDelayedTask( FROM_HERE, - base::BindOnce(process_message_cb_, remote_handle(), std::move(message)), + base::BindOnce( + [](base::WeakPtr self, RpcProcessMessageCB cb, + openscreen::cast::RpcMessenger::Handle handle, + std::unique_ptr message) { + if (!self) { + return; + } + cb.Run(handle, std::move(message)); + }, + weak_factory_.GetWeakPtr(), process_message_cb_, remote_handle(), + std::move(message)), remaining_time); last_request_time_ = now + remaining_time;