Ticket #296: ogpsd_workaround_for_invalid_ubx_header_length.patch

File ogpsd_workaround_for_invalid_ubx_header_length.patch, 2.5 KB (added by Sascha, 3 years ago)
  • framework/subsystems/ogpsd/ubx.py

    diff --git a/framework/subsystems/ogpsd/ubx.py b/framework/subsystems/ogpsd/ubx.py
    index 0dbad8e..1ab1dff 100644
    a b class UBXDevice( GPSDevice ): 
    320320 
    321321    def parse( self, data ): 
    322322        self.buffer += data 
     323        buffer_offset = 0 
    323324        # Minimum packet length is 8 
    324         while len(self.buffer) >= 8: 
     325        while len(self.buffer) >= buffer_offset + 8: 
    325326            # Find the beginning of a UBX message 
    326             start = self.buffer.find( chr( SYNC1 ) + chr( SYNC2 ) ) 
    327             if start > 0 or (start == -1 and len(self.buffer) > 1): 
     327            start = self.buffer.find( chr( SYNC1 ) + chr( SYNC2 ), buffer_offset ) 
     328 
     329            if buffer_offset == 0 and start != 0: 
    328330                logger.debug( "Discarded data not UBX %s" % repr(self.buffer[:start]) ) 
    329331                self.buffer = self.buffer[start:] 
    330332                continue 
    331333 
    332             (cl, id, length) = struct.unpack("<xxBBH", self.buffer[:6]) 
    333             if len(self.buffer) < length + 8: 
     334            if start == -1 or start + 8 > len(self.buffer): 
    334335                return 
    335336 
    336             if self.checksum(self.buffer[2:length+6]) != struct.unpack("<BB", self.buffer[length+6:length+8]): 
    337                 logger.warning( "UBX packed class 0x%x, id 0x%x, length %i failed checksum" % (cl, id, length) ) 
    338                 self.buffer = self.buffer[2:] 
     337            (cl, id, length) = struct.unpack("<BBH", self.buffer[start+2:start+6]) 
     338            if len(self.buffer) < start + length + 8: 
     339                buffer_offset = start + 2  
     340                continue 
     341 
     342            if self.checksum(self.buffer[start+2:start+length+6]) != struct.unpack("<BB", self.buffer[start+length+6:start+length+8]): 
     343                buffer_offset = start + 2 
     344                continue 
     345 
     346            if start != 0: 
     347                logger.warning(" UBX packet ignored %s" % repr(self.buffer[:start]) ) 
     348                self.buffer = self.buffer[start:] 
     349                buffer_offset = 0 
    339350                continue 
    340351 
    341             # Now we got a valid UBX packet, decode it 
    342             self.decode(cl, id, length, self.buffer[6:length+6]) 
     352            self.decode(cl, id, length, self.buffer[start+6:start+length+6]) 
    343353 
    344354            # Discard packet 
    345             self.buffer = self.buffer[length+8:] 
     355            self.buffer = self.buffer[start+length+8:] 
     356            buffer_offset = 0 
    346357 
    347358    def send( self, clid, length, payload ): 
    348359        logger.debug( "Sending UBX packet of type %s: %s" % ( clid, payload ) )