Skip to content

[C++] Bound put<X> var data against the remaining buffer so a uint64 length cannot wrap the position - #1184

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

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

Conversation

@slachiewicz

Copy link
Copy Markdown
Contributor

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

put(src, length) now compares length with bufferLength - position, which cannot wrap, before advancing. The std::string and std::string_view overloads delegate to it. This is the encode-side counterpart of #1175.

Part of #969.

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

…length cannot wrap the position.

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