#6521 Fixed access violation in SSL sockets

This commit is contained in:
walker0643 2018-01-29 12:57:17 -05:00 committed by Nick Bolton
parent 1709984f1e
commit fb27752e3e
4 changed files with 26 additions and 18 deletions

View File

@ -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<IDataSocket*>(socket);
}
catch (XArchNetwork&) {

View File

@ -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<IDataSocket*> SecureSocketSet;
SecureSocketSet m_secureSocketSet;
};

View File

@ -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<ClientListener>(this,
@ -149,7 +152,7 @@ ClientListener::handleClientAccepted(const Event&, void* vsocket)
IDataSocket* socket = static_cast<IDataSocket*>(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<IDataSocket*>(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();
}

View File

@ -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<ClientProxyUnknown*> NewClients;
typedef std::deque<ClientProxy*> WaitingClients;
typedef std::set<IDataSocket*> ClientSockets;
IListenSocket* m_listen;
ISocketFactory* m_socketFactory;
@ -84,4 +87,5 @@ private:
Server* m_server;
IEventQueue* m_events;
bool m_useSecureNetwork;
ClientSockets m_clientSockets;
};