From 663607ff7d0d0e884c4273b4f8a2b0ba488a1d47 Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Sat, 06 Nov 2010 12:47:40 +0000
Subject: [PATCH] Fix potential race condition between handleClose and handleRead events in server filter that can lead to NPEs. (Sync from OpenDS, matthew_swift)

---
 opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPServerFilter.java |  131 +++++++++++++++++++++++++++++--------------
 1 files changed, 88 insertions(+), 43 deletions(-)

diff --git a/opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPServerFilter.java b/opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPServerFilter.java
index 2dbe61b..2017775 100644
--- a/opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPServerFilter.java
+++ b/opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPServerFilter.java
@@ -844,9 +844,14 @@
         final int messageID, final AbandonRequest request)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      conn.handleAbandon(messageID, request);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        conn.handleAbandon(messageID, request);
+      }
     }
 
 
@@ -855,10 +860,16 @@
     public void addRequest(final FilterChainContext ctx, final int messageID,
         final AddRequest request) throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final AddHandler handler = new AddHandler(messageID, ctx.getConnection());
-      conn.handleAdd(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final AddHandler handler = new AddHandler(messageID,
+            ctx.getConnection());
+        conn.handleAdd(messageID, request, handler, handler);
+      }
     }
 
 
@@ -868,11 +879,16 @@
         final int version, final GenericBindRequest bindContext)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final BindHandler handler = new BindHandler(messageID,
-          ctx.getConnection());
-      conn.handleBind(messageID, version, bindContext, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final BindHandler handler = new BindHandler(messageID,
+            ctx.getConnection());
+        conn.handleBind(messageID, version, bindContext, handler, handler);
+      }
     }
 
 
@@ -882,11 +898,16 @@
         final int messageID, final CompareRequest request)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final CompareHandler handler = new CompareHandler(messageID,
-          ctx.getConnection());
-      conn.handleCompare(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final CompareHandler handler = new CompareHandler(messageID,
+            ctx.getConnection());
+        conn.handleCompare(messageID, request, handler, handler);
+      }
     }
 
 
@@ -896,11 +917,16 @@
         final int messageID, final DeleteRequest request)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final DeleteHandler handler = new DeleteHandler(messageID,
-          ctx.getConnection());
-      conn.handleDelete(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final DeleteHandler handler = new DeleteHandler(messageID,
+            ctx.getConnection());
+        conn.handleDelete(messageID, request, handler, handler);
+      }
     }
 
 
@@ -910,12 +936,16 @@
         final FilterChainContext ctx, final int messageID,
         final ExtendedRequest<R> request) throws UnexpectedRequestException
     {
-      final ExtendedHandler<R> handler = new ExtendedHandler<R>(messageID,
-          ctx.getConnection());
-
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      conn.handleExtendedRequest(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final ExtendedHandler<R> handler = new ExtendedHandler<R>(messageID,
+            ctx.getConnection());
+        conn.handleExtendedRequest(messageID, request, handler, handler);
+      }
     }
 
 
@@ -925,11 +955,16 @@
         final int messageID, final ModifyDNRequest request)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final ModifyDNHandler handler = new ModifyDNHandler(messageID,
-          ctx.getConnection());
-      conn.handleModifyDN(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final ModifyDNHandler handler = new ModifyDNHandler(messageID,
+            ctx.getConnection());
+        conn.handleModifyDN(messageID, request, handler, handler);
+      }
     }
 
 
@@ -939,11 +974,16 @@
         final int messageID, final ModifyRequest request)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final ModifyHandler handler = new ModifyHandler(messageID,
-          ctx.getConnection());
-      conn.handleModify(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final ModifyHandler handler = new ModifyHandler(messageID,
+            ctx.getConnection());
+        conn.handleModify(messageID, request, handler, handler);
+      }
     }
 
 
@@ -953,11 +993,16 @@
         final int messageID, final SearchRequest request)
         throws UnexpectedRequestException
     {
-      final ServerConnection<Integer> conn = LDAP_CONNECTION_ATTR.get(
-          ctx.getConnection()).getServerConnection();
-      final SearchHandler handler = new SearchHandler(messageID,
-          ctx.getConnection());
-      conn.handleSearch(messageID, request, handler, handler);
+      final ClientContextImpl clientContext = LDAP_CONNECTION_ATTR.get(ctx
+          .getConnection());
+      if (clientContext != null)
+      {
+        final ServerConnection<Integer> conn = clientContext
+            .getServerConnection();
+        final SearchHandler handler = new SearchHandler(messageID,
+            ctx.getConnection());
+        conn.handleSearch(messageID, request, handler, handler);
+      }
     }
 
 

--
Gitblit v1.10.0