move deletion of accepted client socket pointers to ClientListener
where it belongs. previously SecureListenSocket would delete the client socket but TCPListenSocket would not. PacketStreamFilter would then attempt to delete the socket regardless of what type it was. this would cause an access violation when SecureListenSocket attempted to delete the socket again. fixes #3
This commit is contained in:
parent
8fb904285b
commit
ce8c65f8f9
|
@ -37,15 +37,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()
|
||||
{
|
||||
|
@ -74,8 +65,6 @@ SecureListenSocket::accept()
|
|||
|
||||
socket->secureAccept();
|
||||
|
||||
m_secureSocketSet.insert(socket);
|
||||
|
||||
return dynamic_cast<IDataSocket*>(socket);
|
||||
}
|
||||
catch (XArchNetwork&) {
|
||||
|
|
|
@ -28,14 +28,8 @@ class SecureListenSocket : public TCPListenSocket{
|
|||
public:
|
||||
SecureListenSocket(IEventQueue* events,
|
||||
SocketMultiplexer* socketMultiplexer);
|
||||
~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
|
||||
barrier::IStream* stream = new PacketStreamFilter(m_events, socket, true);
|
||||
barrier::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