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