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 <zoltan.m...@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" )

Reply via email to