From 067a169bbdbe738f4bdd6dafe3eef133aee078c9 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Mon, 31 Oct 2016 14:00:38 +0000
Subject: [PATCH] OPENDJ-2830 Fix ldifsearch size limit

---
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java |   14 ++++++++------
 opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIF.java                     |   22 ++++++++++++----------
 2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIF.java b/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIF.java
index da1aa21..d095c89 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIF.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIF.java
@@ -16,6 +16,7 @@
 package org.forgerock.opendj.ldif;
 
 import static com.forgerock.opendj.ldap.CoreMessages.*;
+import static org.forgerock.opendj.ldap.LdapException.newLdapException;
 
 import java.io.IOException;
 import java.io.StringWriter;
@@ -48,6 +49,7 @@
 import org.forgerock.opendj.ldap.Modification;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.RDN;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.controls.SubtreeDeleteRequestControl;
 import org.forgerock.opendj.ldap.requests.AddRequest;
@@ -699,16 +701,16 @@
             public boolean hasNext() throws IOException {
                 if (nextEntry == null) {
                     final int sizeLimit = search.getSizeLimit();
-                    if (sizeLimit == 0 || entryCount < sizeLimit) {
-                        final DN baseDN = search.getName();
-                        final SearchScope scope = search.getScope();
-                        while (input.hasNext()) {
-                            final Entry entry = input.readEntry();
-                            if (entry.getName().isInScopeOf(baseDN, scope)
-                                    && matcher.matches(entry).toBoolean()) {
-                                nextEntry = filterEntry(entry);
-                                break;
-                            }
+                    if (sizeLimit != 0 && entryCount >= sizeLimit) {
+                        throw newLdapException(ResultCode.SIZE_LIMIT_EXCEEDED);
+                    }
+                    final DN baseDN = search.getName();
+                    final SearchScope scope = search.getScope();
+                    while (input.hasNext()) {
+                        final Entry entry = input.readEntry();
+                        if (entry.getName().isInScopeOf(baseDN, scope) && matcher.matches(entry).toBoolean()) {
+                            nextEntry = filterEntry(entry);
+                            break;
                         }
                     }
                 }
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
index 950aadc..a68f079 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
@@ -17,6 +17,7 @@
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
 import static com.forgerock.opendj.cli.ToolVersionHandler.newSdkVersionHandler;
+import static com.forgerock.opendj.ldap.tools.LDAPToolException.newToolException;
 import static com.forgerock.opendj.ldap.tools.LDAPToolException.newToolParamException;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
 import static com.forgerock.opendj.cli.Utils.filterExitCode;
@@ -38,6 +39,7 @@
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.Filter;
+import org.forgerock.opendj.ldap.LdapException;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.requests.Requests;
@@ -195,13 +197,13 @@
              final LDIFEntryWriter outputWriter = new LDIFEntryWriter(getLDIFToolOutputStream(this, outputFilename))) {
             outputWriter.setWrapColumn(computeWrapColumn(wrapColumn));
             LDIF.copyTo(LDIF.search(sourceReader, search), outputWriter);
+        } catch (final LdapException e) {
+            throw newToolException(
+                    e, e.getResult().getResultCode(), ERR_LDIFSEARCH_FAILED.get(e.getLocalizedMessage()));
         } catch (final IOException e) {
-            if (e instanceof LocalizableException) {
-                errPrintln(ERR_LDIFSEARCH_FAILED.get(((LocalizableException) e).getMessageObject()));
-            } else {
-                errPrintln(ERR_LDIFSEARCH_FAILED.get(e.getLocalizedMessage()));
-            }
-            return ResultCode.CLIENT_SIDE_LOCAL_ERROR.intValue();
+            throw newToolException(e, ResultCode.CLIENT_SIDE_LOCAL_ERROR, ERR_LDIFSEARCH_FAILED.get(
+                    e instanceof LocalizableException ? ((LocalizableException) e).getMessageObject()
+                                                      : e.getLocalizedMessage()));
         } catch (final ArgumentException ae) {
             throw newToolParamException(ae, ae.getMessageObject());
         }

--
Gitblit v1.10.0