-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Fix Base64 decoding edge cases with small destinations and whitespace #123260
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Tagging subscribers to this area: @dotnet/area-system-memory |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR fixes edge cases in Base64 decoding when dealing with small destination buffers and embedded whitespace in the input. The core issue was that the InvalidDataFallback method would get stuck when trying to decode data with whitespace interspersed in Base64 blocks when the destination buffer was too small to hold the complete decoded output.
Changes:
- Modified the loop exit condition in
InvalidDataFallbackto be more explicit about which statuses terminate the loop - Added logic to detect when
DecodeFromreturnsDestinationTooSmallbut makes no progress (localConsumed == 0), falling back to block-wise decoding in those cases - Added comprehensive test coverage for the edge case with whitespace-heavy input and small destination buffers
- Enhanced existing test assertions to verify
Base64.DecodeFromUtf8behavior is consistent withConvert.TryFromBase64String
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/libraries/System.Private.CoreLib/src/System/Buffers/Text/Base64Helper/Base64DecoderHelper.cs | Fixed the InvalidDataFallback loop to properly handle DestinationTooSmall status by continuing to consume whitespace when progress is made, or falling back to block-wise decoding when stuck |
| src/libraries/System.Memory/tests/Base64/Base64DecoderUnitTests.cs | Added test case DecodingWithEmbeddedWhiteSpaceIntoSmallDestination_TrailingWhiteSpacesAreConsumed to verify trailing whitespace is properly consumed even with small destination buffers |
| src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/Convert.cs | Added assertions to existing parameterized tests to verify Base64.DecodeFromUtf8 behaves consistently with Convert methods across various input patterns |
...libraries/System.Private.CoreLib/src/System/Buffers/Text/Base64Helper/Base64DecoderHelper.cs
Outdated
Show resolved
Hide resolved
stephentoub
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks
|
/ba-g stuck in build analysis |
Fixes #123222
Fixes #123389
Replaces #123258
From
InvalidDataFallbackwe'll call back intoDecodeFromto try and process more data.But if the destination is too small and the next block of Base64 contains whitespace, it won't be able to make progress. Use the block-wise fallback in those cases.
Tests in #123151 now pass when including this change.