Skip to content

Commit

Permalink
Fix bug of messages being delivered before data channel is open
Browse files Browse the repository at this point in the history
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.

Bug: chromium:1442696
Change-Id: If25ce6a038d704939b1a8ae73d7ced110448b050
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/304687
Reviewed-by: Tomas Gunnarsson <[email protected]>
Commit-Queue: Tomas Gunnarsson <[email protected]>
Cr-Commit-Position: refs/heads/main@{#40036}
  • Loading branch information
ywh233 authored and WebRTC LUCI CQ committed May 10, 2023
1 parent 80baee1 commit 2083894
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion pc/sctp_data_channel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -848,7 +848,7 @@ void SctpDataChannel::SetState(DataState state) {

// RTC_RUN_ON(network_thread_).
void SctpDataChannel::DeliverQueuedReceivedData() {
if (!observer_) {
if (!observer_ || state_ != kOpen) {
return;
}

Expand Down

0 comments on commit 2083894

Please sign in to comment.