diff --git a/pc/data_channel_controller.cc b/pc/data_channel_controller.cc index 166e181cfe409f7f885fc66e03d41802fad927b0..b7949e7547b63a7b6b0f176988c75315916b363c 100644 --- a/pc/data_channel_controller.cc +++ b/pc/data_channel_controller.cc @@ -77,14 +77,18 @@ 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); signaling_thread()->PostTask( - SafeTask(signaling_safety_.flag(), - [this, channel_id = channel->internal_id(), state = state] { - pc_->OnSctpDataChannelStateChanged(channel_id, state); - })); + SafeTask(signaling_safety_.flag(), [this, channel_id, state] { + pc_->OnSctpDataChannelStateChanged(channel_id, state); + })); } void DataChannelController::OnDataReceived(