Fix integer overflow in CodedInputStream::ReadLengthAndPushLimit - #29523
Open
TurboRx wants to merge 1 commit into
Open
Fix integer overflow in CodedInputStream::ReadLengthAndPushLimit#29523TurboRx wants to merge 1 commit into
TurboRx wants to merge 1 commit into
Conversation
When ReadVarint32 decodes a length greater than INT_MAX (such as 0x80000000), implicitly passing it as a signed int to PushLimit results in a negative byte_limit. Because PushLimit checks byte_limit >= 0, the new limit is silently ignored, leaving the stream bounded only by outer/unconstrained limits instead of immediately bounding the stream. This change ensures that lengths exceeding INT_MAX safely trigger a limit of 0, immediately bounding the stream.
Member
|
The direction of this PR is right, but Before merging, could you:
|
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.
When
ReadVarint32decodes a length >INT_MAX, castinguint32_tto signedintmakesbyte_limitnegative. This causesPushLimitto skip updatingcurrent_limit_, leaving the stream bounded only by outer limits.This patch clamps lengths >
INT_MAXto0so the stream is immediately bounded, and adds a unit test for this case incoded_stream_unittest.cc.