From 4cb0995e1f07aa4d517cf197f970213e9c5eda75 Mon Sep 17 00:00:00 2001 From: xiehan <52160700+Barenboim@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:45:30 +0800 Subject: [PATCH] SSL_CTX_up_ref() only on openSSL 1.1 or above. (#1535) --- src/kernel/CommScheduler.cc | 5 ----- src/kernel/CommScheduler.h | 5 +---- src/manager/RouteManager.cc | 31 ++++++++++++++++--------------- src/manager/RouteManager.h | 27 +++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/kernel/CommScheduler.cc b/src/kernel/CommScheduler.cc index 9acee71b..2f668fc4 100644 --- a/src/kernel/CommScheduler.cc +++ b/src/kernel/CommScheduler.cc @@ -21,7 +21,6 @@ #include #include #include -#include #include "CommScheduler.h" #define PTHREAD_COND_TIMEDWAIT(cond, mutex, abstime) \ @@ -85,13 +84,9 @@ int CommSchedTarget::init(const struct sockaddr *addr, socklen_t addrlen, void CommSchedTarget::deinit() { - SSL_CTX *ssl_ctx = this->get_ssl_ctx(); - pthread_cond_destroy(&this->cond); pthread_mutex_destroy(&this->mutex); this->CommTarget::deinit(); - if (ssl_ctx) - SSL_CTX_free(ssl_ctx); } CommTarget *CommSchedTarget::acquire(int wait_timeout) diff --git a/src/kernel/CommScheduler.h b/src/kernel/CommScheduler.h index c89c9755..a3159983 100644 --- a/src/kernel/CommScheduler.h +++ b/src/kernel/CommScheduler.h @@ -61,11 +61,8 @@ public: int ret = this->init(addr, addrlen, connect_timeout, response_timeout, max_connections); - if (ret >= 0 && ssl_ctx) - { - SSL_CTX_up_ref(ssl_ctx); + if (ret >= 0) this->set_ssl(ssl_ctx, ssl_connect_timeout); - } return ret; } diff --git a/src/manager/RouteManager.cc b/src/manager/RouteManager.cc index d2ef8272..698e368c 100644 --- a/src/manager/RouteManager.cc +++ b/src/manager/RouteManager.cc @@ -141,7 +141,7 @@ public: CommSchedObject *request_object; CommSchedGroup *group; std::mutex mutex; - std::vector targets; + std::vector targets; struct list_head breaker_list; uint64_t key; int nleft; @@ -160,28 +160,29 @@ public: int init(const struct RouteParams *params); void deinit(); - void notify_unavailable(CommSchedTarget *target); - void notify_available(CommSchedTarget *target); + void notify_unavailable(RouteManager::RouteTarget *target); + void notify_available(RouteManager::RouteTarget *target); void check_breaker(); private: void free_list(); - CommSchedTarget *create_target(const struct RouteParams *params, - const struct addrinfo *addrinfo); + RouteManager::RouteTarget *create_target(const struct RouteParams *params, + const struct addrinfo *addrinfo); int add_group_targets(const struct RouteParams *params); }; struct __breaker_node { - CommSchedTarget *target; + RouteManager::RouteTarget *target; int64_t timeout; struct list_head breaker_list; }; -CommSchedTarget *RouteResultEntry::create_target(const struct RouteParams *params, - const struct addrinfo *addr) +RouteManager::RouteTarget * +RouteResultEntry::create_target(const struct RouteParams *params, + const struct addrinfo *addr) { - CommSchedTarget *target; + RouteManager::RouteTarget *target; switch (params->transport_type) { @@ -221,7 +222,7 @@ CommSchedTarget *RouteResultEntry::create_target(const struct RouteParams *param int RouteResultEntry::init(const struct RouteParams *params) { const struct addrinfo *addr = params->addrinfo; - CommSchedTarget *target; + RouteManager::RouteTarget *target; if (addr == NULL)//0 { @@ -262,8 +263,8 @@ int RouteResultEntry::init(const struct RouteParams *params) int RouteResultEntry::add_group_targets(const struct RouteParams *params) { + RouteManager::RouteTarget *target; const struct addrinfo *addr; - CommSchedTarget *target; for (addr = params->addrinfo; addr; addr = addr->ai_next) { @@ -322,7 +323,7 @@ void RouteResultEntry::deinit() } } -void RouteResultEntry::notify_unavailable(CommSchedTarget *target) +void RouteResultEntry::notify_unavailable(RouteManager::RouteTarget *target) { if (this->targets.size() <= 1) return; @@ -348,7 +349,7 @@ void RouteResultEntry::notify_unavailable(CommSchedTarget *target) this->nleft--; } -void RouteResultEntry::notify_available(CommSchedTarget *target) +void RouteResultEntry::notify_available(RouteManager::RouteTarget *target) { if (this->targets.size() <= 1 || this->nbreak == 0) return; @@ -574,12 +575,12 @@ int RouteManager::get(enum TransportType type, void RouteManager::notify_unavailable(void *cookie, CommTarget *target) { if (cookie && target) - ((RouteResultEntry *)cookie)->notify_unavailable((CommSchedTarget *)target); + ((RouteResultEntry *)cookie)->notify_unavailable((RouteTarget *)target); } void RouteManager::notify_available(void *cookie, CommTarget *target) { if (cookie && target) - ((RouteResultEntry *)cookie)->notify_available((CommSchedTarget *)target); + ((RouteResultEntry *)cookie)->notify_available((RouteTarget *)target); } diff --git a/src/manager/RouteManager.h b/src/manager/RouteManager.h index 56f1519c..cd660d43 100644 --- a/src/manager/RouteManager.h +++ b/src/manager/RouteManager.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "rbtree.h" #include "WFConnection.h" #include "EndpointParams.h" @@ -45,6 +46,32 @@ public: class RouteTarget : public CommSchedTarget { +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + public: + int init(const struct sockaddr *addr, socklen_t addrlen, SSL_CTX *ssl_ctx, + int connect_timeout, int ssl_connect_timeout, int response_timeout, + size_t max_connections) + { + int ret = this->CommSchedTarget::init(addr, addrlen, ssl_ctx, + connect_timeout, ssl_connect_timeout, + response_timeout, max_connections); + + if (ret >= 0 && ssl_ctx) + SSL_CTX_up_ref(ssl_ctx); + + return ret; + } + + void deinit() + { + SSL_CTX *ssl_ctx = this->get_ssl_ctx(); + + this->CommSchedTarget::deinit(); + if (ssl_ctx) + SSL_CTX_free(ssl_ctx); + } +#endif + public: int state;