@@ -30,12 +30,15 @@ defaultSerializer.writeHeader();
3030const headerLength = defaultSerializer . releaseBuffer ( ) . length ;
3131const headerOnly = Buffer . from ( [ 0xff , 0x0f ] ) ;
3232const oversizedLengthHeader = Buffer . from ( [ 0xff , 0x0f , 0x7f , 0xff , 0xff , 0xff ] ) ;
33+ const unsignedOversizedLengthHeader = Buffer . from ( [ 0xff , 0x0f , 0x80 , 0x00 , 0x00 , 0x00 ] ) ;
3334const truncatedLengthHeader = Buffer . from ( [ 0xff , 0x0f , 0x00 , 0x01 , 0x00 , 0x00 ] ) ;
3435// Expected stdout for oversizedLengthHeader: first byte is emitted via
3536// String.fromCharCode (byte-by-byte fallback in #drainRawBuffer), remaining
3637// bytes go through the nonSerialized UTF-8 decode path in #processRawBuffer.
3738const oversizedLengthStdout = String . fromCharCode ( oversizedLengthHeader [ 0 ] ) +
3839 Buffer . from ( oversizedLengthHeader . subarray ( 1 ) ) . toString ( 'utf-8' ) ;
40+ const unsignedOversizedLengthStdout = String . fromCharCode ( unsignedOversizedLengthHeader [ 0 ] ) +
41+ Buffer . from ( unsignedOversizedLengthHeader . subarray ( 1 ) ) . toString ( 'utf-8' ) ;
3942
4043function collectStdout ( reported ) {
4144 return reported
@@ -112,6 +115,12 @@ describe('v8 deserializer', common.mustCall(() => {
112115 assert . strictEqual ( collectStdout ( reported ) , oversizedLengthStdout ) ;
113116 } ) ;
114117
118+ it ( 'should read an oversized length as an unsigned integer' , async ( ) => {
119+ const reported = await collectReported ( [ unsignedOversizedLengthHeader ] ) ;
120+ assert ( reported . every ( ( event ) => event . type === 'test:stdout' ) ) ;
121+ assert . strictEqual ( collectStdout ( reported ) , unsignedOversizedLengthStdout ) ;
122+ } ) ;
123+
115124 it ( 'should flush incomplete v8 frame as stdout and keep prior valid data' , async ( ) => {
116125 // A valid non-serialized message followed by bytes that look like
117126 // a v8 header with a truncated/oversized length.
0 commit comments