From aa62a3550f96cac31d081254169939a46c9a387d Mon Sep 17 00:00:00 2001
From: gbellato <gbellato@localhost>
Date: Thu, 11 Jun 2009 13:18:13 +0000
Subject: [PATCH] While investigating issue 4046 I've noticed that in case of an error during the SSL handshake that is used for the authentication of the replication session the associated socket is not correctly closed by the replication code. The socket therefore is left open and the associated resources are never free.

---
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java |   30 +++++++++++++++++++++---------
 1 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 8c21f77..e72f3f7 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -248,8 +248,6 @@
 
   void runListen()
   {
-    Socket newSocket;
-
     // wait for the connect thread to find other replication
     // servers in the topology before starting to accept connections
     // from the ldap servers.
@@ -272,16 +270,30 @@
       // Read incoming messages and create LDAP or ReplicationServer listener
       // and Publisher.
 
+      ProtocolSession session;
+      Socket newSocket = null;
+
       try
       {
-        newSocket =  listenSocket.accept();
-        newSocket.setTcpNoDelay(true);
-        newSocket.setKeepAlive(true);
-        ProtocolSession session =
-             replSessionSecurity.createServerSession(newSocket,
-             ReplSessionSecurity.HANDSHAKE_TIMEOUT);
-        if (session == null) // Error, go back to accept
+        try
+        {
+          newSocket = listenSocket.accept();
+          newSocket.setTcpNoDelay(true);
+          newSocket.setKeepAlive(true);
+          session =
+            replSessionSecurity.createServerSession(newSocket,
+                ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+          if (session == null) // Error, go back to accept
+            continue;
+        }
+        catch (Exception e)
+        {
+          // If problems happen during the SSL handshake, it is necessary
+          // to close the socket to free the associated resources.
+          if (newSocket != null)
+            newSocket.close();
           continue;
+        }
 
         ReplicationMsg msg = session.receive();
 

--
Gitblit v1.10.0