From 741434f68eb3494bb222f4386d56ce0acb32a1c6 Mon Sep 17 00:00:00 2001
From: sin <sin@localhost>
Date: Tue, 29 Sep 2009 17:58:07 +0000
Subject: [PATCH] Additional fix for issue 4181: NPE in DSML search requests.

---
 opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java |   26 +++++++++++++++++++++++++-
 1 files changed, 25 insertions(+), 1 deletions(-)

diff --git a/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java b/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
index 73324d7..e54ac1c 100644
--- a/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
+++ b/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
@@ -43,6 +43,7 @@
 import org.opends.server.protocols.ldap.LDAPConstants;
 import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.protocols.ldap.LDAPMessage;
+import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.protocols.ldap.SearchRequestProtocolOp;
 import org.opends.server.protocols.ldap.SearchResultEntryProtocolOp;
 import org.opends.server.protocols.ldap.SearchResultDoneProtocolOp;
@@ -52,6 +53,7 @@
 import org.opends.server.types.LDAPException;
 import org.opends.server.types.RawFilter;
 import org.opends.server.types.SearchScope;
+import static org.opends.messages.ProtocolMessages.*;
 
 
 
@@ -271,6 +273,7 @@
    *         information.
    */
   private static LDAPFilter createSubstringFilter(SubstringFilter sf)
+        throws LDAPException
   {
     List<String> anys = sf.getAny();
     ArrayList<ByteString> subAnyElements = new ArrayList<ByteString>(anys
@@ -280,6 +283,12 @@
     {
       subAnyElements.add(ByteString.valueOf(s));
     }
+    if(sf.getInitial() == null && subAnyElements.isEmpty()
+            && sf.getFinal()==null)
+    {
+      Message message = ERR_LDAP_FILTER_DECODE_NULL.get();
+      throw new LDAPException(LDAPResultCode.PROTOCOL_ERROR, message);
+    }
     return LDAPFilter.createSubstringFilter(sf.getName(), sf.getInitial()==null?
       null:ByteString.valueOf(sf.getInitial()), subAnyElements,
       sf.getFinal()==null?null:ByteString.valueOf(sf.getFinal()));
@@ -514,7 +523,22 @@
         int resultCode = 0;
         Message errorMessage = null;
         LDAPMessage responseMessage = connection.getLDAPReader().readMessage();
-
+        if(responseMessage == null)
+        {
+          //The server disconnected silently. At this point we don't know if it
+          // is a protocol error or anything else. Since we didn't hear from
+          // the server , we have a reason to believe that the server doesn't
+          // want to handle this request. Let us return unavailable error
+          // code to the client to cover possible cases.
+          Message message = ERR_UNEXPECTED_CONNECTION_CLOSURE.get();
+          LDAPResult result = objFactory.createLDAPResult();
+          ResultCode code = objFactory.createResultCode();
+          code.setCode(LDAPResultCode.UNAVAILABLE);
+          result.setResultCode(code);
+          result.setErrorMessage(message.toString());
+          searchResponse.setSearchResultDone(result);
+          return searchResponse;
+        }
         opType = responseMessage.getProtocolOpType();
         switch (opType)
         {

--
Gitblit v1.10.0