Skip to content

Commit

Permalink
[M114] 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.

(cherry picked from commit 2083894)

No-Try: True
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-Original-Commit-Position: refs/heads/main@{#40036}
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/305380
Reviewed-by: Mirko Bonadei <[email protected]>
Cr-Commit-Position: refs/branch-heads/5735@{#1}
Cr-Branched-From: df7df19-refs/heads/main@{#39949}
  • Loading branch information
ywh233 authored and WebRTC LUCI CQ committed May 15, 2023
1 parent df7df19 commit 9d99682
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 @@ -843,7 +843,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 9d99682

Please sign in to comment.