Skip to content

Commit fa888f0

Browse files
RandoSYh2zero
authored andcommitted
fix: validate Intel HEX record structure
1 parent 4b74e66 commit fa888f0

1 file changed

Lines changed: 14 additions & 1 deletion

File tree

tools/uf2conv.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

4755
def 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

Comments
 (0)