Author: jukka
Date: Fri Mar 21 16:06:24 2014
New Revision: 1579965

URL: http://svn.apache.org/r1579965
Log:
OAK-1566: ArrayIndexOutOfBoundsException in Segment.getRefId()

Correct calculation of the tar index size

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java?rev=1579965&r1=1579964&r2=1579965&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
 Fri Mar 21 16:06:24 2014
@@ -100,12 +100,21 @@ class TarFile {
         }
     }
 
+    private final int getEntrySize(int size) {
+        return BLOCK_SIZE + (size + BLOCK_SIZE - 1) & ~(BLOCK_SIZE - 1);
+    }
+
     synchronized boolean writeEntry(
             UUID uuid, byte[] b, int offset, int size) throws IOException {
-        if (position + BLOCK_SIZE + size + 4 * BLOCK_SIZE > maxFileSize) {
+        int indexSize = entries.size() * 24 + 4;
+        if (position
+                + getEntrySize(size)      // this entry
+                + getEntrySize(indexSize) // index entry
+                + 2 * BLOCK_SIZE          // two zero blocks at the end
+                > maxFileSize) {
             writeEntryHeader(
                     indexEntryName, maxFileSize - 3 * BLOCK_SIZE - position);
-            ByteBuffer index = ByteBuffer.allocate(entries.size() * 24 + 4);
+            ByteBuffer index = ByteBuffer.allocate(indexSize);
             SortedMap<UUID, TarEntry> sorted = newTreeMap();
             sorted.putAll(entries);
             for (Map.Entry<UUID, TarEntry> entry : sorted.entrySet()) {
@@ -116,8 +125,9 @@ class TarFile {
             }
             index.putInt(sorted.size());
             access.write(
-                    maxFileSize - 2 * BLOCK_SIZE - index.capacity(),
-                    index.array(), 0, index.capacity());
+                    maxFileSize - 2 * BLOCK_SIZE - indexSize,
+                    index.array(), 0, indexSize);
+            position = maxFileSize - 2 * BLOCK_SIZE;
             return false;
         }
 


Reply via email to