Repository navigation
Avoid untrusted definite-array preallocation in CBOR decoder - #37
Open
OskarEichler wants to merge 2 commits into
Open
OskarEichler wants to merge 2 commits into
OskarEichler wants to merge 2 commits into
Conversation
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.
Problem
The definite-array decoder allocated Ruby array capacity from the CBOR-declared element count before reading any elements. A short sequence of nested array headers can therefore reserve substantial capacity even when the input ends immediately. The existing change in this PR corrects the cap calculation, but a per-array cap alone does not limit the cumulative reservation across nested arrays.
On Ruby 4.0.6, 32 nested three-byte headers (96 input bytes) reserved 16,778,240 bytes of Ruby Array capacity before
EOFError. This is an allocation measurement, not a demonstrated resident-memory increase or process crash.Fix
Create definite arrays empty and let
rb_ary_pushgrow them as elements arrive. Retain the capped preallocation for raw strings. Decoded values, streaming behavior, and parser errors remain the same; valid large arrays may do additional proportional growth.Verification
rbenv exec rake compileandrbenv exec rake spec: 171 examples, 0 failures on Ruby 4.0.6, arm64 macOS.EOFError.