From 96883023b9e761391ada71759118cab640fce91e Mon Sep 17 00:00:00 2001 From: geowarin Date: Wed, 19 Jul 2017 21:48:23 +0200 Subject: [PATCH] Fix off-by-one error in DelimitedLineTokenizer on blank strings There is currently a bug causing an ArrayIndexOutOfBoundsException when trying to tokenize a blank string with more than two characters --- .../file/transform/DelimitedLineTokenizer.java | 2 +- .../transform/DelimitedLineTokenizerTests.java | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizer.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizer.java index ca6bc2920..c4af0ffc9 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizer.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizer.java @@ -211,7 +211,7 @@ public class DelimitedLineTokenizer extends AbstractLineTokenizer int start = offset; int len = count; - while ((start < (start + len)) && (chars[start] <= ' ')) { + while ((start < (start + len - 1)) && (chars[start] <= ' ')) { start++; len--; } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizerTests.java index 2dedcf767..f10cd6761 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/DelimitedLineTokenizerTests.java @@ -46,6 +46,12 @@ public class DelimitedLineTokenizerTests { assertTrue(TOKEN_MATCHES, tokens.readString(1).equals("")); } + @Test + public void testBlankString() { + FieldSet tokens = tokenizer.tokenize(" "); + assertTrue(TOKEN_MATCHES, tokens.readString(0).equals("")); + } + @Test public void testInvalidConstructorArgument() { try { @@ -130,20 +136,20 @@ public class DelimitedLineTokenizerTests { FieldSet line = tokenizer.tokenize("a b c"); assertEquals(3, line.getFieldCount()); } - + @Test(expected=IllegalArgumentException.class) public void testDelimitedLineTokenizerNullDelimiter() { AbstractLineTokenizer tokenizer = new DelimitedLineTokenizer(null); tokenizer.tokenize("a b c"); } - + @Test(expected=IllegalArgumentException.class) public void testDelimitedLineTokenizerEmptyString() throws Exception { DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(""); tokenizer.afterPropertiesSet(); tokenizer.tokenize("a b c"); } - + @Test public void testDelimitedLineTokenizerString() { AbstractLineTokenizer tokenizer = new DelimitedLineTokenizer(" b "); @@ -386,4 +392,4 @@ public class DelimitedLineTokenizerTests { assertEquals("value2\nvalue2cont", line.readString(1)); } -} \ No newline at end of file +}