Skip to content
Open
Prev Previous commit
Next Next commit
Fix FRAME_SIZE_ERROR debug logging.
  • Loading branch information
thughes committed Feb 21, 2017
commit 638bde8ae7c8ab6dfb38647498b1c782a54eba1d
58 changes: 29 additions & 29 deletions lib/protocol/framer.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ Deserializer.prototype._transform = function _transform(chunk, encoding, done) {
// If it's header then the parsed data is stored in a temporary variable and then the
// deserializer waits for the specified length payload.
if ((this._cursor === this._buffer.length) && this._waitingForHeader) {
var payloadSize = Deserializer.commonHeader(this._buffer, this._frame);
var payloadSize = Deserializer.commonHeader(this._buffer, this._frame, this._log);
if (payloadSize <= MAX_PAYLOAD_SIZE) {
this._next(payloadSize);
} else {
Expand All @@ -128,7 +128,7 @@ Deserializer.prototype._transform = function _transform(chunk, encoding, done) {
// will also run.
if ((this._cursor === this._buffer.length) && !this._waitingForHeader) {
if (this._frame.type) {
var error = Deserializer[this._frame.type](this._buffer, this._frame, this._role);
var error = Deserializer[this._frame.type](this._buffer, this._frame, this._role, this._log);
if (error) {
this._log.error('Incoming frame parsing error: ' + error);
this.emit('error', error);
Expand Down Expand Up @@ -235,9 +235,9 @@ Serializer.commonHeader = function writeCommonHeader(frame, buffers) {
return size;
};

Deserializer.commonHeader = function readCommonHeader(buffer, frame) {
Deserializer.commonHeader = function readCommonHeader(buffer, frame, logger) {
if (buffer.length < 9) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readCommonHeader, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readCommonHeader, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}

Expand Down Expand Up @@ -299,13 +299,13 @@ Serializer.DATA = function writeData(frame, buffers) {
buffers.push(frame.data);
};

Deserializer.DATA = function readData(buffer, frame) {
Deserializer.DATA = function readData(buffer, frame, role, logger) {
var dataOffset = 0;
var paddingLength = 0;
if (frame.flags.PADDED) {
if (buffer.length < 1) {
// We must have at least one byte for padding control, but we don't. Bad peer!
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readData, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readData, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
paddingLength = (buffer.readUInt8(dataOffset) & 0xff);
Expand All @@ -315,7 +315,7 @@ Deserializer.DATA = function readData(buffer, frame) {
if (paddingLength) {
if (paddingLength >= (buffer.length - 1)) {
// We don't have enough room for the padding advertised - bad peer!
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readData, buffer.length: ' + buffer.length + ' paddingLength: ' + paddingLength);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readData, buffer.length: ' + buffer.length + ' paddingLength: ' + paddingLength);
return 'FRAME_SIZE_ERROR';
}
frame.data = buffer.slice(dataOffset, -1 * paddingLength);
Expand Down Expand Up @@ -380,7 +380,7 @@ Serializer.HEADERS = function writeHeadersPriority(frame, buffers) {
buffers.push(frame.data);
};

Deserializer.HEADERS = function readHeadersPriority(buffer, frame) {
Deserializer.HEADERS = function readHeadersPriority(buffer, frame, role, logger) {
var minFrameLength = 0;
if (frame.flags.PADDED) {
minFrameLength += 1;
Expand All @@ -390,7 +390,7 @@ Deserializer.HEADERS = function readHeadersPriority(buffer, frame) {
}
if (buffer.length < minFrameLength) {
// Peer didn't send enough data - bad peer!
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readHeadersPriority, buffer.length: '
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readHeadersPriority, buffer.length: '
+ buffer.length + ' minFrameLength: ' + minFrameLength);
return 'FRAME_SIZE_ERROR';
}
Expand All @@ -416,7 +416,7 @@ Deserializer.HEADERS = function readHeadersPriority(buffer, frame) {
if (paddingLength) {
if ((buffer.length - dataOffset) < paddingLength) {
// Not enough data left to satisfy the advertised padding - bad peer!
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readHeadersPriority, buffer.length: ' + buffer.length
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readHeadersPriority, buffer.length: ' + buffer.length
+ ' dataOffset: ' + dataOffset + ' paddingLength: ' + paddingLength);
return 'FRAME_SIZE_ERROR';
}
Expand Down Expand Up @@ -462,10 +462,10 @@ Serializer.PRIORITY = function writePriority(frame, buffers) {
buffers.push(buffer);
};

Deserializer.PRIORITY = function readPriority(buffer, frame) {
Deserializer.PRIORITY = function readPriority(buffer, frame, role, logger) {
if (buffer.length < 5) {
// PRIORITY frames are 5 bytes long. Bad peer!
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPriority, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPriority, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
var dependencyData = new Buffer(4);
Expand Down Expand Up @@ -506,10 +506,10 @@ Serializer.RST_STREAM = function writeRstStream(frame, buffers) {
buffers.push(buffer);
};

Deserializer.RST_STREAM = function readRstStream(buffer, frame) {
Deserializer.RST_STREAM = function readRstStream(buffer, frame, role, logger) {
if (buffer.length < 4) {
// RST_STREAM is 4 bytes long. Bad peer!
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readRstStream, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readRstStream, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
frame.error = errorCodes[buffer.readUInt32BE(0)];
Expand Down Expand Up @@ -574,14 +574,14 @@ Serializer.SETTINGS = function writeSettings(frame, buffers) {
buffers.push(buffer);
};

Deserializer.SETTINGS = function readSettings(buffer, frame, role) {
Deserializer.SETTINGS = function readSettings(buffer, frame, role, logger) {
frame.settings = {};

// Receipt of a SETTINGS frame with the ACK flag set and a length
// field value other than 0 MUST be treated as a connection error
// (Section 5.4.1) of type FRAME_SIZE_ERROR.
if(frame.flags.ACK && buffer.length != 0) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readSettings, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readSettings, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}

Expand Down Expand Up @@ -672,16 +672,16 @@ Serializer.PUSH_PROMISE = function writePushPromise(frame, buffers) {
buffers.push(frame.data);
};

Deserializer.PUSH_PROMISE = function readPushPromise(buffer, frame) {
Deserializer.PUSH_PROMISE = function readPushPromise(buffer, frame, role, logger) {
if (buffer.length < 4) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPushPromise, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPushPromise, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
var dataOffset = 0;
var paddingLength = 0;
if (frame.flags.PADDED) {
if (buffer.length < 5) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPushPromise PADDED, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPushPromise PADDED, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
paddingLength = (buffer.readUInt8(dataOffset) & 0xff);
Expand All @@ -691,7 +691,7 @@ Deserializer.PUSH_PROMISE = function readPushPromise(buffer, frame) {
dataOffset += 4;
if (paddingLength) {
if ((buffer.length - dataOffset) < paddingLength) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPushPromise, buffer.length: ' + buffer.length
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPushPromise, buffer.length: ' + buffer.length
+ ' dataOffset: ' + dataOffset + ' paddingLength: ' + paddingLength);
return 'FRAME_SIZE_ERROR';
}
Expand Down Expand Up @@ -724,9 +724,9 @@ Serializer.PING = function writePing(frame, buffers) {
buffers.push(frame.data);
};

Deserializer.PING = function readPing(buffer, frame) {
Deserializer.PING = function readPing(buffer, frame, role, logger) {
if (buffer.length !== 8) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPing, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readPing, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
frame.data = buffer;
Expand Down Expand Up @@ -774,10 +774,10 @@ Serializer.GOAWAY = function writeGoaway(frame, buffers) {
buffers.push(buffer);
};

Deserializer.GOAWAY = function readGoaway(buffer, frame) {
Deserializer.GOAWAY = function readGoaway(buffer, frame, role, logger) {
if (buffer.length !== 8) {
// GOAWAY must have 8 bytes
this._log.error({ frame: frame }, 'FRAME_SIZE_ERROR, readGoAway, buffer.length: ' + buffer.length);
logger.error({ frame: frame }, 'FRAME_SIZE_ERROR, readGoAway, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
frame.last_stream = buffer.readUInt32BE(0) & 0x7fffffff;
Expand Down Expand Up @@ -816,9 +816,9 @@ Serializer.WINDOW_UPDATE = function writeWindowUpdate(frame, buffers) {
buffers.push(buffer);
};

Deserializer.WINDOW_UPDATE = function readWindowUpdate(buffer, frame) {
Deserializer.WINDOW_UPDATE = function readWindowUpdate(buffer, frame, role, logger) {
if (buffer.length !== WINDOW_UPDATE_PAYLOAD_SIZE) {
this._log.error({ frame: frame }, 'FRAME_SIZE_ERROR, readWindowUpdate, buffer.length: ' + buffer.length);
logger.error({ frame: frame }, 'FRAME_SIZE_ERROR, readWindowUpdate, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
frame.window_size = buffer.readUInt32BE(0) & 0x7fffffff;
Expand Down Expand Up @@ -1052,14 +1052,14 @@ function unescape(s) {
return t;
}

Deserializer.ALTSVC = function readAltSvc(buffer, frame) {
Deserializer.ALTSVC = function readAltSvc(buffer, frame, role, logger) {
if (buffer.length < 2) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readAltSvc, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readAltSvc, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
var originLength = buffer.readUInt16BE(0);
if ((buffer.length - 2) < originLength) {
this._log.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readAltSvc 2, buffer.length: ' + buffer.length);
logger.error({ buffer: buffer }, 'FRAME_SIZE_ERROR, readAltSvc 2, buffer.length: ' + buffer.length);
return 'FRAME_SIZE_ERROR';
}
frame.origin = buffer.toString('ascii', 2, 2 + originLength);
Expand Down