Repository: olingo-odata2 Updated Branches: refs/heads/master dfe17829f -> de4aec1bd
[OLINGO-1053] Fixed buffer overflow Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/de4aec1b Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/de4aec1b Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/de4aec1b Branch: refs/heads/master Commit: de4aec1bd8183ecfff23297909eb5648885af388 Parents: dfe1782 Author: mibo <[email protected]> Authored: Tue Nov 29 20:49:09 2016 +0100 Committer: mibo <[email protected]> Committed: Tue Nov 29 20:50:21 2016 +0100 ---------------------------------------------------------------------- .../odata2/core/batch/v2/BatchLineReader.java | 18 ++++++++++++------ .../odata2/core/batch/v2/BatchLineReaderTest.java | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/de4aec1b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReader.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReader.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReader.java index 81cde03..4075764 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReader.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReader.java @@ -151,12 +151,7 @@ public class BatchLineReader { if (!foundLineEnd) { byte currentChar = this.buffer[offset++]; - if(!buffer.hasRemaining()) { - buffer.flip(); - ByteBuffer tmp = ByteBuffer.allocate(buffer.limit() *2); - tmp.put(buffer); - buffer = tmp; - } + buffer = grantBuffer(buffer); buffer.put(currentChar); if (currentChar == LF) { @@ -172,6 +167,7 @@ public class BatchLineReader { // Check if there is at least one character if (limit != EOF && this.buffer[offset] == LF) { + buffer = grantBuffer(buffer); buffer.put(LF); offset++; } @@ -193,6 +189,16 @@ public class BatchLineReader { } } + private ByteBuffer grantBuffer(ByteBuffer buffer) { + if(!buffer.hasRemaining()) { + buffer.flip(); + ByteBuffer tmp = ByteBuffer.allocate(buffer.limit() *2); + tmp.put(buffer); + buffer = tmp; + } + return buffer; + } + private int fillBuffer() throws IOException { limit = reader.read(buffer, 0, buffer.length); offset = 0; http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/de4aec1b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReaderTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReaderTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReaderTest.java index a734dd1..351c693 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReaderTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/v2/BatchLineReaderTest.java @@ -27,6 +27,7 @@ import java.util.List; import org.apache.olingo.odata2.core.batch.v2.BatchLineReader; import org.apache.olingo.odata2.core.batch.v2.Line; +import org.apache.olingo.odata2.testutil.helper.StringHelper; import org.junit.Test; public class BatchLineReaderTest { @@ -104,6 +105,23 @@ public class BatchLineReaderTest { reader.close(); } + /** + * Test for special case (described in https://issues.apache.org/jira/browse/OLINGO-1053 ) + */ + @Test + public void testSpecialCRLF() throws IOException { + String line1 = StringHelper.generateData(8191); + String line2 = StringHelper.generateData(8192); + final String content = line1 + "\r\n" + line2 + "\n" + "test"; + + BatchLineReader reader = create(content); + + assertEquals(line1 + "\r\n", reader.readLine()); + assertEquals(line2 + "\n", reader.readLine()); + assertEquals("test", reader.readLine()); + reader.close(); + } + @Test public void testCR() throws IOException { final String TEXT = "Test\r" +
