diff --git a/pc/data_channel_controller.cc b/pc/data_channel_controller.cc index 7fea6c5e55..93599fdba9 100644 --- a/pc/data_channel_controller.cc +++ b/pc/data_channel_controller.cc @@ -70,6 +70,11 @@ void DataChannelController::OnChannelStateChanged( SctpDataChannel* channel, DataChannelInterface::DataState state) { RTC_DCHECK_RUN_ON(network_thread()); + + // Stash away the internal id here in case `OnSctpDataChannelClosed` ends up + // releasing the last reference to the channel. + const int channel_id = channel->internal_id(); + if (state == DataChannelInterface::DataState::kClosed) OnSctpDataChannelClosed(channel); @@ -77,8 +82,7 @@ void DataChannelController::OnChannelStateChanged( ? DataChannelUsage::kHaveBeenUsed : DataChannelUsage::kInUse; signaling_thread()->PostTask(SafeTask( - signaling_safety_.flag(), [this, channel_id = channel->internal_id(), - state = state, channel_usage] { + signaling_safety_.flag(), [this, channel_id, state, channel_usage] { RTC_DCHECK_RUN_ON(signaling_thread()); channel_usage_ = channel_usage; pc_->OnSctpDataChannelStateChanged(channel_id, state);