Skip to content

Reject ext32 length 0xffffffff in the C unpacker - #761

Merged
methane merged 1 commit into
msgpack:mainfrom
methane:fix-ext32-skip-overflow
Oct 30, 2026
Merged

methane merged 1 commit into
msgpack:mainfrom
methane:fix-ext32-skip-overflow

Conversation

@methane

@methane methane commented Oct 27, 2026

Copy link
Copy Markdown
Member

The trail length of an ext value includes the typecode byte, so an ext32 length of 0xffffffff wrapped to zero after + 1 in 32-bit arithmetic.

  • Unpacker.skip() treated the 5-byte ext32 header as a complete object and parsed the remaining bytes as the next object.
  • unpack() / unpackb() were already rejected by the max_ext_len check, but with a confusing 0 exceeds max_ext_len(...) message.

This PR raises ValueError before adding the typecode byte. The pure Python implementation is not affected.

Reported by Oz Kaiser (@tatikoma).

🤖 Generated with Claude Code

The trail length of an ext value includes the typecode byte, so
0xffffffff + 1 wrapped to zero in 32-bit arithmetic. Unpacker.skip()
then treated the 5-byte ext32 header as a complete object and parsed
the remaining bytes as the next object. unpack() was already rejected
by the max_ext_len check, but with a confusing "0 exceeds" message.

Raise ValueError before adding the typecode byte.

Reported by Oz Kaiser (@tatikoma).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

There are no active review issues for the ext32 length-overflow fix.

No open issues 🎉

What changed in this PR

This PR fixes an integer overflow in the C unpacker when an ext32 value declares a length of 0xffffffff, preventing Unpacker.skip() from treating its header as a complete object.

Changes:

  • Reject the maximum ext32 length with ValueError before adding the typecode byte.
  • Add regression coverage for both Unpacker.unpack() and Unpacker.skip().
File Description
test/​test_limits.py Adds a parameterized test rejecting the maximum ext32 length.
msgpack/​unpack_template.h Guards against overflow when calculating the ext32 trailing length.

Review effort: Balanced

@methane
methane merged commit 98f010e into msgpack:main Oct 30, 2026
51 checks passed
@methane
methane deleted the fix-ext32-skip-overflow branch October 30, 2026 07:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants