From 35d877e12843b1047b70e3cbfcd4a8e437c29403 Mon Sep 17 00:00:00 2001 From: ElCruncharino <59633028+ElCruncharino@users.noreply.github.com> Date: Sun, 19 Jul 2026 00:59:20 -0400 Subject: [PATCH] refactor: make SecureSocket write-retry state per connection doWrite()'s retry/buffer state was held in function-local static variables, shared across every SecureSocket instance in the process rather than per connection. Move it to instance members, and simplify secureRead()/secureWrite()'s retry counters (also static, but not load-bearing across calls) to plain locals. --- src/lib/net/SecureSocket.cpp | 29 +++++++++++++---------------- src/lib/net/SecureSocket.h | 5 +++++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/lib/net/SecureSocket.cpp b/src/lib/net/SecureSocket.cpp index b32b60533..78290309e 100644 --- a/src/lib/net/SecureSocket.cpp +++ b/src/lib/net/SecureSocket.cpp @@ -66,6 +66,7 @@ SecureSocket::SecureSocket( SecureSocket::~SecureSocket() { freeSSL(); + free(m_writeStaticBuffer); } void SecureSocket::close() @@ -174,26 +175,22 @@ TCPSocket::JobResult SecureSocket::doRead() TCPSocket::JobResult SecureSocket::doWrite() { using enum JobResult; - static bool s_retry = false; - static int s_retrySize = 0; - static int s_staticBufferSize = 0; - static void *s_staticBuffer = nullptr; // write data int bufferSize = 0; int bytesWrote = 0; int status = 0; - if (s_retry) { - bufferSize = s_retrySize; + if (m_writeRetry) { + bufferSize = m_writeRetrySize; } else { bufferSize = m_outputBuffer.getSize(); if (bufferSize != 0) { - if (bufferSize > s_staticBufferSize) { - s_staticBuffer = realloc(s_staticBuffer, bufferSize); - s_staticBufferSize = bufferSize; + if (bufferSize > m_writeStaticBufferSize) { + m_writeStaticBuffer = realloc(m_writeStaticBuffer, bufferSize); + m_writeStaticBufferSize = bufferSize; } - memcpy(s_staticBuffer, m_outputBuffer.peek(bufferSize), bufferSize); + memcpy(m_writeStaticBuffer, m_outputBuffer.peek(bufferSize), bufferSize); } } @@ -202,14 +199,14 @@ TCPSocket::JobResult SecureSocket::doWrite() } if (isSecureReady()) { - status = secureWrite(s_staticBuffer, bufferSize, bytesWrote); + status = secureWrite(m_writeStaticBuffer, bufferSize, bytesWrote); if (status > 0) { - s_retry = false; + m_writeRetry = false; } else if (status < 0) { return Break; } else if (status == 0) { - s_retry = true; - s_retrySize = bufferSize; + m_writeRetry = true; + m_writeRetrySize = bufferSize; return New; } } else { @@ -232,7 +229,7 @@ int SecureSocket::secureRead(void *buffer, int size, int &read) LOG_VERBOSE("reading secure socket"); read = SSL_read(m_ssl->m_ssl, buffer, size); - static int retry; + int retry = 0; // Check result will cleanup the connection in the case of a fatal checkResult(read, retry); @@ -260,7 +257,7 @@ int SecureSocket::secureWrite(const void *buffer, int size, int &wrote) wrote = SSL_write(m_ssl->m_ssl, buffer, size); - static int retry; + int retry = 0; // Check result will cleanup the connection in the case of a fatal checkResult(wrote, retry); diff --git a/src/lib/net/SecureSocket.h b/src/lib/net/SecureSocket.h index 101b4fd94..79d9f26bc 100644 --- a/src/lib/net/SecureSocket.h +++ b/src/lib/net/SecureSocket.h @@ -96,4 +96,9 @@ private: bool m_secureReady = false; bool m_fatal = false; SecurityLevel m_securityLevel = SecurityLevel::Encrypted; + + bool m_writeRetry = false; + int m_writeRetrySize = 0; + int m_writeStaticBufferSize = 0; + void *m_writeStaticBuffer = nullptr; };