Skip to content

[Java] Reject out-of-range var-data lengths in the skip, wrap and get accessors - #1182

Open
slachiewicz wants to merge 1 commit into
aeron-io:masterfrom
slachiewicz:java-vardata-uint32-length-limit
Open

slachiewicz wants to merge 1 commit into
aeron-io:masterfrom
slachiewicz:java-vardata-uint32-length-limit

Conversation

@slachiewicz

Copy link
Copy Markdown
Contributor

A var-data field with a uint32 length prefix is read as (int), so a length of 2^31 or more became negative and moved the parent limit backwards. skipX(), wrapX(), getX(MutableDirectBuffer), getX(byte[]) and getX(Appendable) now throw IndexOutOfBoundsException before the limit moves when the length is negative (uint32 prefixes only) or runs past the buffer, the same check the String accessor has in #1150.

The check is emitted for every length type, so the generated IR codecs (uint16 lengths) gain it too and are regenerated. It sits in different hunks from #1150, but both touch FrameCodecDecoder and TokenCodecDecoder, so expect a mechanical rebase of the generated files.

Part of #969.

Verified: the new VarDataUint32LengthTest fails 15 of 17 on master and passes here; sbe-tool checkstyle and test, verifyJavaIrCodecsInSync and sbe-samples:check pass.

… accessors.

A uint32 length of 2^31 or more cast to a negative int and moved the parent limit backwards. The check mirrors the
String accessor and also rejects a length that runs past the buffer, before the limit moves.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant