Skip to content

[C] Bound put_<x> var data against the remaining buffer so a uint64 length cannot wrap the position - #1185

Open
slachiewicz wants to merge 1 commit into
aeron-io:masterfrom
slachiewicz:c-var-data-put-uint64-length-wrap
Open

slachiewicz wants to merge 1 commit into
aeron-io:masterfrom
slachiewicz:c-var-data-put-uint64-length-wrap

Conversation

@slachiewicz

Copy link
Copy Markdown
Contributor

With a uint64 var data length, put_(codec, src, length) advanced the position with set_sbe_position(pos + length), which can wrap, pass the bounds check and let the memcpy write past the buffer.

put_ now returns NULL with errno E100 when length exceeds buffer_length - position, a comparison that cannot wrap. This is the encode-side counterpart of #1178.

Part of #969.

Verified: CVarDataPutUint64LengthTest fails on master (negative-size-param in put_text() under ASan) and passes here; sbe-tool checkstyle and test, cppbuild and cppbuild --debug-build --sanitise-build pass.

…ength cannot wrap the position.

The check must stay a subtraction: pos + length wraps for a uint64 length and passes set_sbe_position().
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