From 090aceb3ad4de872798829c57152639cddd0cf67 Mon Sep 17 00:00:00 2001 From: Andrew Tulloch Date: Wed, 27 Feb 2019 13:28:03 +0000 Subject: [PATCH] Fix repeated calls to DataBuffer.write(CharSequence, Charset) Prior to this commit, repeated calls to `DataBuffer.write(CharSequence, Charset)` would not write the given chars to the expected position in the original buffer. This commit fixes that by writing to the `outBuffer.position()`, offset by the current `DataBuffer.writePosition()`. Fixes gh-22484 --- .../core/io/buffer/DataBuffer.java | 4 ++-- .../core/io/buffer/DataBufferTests.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java b/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java index baf161047b2..6f98d016a88 100644 --- a/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java +++ b/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java @@ -264,13 +264,13 @@ public interface DataBuffer { break; } if (cr.isOverflow()) { - writePosition(outBuffer.position()); + writePosition(writePosition() + outBuffer.position()); int maximumSize = (int) (inBuffer.remaining() * charsetEncoder.maxBytesPerChar()); ensureCapacity(maximumSize); outBuffer = asByteBuffer(writePosition(), writableByteCount()); } } - writePosition(outBuffer.position()); + writePosition(writePosition() + outBuffer.position()); } return this; } diff --git a/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java b/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java index 2b78b16df92..054b60f14cd 100644 --- a/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java +++ b/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java @@ -225,6 +225,27 @@ public class DataBufferTests extends AbstractDataBufferAllocatingTestCase { release(buffer); } + @Test + public void writeMultipleUtf8String() { + + DataBuffer buffer = createDataBuffer(1); + buffer.write("abc", StandardCharsets.UTF_8); + assertEquals(3, buffer.readableByteCount()); + + buffer.write("def", StandardCharsets.UTF_8); + assertEquals(6, buffer.readableByteCount()); + + buffer.write("ghi", StandardCharsets.UTF_8); + assertEquals(9, buffer.readableByteCount()); + + byte[] result = new byte[9]; + buffer.read(result); + + assertArrayEquals("abcdefghi".getBytes(), result); + + release(buffer); + } + @Test public void inputStream() throws IOException { DataBuffer buffer = createDataBuffer(4);