From 9d996824465410b4f25cf1d20bdee01d7091533a Mon Sep 17 00:00:00 2001 From: Yuwei Huang Date: Tue, 9 May 2023 16:01:33 -0700 Subject: [PATCH] [M114] Fix bug of messages being delivered before data channel is open If the caller calls RegisterObserver() on the network thread while the state is not kOpen but there are queued received data, those received data will be immediately delivered to the observer before the state is transitioned to kOpen, which may break the observer's assertions and cause problems. The problem turns out to be that, when SctpDataChannel::RegisterObserver calls DeliverQueuedReceivedData(), the data will be passed to the observer without checking the |state_| first, meanwhile SctpDataChannel::UpdateState does effectively check the state and null-check |observer_| before delivering the received data. This CL fixes this by simply making DeliverQueuedReceivedData() also check `state_ == kOpen`. In case the state transitions to kOpen after RegisterObserver() is called, the first DeliverQueuedReceivedData() call will be no-op, while the second DeliverQueuedReceivedData() call will do the work. (cherry picked from commit 20838941240536b52e24e47ce99ad6c2175dba1a) No-Try: True Bug: chromium:1442696 Change-Id: If25ce6a038d704939b1a8ae73d7ced110448b050 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/304687 Reviewed-by: Tomas Gunnarsson Commit-Queue: Tomas Gunnarsson Cr-Original-Commit-Position: refs/heads/main@{#40036} Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/305380 Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/branch-heads/5735@{#1} Cr-Branched-From: df7df199abd619e75b9f1d9a7e12fc3f3f748775-refs/heads/main@{#39949} --- pc/sctp_data_channel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pc/sctp_data_channel.cc b/pc/sctp_data_channel.cc index 3fed03ca11..dda9110bfc 100644 --- a/pc/sctp_data_channel.cc +++ b/pc/sctp_data_channel.cc @@ -843,7 +843,7 @@ void SctpDataChannel::SetState(DataState state) { // RTC_RUN_ON(network_thread_). void SctpDataChannel::DeliverQueuedReceivedData() { - if (!observer_) { + if (!observer_ || state_ != kOpen) { return; }