From 0b4a2e0e5b1c58e8329026f17c0435445d46c4f9 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sat, 24 May 2025 21:26:13 -0400 Subject: [PATCH] chore: use std::unique_ptr for IDataSocket port-of input-leap/836e08b0642ad158ecedc44e59a3bd3c61b56141 ported-by sithlord48 --- src/lib/net/IListenSocket.h | 4 +++- src/lib/net/SecureListenSocket.cpp | 21 +++++++++------------ src/lib/net/SecureListenSocket.h | 2 +- src/lib/net/TCPListenSocket.cpp | 16 ++++++---------- src/lib/net/TCPListenSocket.h | 2 +- src/lib/server/ClientListener.cpp | 15 +++++++-------- 6 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/lib/net/IListenSocket.h b/src/lib/net/IListenSocket.h index 1089bd718..ba487803a 100644 --- a/src/lib/net/IListenSocket.h +++ b/src/lib/net/IListenSocket.h @@ -10,6 +10,8 @@ #include "base/EventTypes.h" #include "net/ISocket.h" +#include + class IDataSocket; //! Listen socket interface @@ -29,7 +31,7 @@ public: data stream. Returns nullptr if no socket is waiting to be accepted. This is only valid after a call to \c bind(). */ - virtual IDataSocket *accept() = 0; + virtual std::unique_ptr accept() = 0; //@} diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp index bf00ab1d2..71419f5b4 100644 --- a/src/lib/net/SecureListenSocket.cpp +++ b/src/lib/net/SecureListenSocket.cpp @@ -32,16 +32,16 @@ SecureListenSocket::SecureListenSocket( // do nothing } -IDataSocket *SecureListenSocket::accept() +std::unique_ptr SecureListenSocket::accept() { - SecureSocket *socket = nullptr; + std::unique_ptr socket; try { - socket = new SecureSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr), m_securityLevel); + socket = std::make_unique( + m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr), m_securityLevel + ); socket->initSsl(true); - if (socket != nullptr) { - setListeningJob(); - } + setListeningJob(); // default location of the TLS cert file in users dir std::string certificateFilename = Settings::value(Settings::Security::Certificate).toString().toStdString(); @@ -52,22 +52,19 @@ IDataSocket *SecureListenSocket::accept() } if (!socket->loadCertificates(certificateFilename)) { - delete socket; return nullptr; } socket->secureAccept(); - return dynamic_cast(socket); + return socket; } catch (XArchNetwork &) { - if (socket != nullptr) { - delete socket; + if (socket) { setListeningJob(); } return nullptr; } catch (std::exception &ex) { - if (socket != nullptr) { - delete socket; + if (socket) { setListeningJob(); } throw ex; diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h index 75a792bf2..457abc893 100644 --- a/src/lib/net/SecureListenSocket.h +++ b/src/lib/net/SecureListenSocket.h @@ -25,7 +25,7 @@ public: ); // IListenSocket overrides - IDataSocket *accept() override; + std::unique_ptr accept() override; private: const SecurityLevel m_securityLevel; diff --git a/src/lib/net/TCPListenSocket.cpp b/src/lib/net/TCPListenSocket.cpp index f2bf4fee3..fd6ff7045 100644 --- a/src/lib/net/TCPListenSocket.cpp +++ b/src/lib/net/TCPListenSocket.cpp @@ -91,24 +91,20 @@ void *TCPListenSocket::getEventTarget() const return const_cast(static_cast(this)); } -IDataSocket *TCPListenSocket::accept() +std::unique_ptr TCPListenSocket::accept() { - IDataSocket *socket = nullptr; + std::unique_ptr socket; try { - socket = new TCPSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr)); - if (socket != nullptr) { - setListeningJob(); - } + socket = std::make_unique(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr)); + setListeningJob(); return socket; } catch (XArchNetwork &) { - if (socket != nullptr) { - delete socket; + if (socket) { setListeningJob(); } return nullptr; } catch (std::exception &ex) { - if (socket != nullptr) { - delete socket; + if (socket) { setListeningJob(); } throw ex; diff --git a/src/lib/net/TCPListenSocket.h b/src/lib/net/TCPListenSocket.h index 7a97bd9c1..806c0d6e0 100644 --- a/src/lib/net/TCPListenSocket.h +++ b/src/lib/net/TCPListenSocket.h @@ -36,7 +36,7 @@ public: void *getEventTarget() const override; // IListenSocket overrides - IDataSocket *accept() override; + std::unique_ptr accept() override; protected: void setListeningJob(); diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp index 3219f6d64..2dd7d1073 100644 --- a/src/lib/server/ClientListener.cpp +++ b/src/lib/server/ClientListener.cpp @@ -124,24 +124,23 @@ void ClientListener::removeUnknownClient(ClientProxyUnknown *unknownClient) void ClientListener::handleClientConnecting(const Event &, void *) { // accept client connection - IDataSocket *socket = m_listen->accept(); + auto socket = m_listen->accept(); - if (socket == nullptr) { + if (!socket) return; - } - m_clientSockets.insert(socket); + auto rawSocketPointer = socket.release(); + m_clientSockets.insert(rawSocketPointer); m_events->adoptHandler( - EventTypes::ClientListenerAccepted, socket->getEventTarget(), - new TMethodEventJob(this, &ClientListener::handleClientAccepted, socket) + EventTypes::ClientListenerAccepted, rawSocketPointer->getEventTarget(), + new TMethodEventJob(this, &ClientListener::handleClientAccepted, rawSocketPointer) ); // When using non SSL, server accepts clients immediately, while SSL // has to call secure accept which may require retry if (m_securityLevel == SecurityLevel::PlainText) { - - m_events->addEvent(Event(EventTypes::ClientListenerAccepted, socket->getEventTarget())); + m_events->addEvent(Event(EventTypes::ClientListenerAccepted, rawSocketPointer->getEventTarget())); } }