Skip to content

Commit 1ba3ce4

Browse files
authored
test_runner: convert to uint during deserialization
Signed-off-by: Aviv Keller <me@aviv.sh> PR-URL: #64706 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
1 parent 893602c commit 1ba3ce4

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

lib/internal/test_runner/runner.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,12 +466,12 @@ class FileTest extends Test {
466466
while (bufferHead?.length >= kSerializedSizeHeader) {
467467
// We call `readUInt32BE` manually here, because this is faster than first converting
468468
// it to a buffer and using `readUInt32BE` on that.
469-
const fullMessageSize = (
469+
const fullMessageSize = ((
470470
bufferHead[kV8HeaderLength] << 24 |
471471
bufferHead[kV8HeaderLength + 1] << 16 |
472472
bufferHead[kV8HeaderLength + 2] << 8 |
473473
bufferHead[kV8HeaderLength + 3]
474-
) + kSerializedSizeHeader;
474+
) >>> 0) + kSerializedSizeHeader;
475475

476476
if (this.#rawBufferSize < fullMessageSize) break;
477477

test/parallel/test-runner-v8-deserializer.mjs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@ defaultSerializer.writeHeader();
3030
const headerLength = defaultSerializer.releaseBuffer().length;
3131
const headerOnly = Buffer.from([0xff, 0x0f]);
3232
const oversizedLengthHeader = Buffer.from([0xff, 0x0f, 0x7f, 0xff, 0xff, 0xff]);
33+
const unsignedOversizedLengthHeader = Buffer.from([0xff, 0x0f, 0x80, 0x00, 0x00, 0x00]);
3334
const 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.
3738
const 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

4043
function 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

Comments
 (0)