tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit f3b334e9403801252f1172e0c54f620649439ae9
parent 78a36b1367428bd13646cac758fb08f86663d2f5
Author: Michael Froman <mfroman@mozilla.com>
Date:   Wed,  8 Oct 2025 23:18:12 -0500

Bug 1993083 - Vendor libwebrtc from c544c1630f

Upstream commit: https://webrtc.googlesource.com/src/+/c544c1630f7eb593b017034e40309879b11ba874
    dtls-in-stun: change ack API to a vector<uint32_t> for writing

    for symmetry with the new getter.

    Bug: webrtc:367395350
    Change-Id: Iffe8aab062bca664cbf3e72c4a44a534132fe716
    Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/398620
    Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
    Commit-Queue: Philipp Hancke <phancke@meta.com>
    Reviewed-by: Harald Alvestrand <hta@webrtc.org>
    Cr-Commit-Position: refs/heads/main@{#45110}

Diffstat:
Mthird_party/libwebrtc/README.mozilla.last-vendor | 4++--
Mthird_party/libwebrtc/api/transport/stun.cc | 11+++++++++++
Mthird_party/libwebrtc/api/transport/stun.h | 1+
Mthird_party/libwebrtc/p2p/base/connection.cc | 3++-
Mthird_party/libwebrtc/p2p/base/p2p_transport_channel_unittest.cc | 3++-
Mthird_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_callbacks.h | 13+++++++------
Mthird_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.cc | 22++++++----------------
Mthird_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.h | 6++----
Mthird_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller_unittest.cc | 95++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mthird_party/libwebrtc/p2p/dtls/dtls_transport.cc | 2+-
10 files changed, 82 insertions(+), 78 deletions(-)

diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor @@ -1,4 +1,4 @@ # ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc -libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-09T04:16:59.183314+00:00. +libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-09T04:18:02.876568+00:00. # base of lastest vendoring -06c41cf7ec +c544c1630f diff --git a/third_party/libwebrtc/api/transport/stun.cc b/third_party/libwebrtc/api/transport/stun.cc @@ -1110,6 +1110,17 @@ StunByteStringAttribute::StunByteStringAttribute(uint16_t type, CopyBytes(bytes, length); } +StunByteStringAttribute::StunByteStringAttribute( + uint16_t type, + const std::vector<uint32_t>& values) + : StunAttribute(type, 0), bytes_(nullptr) { + ByteBufferWriter writer; + for (const auto& value : values) { + writer.WriteUInt32(value); + } + CopyBytes(writer.Data(), writer.Length()); +} + StunByteStringAttribute::StunByteStringAttribute(uint16_t type, uint16_t length) : StunAttribute(type, length), bytes_(nullptr) {} diff --git a/third_party/libwebrtc/api/transport/stun.h b/third_party/libwebrtc/api/transport/stun.h @@ -507,6 +507,7 @@ class StunByteStringAttribute : public StunAttribute { explicit StunByteStringAttribute(uint16_t type); StunByteStringAttribute(uint16_t type, absl::string_view str); StunByteStringAttribute(uint16_t type, const void* bytes, size_t length); + StunByteStringAttribute(uint16_t type, const std::vector<uint32_t>& values); StunByteStringAttribute(uint16_t type, uint16_t length); ~StunByteStringAttribute() override; diff --git a/third_party/libwebrtc/p2p/base/connection.cc b/third_party/libwebrtc/p2p/base/connection.cc @@ -607,7 +607,8 @@ void Connection::MaybeAddDtlsPiggybackingAttributes(StunMessage* msg) { if (ack) { size_t msg_length = msg->length(); - size_t need_length = ack->length() + kStunAttributeHeaderSize; + size_t need_length = + kStunAttributeHeaderSize + ack->size() * sizeof(uint32_t); if (msg_length + need_length <= kMaxStunBindingLength) { msg->AddAttribute(std::make_unique<StunByteStringAttribute>( STUN_ATTR_META_DTLS_IN_STUN_ACK, *ack)); diff --git a/third_party/libwebrtc/p2p/base/p2p_transport_channel_unittest.cc b/third_party/libwebrtc/p2p/base/p2p_transport_channel_unittest.cc @@ -7544,7 +7544,8 @@ class P2PTransportChannelTestDtlsInStun : public P2PTransportChannelTestBase { DestroyChannels(); } - std::pair<std::optional<absl::string_view>, std::optional<absl::string_view>> + std::pair<std::optional<absl::string_view>, + std::optional<std::vector<uint32_t>>> data_to_piggyback_func(StunMessageType type) { return make_pair(absl::string_view(pending_packet_), std::nullopt); } diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_callbacks.h b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_callbacks.h @@ -32,14 +32,14 @@ class DtlsStunPiggybackCallbacks { // Function invoked when sending a `request-type` (e.g. // STUN_BINDING_REQUEST). Returns a pair of data that will be sent: // - an optional DTLS_IN_STUN attribute - // - an optional DTLS_IN_STUN_ACK attribute + // - an optional std::vector<uint32_t> for the DTLS_IN_STUN_ACK attribute absl::AnyInvocable<std::pair<std::optional<absl::string_view>, - std::optional<absl::string_view>>( + std::optional<std::vector<uint32_t>>>( /* request-type */ StunMessageType)>&& send_data, // Function invoked when receiving a STUN_BINDING { REQUEST / RESPONSE } - // contains the optional ArrayViews of the DTLS_IN_STUN and - // DTLS_IN_STUN_ACK attributes. + // contains the optional ArrayView of the DTLS_IN_STUN attribute and the + // optional uint32_t vector DTLS_IN_STUN_ACK attribute. absl::AnyInvocable<void( std::optional<ArrayView<uint8_t>> /* recv_data */, std::optional<std::vector<uint32_t>> /* recv_acks */)>&& recv_data) @@ -51,7 +51,8 @@ class DtlsStunPiggybackCallbacks { (send_data_ == nullptr && recv_data_ == nullptr)); } - std::pair<std::optional<absl::string_view>, std::optional<absl::string_view>> + std::pair<std::optional<absl::string_view>, + std::optional<std::vector<uint32_t>>> send_data(StunMessageType request_type) { RTC_DCHECK(send_data_); return send_data_(request_type); @@ -71,7 +72,7 @@ class DtlsStunPiggybackCallbacks { private: absl::AnyInvocable<std::pair<std::optional<absl::string_view>, - std::optional<absl::string_view>>( + std::optional<std::vector<uint32_t>>>( /* request-type */ StunMessageType)> send_data_; absl::AnyInvocable<void(std::optional<ArrayView<uint8_t>> /* recv_data */, diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.cc b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.cc @@ -23,7 +23,6 @@ #include "api/sequence_checker.h" #include "api/transport/stun.h" #include "p2p/dtls/dtls_utils.h" -#include "rtc_base/byte_buffer.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/strings/str_join.h" @@ -128,14 +127,15 @@ DtlsStunPiggybackController::GetDataToPiggyback( packet.size()); } -std::optional<absl::string_view> DtlsStunPiggybackController::GetAckToPiggyback( +std::optional<const std::vector<uint32_t>> +DtlsStunPiggybackController::GetAckToPiggyback( StunMessageType stun_message_type) { RTC_DCHECK_RUN_ON(&sequence_checker_); if (state_ == State::OFF || state_ == State::COMPLETE) { return std::nullopt; } - return handshake_ack_writer_.DataAsStringView(); + return handshake_messages_received_; } void DtlsStunPiggybackController::ReportDataPiggybacked( @@ -164,7 +164,6 @@ void DtlsStunPiggybackController::ReportDataPiggybacked( RTC_LOG(LS_INFO) << "DTLS-STUN piggybacking complete."; state_ = State::COMPLETE; pending_packets_.clear(); - handshake_ack_writer_.Clear(); handshake_messages_received_.clear(); return; } @@ -197,7 +196,6 @@ void DtlsStunPiggybackController::ReportDataPiggybacked( RTC_LOG(LS_INFO) << "DTLS-STUN piggybacking complete."; state_ = State::COMPLETE; pending_packets_.clear(); - handshake_ack_writer_.Clear(); handshake_messages_received_.clear(); return; } @@ -221,19 +219,11 @@ void DtlsStunPiggybackController::ReportDataPiggybacked( if (std::find(handshake_messages_received_.begin(), handshake_messages_received_.end(), hash) == handshake_messages_received_.end()) { - handshake_messages_received_.push_back(hash); - handshake_ack_writer_.WriteUInt32(hash); - - if (handshake_ack_writer_.Length() > kMaxAckSize) { - // If needed, limit size of ack attribute...by removing oldest ack. + // If needed, limit size of ack attribute by removing oldest ack. + while (handshake_messages_received_.size() >= kMaxAckSize) { handshake_messages_received_.erase(handshake_messages_received_.begin()); - handshake_ack_writer_.Clear(); - for (const auto& val : handshake_messages_received_) { - handshake_ack_writer_.WriteUInt32(val); - } } - - RTC_DCHECK(handshake_ack_writer_.Length() <= kMaxAckSize); + handshake_messages_received_.push_back(hash); } dtls_data_callback_(*data); diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.h b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller.h @@ -21,7 +21,6 @@ #include "api/sequence_checker.h" #include "api/transport/stun.h" #include "p2p/dtls/dtls_utils.h" -#include "rtc_base/byte_buffer.h" #include "rtc_base/system/no_unique_address.h" #include "rtc_base/thread_annotations.h" @@ -32,7 +31,7 @@ namespace webrtc { class DtlsStunPiggybackController { public: // Never ack more than 4 packets. - static constexpr unsigned kMaxAckSize = 16; + static constexpr unsigned kMaxAckSize = 4; // dtls_data_callback will be called with any DTLS packets received // piggybacked. @@ -78,7 +77,7 @@ class DtlsStunPiggybackController { // to obtain optional DTLS data or ACKs. std::optional<absl::string_view> GetDataToPiggyback( StunMessageType stun_message_type); - std::optional<absl::string_view> GetAckToPiggyback( + std::optional<const std::vector<uint32_t>> GetAckToPiggyback( StunMessageType stun_message_type); // Called by Connection when receiving a STUN BINDING { REQUEST / RESPONSE }. @@ -96,7 +95,6 @@ class DtlsStunPiggybackController { std::vector<uint32_t> handshake_messages_received_ RTC_GUARDED_BY(sequence_checker_); - ByteBufferWriter handshake_ack_writer_ RTC_GUARDED_BY(sequence_checker_); // Count of data attributes received. int data_recv_count_ = 0; diff --git a/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller_unittest.cc b/third_party/libwebrtc/p2p/dtls/dtls_stun_piggyback_controller_unittest.cc @@ -57,14 +57,6 @@ const std::vector<uint8_t> dtls_flight4 = { const std::vector<uint8_t> empty = {}; -std::string AsAckAttribute(const std::vector<uint32_t>& list) { - webrtc::ByteBufferWriter writer; - for (const auto& val : list) { - writer.WriteUInt32(val); - } - return std::string(writer.DataAsStringView()); -} - std::vector<uint32_t> FromAckAttribute(webrtc::ArrayView<uint8_t> attr) { webrtc::ByteBufferReader ack_reader(attr); std::vector<uint32_t> values; @@ -96,10 +88,17 @@ std::unique_ptr<webrtc::StunByteStringAttribute> WrapInStun( data.size()); } +std::unique_ptr<webrtc::StunByteStringAttribute> WrapInStun( + webrtc::IceAttributeType type, + const std::vector<uint32_t>& data) { + return std::make_unique<webrtc::StunByteStringAttribute>(type, data); +} + } // namespace namespace webrtc { +using ::testing::ElementsAreArray; using ::testing::MockFunction; using State = DtlsStunPiggybackController::State; @@ -307,30 +306,32 @@ TEST_F(DtlsStunPiggybackControllerTest, } TEST_F(DtlsStunPiggybackControllerTest, BasicHandshakeAckData) { - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_RESPONSE), ""); - EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_REQUEST), ""); + EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_RESPONSE), + std::vector<uint32_t>({})); + EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_RESPONSE), + std::vector<uint32_t>({})); // Flight 1+2 SendClientToServer(dtls_flight1, STUN_BINDING_REQUEST); SendServerToClient(dtls_flight2, STUN_BINDING_RESPONSE); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST), - AsAckAttribute({ComputeDtlsPacketHash(dtls_flight1)})); - EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_RESPONSE), - AsAckAttribute({ComputeDtlsPacketHash(dtls_flight2)})); + EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST), + ElementsAreArray({ComputeDtlsPacketHash(dtls_flight1)})); + EXPECT_THAT(*client_.GetAckToPiggyback(STUN_BINDING_RESPONSE), + ElementsAreArray({ComputeDtlsPacketHash(dtls_flight2)})); // Flight 3+4 SendClientToServer(dtls_flight3, STUN_BINDING_REQUEST); SendServerToClient(dtls_flight4, STUN_BINDING_RESPONSE); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_RESPONSE), - AsAckAttribute({ - ComputeDtlsPacketHash(dtls_flight1), - ComputeDtlsPacketHash(dtls_flight3), - })); - EXPECT_EQ(client_.GetAckToPiggyback(STUN_BINDING_REQUEST), - AsAckAttribute({ - ComputeDtlsPacketHash(dtls_flight2), - ComputeDtlsPacketHash(dtls_flight4), - })); + EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_RESPONSE), + ElementsAreArray({ + ComputeDtlsPacketHash(dtls_flight1), + ComputeDtlsPacketHash(dtls_flight3), + })); + EXPECT_THAT(*client_.GetAckToPiggyback(STUN_BINDING_REQUEST), + ElementsAreArray({ + ComputeDtlsPacketHash(dtls_flight2), + ComputeDtlsPacketHash(dtls_flight4), + })); // Post-handshake ACK SendServerToClient(empty, STUN_BINDING_REQUEST); @@ -344,22 +345,22 @@ TEST_F(DtlsStunPiggybackControllerTest, BasicHandshakeAckData) { TEST_F(DtlsStunPiggybackControllerTest, AckDataNoDuplicates) { // Flight 1+2 SendClientToServer(dtls_flight1, STUN_BINDING_REQUEST); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST), - AsAckAttribute({ComputeDtlsPacketHash(dtls_flight1)})); + EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST), + ElementsAreArray({ComputeDtlsPacketHash(dtls_flight1)})); SendClientToServer(dtls_flight3, STUN_BINDING_REQUEST); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST), - AsAckAttribute({ - ComputeDtlsPacketHash(dtls_flight1), - ComputeDtlsPacketHash(dtls_flight3), - })); + EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST), + ElementsAreArray({ + ComputeDtlsPacketHash(dtls_flight1), + ComputeDtlsPacketHash(dtls_flight3), + })); // Receive Flight 1 again, no change expected. SendClientToServer(dtls_flight1, STUN_BINDING_REQUEST); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST), - AsAckAttribute({ - ComputeDtlsPacketHash(dtls_flight1), - ComputeDtlsPacketHash(dtls_flight3), - })); + EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST), + ElementsAreArray({ + ComputeDtlsPacketHash(dtls_flight1), + ComputeDtlsPacketHash(dtls_flight3), + })); } TEST_F(DtlsStunPiggybackControllerTest, IgnoresNonDtlsData) { @@ -389,19 +390,19 @@ TEST_F(DtlsStunPiggybackControllerTest, LimitAckSize) { server_.ReportDataPiggybacked( WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight1)->array_view(), std::nullopt); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 4u); + EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 1u); server_.ReportDataPiggybacked( WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight2)->array_view(), std::nullopt); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 8u); + EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 2u); server_.ReportDataPiggybacked( WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight3)->array_view(), std::nullopt); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 12u); + EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 3u); server_.ReportDataPiggybacked( WrapInStun(STUN_ATTR_META_DTLS_IN_STUN, dtls_flight4)->array_view(), std::nullopt); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 16u); + EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), 4u); // Limit size of ack so that it does not grow unbounded. server_.ReportDataPiggybacked( @@ -409,13 +410,13 @@ TEST_F(DtlsStunPiggybackControllerTest, LimitAckSize) { std::nullopt); EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST)->size(), DtlsStunPiggybackController::kMaxAckSize); - EXPECT_EQ(server_.GetAckToPiggyback(STUN_BINDING_REQUEST), - AsAckAttribute({ - ComputeDtlsPacketHash(dtls_flight2), - ComputeDtlsPacketHash(dtls_flight3), - ComputeDtlsPacketHash(dtls_flight4), - ComputeDtlsPacketHash(dtls_flight5), - })); + EXPECT_THAT(*server_.GetAckToPiggyback(STUN_BINDING_REQUEST), + ElementsAreArray({ + ComputeDtlsPacketHash(dtls_flight2), + ComputeDtlsPacketHash(dtls_flight3), + ComputeDtlsPacketHash(dtls_flight4), + ComputeDtlsPacketHash(dtls_flight5), + })); } TEST_F(DtlsStunPiggybackControllerTest, MultiPacketRoundRobin) { diff --git a/third_party/libwebrtc/p2p/dtls/dtls_transport.cc b/third_party/libwebrtc/p2p/dtls/dtls_transport.cc @@ -640,7 +640,7 @@ void DtlsTransportInternalImpl::ConnectToIceTransport() { DtlsStunPiggybackCallbacks( [&](auto stun_message_type) { std::optional<absl::string_view> data; - std::optional<absl::string_view> ack; + std::optional<std::vector<uint32_t>> ack; if (dtls_in_stun_) { data = dtls_stun_piggyback_controller_.GetDataToPiggyback( stun_message_type);