From 084a0d0e97d14104fb34d20ed6960a23ecefc439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20=C3=81lvarez=20=C3=81lvarez?= Date: Mon, 16 Jun 2025 10:25:02 +0200 Subject: [PATCH] Fix ByteCountingInputStream when reading past EOF --- .../uploader/ByteCountingInputStream.java | 4 ++- .../uploader/ByteCountingInputStreamTest.java | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ByteCountingInputStreamTest.java diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ByteCountingInputStream.java b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ByteCountingInputStream.java index 577170fd35a..32ba88bee90 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ByteCountingInputStream.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ByteCountingInputStream.java @@ -15,7 +15,9 @@ final class ByteCountingInputStream extends InputStream { @Override public int read() throws IOException { int data = source.read(); - readBytes++; + if (data >= 0) { + readBytes++; + } return data; } diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ByteCountingInputStreamTest.java b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ByteCountingInputStreamTest.java new file mode 100644 index 00000000000..a8bfc727112 --- /dev/null +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ByteCountingInputStreamTest.java @@ -0,0 +1,26 @@ +package com.datadog.profiling.uploader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import org.junit.jupiter.api.Test; + +public class ByteCountingInputStreamTest { + + @Test + public void testDoesNotCountAfterEof() throws IOException { + byte[] data = {1, 2, 3}; + + ByteCountingInputStream in = new ByteCountingInputStream(new ByteArrayInputStream(data)); + for (byte datum : data) { + int b = in.read(); + assertEquals(datum, b); + } + assertEquals(data.length, (int) in.getReadBytes()); + + // read past EOF + assertEquals(-1, in.read()); + assertEquals(data.length, (int) in.getReadBytes()); + } +}