Re: [PATCH v2] seq_buf: Mark a seq_buf overflowed when terminating it loses a byte

From: Alejandro Colomar

Date: Fri Oct 30 2026 - 16:19:31 EST


Hi Kees,

> Date: 2026-10-30 12:20:54-0700
> From: Kees Cook <kees@xxxxxxxxxx>
>
[...]
>
> Reported-by: Steven Rostedt <rostedt@xxxxxxxxxxx>
> Closes: https://lore.kernel.org/all/20261016145928.16eddc9a@xxxxxxxxxxxxxxxxxx/
> Fixes: 8d1478bfd63be ("seq_buf: Add seq_buf_strlen()")

That Fixes tag seems wrong. That commit was only moving code around,
AFAICS. I see the bug already present in v5.13, when
seq_buf_terminate() was added.

$ git show v5.13:include/linux/seq_buf.h | grepc seq_buf_terminate;
(standard input):static inline void seq_buf_terminate(struct seq_buf *s)
{
if (WARN_ON(s->size == 0))
return;

if (seq_buf_buffer_left(s))
s->buffer[s->len] = 0;
else
s->buffer[s->size - 1] = 0;
}

Back then, we already had a _putmem() function that could fill the
entire buffer:

$ git show v5.13:lib/seq_buf.c | grepc seq_buf_putmem;
(standard input):int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len)
{
WARN_ON(s->size == 0);

if (seq_buf_can_fit(s, len)) {
memcpy(s->buffer + s->len, mem, len);
s->len += len;
return 0;
}
seq_buf_set_overflow(s);
return -1;
}

$ git show v5.13:lib/seq_buf.c | grepc seq_buf_can_fit;
(standard input):static bool seq_buf_can_fit(struct seq_buf *s, size_t len)
{
return s->len + len <= s->size;
}

Unless I'm missing something, the bug was introduced in f2616c772c76
(2021-03-18; "seq_buf: Add seq_buf_terminate() API"). Thus:

Fixes: f2616c772c768 ("seq_buf: Add seq_buf_terminate() API")


Have a lovely night!
Alex

> Signed-off-by: Kees Cook <kees@xxxxxxxxxx>

--
<https://www.alejandro-colomar.es>

Attachment: signature.asc
Description: PGP signature