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