From 42ba26a163635f76a5f43af52233ca5dc103d9d1 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 17 Nov 2015 20:29:15 +0000
Subject: [PATCH] OPENDJ-2395: fix NPE during undefined indexed search

---
 opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java |    8 ++++++++
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java               |   44 +++++++++++++++++++++++++++++++-------------
 2 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
index b8e2872..740a4ca 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -672,41 +672,59 @@
       IndexFilterType indexFilterType, SearchFilter filter) throws DecodeException
   {
     MatchingRule rule;
-    Assertion assertion;
     switch (indexFilterType)
     {
     case EQUALITY:
       rule = filter.getAttributeType().getEqualityMatchingRule();
-      assertion = rule.getAssertion(filter.getAssertionValue());
-      return assertion.createIndexQuery(indexQueryFactory);
+      if (rule != null) {
+        Assertion assertion = rule.getAssertion(filter.getAssertionValue());
+        return assertion.createIndexQuery(indexQueryFactory);
+      }
+      break;
 
     case PRESENCE:
       return indexQueryFactory.createMatchAllQuery();
 
     case GREATER_OR_EQUAL:
       rule = filter.getAttributeType().getOrderingMatchingRule();
-      assertion = rule.getGreaterOrEqualAssertion(filter.getAssertionValue());
-      return assertion.createIndexQuery(indexQueryFactory);
+      if (rule != null) {
+        Assertion assertion = rule.getGreaterOrEqualAssertion(filter.getAssertionValue());
+        return assertion.createIndexQuery(indexQueryFactory);
+      }
+      break;
 
     case LESS_OR_EQUAL:
       rule = filter.getAttributeType().getOrderingMatchingRule();
-      assertion = rule.getLessOrEqualAssertion(filter.getAssertionValue());
-      return assertion.createIndexQuery(indexQueryFactory);
+      if (rule != null) {
+        Assertion assertion = rule.getLessOrEqualAssertion(filter.getAssertionValue());
+        return assertion.createIndexQuery(indexQueryFactory);
+      }
+      break;
 
     case SUBSTRING:
       rule = filter.getAttributeType().getSubstringMatchingRule();
-      assertion = rule.getSubstringAssertion(
-          filter.getSubInitialElement(), filter.getSubAnyElements(), filter.getSubFinalElement());
-      return assertion.createIndexQuery(indexQueryFactory);
+      if (rule != null) {
+        Assertion assertion = rule.getSubstringAssertion(filter.getSubInitialElement(),
+                                                         filter.getSubAnyElements(),
+                                                         filter.getSubFinalElement());
+        return assertion.createIndexQuery(indexQueryFactory);
+      }
+      break;
 
     case APPROXIMATE:
       rule = filter.getAttributeType().getApproximateMatchingRule();
-      assertion = rule.getAssertion(filter.getAssertionValue());
-      return assertion.createIndexQuery(indexQueryFactory);
+      if (rule != null) {
+        Assertion assertion = rule.getAssertion(filter.getAssertionValue());
+        return assertion.createIndexQuery(indexQueryFactory);
+      }
+      break;
 
     default:
-      return null;
+      break;
     }
+
+    // The filter is undefined.
+    return indexQueryFactory.createMatchAllQuery();
   }
 
   /**
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java
index 588bc05..ed15983 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java
@@ -763,6 +763,14 @@
     subTreeSearch(true);
   }
 
+  @Test(dependsOnMethods = { "testAdd", "testModifyEntry", "testRenameEntry", "testDeleteAlreadyDeletedEntry" })
+  public void testSubTreeSearchAgainstAnIndexWithUnrecognizedMatchingRule() throws Exception
+  {
+    SearchRequest request = newSearchRequest(testBaseDN, SearchScope.WHOLE_SUBTREE, "entryUUID=xxx*");
+    List<SearchResultEntry> result = runSearch(request, false);
+    assertThat(result).isEmpty();
+  }
+
   @Test(dependsOnMethods = "testAdd")
   public void testSearchIsConsideredUnindexedBasedOnLookThroughLimit() throws DirectoryException {
     final int nbEntries = topEntries.size() + entries.size() + workEntries.size();

--
Gitblit v1.10.0