ArrayWriter.EnsureBufferCapacity must account for _start #6266
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.
Currently,
HotChocolate.Utilities.ArrayWriter.GetMemory()/GetSpan()
can throw in rare cases becauseEnsureBufferCapacity
allocates insufficient memory. Example: suppose the array writer has a 16k buffer (_buffer.Length == 0x4000
) to which 8k bytes is already written (_start == 0x2000
) andGetMemory(0x7000)
is invoked, in turn callingEnsureBufferCapacity(0x7000)
. It will double the size of the buffer to0x8000
and think did it's job because0x7000 < 0x8000
, but then_buffer.AsSpan().Slice(0x2000,0x7000)
throws.The one-liner PR fixes this without danger of integer overflow by subtracting
_start
when comparing needed capacity to newly available capacity.