@@ -41,26 +41,37 @@ def parse_hex_line(line, line_number):
4141 address = (raw [1 ] << 8 ) | raw [2 ]
4242 record_type = raw [3 ]
4343 payload = raw [4 :4 + count ]
44+
45+ required_lengths = {0x01 : 0 , 0x02 : 2 , 0x03 : 4 , 0x04 : 2 , 0x05 : 4 }
46+ if record_type in required_lengths :
47+ if count != required_lengths [record_type ]:
48+ raise ValueError (f"line { line_number } : invalid record length for type { record_type :#x} " )
49+ if address != 0 :
50+ raise ValueError (f"line { line_number } : non-zero address for type { record_type :#x} " )
51+
4452 return record_type , address , payload
4553
4654
4755def read_ihex (filename ):
4856 data = {}
4957 upper_address = 0
58+ eof_seen = False
5059
5160 with open (filename , "r" , encoding = "ascii" ) as hex_file :
5261 for line_number , line in enumerate (hex_file , 1 ):
5362 record = parse_hex_line (line , line_number )
5463 if record is None :
5564 continue
65+ if eof_seen :
66+ raise ValueError (f"line { line_number } : record after EOF" )
5667
5768 record_type , address , payload = record
5869 if record_type == 0x00 :
5970 absolute = upper_address + address
6071 for offset , value in enumerate (payload ):
6172 data [absolute + offset ] = value
6273 elif record_type == 0x01 :
63- break
74+ eof_seen = True
6475 elif record_type == 0x02 :
6576 upper_address = int .from_bytes (payload , "big" ) << 4
6677 elif record_type == 0x04 :
@@ -70,6 +81,8 @@ def read_ihex(filename):
7081 else :
7182 raise ValueError (f"line { line_number } : unsupported record type { record_type :#x} " )
7283
84+ if not eof_seen :
85+ raise ValueError ("input HEX is missing EOF record" )
7386 if not data :
7487 raise ValueError ("input HEX contains no data records" )
7588
0 commit comments