From 8dc42dce4649dd52d4f85b161cd09350fce60920 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 22 Dec 2014 18:03:37 +0000
Subject: [PATCH] OPENDJ-1710: NPE performing deletes and potentially other indexed updates against Persistit backend

---
 opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSet.java |   37 ++++++++++++++++++++++++++++---------
 1 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSet.java b/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSet.java
index eae1c9d..43319e5 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSet.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSet.java
@@ -31,7 +31,9 @@
 import java.util.Iterator;
 
 import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteSequenceReader;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
 
 /**
  * Represents a set of Entry IDs.  It can represent a set where the IDs are
@@ -90,10 +92,8 @@
     if (bytes == null)
     {
       values = new long[0];
-      return;
     }
-
-    if (bytes.length() == 0)
+    else if (bytes.length() == 0)
     {
       // Entry limit has exceeded and there is no encoded undefined set size.
       undefinedSize = Long.MAX_VALUE;
@@ -101,17 +101,30 @@
     else if ((bytes.byteAt(0) & 0x80) == 0x80)
     {
       // Entry limit has exceeded and there is an encoded undefined set size.
-      undefinedSize =
-          JebFormat.entryIDUndefinedSizeFromDatabase(bytes.toByteArray());
+      undefinedSize = bytes.length() == 8
+              ? bytes.toLong() & Long.MAX_VALUE // remove top bit
+              : Long.MAX_VALUE;
     }
     else
     {
       // Seems like entry limit has not been exceeded and the bytes is a
       // list of entry IDs.
-      values = JebFormat.entryIDListFromDatabase(bytes);
+      values = decodeEntryIDList(bytes);
     }
   }
 
+  private long[] decodeEntryIDList(ByteString bytes)
+  {
+    final ByteSequenceReader reader = bytes.asReader();
+    final int count = bytes.length() / 8;
+    final long[] entryIDList = new long[count];
+    for (int i = 0; i < count; i++)
+    {
+      entryIDList[i] = reader.getLong();
+    }
+    return entryIDList;
+  }
+
   /**
    * Construct an EntryIDSet from an array of longs.
    *
@@ -285,13 +298,19 @@
    */
   public ByteString toByteString()
   {
-    if(isDefined())
+    if (isDefined())
     {
-      return ByteString.wrap(JebFormat.entryIDListToDatabase(values));
+      final ByteStringBuilder builder = new ByteStringBuilder(8 * values.length);
+      for (int i = 0; i < values.length; i++)
+      {
+        builder.append(values[i]);
+      }
+      return builder.toByteString();
     }
     else
     {
-      return ByteString.wrap(JebFormat.entryIDUndefinedSizeToDatabase(undefinedSize));
+      // Set top bit.
+      return ByteString.valueOf(undefinedSize | Long.MIN_VALUE);
     }
   }
 

--
Gitblit v1.10.0