Skip to content

Commit a5329fb

Browse files
committed
- added boundary check for raw navmsg decoder.
1 parent 61c82f9 commit a5329fb

File tree

1 file changed

+24
-33
lines changed

1 file changed

+24
-33
lines changed

src/cssrlib/rawnav.py

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,8 @@ def decode_gal_fnav(self, week, time, sat, type_, msg):
245245
return None
246246

247247
buff = self.gal_fnav[prn-1]
248-
i = 0
249248
for k in range(31): # copy 244bits
250-
buff[(sid-1)*31+k] = bs.unpack_from('u8', msg, i)[0]
251-
i += 8
249+
buff[(sid-1)*31+k] = msg[k]
252250

253251
buff = bytes(buff)
254252
sid1, svid1, iodnav1 = bs.unpack_from('u6u6u10', buff, 0)
@@ -300,18 +298,8 @@ def decode_gal_fnav(self, week, time, sat, type_, msg):
300298
eph.iodc = iodnav1
301299

302300
eph.sva = self.sisa2sva(sisa)
303-
304-
if type_ == 0:
305-
eph.code = 1
306-
elif type_ == 1:
307-
eph.code = 2
308-
elif type_ == 2:
309-
eph.code = 4
310-
311-
if type_ == 0 or type_ == 2: # INAV E1B, E5B
312-
eph.code |= (1 << 9) # toc/af0-2, SISA are for E5b, E1
313-
elif type_ == 1: # FNAV E1B, R5A
314-
eph.code |= (1 << 8) # toc/af0-2, SISA are for E5a, E1
301+
eph.code = 2 # FNAV
302+
eph.code |= (1 << 8) # toc/af0-2, SISA are for E5a, E1
315303

316304
eph.toe = gst2time(week_gst, eph.toes)
317305
eph.toc = gst2time(week_gst, toc)
@@ -342,7 +330,7 @@ def decode_gps_lnav(self, week, time, sat, msg):
342330
return None
343331

344332
sid = bs.unpack_from('u3', msg, 53)[0]
345-
buff[(sid-1)*40:(sid-1)*40+40] = msg
333+
buff[(sid-1)*40:(sid-1)*40+40] = msg[0:40]
346334

347335
id1 = bs.unpack_from('u3', buff, 53)[0]
348336
id2 = bs.unpack_from('u3', buff, 320+53)[0]
@@ -477,10 +465,10 @@ def decode_gps_cnav(self, week, time, sat, msg):
477465
return None
478466

479467
if sid in (10, 11): # ephemeris
480-
buff[(sid-10)*38:(sid-10)*38+38] = msg
468+
buff[(sid-10)*38:(sid-10)*38+38] = msg[0:38]
481469
elif (sid >= 30 and sid <= 37) or \
482470
(sys == uGNSS.QZS and sid == 61): # clock
483-
buff[2*38:2*38+38] = msg
471+
buff[2*38:2*38+38] = msg[0:38]
484472
elif sid == 12: # QZSS reduced almanac
485473
None
486474
elif sid == 15: # Text
@@ -810,11 +798,11 @@ def decode_bds_cnav_sisai(self, msg, eph, i):
810798
i += 22
811799
return i
812800

813-
def decode_bds_b1c(self, week, time_, prn, msg):
801+
def decode_bds_b1c(self, week, time_, sat, msg):
814802
""" BDS B1C (B-CNAV1 message decoder) [4] """
815803

816804
eph = Eph()
817-
eph.sat = prn2sat(uGNSS.BDS, prn)
805+
eph.sat = sat
818806
eph.sisai = np.zeros(4, dtype=int)
819807
eph.isc = np.zeros(6)
820808
# data2: 600b, errCorr2: 8b, data3: 264b, soh: 8b
@@ -873,7 +861,9 @@ def decode_bds_b2a(self, week, time_, sat, msg):
873861
msg_t = {10: 0, 11: 1, 30: 2, 34: 3, 40: 4}
874862
mid = msg_t[sid]
875863
buff = self.bds_cnv2[prn-1]
876-
buff[mid*40:mid*40+40] = msg
864+
865+
for k in range(len(msg)):
866+
buff[mid*40+k] = msg[k]
877867

878868
id1, sow1 = bs.unpack_from('u6u18', buff, 6)
879869
id2, sow2 = bs.unpack_from('u6u18', buff, 320+6)
@@ -933,23 +923,24 @@ def decode_bds_b2a(self, week, time_, sat, msg):
933923

934924
return eph
935925

936-
def decode_bds_b2b(self, week, time_, sat, msg):
926+
def decode_bds_b2b(self, week, time_, sat, msg, ofst=12):
937927
""" BDS B2b (B-CNAV3 message decoder) [4] """
938928

939929
sys, prn = sat2prn(sat)
940-
sid, sow = bs.unpack_from('u6u20', msg, 12)
930+
sid, sow = bs.unpack_from('u6u20', msg, ofst)
941931

942932
if sid not in (10, 30, 40):
943933
return None
944934

945935
msg_t = {10: 0, 30: 1, 40: 2}
946936
mid = msg_t[sid]
947937
buff = self.bds_cnv3[prn-1]
948-
buff[mid*64:mid*64+64] = msg
938+
for k in range(len(msg)):
939+
buff[mid*64+k] = msg[k]
949940

950-
id1, sow1 = bs.unpack_from('u6u20', buff, 12)
951-
id2, sow2 = bs.unpack_from('u6u20', buff, 512+12)
952-
id3, sow3 = bs.unpack_from('u6u20', buff, 512*2+12)
941+
id1, sow1 = bs.unpack_from('u6u20', buff, ofst)
942+
id2, sow2 = bs.unpack_from('u6u20', buff, 512+ofst)
943+
id3, sow3 = bs.unpack_from('u6u20', buff, 512*2+ofst)
953944

954945
if id1 != 10 or id2 != 30:
955946
return None
@@ -962,15 +953,15 @@ def decode_bds_b2b(self, week, time_, sat, msg):
962953
eph.isc = np.zeros(6)
963954

964955
# decode MT10
965-
i = 12+30
956+
i = ofst+30
966957
i = self.decode_bds_cnav_eph1(buff, eph, i)
967958
i = self.decode_bds_cnav_eph2(buff, eph, i)
968959

969960
eph.integ, eph.sismai = bs.unpack_from('u3u4', buff, i)
970961
i += 7
971962

972963
# decode MT30
973-
i = 512+12+26
964+
i = 512+ofst+26
974965
eph.week = bs.unpack_from('u13', buff, i)[0]
975966
i += 13+4
976967
i = self.decode_bds_cnav_clk(buff, eph, i)
@@ -1000,7 +991,7 @@ def decode_bds_d1(self, week, time, sat, msg):
1000991
return None
1001992

1002993
buff = self.bds_d12[prn-1]
1003-
buff[(sid-1)*40:(sid-1)*40+40] = msg
994+
buff[(sid-1)*40:(sid-1)*40+40] = msg[0:40]
1004995

1005996
id1 = bs.unpack_from('u3', buff, 15)[0]
1006997
id2 = bs.unpack_from('u3', buff, 320+15)[0]
@@ -1088,7 +1079,7 @@ def decode_bds_d2(self, week, time, sat, msg):
10881079

10891080
if frame == 1 and (page >= 1 and page <= 10):
10901081
buff = self.bds_d12[prn-1]
1091-
buff[(page-1)*20:(page-1)*20+20] = msg
1082+
buff[(page-1)*20:(page-1)*20+20] = msg[0:20]
10921083
else:
10931084
return None
10941085

@@ -1204,7 +1195,7 @@ def decode_irn_lnav(self, week, time, sat, msg):
12041195
i += 30
12051196

12061197
buff = self.irn_nav[prn-1]
1207-
buff[sid*40:sid*40+40] = msg
1198+
buff[sid*40:sid*40+40] = msg[0:40]
12081199

12091200
if sid > 2:
12101201
return None
@@ -1300,7 +1291,7 @@ def decode_glo_fdma(self, week, time, sat, msg, freq=0):
13001291
for sid_ in range(4):
13011292
buff[sid_*12:sid_*12+12] = bytearray(12)
13021293

1303-
buff[(sid-1)*12:(sid-1)*12+12] = msg
1294+
buff[(sid-1)*12:(sid-1)*12+12] = msg[0:12]
13041295

13051296
id1 = bs.unpack_from('u4', buff, 1)[0]
13061297
id2 = bs.unpack_from('u4', buff, 96+1)[0]

0 commit comments

Comments
 (0)