Skip to content

Commit 4531c19

Browse files
committed
[SUREFIRE-2076] BufferOverflowException when encoding message with null runMode
1 parent 2657a32 commit 4531c19

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,8 @@ public int estimateBufferLength( int opcodeLength, RunMode runMode, CharsetEncod
181181
// one byte + one delimiter character ':' + <string> + one delimiter character ':'
182182
int lengthOfMetadata = 1 + getEncodedMagicNumber().length + 1 + 1 + 1 + opcodeLength + 1;
183183

184-
if ( runMode != null )
185-
{
186-
// one byte of length + one delimiter character ':' + <string> + one delimiter character ':'
187-
lengthOfMetadata += 1 + 1 + runMode.getRunmode().length() + 1;
188-
}
184+
// one byte of length + one delimiter character ':' + <string> + one delimiter character ':'
185+
lengthOfMetadata += 1 + 1 + ( runMode == null ? 0 : runMode.getRunmodeBinary().length ) + 1;
189186

190187
if ( encoder != null )
191188
{

surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java

+16-16
Original file line numberDiff line numberDiff line change
@@ -134,45 +134,45 @@ public void shouldComputeStreamPreemptiveLength()
134134
NORMAL_RUN, encoder, 0, 1, "s" ) )
135135
.isEqualTo( 88 );
136136

137-
// :maven-surefire-event:16:console-info-log:5:UTF-8:0003:sss:
137+
// :maven-surefire-event:16:console-info-log:0::5:UTF-8:0001:s:
138138
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_INFO.getOpcodeBinary().length,
139139
null, encoder, 0, 0, "s" ) )
140-
.isEqualTo( 58 );
140+
.isEqualTo( 61 );
141141

142-
// :maven-surefire-event:17:console-debug-log:5:UTF-8:0003:sss:
142+
// :maven-surefire-event:17:console-debug-log:0::5:UTF-8:0001:s:
143143
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_DEBUG.getOpcodeBinary().length,
144144
null, encoder, 0, 0, "s" ) )
145-
.isEqualTo( 59 );
145+
.isEqualTo( 62 );
146146

147-
// :maven-surefire-event:19:console-warning-log:5:UTF-8:0003:sss:
147+
// :maven-surefire-event:19:console-warning-log:0::5:UTF-8:0001:s:
148148
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_WARNING.getOpcodeBinary().length,
149149
null, encoder, 0, 0, "s" ) )
150-
.isEqualTo( 61 );
150+
.isEqualTo( 64 );
151151

152-
// :maven-surefire-event:17:console-error-log:5:UTF-8:0003:sss:
152+
// :maven-surefire-event:17:console-error-log:0::5:UTF-8:0001:s:
153153
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_ERROR.getOpcodeBinary().length,
154154
null, encoder, 0, 0, "s" ) )
155-
.isEqualTo( 59 );
155+
.isEqualTo( 62 );
156156

157-
// :maven-surefire-event:3:bye:
157+
// :maven-surefire-event:3:bye:0::
158158
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_BYE.getOpcodeBinary().length,
159159
null, null, 0, 0 ) )
160-
.isEqualTo( 28 );
160+
.isEqualTo( 31 );
161161

162-
// :maven-surefire-event:17:stop-on-next-test:
162+
// :maven-surefire-event:17:stop-on-next-test:0::
163163
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STOP_ON_NEXT_TEST.getOpcodeBinary().length,
164164
null, null, 0, 0 ) )
165-
.isEqualTo( 42 );
165+
.isEqualTo( 45 );
166166

167-
// :maven-surefire-event:9:next-test:
167+
// :maven-surefire-event:9:next-test:0::
168168
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_NEXT_TEST.getOpcodeBinary().length,
169169
null, null, 0, 0 ) )
170-
.isEqualTo( 34 );
170+
.isEqualTo( 37 );
171171

172-
// :maven-surefire-event:14:jvm-exit-error:
172+
// :maven-surefire-event:14:jvm-exit-error:0::
173173
assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_JVM_EXIT_ERROR.getOpcodeBinary().length,
174174
null, null, 0, 0 ) )
175-
.isEqualTo( 39 );
175+
.isEqualTo( 42 );
176176
}
177177

178178
@Test

surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,25 @@ public void testStdErrStreamEmptyMessageNullTestId() throws IOException
12511251
.isEqualTo( expected );
12521252
}
12531253

1254+
@Test
1255+
public void testStdErrStreamEmptyMessageNullRunMode() throws IOException
1256+
{
1257+
Stream out = Stream.newStream();
1258+
WritableBufferedByteChannel channel = newBufferedChannel( out );
1259+
EventChannelEncoder encoder = new EventChannelEncoder( channel );
1260+
1261+
// This used to produce a BufferOverflowException; see SUREFIRE-2076.
1262+
encoder.testOutput( new TestOutputReportEntry( stdErr( "" ), null, 1L ) );
1263+
channel.close();
1264+
1265+
String expected = ":maven-surefire-event:\u000e:std-err-stream:"
1266+
+ (char) 0 + "::" // One byte for length and 1+1 bytes for the 2 delimiters (0 bytes for null runMode)
1267+
+ "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:"
1268+
+ "\u0005:UTF-8:\u0000\u0000\u0000\u0000::";
1269+
1270+
assertThat( new String( out.toByteArray(), UTF_8 ) )
1271+
.isEqualTo( expected );
1272+
}
12541273

12551274
@Test
12561275
@SuppressWarnings( "checkstyle:innerassignment" )

0 commit comments

Comments
 (0)