Author: alexparvulescu
Date: Thu Oct  9 08:55:25 2014
New Revision: 1630332

URL: http://svn.apache.org/r1630332
Log:
OAK-2172 ArrayIndexOutOfBoundsException in Segment.getRefId() protection and 
logs


Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
    
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
    
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1620898

Modified: 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1630332&r1=1630331&r2=1630332&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
 (original)
+++ 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
 Thu Oct  9 08:55:25 2014
@@ -180,6 +180,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/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1630332&r1=1630331&r2=1630332&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 (original)
+++ 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 Thu Oct  9 08:55:25 2014
@@ -79,7 +79,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/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java?rev=1630332&r1=1630331&r2=1630332&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
 Thu Oct  9 08:55:25 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);
+    }
+
 }


Reply via email to