#6521 Fixed access violation in SSL sockets
This commit is contained in:
parent
9702d7e8c6
commit
69432151fd
|
@ -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&) {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue