X-Git-Url: http://www.average.org/gitweb/?a=blobdiff_plain;f=gps303%2Fcollector.py;h=7326e1f3affa9704f17b5e2a27d597aab0dff7f6;hb=69d3f8b9d8a3cd603dcb07065115eb7426ca9a34;hp=de65394d4f4b5eefb0527bea384746cea5d5b2a0;hpb=0c28fa6306f252934fe7e2c04522e8540c414387;p=loctrkd.git diff --git a/gps303/collector.py b/gps303/collector.py index de65394..7326e1f 100644 --- a/gps303/collector.py +++ b/gps303/collector.py @@ -69,7 +69,20 @@ class Client: ) self.buffer = self.buffer[framestart:] # At this point, buffer starts with a packet - frameend = self.buffer.find(b"\r\n", 4) + if len(self.buffer) < 6: # no len and proto - cannot proceed + break + exp_end = self.buffer[2] + 3 # Expect '\r\n' here + frameend = 0 + # Length field can legitimeely be much less than the + # length of the packet (e.g. WiFi positioning), but + # it _should not_ be greater. Still sometimes it is. + # Luckily, not by too much: by maybe two or three bytes? + # Do this embarrassing hack to avoid accidental match + # of some binary data in the packet against '\r\n'. + while True: + frameend = self.buffer.find(b"\r\n", frameend) + if frameend >= (exp_end - 3): # Found realistic match + break if frameend == -1: # Incomplete frame, return what we have break packet = self.buffer[2:frameend]