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" )