From dc4beba9e915440bbfc2e01f05da60348dcba605 Mon Sep 17 00:00:00 2001
From: "Jerry (Xinyu Hou)" <xinyu@synergy-project.org>
Date: Tue, 18 Oct 2016 16:48:32 +0100
Subject: [PATCH] #5680 Stop deleting socket twice if it's been adopted by
 PacketStream

---
 src/lib/net/IListenSocket.h        |  9 +--------
 src/lib/net/SecureListenSocket.cpp | 11 -----------
 src/lib/net/SecureListenSocket.h   |  1 -
 src/lib/net/TCPListenSocket.h      |  1 -
 src/lib/server/ClientListener.cpp  | 10 ----------
 src/lib/server/ClientListener.h    |  2 --
 src/lib/server/Server.cpp          |  7 +------
 7 files changed, 2 insertions(+), 39 deletions(-)

diff --git a/src/lib/net/IListenSocket.h b/src/lib/net/IListenSocket.h
index 905ec831..2cd6fb1b 100644
--- a/src/lib/net/IListenSocket.h
+++ b/src/lib/net/IListenSocket.h
@@ -41,14 +41,7 @@ public:
 	*/
 	virtual IDataSocket*
 						accept() = 0;
-
-	//! Delete connection socket
-	/*!
-	This is used when the socket was created but not adopted by a client
-	proxy.
-	*/
-	virtual void		deleteSocket(void*) = 0;
-
+	
 	//@}
 
 	// ISocket overrides
diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp
index b4c08646..533ae41a 100644
--- a/src/lib/net/SecureListenSocket.cpp
+++ b/src/lib/net/SecureListenSocket.cpp
@@ -93,14 +93,3 @@ SecureListenSocket::accept()
 		throw ex;
 	}
 }
-
-void
-SecureListenSocket::deleteSocket(void* socket)
-{
-	SecureSocketSet::iterator it;
-	it = m_secureSocketSet.find((IDataSocket*)socket);
-	if (it != m_secureSocketSet.end()) {
-		delete *it;
-		m_secureSocketSet.erase(it);
-	}
-}
diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h
index ff19602c..960a8a26 100644
--- a/src/lib/net/SecureListenSocket.h
+++ b/src/lib/net/SecureListenSocket.h
@@ -33,7 +33,6 @@ public:
 	// IListenSocket overrides
 	virtual IDataSocket*
 						accept();
-	void				deleteSocket(void*);
 
 private:
 	typedef std::set<IDataSocket*> SecureSocketSet;
diff --git a/src/lib/net/TCPListenSocket.h b/src/lib/net/TCPListenSocket.h
index cf4469a0..41308622 100644
--- a/src/lib/net/TCPListenSocket.h
+++ b/src/lib/net/TCPListenSocket.h
@@ -43,7 +43,6 @@ public:
 	// IListenSocket overrides
 	virtual IDataSocket*
 						accept();
-	virtual void		deleteSocket(void*) { }
 
 protected:
 	void				setListeningJob();
diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp
index 619ba2a0..a8bef7cf 100644
--- a/src/lib/server/ClientListener.cpp
+++ b/src/lib/server/ClientListener.cpp
@@ -106,12 +106,6 @@ ClientListener::setServer(Server* server)
 	m_server = server;
 }
 
-void
-ClientListener::deleteSocket(void* socket)
-{
-	m_listen->deleteSocket(socket);
-}
-
 ClientProxy*
 ClientListener::getNextClient()
 {
@@ -213,10 +207,6 @@ ClientListener::handleUnknownClient(const Event&, void* vclient)
 	}
 
 	delete unknownClient;
-
-	if (m_useSecureNetwork && !handshakeOk) {
-		deleteSocket(socket);
-	}
 }
 
 void
diff --git a/src/lib/server/ClientListener.h b/src/lib/server/ClientListener.h
index 7674386c..545e163a 100644
--- a/src/lib/server/ClientListener.h
+++ b/src/lib/server/ClientListener.h
@@ -48,8 +48,6 @@ public:
 
 	//@}
 
-	void				deleteSocket(void* socket);
-
 	//! @name accessors
 	//@{
 
diff --git a/src/lib/server/Server.cpp b/src/lib/server/Server.cpp
index d9394ed5..30249f1e 100644
--- a/src/lib/server/Server.cpp
+++ b/src/lib/server/Server.cpp
@@ -1378,10 +1378,7 @@ Server::handleClientDisconnected(const Event&, void* vclient)
 	removeActiveClient(client);
 	removeOldClient(client);
 
-	PacketStreamFilter* streamFileter = dynamic_cast<PacketStreamFilter*>(client->getStream());
-	TCPSocket* socket = dynamic_cast<TCPSocket*>(streamFileter->getStream());
 	delete client;
-	m_clientListener->deleteSocket(socket);
 }
 
 void
@@ -1391,10 +1388,8 @@ Server::handleClientCloseTimeout(const Event&, void* vclient)
 	BaseClientProxy* client = static_cast<BaseClientProxy*>(vclient);
 	LOG((CLOG_NOTE "forced disconnection of client \"%s\"", getName(client).c_str()));
 	removeOldClient(client);
-	PacketStreamFilter* streamFileter = dynamic_cast<PacketStreamFilter*>(client->getStream());
-	TCPSocket* socket = dynamic_cast<TCPSocket*>(streamFileter->getStream());
+
 	delete client;
-	m_clientListener->deleteSocket(socket);
 }
 
 void