diff --git a/thirdparty/patches/brpc-1.6.0-fix-core-when-enable-SSL.patch b/thirdparty/patches/brpc-1.6.0-fix-core-when-enable-SSL.patch new file mode 100644 index 00000000000000..39cc995ead5631 --- /dev/null +++ b/thirdparty/patches/brpc-1.6.0-fix-core-when-enable-SSL.patch @@ -0,0 +1,70 @@ +From b4fecace384951638e0d092629e7ac922e9b609d Mon Sep 17 00:00:00 2001 +From: warriorpaw +Date: Sun, 25 Jun 2023 14:29:06 +0800 +Subject: [PATCH] fix core when enable SSL (#2180) + +--- + src/brpc/socket.cpp | 15 ++++++++++++--- + src/brpc/socket.h | 3 +++ + 2 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/src/brpc/socket.cpp b/src/brpc/socket.cpp +index 259e09ca..e0a69422 100644 +--- a/src/brpc/socket.cpp ++++ b/src/brpc/socket.cpp +@@ -1569,6 +1569,7 @@ X509* Socket::GetPeerCertificate() const { + if (ssl_state() != SSL_CONNECTED) { + return NULL; + } ++ BAIDU_SCOPED_LOCK(_ssl_session_mutex); + return SSL_get_peer_certificate(_ssl_session); + } + +@@ -1879,11 +1880,15 @@ ssize_t Socket::DoWrite(WriteRequest* req) { + CHECK_EQ(SSL_CONNECTED, ssl_state()); + if (_conn) { + // TODO: Separate SSL stuff from SocketConnection ++ BAIDU_SCOPED_LOCK(_ssl_session_mutex); + return _conn->CutMessageIntoSSLChannel(_ssl_session, data_list, ndata); + } + int ssl_error = 0; +- ssize_t nw = butil::IOBuf::cut_multiple_into_SSL_channel( +- _ssl_session, data_list, ndata, &ssl_error); ++ ssize_t nw = 0; ++ { ++ BAIDU_SCOPED_LOCK(_ssl_session_mutex); ++ nw = butil::IOBuf::cut_multiple_into_SSL_channel(_ssl_session, data_list, ndata, &ssl_error); ++ } + switch (ssl_error) { + case SSL_ERROR_NONE: + break; +@@ -2027,7 +2032,11 @@ ssize_t Socket::DoRead(size_t size_hint) { + + CHECK_EQ(SSL_CONNECTED, ssl_state()); + int ssl_error = 0; +- ssize_t nr = _read_buf.append_from_SSL_channel(_ssl_session, &ssl_error, size_hint); ++ ssize_t nr = 0; ++ { ++ BAIDU_SCOPED_LOCK(_ssl_session_mutex); ++ nr = _read_buf.append_from_SSL_channel(_ssl_session, &ssl_error, size_hint); ++ } + switch (ssl_error) { + case SSL_ERROR_NONE: // `nr' > 0 + break; +diff --git a/src/brpc/socket.h b/src/brpc/socket.h +index cc77168f..bd753f60 100644 +--- a/src/brpc/socket.h ++++ b/src/brpc/socket.h +@@ -827,6 +827,9 @@ private: + AuthContext* _auth_context; + + SSLState _ssl_state; ++ // SSL objects cannot be read and written at the same time. ++ // Use mutex to protect SSL objects when ssl_state is SSL_CONNECTED. ++ mutable butil::Mutex _ssl_session_mutex; + SSL* _ssl_session; // owner + std::shared_ptr _ssl_ctx; + +-- +2.50.1 +