Skip to content

Commit f0a7df1

Browse files
authoredFeb 25, 2018
[fix] Ensure packet data is an array (#83)
Related: socketio/socket.io#3140
1 parent 8822578 commit f0a7df1

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed
 

‎index.js

+16-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var debug = require('debug')('socket.io-parser');
77
var Emitter = require('component-emitter');
88
var hasBin = require('has-binary2');
99
var binary = require('./binary');
10+
var isArray = require('isarray');
1011
var isBuf = require('./is-buffer');
1112

1213
/**
@@ -272,7 +273,9 @@ function decodeString(str) {
272273
type: Number(str.charAt(0))
273274
};
274275

275-
if (null == exports.types[p.type]) return error();
276+
if (null == exports.types[p.type]) {
277+
return error('unknown packet type ' + p.type);
278+
}
276279

277280
// look up attachments if type binary
278281
if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {
@@ -318,20 +321,25 @@ function decodeString(str) {
318321

319322
// look up json data
320323
if (str.charAt(++i)) {
321-
p = tryParse(p, str.substr(i));
324+
var payload = tryParse(str.substr(i));
325+
var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));
326+
if (isPayloadValid) {
327+
p.data = payload;
328+
} else {
329+
return error('invalid payload');
330+
}
322331
}
323332

324333
debug('decoded %s as %j', str, p);
325334
return p;
326335
}
327336

328-
function tryParse(p, str) {
337+
function tryParse(str) {
329338
try {
330-
p.data = JSON.parse(str);
339+
return JSON.parse(str);
331340
} catch(e){
332-
return error();
341+
return false;
333342
}
334-
return p;
335343
}
336344

337345
/**
@@ -392,9 +400,9 @@ BinaryReconstructor.prototype.finishedReconstruction = function() {
392400
this.buffers = [];
393401
};
394402

395-
function error() {
403+
function error(msg) {
396404
return {
397405
type: exports.ERROR,
398-
data: 'parser error'
406+
data: 'parser error: ' + msg
399407
};
400408
}

‎test/arraybuffer.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ describe('parser', function() {
77
it('encodes an ArrayBuffer', function() {
88
var packet = {
99
type: parser.BINARY_EVENT,
10-
data: new ArrayBuffer(2),
10+
data: ['a', new ArrayBuffer(2)],
1111
id: 0,
1212
nsp: '/'
1313
};
@@ -17,7 +17,7 @@ describe('parser', function() {
1717
it('encodes ArrayBuffers deep in JSON', function() {
1818
var packet = {
1919
type: parser.BINARY_EVENT,
20-
data: {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}},
20+
data: ['a', {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}],
2121
id: 999,
2222
nsp: '/deep'
2323
};
@@ -27,7 +27,7 @@ describe('parser', function() {
2727
it('encodes deep binary JSON with null values', function() {
2828
var packet = {
2929
type: parser.BINARY_EVENT,
30-
data: {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)},
30+
data: ['a', {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}],
3131
nsp: '/',
3232
id: 600
3333
};

‎test/buffer.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ describe('parser', function() {
88
it('encodes a Buffer', function() {
99
helpers.test_bin({
1010
type: parser.BINARY_EVENT,
11-
data: new Buffer('abc', 'utf8'),
11+
data: ['a', new Buffer('abc', 'utf8')],
1212
id: 23,
1313
nsp: '/cool'
1414
});

‎test/parser.js

+19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ describe('parser', function(){
1212
expect(parser.EVENT).to.be.a('number');
1313
expect(parser.ACK).to.be.a('number');
1414
expect(parser.ERROR).to.be.a('number');
15+
expect(parser.BINARY_EVENT).to.be.a('number');
16+
expect(parser.BINARY_ACK).to.be.a('number');
1517
});
1618

1719
it('encodes connection', function(){
@@ -51,6 +53,14 @@ describe('parser', function(){
5153
});
5254
});
5355

56+
it('encodes an error', function(){
57+
helpers.test({
58+
type: parser.ERROR,
59+
data: 'Unauthorized',
60+
nsp: '/'
61+
});
62+
});
63+
5464
it('decodes a bad binary packet', function(){
5565
try {
5666
var decoder = new parser.Decoder();
@@ -59,4 +69,13 @@ describe('parser', function(){
5969
expect(e.message).to.match(/Illegal/);
6070
}
6171
});
72+
73+
it('returns an error packet on parsing error', function(done){
74+
var decoder = new parser.Decoder();
Has a conversation. Original line has a conversation.
75+
decoder.on('decoded', function(packet) {
76+
expect(packet).to.eql({ type: 4, data: 'parser error: invalid payload' });
77+
done();
78+
});
79+
decoder.add('442["some","data"');
80+
});
6281
});

0 commit comments

Comments
 (0)
Please sign in to comment.