On Mon, 5 Oct 2026 08:56:54 -0700 Kees Cook <[email protected]> wrote:
> When seq_buf_puts() or seq_buf_putmem() is given more than fits, it > copies nothing and only marks the seq_buf as overflowed. If seq_buf_str() > is used, it will terminate the buffer in its last byte, so every byte > between the end of the data and the end of the buffer becomes part of > the string, though the seq_buf never wrote them. > > seq_buf_printf() does not have this problem, because vsnprintf() writes > as much of the output as fits, followed by a NUL. Repeat this behavior > in seq_buf_puts(), using strscpy(), and in seq_buf_putmem(), which also > covers seq_buf_putmem_hex(). seq_buf_putc() needs no change, as it can > only overflow when the buffer is already full. > > Each writer now records the buffer as full once it has copied what fits, > so that what it wrote can be told apart from bytes nothing touched. > > Of the callers that check the return value or test for overflow > afterward, only lpfc_rx_monitor_report() relied on a string that did not > fit being left out, and the previous patch has it drop such a record > itself. The others treat overflow as an error or report it. The callers > that ignore overflow use whatever the buffer holds, which now ends with > the part of the string that fit. > > Update seq_buf_putmem_hex_overflow_test, which expected a hex group that > did not fit whole to be left out entirely, and add tests that overflow > seq_buf_puts(), seq_buf_putmem() and seq_buf_putmem_hex() with stale > bytes in the buffer. > > The three partial-overflow tests check the buffer itself rather than > seq_buf_str(). Neither writer leaves the last byte of the buffer alone: > seq_buf_putmem() copies raw bytes and writes no NUL, and seq_buf_puts() > relies on strscpy() to write one. That byte is exactly where > seq_buf_str() writes its terminator, so asserting only on the string > would pass whether the copy stopped a byte early or dropped the NUL > entirely. > > seq_buf_putmem() was not exported, so the test failed to link as a > module. Export it. > > Tests passed under qemu on ARCH=x86_64 with GCC 16.2.0 and CONFIG_KASAN=y, > and on big-endian ARCH=s390 with GCC s390x-linux-gnu 16.2.0, and the > test builds as a module (CONFIG_SEQ_BUF_KUNIT_TEST=m). > > Assisted-by: LLM > Reviewed-by: Andy Shevchenko <[email protected]> > Signed-off-by: Kees Cook <[email protected]> > --- Reviewed-by: Steven Rostedt <[email protected]> -- Steve

