summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Alvestrand <hta@chromium.org>2021-01-20 10:23:07 +0000
committerMichael Brüning <michael.bruning@qt.io>2021-03-29 09:43:40 +0000
commit71b72721f644be8cd92f5d3f2245f65993799f56 (patch)
treea44cb6c49c85017ee2c8d3ae2f9d26182f16b290
parentf2f8da5d330489c0de4239eea994a7ad9e62709e (diff)
[Backport] CVE-2021-21191: Use after free in WebRTC
Cherry-pick of patch originally reviewed on https://chromium-review.googlesource.com/c/chromium/src/+/2639893: Iterate more carefully over DTLS transports at close Ensure that even if the set of DTLS transports is modified during callbacks called from close, the process will be well-defined. Bug: chromium:1167357 Change-Id: I712280e7382a647027912178156127831b437f75 Reviewed-by: Henrik Boström <hbos@chromium.org> Commit-Queue: Harald Alvestrand <hta@chromium.org> Cr-Commit-Position: refs/heads/master@{#845122} Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
-rw-r--r--chromium/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/chromium/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/chromium/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index fd5dff1a56b..7ede07459f1 100644
--- a/chromium/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/chromium/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -3521,8 +3521,14 @@ void RTCPeerConnection::CloseInternal() {
if (sctp_transport_) {
sctp_transport_->Close();
}
- for (auto& dtls_transport_iter : dtls_transports_by_native_transport_) {
- dtls_transport_iter.value->Close();
+ // Since Close() can trigger JS-level callbacks, iterate over a copy
+ // of the transports list.
+ auto dtls_transports_copy = dtls_transports_by_native_transport_;
+ for (auto& dtls_transport_iter : dtls_transports_copy) {
+ // Since "value" is a WeakPtr, check if it's still valid.
+ if (dtls_transport_iter.value) {
+ dtls_transport_iter.value->Close();
+ }
}
feature_handle_for_scheduler_.reset();