Skip to content

cblockd: fix heap overflow when replaying console history - #131

Merged
csjayp merged 1 commit into
masterfrom
csjp/heap-overflow-fix
Nov 11, 2026
Merged

csjayp merged 1 commit into
masterfrom
csjp/heap-overflow-fix

Conversation

@csjayp

@csjayp csjayp commented Nov 11, 2026

Copy link
Copy Markdown
Owner

tty_trim_buffer() strips trailing whitespace and NULs from the console history before it is replayed to a newly attached client. If the scan never found a non-whitespace byte above input[0] (for example a history of just "\r\n"), the "new" pointer was left at 0 and the returned length was computed as len - (pointer - 0), which wraps to a huge size_t. dispatch_connect_console() then sent 64K frames past the end of the termbuf_to_contig() allocation, which crashed cblockd under ASAN and could send heap contents to the console client otherwise.

Rewrite the function to count the length down instead of doing pointer arithmetic. This also checks input[0], which the old loop skipped, and casts to unsigned char before calling isspace(), because passing a negative char is undefined behaviour for bytes >= 0x80.

Writing the terminating NUL at input[len] is safe because termbuf_to_contig() allocates t_tot_len + 1 bytes.

tty_trim_buffer() strips trailing whitespace and NULs from the console
history before it is replayed to a newly attached client. If the scan
never found a non-whitespace byte above input[0] (for example a history
of just "\r\n"), the "new" pointer was left at 0 and the returned length
was computed as len - (pointer - 0), which wraps to a huge size_t.
dispatch_connect_console() then sent 64K frames past the end of the
termbuf_to_contig() allocation, which crashed cblockd under ASAN and
could send heap contents to the console client otherwise.

Rewrite the function to count the length down instead of doing pointer
arithmetic. This also checks input[0], which the old loop skipped, and
casts to unsigned char before calling isspace(), because passing a
negative char is undefined behaviour for bytes >= 0x80.

Writing the terminating NUL at input[len] is safe because
termbuf_to_contig() allocates t_tot_len + 1 bytes.
@csjayp
csjayp merged commit acdb653 into master Nov 11, 2026
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