You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2014/08/27 15:48:41 UTC

svn commit: r1620898 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/segment/ test/java/org/apache/jackrabbit/oak/plugins/segment/

Author: alexparvulescu
Date: Wed Aug 27 13:48:41 2014
New Revision: 1620898

URL: http://svn.apache.org/r1620898
Log:
OAK-2049 ArrayIndexOutOfBoundsException in Segment.getRefId()
 - added protection for the ArrayIndexOutOfBoundsException, added segmentid to the error logs

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1620898&r1=1620897&r2=1620898&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java Wed Aug 27 13:48:41 2014
@@ -188,6 +188,14 @@ public class Segment {
     }
 
     SegmentId getRefId(int index) {
+        if (refids == null || index >= refids.length) {
+            String type = "data";
+            if (!id.isDataSegmentId()) {
+                type = "bulk";
+            }
+            throw new IllegalStateException("RefId '" + index
+                    + "' doesn't exist in " + type + " segment " + id);
+        }
         SegmentId refid = refids[index];
         if (refid == null) {
             synchronized (this) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1620898&r1=1620897&r2=1620898&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java Wed Aug 27 13:48:41 2014
@@ -87,7 +87,7 @@ public class SegmentWriter {
 
     static final int BLOCK_SIZE = 1 << 12; // 4kB
 
-    private static byte[] createNewBuffer() {
+    static byte[] createNewBuffer() {
         byte[] buffer = new byte[Segment.MAX_SEGMENT_SIZE];
         buffer[0] = '0';
         buffer[1] = 'a';

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java?rev=1620898&r1=1620897&r2=1620898&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java Wed Aug 27 13:48:41 2014
@@ -19,8 +19,8 @@ package org.apache.jackrabbit.oak.plugin
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
 
+import java.nio.ByteBuffer;
 import java.util.Set;
-import java.util.UUID;
 
 import org.apache.jackrabbit.oak.plugins.segment.memory.MemoryStore;
 import org.junit.Test;
@@ -84,4 +84,29 @@ public class SegmentIdFactoryTest {
         assertTrue(ids.contains(b));
     }
 
+    /**
+     * OAK-2049 - error for data segments
+     */
+    @Test(expected = IllegalStateException.class)
+    public void dataAIOOBE() {
+        SegmentId id = factory.newDataSegmentId();
+        byte[] buffer = SegmentWriter.createNewBuffer();
+        ByteBuffer data = ByteBuffer.allocate(Segment.MAX_SEGMENT_SIZE);
+        data.put(buffer);
+        data.rewind();
+        Segment s = new Segment(factory, id, data);
+        s.getRefId(1);
+    }
+
+    /**
+     * OAK-2049 - error for bulk segments
+     */
+    @Test(expected = IllegalStateException.class)
+    public void bulkAIOOBE() {
+        SegmentId id = factory.newBulkSegmentId();
+        ByteBuffer data = ByteBuffer.allocate(4);
+        Segment s = new Segment(factory, id, data);
+        s.getRefId(1);
+    }
+
 }