tor-browser

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

commit 38ca1cab73cbc36d43bba9053f492f8e03a059c6
parent a77c54c40025a64795ab58985ff655725e6afbbe
Author: Dan Baker <dbaker@mozilla.com>
Date:   Mon,  1 Dec 2025 17:26:32 -0700

Bug 2000941 - Vendor libwebrtc from 036718f775

Upstream commit: https://webrtc.googlesource.com/src/+/036718f775ca8c97ab033661dde20cad0e5c9895
    Allow to provide Environment when constructing AsyncPacketSockets

    Additionally new constructor and factory function document nullability
    and ownership of passed pointers with unique_ptr type and nullability
    attributes.

    Once all of WebRTC is updated to provide Environment, it will be used to
    query current time when stamping packets.

    Bug: webrtc:42223992
    Change-Id: I73fc0626f5b4ef5b7b6c584bf6d151a88ffaf9eb
    Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/407824
    Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
    Reviewed-by: Harald Alvestrand <hta@webrtc.org>
    Cr-Commit-Position: refs/heads/main@{#45583}

Diffstat:
Mthird_party/libwebrtc/README.mozilla.last-vendor | 4++--
Mthird_party/libwebrtc/moz-patch-stack/s0001.patch | 2+-
Mthird_party/libwebrtc/moz-patch-stack/s0027.patch | 38+++++++++++++++++++-------------------
Mthird_party/libwebrtc/moz-patch-stack/s0053.patch | 2+-
Mthird_party/libwebrtc/moz-patch-stack/s0091.patch | 2+-
Mthird_party/libwebrtc/moz-patch-stack/s0094.patch | 6+++---
Mthird_party/libwebrtc/moz-patch-stack/s0102.patch | 4++--
Mthird_party/libwebrtc/moz-patch-stack/s0107.patch | 8++++----
Mthird_party/libwebrtc/p2p/BUILD.gn | 3+++
Mthird_party/libwebrtc/p2p/base/async_stun_tcp_socket.cc | 12+++++++++++-
Mthird_party/libwebrtc/p2p/base/async_stun_tcp_socket.h | 7+++++++
Mthird_party/libwebrtc/p2p/base/async_stun_tcp_socket_unittest.cc | 22+++++++++++++++-------
Mthird_party/libwebrtc/rtc_base/BUILD.gn | 13++++++++++++-
Mthird_party/libwebrtc/rtc_base/async_tcp_socket.cc | 15++++++++++++---
Mthird_party/libwebrtc/rtc_base/async_tcp_socket.h | 14++++++++++----
Mthird_party/libwebrtc/rtc_base/async_udp_socket.cc | 23+++++++++++++++++++++++
Mthird_party/libwebrtc/rtc_base/async_udp_socket.h | 16++++++++++++++++
Mthird_party/libwebrtc/rtc_base/async_udp_socket_unittest.cc | 26++++++++++++++------------
Mthird_party/libwebrtc/rtc_base/socket_factory.h | 11+++++++++--
Mthird_party/libwebrtc/rtc_base/test_client_unittest.cc | 17+++++++++++------
20 files changed, 176 insertions(+), 69 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 /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc -libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T00:24:02.944971+00:00. +libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T00:26:17.942225+00:00. # base of lastest vendoring -7509b2d193 +036718f775 diff --git a/third_party/libwebrtc/moz-patch-stack/s0001.patch b/third_party/libwebrtc/moz-patch-stack/s0001.patch @@ -1392,7 +1392,7 @@ index 5ccc3d7d38..cd957416bc 100644 const bool enable_svc_for_simulcast_; std::optional<SimulcastToSvcConverter> simulcast_to_svc_converter_; diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index ebdb3a07c9..e894327590 100644 +index 4d4014adc9..8cbca254d4 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -449,6 +449,12 @@ rtc_library("logging") { diff --git a/third_party/libwebrtc/moz-patch-stack/s0027.patch b/third_party/libwebrtc/moz-patch-stack/s0027.patch @@ -1008,7 +1008,7 @@ index 39aa39a41c..b26e30e8bb 100644 "/config/external/nspr", "/nsprpub/lib/ds", diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index e894327590..6c9d891fff 100644 +index 8cbca254d4..d8a0a3630c 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -326,6 +326,7 @@ rtc_library("sample_counter") { @@ -1037,7 +1037,7 @@ index e894327590..6c9d891fff 100644 if (rtc_build_json) { deps += [ "//third_party/jsoncpp" ] } else { -@@ -1179,6 +1183,7 @@ if (!build_with_chromium) { +@@ -1183,6 +1187,7 @@ if (!build_with_chromium) { } rtc_library("network") { @@ -1045,7 +1045,7 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "network.cc", -@@ -1223,6 +1228,7 @@ rtc_library("network") { +@@ -1227,6 +1232,7 @@ rtc_library("network") { deps += [ ":win32" ] } } @@ -1053,7 +1053,7 @@ index e894327590..6c9d891fff 100644 rtc_source_set("sigslot_trampoline") { sources = [ "sigslot_trampoline.h" ] -@@ -1245,14 +1251,17 @@ rtc_library("sigslot_trampoline_unittest") { +@@ -1249,14 +1255,17 @@ rtc_library("sigslot_trampoline_unittest") { } rtc_library("socket_address_pair") { @@ -1071,7 +1071,7 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "net_helper.cc", -@@ -1263,8 +1272,10 @@ rtc_library("net_helper") { +@@ -1267,8 +1276,10 @@ rtc_library("net_helper") { "//third_party/abseil-cpp/absl/strings:string_view", ] } @@ -1082,7 +1082,7 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "socket_adapters.cc", -@@ -1285,6 +1296,7 @@ rtc_library("socket_adapters") { +@@ -1289,6 +1300,7 @@ rtc_library("socket_adapters") { "//third_party/abseil-cpp/absl/strings:string_view", ] } @@ -1090,7 +1090,7 @@ index e894327590..6c9d891fff 100644 rtc_library("network_route") { sources = [ -@@ -1299,6 +1311,7 @@ rtc_library("network_route") { +@@ -1303,6 +1315,7 @@ rtc_library("network_route") { } rtc_library("async_tcp_socket") { @@ -1098,8 +1098,8 @@ index e894327590..6c9d891fff 100644 sources = [ "async_tcp_socket.cc", "async_tcp_socket.h", -@@ -1318,8 +1331,10 @@ rtc_library("async_tcp_socket") { - "network:sent_packet", +@@ -1325,8 +1338,10 @@ rtc_library("async_tcp_socket") { + "//third_party/abseil-cpp/absl/memory", ] } +} @@ -1109,8 +1109,8 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "async_udp_socket.cc", -@@ -1343,8 +1358,10 @@ rtc_library("async_udp_socket") { - "system:no_unique_address", +@@ -1352,8 +1367,10 @@ rtc_library("async_udp_socket") { + "//third_party/abseil-cpp/absl/base:nullability", ] } +} @@ -1120,7 +1120,7 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "async_packet_socket.cc", -@@ -1368,6 +1385,7 @@ rtc_library("async_packet_socket") { +@@ -1377,6 +1394,7 @@ rtc_library("async_packet_socket") { "//third_party/abseil-cpp/absl/functional:any_invocable", ] } @@ -1128,7 +1128,7 @@ index e894327590..6c9d891fff 100644 if (rtc_include_tests) { rtc_library("async_packet_socket_unittest") { -@@ -1453,6 +1471,7 @@ rtc_library("data_rate_limiter") { +@@ -1463,6 +1481,7 @@ rtc_library("data_rate_limiter") { } rtc_library("unique_id_generator") { @@ -1136,7 +1136,7 @@ index e894327590..6c9d891fff 100644 sources = [ "unique_id_generator.cc", "unique_id_generator.h", -@@ -1470,6 +1489,7 @@ rtc_library("unique_id_generator") { +@@ -1480,6 +1499,7 @@ rtc_library("unique_id_generator") { "//third_party/abseil-cpp/absl/strings:string_view", ] } @@ -1144,7 +1144,7 @@ index e894327590..6c9d891fff 100644 rtc_library("crc32") { sources = [ -@@ -1501,6 +1521,7 @@ rtc_library("stream") { +@@ -1511,6 +1531,7 @@ rtc_library("stream") { } rtc_library("rtc_certificate_generator") { @@ -1152,7 +1152,7 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "rtc_certificate_generator.cc", -@@ -1515,6 +1536,7 @@ rtc_library("rtc_certificate_generator") { +@@ -1525,6 +1546,7 @@ rtc_library("rtc_certificate_generator") { "//third_party/abseil-cpp/absl/functional:any_invocable", ] } @@ -1160,7 +1160,7 @@ index e894327590..6c9d891fff 100644 rtc_source_set("ssl_header") { visibility = [ "*" ] -@@ -1571,6 +1593,7 @@ rtc_library("crypto_random") { +@@ -1581,6 +1603,7 @@ rtc_library("crypto_random") { } rtc_library("ssl") { @@ -1168,7 +1168,7 @@ index e894327590..6c9d891fff 100644 visibility = [ "*" ] sources = [ "openssl_key_pair.cc", -@@ -1643,6 +1666,7 @@ rtc_library("ssl") { +@@ -1653,6 +1676,7 @@ rtc_library("ssl") { deps += [ ":win32" ] } } @@ -1176,7 +1176,7 @@ index e894327590..6c9d891fff 100644 rtc_library("ssl_adapter") { visibility = [ "*" ] -@@ -2368,7 +2392,7 @@ if (rtc_include_tests) { +@@ -2379,7 +2403,7 @@ if (rtc_include_tests) { } } diff --git a/third_party/libwebrtc/moz-patch-stack/s0053.patch b/third_party/libwebrtc/moz-patch-stack/s0053.patch @@ -29,7 +29,7 @@ index 7db75d5fd3..d0feb5007c 100644 rtc_library("task_queue_test") { visibility = [ "*" ] diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index 6c9d891fff..c476050661 100644 +index d8a0a3630c..938a1d24d8 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -664,10 +664,14 @@ if (is_mac || is_ios) { diff --git a/third_party/libwebrtc/moz-patch-stack/s0091.patch b/third_party/libwebrtc/moz-patch-stack/s0091.patch @@ -13,7 +13,7 @@ Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/4e7b3c485e549e7e3 1 file changed, 6 insertions(+) diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index c476050661..f419602aa2 100644 +index 938a1d24d8..ef3ea9f86a 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -992,6 +992,12 @@ rtc_library("threading") { diff --git a/third_party/libwebrtc/moz-patch-stack/s0094.patch b/third_party/libwebrtc/moz-patch-stack/s0094.patch @@ -9,10 +9,10 @@ Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/ee2f06666bcc6d22c 1 file changed, 2 insertions(+) diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index f419602aa2..836e6d2ca0 100644 +index ef3ea9f86a..322928e857 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn -@@ -1679,6 +1679,7 @@ if (!build_with_mozilla) { +@@ -1689,6 +1689,7 @@ if (!build_with_mozilla) { } rtc_library("ssl_adapter") { @@ -20,7 +20,7 @@ index f419602aa2..836e6d2ca0 100644 visibility = [ "*" ] sources = [ "openssl_adapter.cc", -@@ -1727,6 +1728,7 @@ rtc_library("ssl_adapter") { +@@ -1737,6 +1738,7 @@ rtc_library("ssl_adapter") { configs += [ "..:external_ssl_library" ] } } diff --git a/third_party/libwebrtc/moz-patch-stack/s0102.patch b/third_party/libwebrtc/moz-patch-stack/s0102.patch @@ -616,7 +616,7 @@ index f43d1b9ba1..2efd33c566 100644 if (rtc_build_libsrtp) { diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index 836e6d2ca0..5439f86438 100644 +index 322928e857..ea0fa53396 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -9,8 +9,8 @@ @@ -630,7 +630,7 @@ index 836e6d2ca0..5439f86438 100644 } rtc_source_set("protobuf_utils") { -@@ -1921,8 +1921,8 @@ if (!rtc_rusty_base64) { +@@ -1931,8 +1931,8 @@ if (!rtc_rusty_base64) { ] } } else { diff --git a/third_party/libwebrtc/moz-patch-stack/s0107.patch b/third_party/libwebrtc/moz-patch-stack/s0107.patch @@ -116,10 +116,10 @@ index ecbb7eae7e..a13fe19324 100644 public_configs = [] if (!build_with_chromium) { diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn -index 5439f86438..6042579110 100644 +index ea0fa53396..78476b68a6 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn -@@ -1558,6 +1558,7 @@ rtc_source_set("ssl_header") { +@@ -1568,6 +1568,7 @@ rtc_source_set("ssl_header") { } rtc_library("digest") { @@ -127,7 +127,7 @@ index 5439f86438..6042579110 100644 visibility = [ "*" ] sources = [ "message_digest.cc", -@@ -1579,8 +1580,10 @@ rtc_library("digest") { +@@ -1589,8 +1590,10 @@ rtc_library("digest") { configs += [ "..:external_ssl_library" ] } } @@ -138,7 +138,7 @@ index 5439f86438..6042579110 100644 visibility = [ "*" ] sources = [ "crypto_random.cc", -@@ -1601,6 +1604,7 @@ rtc_library("crypto_random") { +@@ -1611,6 +1614,7 @@ rtc_library("crypto_random") { configs += [ "..:external_ssl_library" ] } } diff --git a/third_party/libwebrtc/p2p/BUILD.gn b/third_party/libwebrtc/p2p/BUILD.gn @@ -50,6 +50,7 @@ rtc_library("async_stun_tcp_socket") { ] deps = [ "../api:array_view", + "../api/environment", "../api/transport:stun_types", "../api/units:timestamp", "../rtc_base:async_packet_socket", @@ -61,6 +62,8 @@ rtc_library("async_stun_tcp_socket") { "../rtc_base:timeutils", "../rtc_base/network:received_packet", "../rtc_base/network:sent_packet", + "//third_party/abseil-cpp/absl/base:nullability", + "//third_party/abseil-cpp/absl/memory", ] } diff --git a/third_party/libwebrtc/p2p/base/async_stun_tcp_socket.cc b/third_party/libwebrtc/p2p/base/async_stun_tcp_socket.cc @@ -13,8 +13,13 @@ #include <cerrno> #include <cstddef> #include <cstdint> +#include <memory> +#include <utility> +#include "absl/base/nullability.h" +#include "absl/memory/memory.h" #include "api/array_view.h" +#include "api/environment/environment.h" #include "api/transport/stun.h" #include "api/units/timestamp.h" #include "rtc_base/async_packet_socket.h" @@ -42,8 +47,13 @@ inline bool IsStunMessage(uint16_t msg_type) { return (msg_type & 0xC000) ? false : true; } +AsyncStunTCPSocket::AsyncStunTCPSocket( + const Environment& /*env*/, + absl_nonnull std::unique_ptr<Socket> socket) + : AsyncTCPSocketBase(std::move(socket), kBufSize) {} + AsyncStunTCPSocket::AsyncStunTCPSocket(Socket* socket) - : AsyncTCPSocketBase(socket, kBufSize) {} + : AsyncTCPSocketBase(absl::WrapUnique(socket), kBufSize) {} int AsyncStunTCPSocket::Send(const void* pv, size_t cb, diff --git a/third_party/libwebrtc/p2p/base/async_stun_tcp_socket.h b/third_party/libwebrtc/p2p/base/async_stun_tcp_socket.h @@ -13,8 +13,11 @@ #include <cstddef> #include <cstdint> +#include <memory> +#include "absl/base/nullability.h" #include "api/array_view.h" +#include "api/environment/environment.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/async_tcp_socket.h" #include "rtc_base/socket.h" @@ -23,6 +26,10 @@ namespace webrtc { class AsyncStunTCPSocket : public AsyncTCPSocketBase { public: + AsyncStunTCPSocket(const Environment& env, + absl_nonnull std::unique_ptr<Socket> socket); + // TODO: bugs.webrtc.org/42223992 - Delete or deprecate constructor below when + // WebRTC is updated to use constructor that provides Environment. explicit AsyncStunTCPSocket(Socket* socket); AsyncStunTCPSocket(const AsyncStunTCPSocket&) = delete; diff --git a/third_party/libwebrtc/p2p/base/async_stun_tcp_socket_unittest.cc b/third_party/libwebrtc/p2p/base/async_stun_tcp_socket_unittest.cc @@ -19,6 +19,7 @@ #include "absl/memory/memory.h" #include "api/array_view.h" +#include "api/environment/environment.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/async_tcp_socket.h" #include "rtc_base/buffer.h" @@ -29,6 +30,7 @@ #include "rtc_base/third_party/sigslot/sigslot.h" #include "rtc_base/thread.h" #include "rtc_base/virtual_socket_server.h" +#include "test/create_test_environment.h" #include "test/gmock.h" #include "test/gtest.h" @@ -70,11 +72,16 @@ static const SocketAddress kServerAddr("22.22.22.22", 0); class AsyncStunServerTCPSocket : public AsyncTcpListenSocket { public: - explicit AsyncStunServerTCPSocket(std::unique_ptr<Socket> socket) - : AsyncTcpListenSocket(std::move(socket)) {} + AsyncStunServerTCPSocket(const Environment& env, + std::unique_ptr<Socket> socket) + : AsyncTcpListenSocket(std::move(socket)), env_(env) {} void HandleIncomingConnection(Socket* socket) override { - SignalNewConnection(this, new AsyncStunTCPSocket(socket)); + SignalNewConnection(this, + new AsyncStunTCPSocket(env_, absl::WrapUnique(socket))); } + + private: + const Environment env_; }; class AsyncStunTCPSocketTest : public ::testing::Test, @@ -86,20 +93,21 @@ class AsyncStunTCPSocketTest : public ::testing::Test, void SetUp() override { CreateSockets(); } void CreateSockets() { + const Environment env = CreateTestEnvironment(); std::unique_ptr<Socket> server = - absl::WrapUnique(vss_->CreateSocket(kServerAddr.family(), SOCK_STREAM)); + vss_->Create(kServerAddr.family(), SOCK_STREAM); server->Bind(kServerAddr); listen_socket_ = - std::make_unique<AsyncStunServerTCPSocket>(std::move(server)); + std::make_unique<AsyncStunServerTCPSocket>(env, std::move(server)); listen_socket_->SignalNewConnection.connect( this, &AsyncStunTCPSocketTest::OnNewConnection); std::unique_ptr<Socket> client = - absl::WrapUnique(vss_->CreateSocket(kClientAddr.family(), SOCK_STREAM)); + vss_->Create(kClientAddr.family(), SOCK_STREAM); ASSERT_THAT(client, NotNull()); ASSERT_EQ(client->Bind(kClientAddr), 0); ASSERT_EQ(client->Connect(listen_socket_->GetLocalAddress()), 0); - send_socket_ = std::make_unique<AsyncStunTCPSocket>(client.release()); + send_socket_ = std::make_unique<AsyncStunTCPSocket>(env, std::move(client)); send_socket_->SignalSentPacket.connect( this, &AsyncStunTCPSocketTest::OnSentPacket); vss_->ProcessMessagesUntilIdle(); diff --git a/third_party/libwebrtc/rtc_base/BUILD.gn b/third_party/libwebrtc/rtc_base/BUILD.gn @@ -1052,7 +1052,11 @@ rtc_library("threading") { rtc_source_set("socket_factory") { sources = [ "socket_factory.h" ] - deps = [ ":socket" ] + deps = [ + ":socket", + "//third_party/abseil-cpp/absl/base:nullability", + "//third_party/abseil-cpp/absl/memory", + ] } rtc_library("async_socket") { @@ -1336,9 +1340,12 @@ if (!build_with_mozilla) { ":socket_address", ":timeutils", "../api:array_view", + "../api/environment", "../api/units:timestamp", "network:received_packet", "network:sent_packet", + "//third_party/abseil-cpp/absl/base:nullability", + "//third_party/abseil-cpp/absl/memory", ] } } @@ -1361,11 +1368,13 @@ if (!build_with_mozilla) { ":socket_factory", ":timeutils", "../api:sequence_checker", + "../api/environment", "../api/units:time_delta", "../api/units:timestamp", "network:received_packet", "network:sent_packet", "system:no_unique_address", + "//third_party/abseil-cpp/absl/base:nullability", ] } } @@ -1422,6 +1431,7 @@ if (rtc_include_tests) { ":rtc_base_tests_utils", ":socket", ":socket_address", + "../test:create_test_environment", "../test:test_support", "network:received_packet", "third_party/sigslot", @@ -2360,6 +2370,7 @@ if (rtc_include_tests) { "../api/units:time_delta", "../api/units:timestamp", "../system_wrappers", + "../test:create_test_environment", "../test:create_test_field_trials", "../test:fileutils", "../test:rtc_expect_death", diff --git a/third_party/libwebrtc/rtc_base/async_tcp_socket.cc b/third_party/libwebrtc/rtc_base/async_tcp_socket.cc @@ -17,7 +17,10 @@ #include <memory> #include <utility> +#include "absl/base/nullability.h" +#include "absl/memory/memory.h" #include "api/array_view.h" +#include "api/environment/environment.h" #include "api/units/timestamp.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/byte_order.h" @@ -49,8 +52,10 @@ static const size_t kMinimumRecvSize = 128; static const int kListenBacklog = 5; -AsyncTCPSocketBase::AsyncTCPSocketBase(Socket* socket, size_t max_packet_size) - : socket_(socket), +AsyncTCPSocketBase::AsyncTCPSocketBase( + absl_nonnull std::unique_ptr<Socket> socket, + size_t max_packet_size) + : socket_(std::move(socket)), max_insize_(max_packet_size), max_outsize_(max_packet_size) { inbuf_.EnsureCapacity(kMinimumRecvSize); @@ -228,8 +233,12 @@ void AsyncTCPSocketBase::OnCloseEvent(Socket* socket, int error) { NotifyClosed(error); } +AsyncTCPSocket::AsyncTCPSocket(const Environment& /*env*/, + absl_nonnull std::unique_ptr<Socket> socket) + : AsyncTCPSocketBase(std::move(socket), kBufSize) {} + AsyncTCPSocket::AsyncTCPSocket(Socket* socket) - : AsyncTCPSocketBase(socket, kBufSize) {} + : AsyncTCPSocketBase(absl::WrapUnique(socket), kBufSize) {} int AsyncTCPSocket::Send(const void* pv, size_t cb, diff --git a/third_party/libwebrtc/rtc_base/async_tcp_socket.h b/third_party/libwebrtc/rtc_base/async_tcp_socket.h @@ -11,12 +11,13 @@ #ifndef RTC_BASE_ASYNC_TCP_SOCKET_H_ #define RTC_BASE_ASYNC_TCP_SOCKET_H_ -#include <stddef.h> - +#include <cstddef> #include <cstdint> #include <memory> +#include "absl/base/nullability.h" #include "api/array_view.h" +#include "api/environment/environment.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/buffer.h" #include "rtc_base/socket.h" @@ -29,7 +30,8 @@ namespace webrtc { // buffer them in user space. class AsyncTCPSocketBase : public AsyncPacketSocket { public: - AsyncTCPSocketBase(Socket* socket, size_t max_packet_size); + AsyncTCPSocketBase(absl_nonnull std::unique_ptr<Socket> socket, + size_t max_packet_size); ~AsyncTCPSocketBase() override; AsyncTCPSocketBase(const AsyncTCPSocketBase&) = delete; @@ -72,7 +74,7 @@ class AsyncTCPSocketBase : public AsyncPacketSocket { void OnWriteEvent(Socket* socket); void OnCloseEvent(Socket* socket, int error); - std::unique_ptr<Socket> socket_; + absl_nonnull std::unique_ptr<Socket> socket_; Buffer inbuf_; Buffer outbuf_; size_t max_insize_; @@ -81,6 +83,10 @@ class AsyncTCPSocketBase : public AsyncPacketSocket { class AsyncTCPSocket : public AsyncTCPSocketBase { public: + AsyncTCPSocket(const Environment& env, + absl_nonnull std::unique_ptr<Socket> socket); + // TODO: bugs.webrtc.org/42223992 - Delete or deprecate constructor below when + // WebRTC is updated to use constructor that provides Environment. explicit AsyncTCPSocket(Socket* socket); ~AsyncTCPSocket() override {} diff --git a/third_party/libwebrtc/rtc_base/async_udp_socket.cc b/third_party/libwebrtc/rtc_base/async_udp_socket.cc @@ -13,7 +13,10 @@ #include <cstddef> #include <memory> #include <optional> +#include <utility> +#include "absl/base/nullability.h" +#include "api/environment/environment.h" #include "api/sequence_checker.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" @@ -29,6 +32,22 @@ namespace webrtc { +absl_nullable std::unique_ptr<AsyncUDPSocket> AsyncUDPSocket::Create( + const Environment& env, + const SocketAddress& bind_address, + SocketFactory& factory) { + std::unique_ptr<Socket> socket = + factory.Create(bind_address.family(), SOCK_DGRAM); + if (socket == nullptr) { + return nullptr; + } + if (socket->Bind(bind_address) < 0) { + RTC_LOG(LS_ERROR) << "Bind() failed with error " << socket->GetError(); + return nullptr; + } + return std::make_unique<AsyncUDPSocket>(env, std::move(socket)); +} + AsyncUDPSocket* AsyncUDPSocket::Create(Socket* socket, const SocketAddress& bind_address) { std::unique_ptr<Socket> owned_socket(socket); @@ -47,6 +66,10 @@ AsyncUDPSocket* AsyncUDPSocket::Create(SocketFactory* factory, return Create(socket, bind_address); } +AsyncUDPSocket::AsyncUDPSocket(const Environment& env, + absl_nonnull std::unique_ptr<Socket> socket) + : AsyncUDPSocket(socket.release()) {} + AsyncUDPSocket::AsyncUDPSocket(Socket* socket) : socket_(socket) { sequence_checker_.Detach(); // The socket should start out readable but not writable. diff --git a/third_party/libwebrtc/rtc_base/async_udp_socket.h b/third_party/libwebrtc/rtc_base/async_udp_socket.h @@ -16,6 +16,8 @@ #include <memory> #include <optional> +#include "absl/base/nullability.h" +#include "api/environment/environment.h" #include "api/sequence_checker.h" #include "api/units/time_delta.h" #include "rtc_base/async_packet_socket.h" @@ -32,6 +34,15 @@ namespace webrtc { // buffered since it is acceptable to drop packets under high load. class AsyncUDPSocket : public AsyncPacketSocket { public: + // Creates a new socket for sending asynchronous UDP packets using an + // asynchronous socket from the given factory. + static absl_nullable std::unique_ptr<AsyncUDPSocket> Create( + const Environment& env, + const SocketAddress& bind_address, + SocketFactory& factory); + + // TODO: bugs.webrtc.org/42223992 - Delete or deprecate 2 factory functions + // below when WebRTC is updated to use factory that provides Environment. // Binds `socket` and creates AsyncUDPSocket for it. Takes ownership // of `socket`. Returns null if bind() fails (`socket` is destroyed // in that case). @@ -41,6 +52,11 @@ class AsyncUDPSocket : public AsyncPacketSocket { // asynchronous socket from the given factory. static AsyncUDPSocket* Create(SocketFactory* factory, const SocketAddress& bind_address); + + AsyncUDPSocket(const Environment& env, + absl_nonnull std::unique_ptr<Socket> socket); + // TODO: bugs.webrtc.org/42223992 - Delete or deprecate constructor below when + // WebRTC is updated to use constructor that provides Environment. explicit AsyncUDPSocket(Socket* socket); ~AsyncUDPSocket() = default; diff --git a/third_party/libwebrtc/rtc_base/async_udp_socket_unittest.cc b/third_party/libwebrtc/rtc_base/async_udp_socket_unittest.cc @@ -13,42 +13,44 @@ #include <cstdint> #include <memory> -#include "absl/memory/memory.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/socket.h" #include "rtc_base/socket_address.h" #include "rtc_base/virtual_socket_server.h" +#include "test/create_test_environment.h" +#include "test/gmock.h" #include "test/gtest.h" namespace webrtc { -static const SocketAddress kAddr("22.22.22.22", 0); +using ::testing::NotNull; TEST(AsyncUDPSocketTest, SetSocketOptionIfEctChange) { + const SocketAddress kAddr("22.22.22.22", 0); VirtualSocketServer socket_server; - Socket* socket = socket_server.CreateSocket(kAddr.family(), SOCK_DGRAM); - std::unique_ptr<AsyncUDPSocket> udp__socket = - absl::WrapUnique(AsyncUDPSocket::Create(socket, kAddr)); + std::unique_ptr<AsyncUDPSocket> udp_socket = + AsyncUDPSocket::Create(CreateTestEnvironment(), kAddr, socket_server); + ASSERT_THAT(udp_socket, NotNull()); int ect = 0; - socket->GetOption(Socket::OPT_SEND_ECN, &ect); + udp_socket->GetOption(Socket::OPT_SEND_ECN, &ect); ASSERT_EQ(ect, 0); uint8_t buffer[] = "hello"; AsyncSocketPacketOptions packet_options; packet_options.ecn_1 = false; - udp__socket->SendTo(buffer, 5, kAddr, packet_options); - socket->GetOption(Socket::OPT_SEND_ECN, &ect); + udp_socket->SendTo(buffer, 5, kAddr, packet_options); + udp_socket->GetOption(Socket::OPT_SEND_ECN, &ect); EXPECT_EQ(ect, 0); packet_options.ecn_1 = true; - udp__socket->SendTo(buffer, 5, kAddr, packet_options); - socket->GetOption(Socket::OPT_SEND_ECN, &ect); + udp_socket->SendTo(buffer, 5, kAddr, packet_options); + udp_socket->GetOption(Socket::OPT_SEND_ECN, &ect); EXPECT_EQ(ect, 1); packet_options.ecn_1 = false; - udp__socket->SendTo(buffer, 5, kAddr, packet_options); - socket->GetOption(Socket::OPT_SEND_ECN, &ect); + udp_socket->SendTo(buffer, 5, kAddr, packet_options); + udp_socket->GetOption(Socket::OPT_SEND_ECN, &ect); EXPECT_EQ(ect, 0); } diff --git a/third_party/libwebrtc/rtc_base/socket_factory.h b/third_party/libwebrtc/rtc_base/socket_factory.h @@ -11,16 +11,23 @@ #ifndef RTC_BASE_SOCKET_FACTORY_H_ #define RTC_BASE_SOCKET_FACTORY_H_ +#include <memory> + +#include "absl/base/nullability.h" +#include "absl/memory/memory.h" #include "rtc_base/socket.h" namespace webrtc { class SocketFactory { public: - virtual ~SocketFactory() {} + virtual ~SocketFactory() = default; - // Returns a new socket. The type can be SOCK_DGRAM and SOCK_STREAM. + // Returns a new socket. The type can be SOCK_DGRAM and SOCK_STREAM. virtual Socket* CreateSocket(int family, int type) = 0; + absl_nullable std::unique_ptr<Socket> Create(int family, int type) { + return absl::WrapUnique(CreateSocket(family, type)); + } }; } // namespace webrtc diff --git a/third_party/libwebrtc/rtc_base/test_client_unittest.cc b/third_party/libwebrtc/rtc_base/test_client_unittest.cc @@ -13,7 +13,7 @@ #include <memory> #include <utility> -#include "absl/memory/memory.h" +#include "api/environment/environment.h" #include "rtc_base/async_tcp_socket.h" #include "rtc_base/async_udp_socket.h" #include "rtc_base/logging.h" @@ -23,6 +23,7 @@ #include "rtc_base/socket_address.h" #include "rtc_base/test_echo_server.h" #include "rtc_base/thread.h" +#include "test/create_test_environment.h" #include "test/gmock.h" #include "test/gtest.h" @@ -44,12 +45,15 @@ namespace { using ::testing::NotNull; void TestUdpInternal(const SocketAddress& loopback) { + const Environment env = CreateTestEnvironment(); PhysicalSocketServer socket_server; AutoSocketServerThread main_thread(&socket_server); - Socket* socket = socket_server.CreateSocket(loopback.family(), SOCK_DGRAM); + std::unique_ptr<Socket> socket = + socket_server.Create(loopback.family(), SOCK_DGRAM); + ASSERT_THAT(socket, NotNull()); socket->Bind(loopback); - TestClient client(std::make_unique<AsyncUDPSocket>(socket)); + TestClient client(std::make_unique<AsyncUDPSocket>(env, std::move(socket))); SocketAddress addr = client.address(), from; EXPECT_EQ(3, client.SendTo("foo", 3, addr)); EXPECT_TRUE(client.CheckNextPacket("foo", 3, &from)); @@ -58,16 +62,17 @@ void TestUdpInternal(const SocketAddress& loopback) { } void TestTcpInternal(const SocketAddress& loopback) { + const Environment env = CreateTestEnvironment(); PhysicalSocketServer socket_server; AutoSocketServerThread main_thread(&socket_server); TestEchoServer server(&main_thread, loopback); - std::unique_ptr<Socket> socket = absl::WrapUnique( - socket_server.CreateSocket(loopback.family(), SOCK_STREAM)); + std::unique_ptr<Socket> socket = + socket_server.Create(loopback.family(), SOCK_STREAM); ASSERT_THAT(socket, NotNull()); ASSERT_EQ(socket->Bind(loopback), 0); ASSERT_EQ(socket->Connect(server.address()), 0); - auto tcp_socket = std::make_unique<AsyncTCPSocket>(socket.release()); + auto tcp_socket = std::make_unique<AsyncTCPSocket>(env, std::move(socket)); TestClient client(std::move(tcp_socket)); SocketAddress addr = client.address(), from;