Skip to content

blst_t.hpp: sanitize byte length in blst_256_t::to - #291

Closed
arib06 wants to merge 1 commit into
supranational:masterfrom
arib06:blst-t-to-zero-len
Closed

arib06 wants to merge 1 commit into
supranational:masterfrom
arib06:blst-t-to-zero-len

Conversation

@arib06

@arib06 arib06 commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

blst_256_t::to(const unsigned char*, size_t, bool) imports a variable-length byte string into a field element, the C++ mirror of the C blst_scalar_from_be_bytes() entry point. It sizes the leading partial digit with rem = (n - 1) % 32 + 1, but unlike the C version it never special-cases n == 0. When a caller imports an empty value the (n - 1) subtraction underflows to SIZE_MAX, rem lands on 32, and the following n -= rem drives n to SIZE_MAX - 31, so the digit loop keeps reading 32-byte chunks well past the end of the buffer. I ran into it while exercising zero-length imports and AddressSanitizer reported a stack-buffer-overflow read on the first loop iteration. The C siblings in exports.c already guard this with n ? (n - 1) % 32 + 1 : 0, so I applied the same guard here, which makes an empty input decode to the zero element and leaves every n >= 1 path unchanged.

@dot-asm dot-asm closed this in bac48b4 Oct 12, 2026
@dot-asm

dot-asm commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator

Thanks!

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.

2 participants