[api] Cover truncated bodies in the decode integration test and pin the 64 bit field rejection

Three malformed frames (a tag with a dangling continuation bit, a length prefix past the
payload, a two byte fixed32) must stop the decode loop without taking the connection down;
a generator test records that a double field is rejected before it could reach the loop.
This commit is contained in:
J. Nick Koston
2026-09-07 15:58:28 +02:00
parent 89082c7b2d
commit 097d487261
2 changed files with 22 additions and 0 deletions
@@ -93,6 +93,17 @@ async def test_api_decode_wire_types(
await waiter.expect(number_is(-77.5))
assert len(switch_states) == seen
# Truncated bodies stop the decode loop without taking the connection down: a tag with its
# continuation bit set and nothing after it, a length prefix past the end of the payload,
# and a fixed32 with two of its four bytes
await raw.send_raw(SWITCH_COMMAND, key + b"\x80")
await raw.send_raw(SWITCH_COMMAND, key + tag(2, WIRE_LENGTH) + b"\x7f" + b"ab")
await raw.send_raw(SWITCH_COMMAND, tag(1, WIRE_FIXED32) + b"\x01\x02")
await raw.send_raw(SWITCH_COMMAND, key + on)
await waiter.expect(switch_is(True), label="switch on after truncated frames")
await raw.send_raw(SWITCH_COMMAND, key + off)
await waiter.expect(switch_is(False))
# An unknown field ahead of the known ones is skipped; field 200 needs a two byte tag
await raw.send_raw(
SWITCH_COMMAND, tag(200, WIRE_VARINT) + encode_varint(300) + key + on