From a567a3136472c3cb288026f03f71243b3d99b513 Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Thu, 21 Jul 2011 12:38:09 +0000
Subject: [PATCH] Fix issue OPENDJ-239.

---
 opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPConnection.java |   44 ++++++++++++++++++++++++++++++--------------
 1 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPConnection.java b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPConnection.java
index e0ccf0d..ed6f75b 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPConnection.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPConnection.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2010 Sun Microsystems, Inc.
+ *      Portions Copyright 2011 ForgeRock AS
  */
 
 package com.forgerock.opendj.ldap;
@@ -293,13 +294,6 @@
         future.adaptErrorResult(connectionInvalidReason);
         return future;
       }
-      if (!bindOrStartTLSInProgress.compareAndSet(false, true))
-      {
-        future.setResultOrError(Responses.newBindResult(
-            ResultCode.OPERATIONS_ERROR).setDiagnosticMessage(
-            "Bind or Start TLS operation in progress"));
-        return future;
-      }
       if (!pendingRequests.isEmpty())
       {
         future.setResultOrError(Responses.newBindResult(
@@ -308,6 +302,14 @@
         return future;
       }
 
+      if (!bindOrStartTLSInProgress.compareAndSet(false, true))
+      {
+        future.setResultOrError(Responses.newBindResult(
+            ResultCode.OPERATIONS_ERROR).setDiagnosticMessage(
+            "Bind or Start TLS operation in progress"));
+        return future;
+      }
+
       pendingRequests.put(messageID, future);
     }
 
@@ -331,6 +333,8 @@
     {
       pendingRequests.remove(messageID);
 
+      bindOrStartTLSInProgress.set(false);
+
       // FIXME: what other sort of IOExceptions can be thrown?
       // FIXME: Is this the best result code?
       final Result errorResult = Responses.newResult(
@@ -499,13 +503,6 @@
         future.adaptErrorResult(connectionInvalidReason);
         return future;
       }
-      if (!bindOrStartTLSInProgress.compareAndSet(false, true))
-      {
-        future.setResultOrError(request.getResultDecoder()
-            .newExtendedErrorResult(ResultCode.OPERATIONS_ERROR, "",
-                "Bind or Start TLS operation in progress"));
-        return future;
-      }
       if (request.getOID().equals(StartTLSExtendedRequest.OID))
       {
         if (!pendingRequests.isEmpty())
@@ -520,6 +517,24 @@
           future.setResultOrError(request.getResultDecoder()
               .newExtendedErrorResult(ResultCode.OPERATIONS_ERROR, "",
                   "This connection is already TLS enabled"));
+          return future;
+        }
+        if (!bindOrStartTLSInProgress.compareAndSet(false, true))
+        {
+          future.setResultOrError(request.getResultDecoder()
+                .newExtendedErrorResult(ResultCode.OPERATIONS_ERROR, "",
+                    "Bind or Start TLS operation in progress"));
+          return future;
+        }
+      }
+      else
+      {
+        if (bindOrStartTLSInProgress.get())
+        {
+          future.setResultOrError(request.getResultDecoder()
+                .newExtendedErrorResult(ResultCode.OPERATIONS_ERROR, "",
+                    "Bind or Start TLS operation in progress"));
+          return future;
         }
       }
       pendingRequests.put(messageID, future);
@@ -541,6 +556,7 @@
     catch (final IOException e)
     {
       pendingRequests.remove(messageID);
+      bindOrStartTLSInProgress.set(false);
 
       // FIXME: what other sort of IOExceptions can be thrown?
       // FIXME: Is this the best result code?

--
Gitblit v1.10.0