| From b4fecace384951638e0d092629e7ac922e9b609d Mon Sep 17 00:00:00 2001 |
| From: warriorpaw <z.warriorpaw@gmail.com> |
| 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<SocketSSLContext> _ssl_ctx; |
| |
| -- |
| 2.50.1 |
| |