This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.18.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.18.x by this push:
new caa4026c5bda [backport camel-4.18.x] CAMEL-24355: Fix
NIOConverter.toByteArray for fully consumed ByteBuffer (#25355)
caa4026c5bda is described below
commit caa4026c5bda202f7fb7551fa7520b2530c0d8b9
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Aug 5 16:36:27 2026 +0200
[backport camel-4.18.x] CAMEL-24355: Fix NIOConverter.toByteArray for fully
consumed ByteBuffer (#25355)
* CAMEL-24355: Fix NIOConverter.toByteArray for fully consumed ByteBuffer
Use duplicate().rewind() to read bytes from position 0 to limit without
mutating the original buffer, fixing BufferUnderflowException when the
buffer position equals limit (e.g. Kinesis KCL dead letter queue flow).
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Cursor <[email protected]>
* CAMEL-24355: Use absolute ByteBuffer.get for simpler conversion
Switch to buffer.get(0, bArray) after review feedback and add read-only
buffer coverage. Drop unnecessary public modifier from test class.
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Cursor <[email protected]>
---------
Co-authored-by: Omar Atie <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Cursor <[email protected]>
---
.../org/apache/camel/converter/NIOConverter.java | 2 +-
.../apache/camel/converter/NIOConverterTest.java | 76 +++++++++++++++++++++-
2 files changed, 76 insertions(+), 2 deletions(-)
diff --git
a/core/camel-base/src/main/java/org/apache/camel/converter/NIOConverter.java
b/core/camel-base/src/main/java/org/apache/camel/converter/NIOConverter.java
index d4bb5548fff8..55eb58eef253 100644
--- a/core/camel-base/src/main/java/org/apache/camel/converter/NIOConverter.java
+++ b/core/camel-base/src/main/java/org/apache/camel/converter/NIOConverter.java
@@ -50,7 +50,7 @@ public final class NIOConverter {
@Converter(order = 1)
public static byte[] toByteArray(ByteBuffer buffer) {
byte[] bArray = new byte[buffer.limit()];
- buffer.get(bArray);
+ buffer.get(0, bArray);
return bArray;
}
diff --git
a/core/camel-core/src/test/java/org/apache/camel/converter/NIOConverterTest.java
b/core/camel-core/src/test/java/org/apache/camel/converter/NIOConverterTest.java
index 85a0e61e7b3b..a8bf1349b9de 100644
---
a/core/camel-core/src/test/java/org/apache/camel/converter/NIOConverterTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/converter/NIOConverterTest.java
@@ -25,10 +25,11 @@ import org.apache.camel.ContextTestSupport;
import org.apache.camel.Exchange;
import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-public class NIOConverterTest extends ContextTestSupport {
+class NIOConverterTest extends ContextTestSupport {
private static final String TEST_FILE_NAME = "hello" + UUID.randomUUID() +
".txt";
@Test
@@ -53,6 +54,79 @@ public class NIOConverterTest extends ContextTestSupport {
assertEquals(5, out.length);
}
+ @Test
+ void testToByteArrayFullyConsumedBuffer() {
+ ByteBuffer bb = ByteBuffer.wrap("Hello".getBytes());
+ while (bb.hasRemaining()) {
+ bb.get();
+ }
+ assertThat(bb.position()).isEqualTo(bb.limit());
+
+ byte[] out = NIOConverter.toByteArray(bb);
+
+ assertThat(out).containsExactly("Hello".getBytes());
+ assertThat(bb.position()).isEqualTo(bb.limit());
+ }
+
+ @Test
+ void testToByteArrayPartiallyConsumedBuffer() {
+ ByteBuffer bb = ByteBuffer.allocate(100);
+ bb.put("Hello".getBytes());
+ bb.flip();
+ bb.get();
+ assertThat(bb.position()).isEqualTo(1);
+
+ byte[] out = NIOConverter.toByteArray(bb);
+
+ assertThat(out).containsExactly("Hello".getBytes());
+ assertThat(bb.position()).isEqualTo(1);
+ }
+
+ @Test
+ void testToByteArrayEmptyBuffer() {
+ ByteBuffer bb = ByteBuffer.allocate(0);
+
+ byte[] out = NIOConverter.toByteArray(bb);
+
+ assertThat(out).isEmpty();
+ }
+
+ @Test
+ void testToByteArrayReadOnlyFullyConsumedBuffer() {
+ ByteBuffer bb = ByteBuffer.wrap("Hello".getBytes()).asReadOnlyBuffer();
+ while (bb.hasRemaining()) {
+ bb.get();
+ }
+
+ byte[] out = NIOConverter.toByteArray(bb);
+
+ assertThat(out).containsExactly("Hello".getBytes());
+ }
+
+ @Test
+ void testToStringFullyConsumedBuffer() throws Exception {
+ ByteBuffer bb = ByteBuffer.wrap("Hello".getBytes());
+ while (bb.hasRemaining()) {
+ bb.get();
+ }
+
+ String out = NIOConverter.toString(bb, null);
+
+ assertThat(out).isEqualTo("Hello");
+ }
+
+ @Test
+ void testToInputStreamFullyConsumedBuffer() throws Exception {
+ ByteBuffer bb = ByteBuffer.wrap("Hello".getBytes());
+ while (bb.hasRemaining()) {
+ bb.get();
+ }
+
+ InputStream is = NIOConverter.toInputStream(bb);
+
+ assertThat(IOConverter.toString(is, null)).isEqualTo("Hello");
+ }
+
@Test
public void testToString() throws Exception {
ByteBuffer bb = ByteBuffer.wrap("Hello".getBytes());