Repository navigation
fix(internet): parse an IGMPv3 Report cut inside its record list (#2650) - #2662
Merged
Merged
Conversation
A Report the capture cuts short falls back to Raw. Report.records is sized by the IGMP length, so past the octets present a GroupRecord consumes nothing, and ListField.unpack refuses it as a loop making no progress. - GroupRecordListField sizes Report.records by the octets present: the record the data ends inside is kept as far as it goes, and Schema.unpack records the short read, as for a cut Query. ListField is unchanged, so its guard against a loop making no progress still holds. - IGMPv3.make takes num_group_records, which IGMPv3._make_data passes through, so a Report cut to fewer records than its count rebuilds as captured. A count that is no int from the records' length to 65535 raises ProtocolError (#2617). - Tests: cuts inside a record header and a source list, a whole Report, cut Additional Data, the field on bytes and a live stream, the count's refusals and edges, the short-read sweep, and TRUNCATED checksum_status. IGMP, schema, field, sweep and doc-claim modules pass; captures parse identically to main.
Owner
Author
|
GOOD TO GO at |
JarryShaw
added a commit
that referenced
this pull request
Nov 2, 2026
…ants sweep #2662 range-checks num_group_records against 0xFFFF, the Number of Group Records field's maximum (RFC 3376 section 4.2.1), which the one-home sweep read as a copy of IP_MAX_LENGTH. Key it in NOT_A_COPY by its exact expression.
JarryShaw
added a commit
that referenced
this pull request
Nov 2, 2026
…he cut-frame fixes and GRE's bindings into 1.6.0 (#2449) - Breaking: TCP, UDP and SCTP makers (#2670) and PCAP-NG's (#2671) raise on a value a field cannot hold, where 1.5.x wrote it masked; each entry gives the old and new values. The TTL Diff wraps as before. - Changed: __index__ returns the LinkType, EtherType, TransType or AppType value, ports as ints (#2652); only Create Release waits for a deployment approval (#2658). The conventions entry records the index rule. - Fixed: a cut HTTP/2 SETTINGS frame parses and rebuilds; HTTPv2.make takes frame_length (#2666). - Folded into unreleased entries: FRAD at LinkType 107 and GRE at IP protocol 47 (#2667); cut IGMPv3 messages and num_group_records (#2662, #2672); Linux_ARPHRD (#2663); DCCP's range checks (#2670); a cut GRE frame is TRUNCATED, replacing fold-12's INVALID note, and frame_length in pcapkit.utilities.contextvars (#2668). - No entry for _make_sint's private allow_unsigned, ARP's private PAT_MAC_ADDR, or the test- and docs-only d728873, 326a6cf, fc80fb1, a37edf1 and 2766707. - CHANGELOG.md regenerated; util/changelog_md.py --check passes.
This was referenced Nov 2, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
make pylint,make mypy,make isort)make testpasses, and a test case covers the changeWhat is the purpose of your pull request?
fix— fixes a bugDescription of your pull request and other information
An IGMPv3 Membership Report cut short by the capture parses as IGMPv3 instead of falling back to
Raw. A Query cut the same way already did.Report.recordsis sized by the IP-declared length, soListField's infinite-loop guard (OptionField.unpack never returns for a well-formed HOPOPT header with an SMF_DPD option #431) raised at the end of the captured octets.GroupRecordListField: sizes the list by the octets present, as SCTP'sChunkListFielddoes, and the short read is recorded.ListFieldis unchanged, because changing it altered TCP SACK.IGMPv3.make: takes an optionalnum_group_records, so a cut Report rebuilds as captured. Per fix(internet): the Quick-Start rate codec raises in IPv4 and clamps in TCP #2617, it raisesProtocolErrorunless the value is anintfrom the record count to0xFFFF.TRUNCATEDunder checksum verification.A Sonnet cross-review confirmed every byte-exact rebuild across cuts at every offset of seven Report shapes. Queries, TCP SACK, SCTP SACK and HTTP/2 SETTINGS are unchanged. The
make()validation it asked for is in this head.test_whole_report_is_not_markedis a control and passes onmain.Closes #2650