From 3775a25870ac2a8f4463c3429e10667ae93c2ec7 Mon Sep 17 00:00:00 2001
From: Chris Ridd <chris.ridd@forgerock.com>
Date: Mon, 04 Nov 2013 11:06:55 +0000
Subject: [PATCH] CR-2522 Fix OPENDJ-1189: Integer overflow while sizing scratch files building indexes

---
 opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java |   21 ++++++++++++++++++---
 1 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java b/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
index 7241925..bd10a44 100644
--- a/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
@@ -29,6 +29,8 @@
 
 import static org.opends.messages.JebMessages.*;
 import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
+import static org.opends.server.loggers.debug.DebugLogger.getTracer;
 import static org.opends.server.util.DynamicConstants.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
@@ -53,6 +55,7 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.extensions.DiskSpaceMonitor;
+import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.types.*;
 import org.opends.server.util.LDIFReader;
 import org.opends.server.util.Platform;
@@ -67,6 +70,11 @@
  */
 public final class Importer implements DiskSpaceMonitorHandler
 {
+  /**
+   * The tracer object for the debug logger.
+   */
+  private static final DebugTracer TRACER = getTracer();
+
   private static final int TIMER_INTERVAL = 10000;
   private static final int KB = 1024;
   private static final int MB = (KB * KB);
@@ -484,7 +492,10 @@
         // Scratch writers allocate 4 buffers per index as well.
         final int totalPhaseOneBufferCount =
             phaseOneBufferCount + (4 * indexCount);
-        bufferSize = (int) (phaseOneBufferMemory / totalPhaseOneBufferCount);
+        long longBufferSize = phaseOneBufferMemory / totalPhaseOneBufferCount;
+        // We need (2 * bufferSize) to fit in an int for the insertByteStream
+        // and deleteByteStream constructors.
+        bufferSize = (int) Math.min(longBufferSize, Integer.MAX_VALUE / 2);
 
         if (bufferSize > MAX_BUFFER_SIZE)
         {
@@ -3305,8 +3316,12 @@
       }
       catch (Exception e)
       {
-        Message message =
-            ERR_JEB_IMPORT_LDIF_REBUILD_INDEX_TASK_ERR.get(e.getMessage());
+        if (debugEnabled())
+        {
+          TRACER.debugCaught(DebugLogLevel.ERROR, e);
+        }
+        Message message = ERR_JEB_IMPORT_LDIF_REBUILD_INDEX_TASK_ERR.get(
+          stackTraceToSingleLineString(e));
         logError(message);
         isCanceled = true;
         throw e;

--
Gitblit v1.10.0