Eike Lang created JCR-3558:
------------------------------
Summary:
org.apache.jackrabbit.jcr2spi.xml.TargetImportHandler.BufferedStringValue
throws ArrayIndexOutOfBoundsException
Key: JCR-3558
URL: https://issues.apache.org/jira/browse/JCR-3558
Project: Jackrabbit Content Repository
Issue Type: Bug
Components: jackrabbit-jcr2spi
Affects Versions: 2.6
Reporter: Eike Lang
When importing XML into jackrabbit, an arrayIndexOutOfBoundException will be
thrown if during the import process the append method of the inner
BufferedStringValue class of
org.apache.jackrabbit.jcr2spi.xml.TargertImportHandler is called so that:
- the char array to be appended is longer than the current buffer size
- AND the char array to be appended is smaller than the max buffer size
- AND the char array to be appended is larger than the current buffer size PLUS
the buffer increment
I.e. starting from a fresh buffer, anything larger than 16384 chars, but
smaller than 65536 chars will go boom.
The following test class exposes the problem: (Making BufferedStringValue and
its siblings static inner classes would make them a bit easier to test, with no
adverse effect I could see.) Relevant case is of course the first one, the
other two illustrate what already works.
-------------------------- BufferedStringValueTest.java----------
package org.apache.jackrabbit.jcr2spi.xml;
import static org.mockito.Mockito.mock;
import java.io.IOException;
import
org.apache.jackrabbit.jcr2spi.xml.TargetImportHandler.BufferedStringValue;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import org.junit.Test;
public class BufferedStringValueTest {
@Test
public void bufferShouldBeIncreasedByASaneAmount() throws IOException {
TargetImportHandler targetImportHandler = new
SysViewImportHandler(mock(Importer.class),
mock(NamePathResolver.class));
BufferedStringValue value = targetImportHandler.new
BufferedStringValue();
char[] chars = new char[0x4001];
for (int i = 0; i < chars.length; i++) {
chars[i] = 0;
}
value.append(chars, 0, chars.length);
}
@Test
public void
bufferShouldDealWithArraysBiggerThanBufferButSmallerThanBufferIncrementPlusBuffer()
throws IOException {
TargetImportHandler targetImportHandler = new
SysViewImportHandler(mock(Importer.class),
mock(NamePathResolver.class));
BufferedStringValue value = targetImportHandler.new
BufferedStringValue();
char[] chars = new char[0x3999];
for (int i = 0; i < chars.length; i++) {
chars[i] = 0;
}
value.append(chars, 0, chars.length);
}
@Test
public void bufferShouldDealWithArraysBiggerThanMaxSize() throws
IOException {
TargetImportHandler targetImportHandler = new
SysViewImportHandler(mock(Importer.class),
mock(NamePathResolver.class));
BufferedStringValue value = targetImportHandler.new
BufferedStringValue();
char[] chars = new char[0x10001];
for (int i = 0; i < chars.length; i++) {
chars[i] = 0;
}
value.append(chars, 0, chars.length);
}
}
--------------------------
The following simple patch resolves this issue:
326c326
< char[] newBuffer = new char[buffer.length +
BUFFER_INCREMENT];
---
> char[] newBuffer = new char[ bufferPos +length +
> BUFFER_INCREMENT];
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira