You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2022/04/27 17:05:29 UTC
[maven-surefire] branch master updated: [SUREFIRE-2076] BufferOverflowException when encoding message with null runMode (#529)
This is an automated email from the ASF dual-hosted git repository.
tibordigana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
The following commit(s) were added to refs/heads/master by this push:
new 71f871751 [SUREFIRE-2076] BufferOverflowException when encoding message with null runMode (#529)
71f871751 is described below
commit 71f871751e3395e9d1646a34aa3433039fbfab2a
Author: Zoltan Meze <zo...@gmail.com>
AuthorDate: Wed Apr 27 19:05:22 2022 +0200
[SUREFIRE-2076] BufferOverflowException when encoding message with null runMode (#529)
[SUREFIRE-2076] BufferOverflowException when encoding message with null runMode
* [SUREFIRE-2076] BufferOverflowException when encoding message with null runMode
* [SUREFIRE-2076] Null smartStackTrace not included in buffer length estimation in consoleErrorLog
Can potentially lead to BufferOverflowException with underestimated buffer length
---
.../surefire/api/stream/AbstractStreamEncoder.java | 7 ++---
.../api/stream/AbstractStreamEncoderTest.java | 32 +++++++++++-----------
.../surefire/booter/spi/EventChannelEncoder.java | 2 +-
.../booter/spi/EventChannelEncoderTest.java | 19 +++++++++++++
4 files changed, 38 insertions(+), 22 deletions(-)
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java
index 51a98730f..0bde0e55b 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java
@@ -181,11 +181,8 @@ public abstract class AbstractStreamEncoder<E extends Enum<E>>
// one byte + one delimiter character ':' + <string> + one delimiter character ':'
int lengthOfMetadata = 1 + getEncodedMagicNumber().length + 1 + 1 + 1 + opcodeLength + 1;
- if ( runMode != null )
- {
- // one byte of length + one delimiter character ':' + <string> + one delimiter character ':'
- lengthOfMetadata += 1 + 1 + runMode.getRunmode().length() + 1;
- }
+ // one byte of length + one delimiter character ':' + <string> + one delimiter character ':'
+ lengthOfMetadata += 1 + 1 + ( runMode == null ? 0 : runMode.getRunmodeBinary().length ) + 1;
if ( encoder != null )
{
diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java b/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java
index a94ce76b0..e28823eb0 100644
--- a/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java
+++ b/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java
@@ -134,45 +134,45 @@ public class AbstractStreamEncoderTest
NORMAL_RUN, encoder, 0, 1, "s" ) )
.isEqualTo( 88 );
- // :maven-surefire-event:16:console-info-log:5:UTF-8:0003:sss:
+ // :maven-surefire-event:16:console-info-log:0::5:UTF-8:0001:s:
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_INFO.getOpcodeBinary().length,
null, encoder, 0, 0, "s" ) )
- .isEqualTo( 58 );
+ .isEqualTo( 61 );
- // :maven-surefire-event:17:console-debug-log:5:UTF-8:0003:sss:
+ // :maven-surefire-event:17:console-debug-log:0::5:UTF-8:0001:s:
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_DEBUG.getOpcodeBinary().length,
null, encoder, 0, 0, "s" ) )
- .isEqualTo( 59 );
+ .isEqualTo( 62 );
- // :maven-surefire-event:19:console-warning-log:5:UTF-8:0003:sss:
+ // :maven-surefire-event:19:console-warning-log:0::5:UTF-8:0001:s:
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_WARNING.getOpcodeBinary().length,
null, encoder, 0, 0, "s" ) )
- .isEqualTo( 61 );
+ .isEqualTo( 64 );
- // :maven-surefire-event:17:console-error-log:5:UTF-8:0003:sss:
+ // :maven-surefire-event:17:console-error-log:0::5:UTF-8:0001:s:
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_ERROR.getOpcodeBinary().length,
null, encoder, 0, 0, "s" ) )
- .isEqualTo( 59 );
+ .isEqualTo( 62 );
- // :maven-surefire-event:3:bye:
+ // :maven-surefire-event:3:bye:0::
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_BYE.getOpcodeBinary().length,
null, null, 0, 0 ) )
- .isEqualTo( 28 );
+ .isEqualTo( 31 );
- // :maven-surefire-event:17:stop-on-next-test:
+ // :maven-surefire-event:17:stop-on-next-test:0::
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STOP_ON_NEXT_TEST.getOpcodeBinary().length,
null, null, 0, 0 ) )
- .isEqualTo( 42 );
+ .isEqualTo( 45 );
- // :maven-surefire-event:9:next-test:
+ // :maven-surefire-event:9:next-test:0::
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_NEXT_TEST.getOpcodeBinary().length,
null, null, 0, 0 ) )
- .isEqualTo( 34 );
+ .isEqualTo( 37 );
- // :maven-surefire-event:14:jvm-exit-error:
+ // :maven-surefire-event:14:jvm-exit-error:0::
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_JVM_EXIT_ERROR.getOpcodeBinary().length,
null, null, 0, 0 ) )
- .isEqualTo( 39 );
+ .isEqualTo( 42 );
}
@Test
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 dbc3d52f4..f06b28177 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
@@ -214,7 +214,7 @@ public class EventChannelEncoder extends EventEncoder implements MasterProcessCh
CharsetEncoder encoder = newCharsetEncoder();
String stackTrace = t == null ? null : ConsoleLoggerUtils.toString( t );
int bufferMaxLength = estimateBufferLength( BOOTERCODE_CONSOLE_ERROR.getOpcode().length(), null, encoder, 0, 0,
- message, stackTrace );
+ message, null, stackTrace );
ByteBuffer result = ByteBuffer.allocate( bufferMaxLength );
encodeHeader( result, BOOTERCODE_CONSOLE_ERROR );
encodeCharset( 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 b96a26622..954144893 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
@@ -1251,6 +1251,25 @@ public class EventChannelEncoderTest
.isEqualTo( expected );
}
+ @Test
+ public void testStdErrStreamEmptyMessageNullRunMode() throws IOException
+ {
+ Stream out = Stream.newStream();
+ WritableBufferedByteChannel channel = newBufferedChannel( out );
+ EventChannelEncoder encoder = new EventChannelEncoder( channel );
+
+ // This used to produce a BufferOverflowException; see SUREFIRE-2076.
+ encoder.testOutput( new TestOutputReportEntry( stdErr( "" ), null, 1L ) );
+ channel.close();
+
+ String expected = ":maven-surefire-event:\u000e:std-err-stream:"
+ + (char) 0 + "::" // One byte for length and 1+1 bytes for the 2 delimiters (0 bytes for null runMode)
+ + "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:"
+ + "\u0005:UTF-8:\u0000\u0000\u0000\u0000::";
+
+ assertThat( new String( out.toByteArray(), UTF_8 ) )
+ .isEqualTo( expected );
+ }
@Test
@SuppressWarnings( "checkstyle:innerassignment" )