@@ -205,6 +205,15 @@ var createDataHandler = exports.Connection.createDataHandler = function(self) {
205205 if ( data . length > 4 ) {
206206 // Retrieve the message size
207207 var sizeOfMessage = binaryutils . decodeUInt32 ( data , 0 ) ;
208+ // If we have a negative sizeOfMessage emit error and return
209+ if ( sizeOfMessage < 0 || sizeOfMessage > self . maxBsonSize ) {
210+ // We got a parse Error fire it off then keep going
211+ self . emit ( "parseError" , { err :"socketHandler" , trace :'' , bin :self . buffer , parseState :{
212+ sizeOfMessage :sizeOfMessage ,
213+ bytesRead :self . bytesRead ,
214+ stubBuffer :self . stubBuffer } } ) ;
215+ return ;
216+ }
208217
209218 // Ensure that the size of message is larger than 0 and less than the max allowed
210219 if ( sizeOfMessage > 4 && sizeOfMessage < self . maxBsonSize && sizeOfMessage > data . length ) {
@@ -255,14 +264,22 @@ var createDataHandler = exports.Connection.createDataHandler = function(self) {
255264 data = new Buffer ( 0 ) ;
256265
257266 } else {
258- self . emit ( "message" , data . slice ( 0 , sizeOfMessage ) ) ;
259- // Reset state of buffer
260- self . buffer = null ;
261- self . sizeOfMessage = 0 ;
262- self . bytesRead = 0 ;
263- self . stubBuffer = null ;
264- // Copy rest of message
265- data = data . slice ( sizeOfMessage ) ;
267+ try {
268+ self . emit ( "message" , data . slice ( 0 , sizeOfMessage ) ) ;
269+ // Reset state of buffer
270+ self . buffer = null ;
271+ self . sizeOfMessage = 0 ;
272+ self . bytesRead = 0 ;
273+ self . stubBuffer = null ;
274+ // Copy rest of message
275+ data = data . slice ( sizeOfMessage ) ;
276+ } catch ( err ) {
277+ // We got a parse Error fire it off then keep going
278+ self . emit ( "parseError" , { err :"socketHandler" , trace :err , bin :self . buffer , parseState :{
279+ sizeOfMessage :sizeOfMessage ,
280+ bytesRead :self . bytesRead ,
281+ stubBuffer :self . stubBuffer } } ) ;
282+ }
266283
267284 }
268285 } else {
0 commit comments