From 69432151fd18ed0ba964ea06be47370570d50f1f Mon Sep 17 00:00:00 2001 From: walker0643 Date: Mon, 29 Jan 2018 12:57:17 -0500 Subject: [PATCH] #6521 Fixed access violation in SSL sockets --- src/lib/net/SecureListenSocket.cpp | 11 ----------- src/lib/net/SecureListenSocket.h | 7 +------ src/lib/server/ClientListener.cpp | 22 +++++++++++++++++++++- src/lib/server/ClientListener.h | 4 ++++ 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp index 75036298..a3e6447f 100644 --- a/src/lib/net/SecureListenSocket.cpp +++ b/src/lib/net/SecureListenSocket.cpp @@ -38,15 +38,6 @@ SecureListenSocket::SecureListenSocket( { } -SecureListenSocket::~SecureListenSocket() -{ - SecureSocketSet::iterator it; - for (it = m_secureSocketSet.begin(); it != m_secureSocketSet.end(); it++) { - delete *it; - } - m_secureSocketSet.clear(); -} - IDataSocket* SecureListenSocket::accept() { @@ -75,8 +66,6 @@ SecureListenSocket::accept() socket->secureAccept(); - m_secureSocketSet.insert(socket); - return dynamic_cast(socket); } catch (XArchNetwork&) { diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h index 5abf4c51..ba295eff 100644 --- a/src/lib/net/SecureListenSocket.h +++ b/src/lib/net/SecureListenSocket.h @@ -28,14 +28,9 @@ class SecureListenSocket : public TCPListenSocket{ public: SecureListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family); - ~SecureListenSocket(); + // IListenSocket overrides virtual IDataSocket* accept(); - -private: - typedef std::set SecureSocketSet; - - SecureSocketSet m_secureSocketSet; }; diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp index d7ee675a..2aeca1f3 100644 --- a/src/lib/server/ClientListener.cpp +++ b/src/lib/server/ClientListener.cpp @@ -96,6 +96,7 @@ ClientListener::~ClientListener() m_events->removeHandler(m_events->forIListenSocket().connecting(), m_listen); cleanupListenSocket(); + cleanupClientSockets(); delete m_socketFactory; } @@ -128,6 +129,8 @@ ClientListener::handleClientConnecting(const Event&, void*) return; } + m_clientSockets.insert(socket); + m_events->adoptHandler(m_events->forClientListener().accepted(), socket->getEventTarget(), new TMethodEventJob(this, @@ -149,7 +152,7 @@ ClientListener::handleClientAccepted(const Event&, void* vsocket) IDataSocket* socket = static_cast(vsocket); // filter socket messages, including a packetizing filter - synergy::IStream* stream = new PacketStreamFilter(m_events, socket, true); + synergy::IStream* stream = new PacketStreamFilter(m_events, socket, false); assert(m_server != NULL); // create proxy for unknown client @@ -221,7 +224,14 @@ ClientListener::handleClientDisconnected(const Event&, void* vclient) m_waitingClients.erase(i); m_events->removeHandler(m_events->forClientProxy().disconnected(), client); + + // pull out the socket before deleting the client so + // we know which socket we no longer need + IDataSocket* socket = static_cast(client->getStream()); delete client; + m_clientSockets.erase(socket); + delete socket; + break; } } @@ -232,3 +242,13 @@ ClientListener::cleanupListenSocket() { delete m_listen; } + +void +ClientListener::cleanupClientSockets() +{ + ClientSockets::iterator it; + for (it = m_clientSockets.begin(); it != m_clientSockets.end(); it++) { + delete *it; + } + m_clientSockets.clear(); +} diff --git a/src/lib/server/ClientListener.h b/src/lib/server/ClientListener.h index 4b69f0d9..5c3af3c3 100644 --- a/src/lib/server/ClientListener.h +++ b/src/lib/server/ClientListener.h @@ -31,6 +31,7 @@ class IListenSocket; class ISocketFactory; class Server; class IEventQueue; +class IDataSocket; class ClientListener { public: @@ -72,10 +73,12 @@ private: void handleClientDisconnected(const Event&, void*); void cleanupListenSocket(); + void cleanupClientSockets(); private: typedef std::set NewClients; typedef std::deque WaitingClients; + typedef std::set ClientSockets; IListenSocket* m_listen; ISocketFactory* m_socketFactory; @@ -84,4 +87,5 @@ private: Server* m_server; IEventQueue* m_events; bool m_useSecureNetwork; + ClientSockets m_clientSockets; };