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); + } + }
