diff --git a/rtc_base/openssl_adapter.cc b/rtc_base/openssl_adapter.cc index d5c51ff495..a9e5858bca 100644 --- a/rtc_base/openssl_adapter.cc +++ b/rtc_base/openssl_adapter.cc @@ -44,7 +44,7 @@ #include "rtc_base/openssl_identity.h" #endif #include "rtc_base/openssl_utility.h" -#include "rtc_base/string_encode.h" +#include "rtc_base/strings/string_builder.h" #include "rtc_base/thread.h" ////////////////////////////////////////////////////////////////////// @@ -166,6 +166,23 @@ static void LogSslError() { namespace rtc { +namespace webrtc_openssl_adapter_internal { + +// Simple O(n^2) implementation is sufficient for current use case. +std::string StrJoin(const std::vector& list, char delimiter) { + RTC_CHECK(!list.empty()); + StringBuilder sb; + sb << list[0]; + for (size_t i = 1; i < list.size(); i++) { + sb.AppendFormat("%c", delimiter); + sb << list[i]; + } + return sb.Release(); +} +} // namespace webrtc_openssl_adapter_internal + +using webrtc_openssl_adapter_internal::StrJoin; + bool OpenSSLAdapter::InitializeSSL() { if (!SSL_library_init()) return false; @@ -354,7 +371,7 @@ int OpenSSLAdapter::BeginSSL() { } if (!elliptic_curves_.empty()) { - SSL_set1_curves_list(ssl_, rtc::join(elliptic_curves_, ':').c_str()); + SSL_set1_curves_list(ssl_, StrJoin(elliptic_curves_, ':').c_str()); } // Now that the initial config is done, transfer ownership of `bio` to the diff --git a/rtc_base/openssl_adapter.h b/rtc_base/openssl_adapter.h index d5e8b9e638..50ae44d7cc 100644 --- a/rtc_base/openssl_adapter.h +++ b/rtc_base/openssl_adapter.h @@ -37,6 +37,14 @@ namespace rtc { +namespace webrtc_openssl_adapter_internal { + +// Local definition, since absl::StrJoin is not allow-listed. Declared in header +// file only for unittests. +std::string StrJoin(const std::vector& list, char delimiter); + +} // namespace webrtc_openssl_adapter_internal + class OpenSSLAdapter final : public SSLAdapter, public MessageHandlerAutoCleanup { public: diff --git a/rtc_base/openssl_adapter_unittest.cc b/rtc_base/openssl_adapter_unittest.cc index 0805cba56c..21da777e7a 100644 --- a/rtc_base/openssl_adapter_unittest.cc +++ b/rtc_base/openssl_adapter_unittest.cc @@ -113,4 +113,19 @@ TEST(OpenSSLAdapterFactoryTest, CreateWorksWithCustomVerifier) { EXPECT_NE(simple_adapter, nullptr); } +TEST(StrJoinTest, SingleElement) { + EXPECT_EQ(webrtc_openssl_adapter_internal::StrJoin({"a"}, ','), "a"); +} + +TEST(StrJoinTest, TwoElements) { + EXPECT_EQ(webrtc_openssl_adapter_internal::StrJoin({"first", "second"}, ':'), + "first:second"); +} + +TEST(StrJoinTest, WithEmptyElement) { + EXPECT_EQ( + webrtc_openssl_adapter_internal::StrJoin({"first", "", "second"}, ':'), + "first::second"); +} + } // namespace rtc diff --git a/rtc_base/string_encode.cc b/rtc_base/string_encode.cc index 5129b24473..84361ae142 100644 --- a/rtc_base/string_encode.cc +++ b/rtc_base/string_encode.cc @@ -174,28 +174,6 @@ bool tokenize_first(absl::string_view source, return true; } -std::string join(const std::vector& source, char delimiter) { - if (source.size() == 0) { - return std::string(); - } - // Find length of the string to be returned to pre-allocate memory. - size_t source_string_length = 0; - for (size_t i = 0; i < source.size(); ++i) { - source_string_length += source[i].length(); - } - - // Build the joined string. - std::string joined_string; - joined_string.reserve(source_string_length + source.size() - 1); - for (size_t i = 0; i < source.size(); ++i) { - if (i != 0) { - joined_string += delimiter; - } - joined_string += source[i]; - } - return joined_string; -} - std::vector split(absl::string_view source, char delimiter) { std::vector fields; size_t last = 0; diff --git a/rtc_base/string_encode.h b/rtc_base/string_encode.h index 3ed034bbb4..6bbb0088f3 100644 --- a/rtc_base/string_encode.h +++ b/rtc_base/string_encode.h @@ -43,10 +43,6 @@ size_t hex_decode_with_delimiter(ArrayView buffer, absl::string_view source, char delimiter); -// Joins the source vector of strings into a single string, with each -// field in source being separated by delimiter. No trailing delimiter is added. -std::string join(const std::vector& source, char delimiter); - // Splits the source string into multiple fields separated by delimiter, // with duplicates of delimiter creating empty fields. Empty input produces a // single, empty, field.