Skip to content

Commit 58ddc8c

Browse files
LeSingh1lpinca
authored andcommitted
[fix] Count empty fragments toward the limit (#2329)
Ensure that empty fragments are counted against the `maxFragments` limit.
1 parent 86d3e8a commit 58ddc8c

2 files changed

Lines changed: 23 additions & 19 deletions

File tree

‎lib/receiver.js‎

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class Receiver extends Writable {
6565

6666
this._totalPayloadLength = 0;
6767
this._messageLength = 0;
68+
this._numFragments = 0;
6869
this._fragments = [];
6970

7071
this._state = GET_INFO;
@@ -353,21 +354,18 @@ class Receiver extends Writable {
353354

354355
if (this._opcode > 0x07) return this.controlMessage(data);
355356

357+
if (this._maxFragments > 0 && ++this._numFragments > this._maxFragments) {
358+
this._loop = false;
359+
return error(RangeError, 'Too many message fragments', false, 1008);
360+
}
361+
356362
if (this._compressed) {
357363
this._state = INFLATING;
358364
this.decompress(data, cb);
359365
return;
360366
}
361367

362368
if (data.length) {
363-
if (
364-
this._maxFragments > 0 &&
365-
this._fragments.length >= this._maxFragments
366-
) {
367-
this._loop = false;
368-
return error(RangeError, 'Too many message fragments', false, 1008);
369-
}
370-
371369
//
372370
// This message is not compressed so its lenght is the sum of the payload
373371
// length of all fragments.
@@ -400,15 +398,6 @@ class Receiver extends Writable {
400398
);
401399
}
402400

403-
if (
404-
this._maxFragments > 0 &&
405-
this._fragments.length >= this._maxFragments
406-
) {
407-
return cb(
408-
error(RangeError, 'Too many message fragments', false, 1008)
409-
);
410-
}
411-
412401
this._fragments.push(buf);
413402
}
414403

‎test/receiver.test.js‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ describe('Receiver', () => {
889889
});
890890
});
891891

892-
it('emits an error if there are too many message fragments (1/2)', (done) => {
892+
it('emits an error if there are too many message fragments (1/3)', (done) => {
893893
const receiver = new Receiver(undefined, {}, 0, 0, 2);
894894

895895
receiver.on('error', (err) => {
@@ -914,7 +914,22 @@ describe('Receiver', () => {
914914
);
915915
});
916916

917-
it('emits an error if there are too many message fragments (2/2)', (done) => {
917+
it('emits an error if there are too many message fragments (2/3)', (done) => {
918+
const receiver = new Receiver(undefined, {}, 0, 0, 2);
919+
920+
receiver.on('error', (err) => {
921+
assert.ok(err instanceof RangeError);
922+
assert.strictEqual(err.message, 'Too many message fragments');
923+
assert.strictEqual(err[kStatusCode], 1008);
924+
done();
925+
});
926+
927+
receiver.write(Buffer.from([0x02, 0x00]));
928+
receiver.write(Buffer.from([0x00, 0x00]));
929+
receiver.write(Buffer.from([0x00, 0x00]));
930+
});
931+
932+
it('emits an error if there are too many message fragments (3/3)', (done) => {
918933
const perMessageDeflate = new PerMessageDeflate();
919934
perMessageDeflate.accept([{}]);
920935

0 commit comments

Comments
 (0)