Hi, On Wed, Dec 10, 2008 at 03:18:39AM +0100, Sascha Wessel wrote: > I guess it's a problem with invalid ubx headers. Can you try the > attached patch?
argh, forgot to check the buffer length, corrected patch attached... Greetings, Sascha
diff --git a/framework/subsystems/ogpsd/ubx.py b/framework/subsystems/ogpsd/ubx.py index 0dbad8e..1ab1dff 100644 --- a/framework/subsystems/ogpsd/ubx.py +++ b/framework/subsystems/ogpsd/ubx.py @@ -320,29 +320,40 @@ class UBXDevice( GPSDevice ): def parse( self, data ): self.buffer += data + buffer_offset = 0 # Minimum packet length is 8 - while len(self.buffer) >= 8: + while len(self.buffer) >= buffer_offset + 8: # Find the beginning of a UBX message - start = self.buffer.find( chr( SYNC1 ) + chr( SYNC2 ) ) - if start > 0 or (start == -1 and len(self.buffer) > 1): + start = self.buffer.find( chr( SYNC1 ) + chr( SYNC2 ), buffer_offset ) + + if buffer_offset == 0 and start != 0: logger.debug( "Discarded data not UBX %s" % repr(self.buffer[:start]) ) self.buffer = self.buffer[start:] continue - (cl, id, length) = struct.unpack("<xxBBH", self.buffer[:6]) - if len(self.buffer) < length + 8: + if start == -1 or start + 8 > len(self.buffer): return - if self.checksum(self.buffer[2:length+6]) != struct.unpack("<BB", self.buffer[length+6:length+8]): - logger.warning( "UBX packed class 0x%x, id 0x%x, length %i failed checksum" % (cl, id, length) ) - self.buffer = self.buffer[2:] + (cl, id, length) = struct.unpack("<BBH", self.buffer[start+2:start+6]) + if len(self.buffer) < start + length + 8: + buffer_offset = start + 2 + continue + + if self.checksum(self.buffer[start+2:start+length+6]) != struct.unpack("<BB", self.buffer[start+length+6:start+length+8]): + buffer_offset = start + 2 + continue + + if start != 0: + logger.warning(" UBX packet ignored %s" % repr(self.buffer[:start]) ) + self.buffer = self.buffer[start:] + buffer_offset = 0 continue - # Now we got a valid UBX packet, decode it - self.decode(cl, id, length, self.buffer[6:length+6]) + self.decode(cl, id, length, self.buffer[start+6:start+length+6]) # Discard packet - self.buffer = self.buffer[length+8:] + self.buffer = self.buffer[start+length+8:] + buffer_offset = 0 def send( self, clid, length, payload ): logger.debug( "Sending UBX packet of type %s: %s" % ( clid, payload ) )
_______________________________________________ Smartphones-userland mailing list Smartphones-userland@linuxtogo.org http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/smartphones-userland