From 8e301949173f20971c288484e5711b5496e5df49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Wed, 6 Apr 2022 11:06:18 +0200 Subject: [PATCH] SUREFIRE-2056 BufferOverflowException when encoding message with null testId (#506) [SUREFIRE-2056] Reproduce buffer overflow in EventChannelEncoder when the test ID is null --- .../booter/spi/EventChannelEncoder.java | 2 +- .../booter/spi/EventChannelEncoderTest.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java index b4a234d490..dbc3d52f43 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java @@ -393,7 +393,7 @@ ByteBuffer encodeMessage( ForkedProcessEventType eventType, RunMode runMode, Lon { CharsetEncoder encoder = newCharsetEncoder(); int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), runMode, encoder, 0, - testRunId == null ? 0 : 1, message ); + 1, message ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); encode( encoder, result, eventType, runMode, testRunId, message ); return result; diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java index 5b28d3a13a..b96a266228 100644 --- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java +++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java @@ -1226,6 +1226,32 @@ public void testStdErrStreamLn() throws IOException .isEqualTo( expected ); } + @Test + public void testStdErrStreamEmptyMessageNullTestId() throws IOException + { + Stream out = Stream.newStream(); + WritableBufferedByteChannel channel = newBufferedChannel( out ); + EventChannelEncoder encoder = new EventChannelEncoder( channel ); + + // This used to produce a BufferOverflowException; see SUREFIRE-2056. + // In essence, we used to under-allocate for the encoding of a null test ID + // (we used to allocate 0 byte instead of 1 byte). + // The message needs to be empty in order to reproduce the bug, + // otherwise we over-allocate for the test message + // (for safety, due to unpredictability of the size of encoded text) + // and this over-allocation ends up compensating the under-allocation for the null test id. + encoder.testOutput( new TestOutputReportEntry( stdErr( "" ), NORMAL_RUN, null ) ); + channel.close(); + + String expected = ":maven-surefire-event:\u000e:std-err-stream:" + + (char) 10 + ":normal-run:\u0000:" + + "\u0005:UTF-8:\u0000\u0000\u0000\u0000::"; + + assertThat( new String( out.toByteArray(), UTF_8 ) ) + .isEqualTo( expected ); + } + + @Test @SuppressWarnings( "checkstyle:innerassignment" ) public void shouldCountSameNumberOfSystemProperties() throws IOException