aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rtc_base/openssl_adapter.cc26
-rw-r--r--rtc_base/openssl_adapter.h11
2 files changed, 18 insertions, 19 deletions
diff --git a/rtc_base/openssl_adapter.cc b/rtc_base/openssl_adapter.cc
index a9e5858bca..7ac922041d 100644
--- a/rtc_base/openssl_adapter.cc
+++ b/rtc_base/openssl_adapter.cc
@@ -33,8 +33,8 @@
#endif
#include "absl/memory/memory.h"
+#include "api/units/time_delta.h"
#include "rtc_base/checks.h"
-#include "rtc_base/location.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_conversions.h"
#include "rtc_base/openssl.h"
@@ -166,6 +166,8 @@ static void LogSslError() {
namespace rtc {
+using ::webrtc::TimeDelta;
+
namespace webrtc_openssl_adapter_internal {
// Simple O(n^2) implementation is sufficient for current use case.
@@ -392,7 +394,7 @@ int OpenSSLAdapter::ContinueSSL() {
RTC_DCHECK(state_ == SSL_CONNECTING);
// Clear the DTLS timer
- Thread::Current()->Clear(this, MSG_TIMEOUT);
+ timer_.reset();
int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_);
switch (SSL_get_error(ssl_, code)) {
@@ -420,10 +422,10 @@ int OpenSSLAdapter::ContinueSSL() {
RTC_LOG(LS_VERBOSE) << " -- error want read";
struct timeval timeout;
if (DTLSv1_get_timeout(ssl_, &timeout)) {
- int delay = timeout.tv_sec * 1000 + timeout.tv_usec / 1000;
-
- Thread::Current()->PostDelayed(RTC_FROM_HERE, delay, this, MSG_TIMEOUT,
- 0);
+ TimeDelta delay = TimeDelta::Seconds(timeout.tv_sec) +
+ TimeDelta::Micros(timeout.tv_usec);
+ Thread::Current()->PostDelayedTask(
+ SafeTask(timer_.flag(), [this] { OnTimeout(); }), delay);
}
break;
@@ -470,7 +472,7 @@ void OpenSSLAdapter::Cleanup() {
identity_.reset();
// Clear the DTLS timer
- Thread::Current()->Clear(this, MSG_TIMEOUT);
+ timer_.reset();
}
int OpenSSLAdapter::DoSslWrite(const void* pv, size_t cb, int* error) {
@@ -673,12 +675,10 @@ bool OpenSSLAdapter::IsResumedSession() {
return (ssl_ && SSL_session_reused(ssl_) == 1);
}
-void OpenSSLAdapter::OnMessage(Message* msg) {
- if (MSG_TIMEOUT == msg->message_id) {
- RTC_LOG(LS_INFO) << "DTLS timeout expired";
- DTLSv1_handle_timeout(ssl_);
- ContinueSSL();
- }
+void OpenSSLAdapter::OnTimeout() {
+ RTC_LOG(LS_INFO) << "DTLS timeout expired";
+ DTLSv1_handle_timeout(ssl_);
+ ContinueSSL();
}
void OpenSSLAdapter::OnConnectEvent(Socket* socket) {
diff --git a/rtc_base/openssl_adapter.h b/rtc_base/openssl_adapter.h
index 50ae44d7cc..3ce33e1f5b 100644
--- a/rtc_base/openssl_adapter.h
+++ b/rtc_base/openssl_adapter.h
@@ -20,8 +20,8 @@
#include <vector>
#include "absl/strings/string_view.h"
+#include "api/task_queue/pending_task_safety_flag.h"
#include "rtc_base/buffer.h"
-#include "rtc_base/message_handler.h"
#ifdef OPENSSL_IS_BORINGSSL
#include "rtc_base/boringssl_identity.h"
#else
@@ -45,8 +45,7 @@ std::string StrJoin(const std::vector<std::string>& list, char delimiter);
} // namespace webrtc_openssl_adapter_internal
-class OpenSSLAdapter final : public SSLAdapter,
- public MessageHandlerAutoCleanup {
+class OpenSSLAdapter final : public SSLAdapter {
public:
static bool InitializeSSL();
static bool CleanupSSL();
@@ -114,17 +113,15 @@ class OpenSSLAdapter final : public SSLAdapter,
SSL_ERROR
};
- enum { MSG_TIMEOUT };
-
int BeginSSL();
int ContinueSSL();
void Error(absl::string_view context, int err, bool signal = true);
void Cleanup();
+ void OnTimeout();
// Return value and arguments have the same meanings as for Send; `error` is
// an output parameter filled with the result of SSL_get_error.
int DoSslWrite(const void* pv, size_t cb, int* error);
- void OnMessage(Message* msg) override;
bool SSLPostConnectionCheck(SSL* ssl, absl::string_view host);
#if !defined(NDEBUG)
@@ -185,6 +182,8 @@ class OpenSSLAdapter final : public SSLAdapter,
std::vector<std::string> elliptic_curves_;
// Holds the result of the call to run of the ssl_cert_verify_->Verify()
bool custom_cert_verifier_status_;
+ // Flag to cancel pending timeout task.
+ webrtc::ScopedTaskSafety timer_;
};
// The OpenSSLAdapterFactory is responsbile for creating multiple new