From: sashiko-bot@kernel.org
To: "Vincent Donnefort" <vdonnefort@google.com>,
linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v8 07/21] tracing/simple_ring_buffer: Add support for compressed length
Date: Fri, 06 Nov 2026 18:20:55 +0000 [thread overview]
Message-ID: <sashiko-outbox-202012@kernel.org> (raw)
In-Reply-To: <20261106180657.2460376-8-vdonnefort@google.com>
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [High] tracing: shared-memory TOCTOU in simple_ring_buffer_reserve()
--
commit 9257cd3bebb215fd4b1122136bcc3bcfeab103ba
Author: Vincent Donnefort <vdonnefort@google.com>
tracing/simple_ring_buffer: Add support for compressed length
This commit compresses small event lengths into the ring buffer event header
type_len field and enforces ring-buffer alignment to save 4 bytes per small
event.
> diff --git a/kernel/trace/simple_ring_buffer.c b/kernel/trace/simple_ring_buffer.c
> index abfaf9bee12e1..a305331d29ba9 100644
> --- a/kernel/trace/simple_ring_buffer.c
> +++ b/kernel/trace/simple_ring_buffer.c
> @@ -207,7 +207,13 @@ static unsigned long rb_event_size(unsigned long length)
> {
> struct ring_buffer_event *event;
>
> - return length + RB_EVNT_HDR_SIZE + sizeof(event->array[0]);
> + if (!length)
> + length++;
> +
> + if (length > RB_MAX_SMALL_DATA || RB_FORCE_8BYTE_ALIGNMENT)
> + length += sizeof(event->array[0]);
> +
> + return ALIGN(length + RB_EVNT_HDR_SIZE, RB_ARCH_ALIGNMENT);
> }
>
> static struct ring_buffer_event *
> @@ -223,12 +229,15 @@ rb_event_add_ts_extend(struct ring_buffer_event *event, u64 delta)
> static struct ring_buffer_event *
> simple_rb_reserve_next(struct simple_rb_per_cpu *cpu_buffer, unsigned long length, u64 timestamp)
> {
> - unsigned long ts_ext_size = 0, event_size = rb_event_size(length);
> struct simple_buffer_page *tail = cpu_buffer->tail_page;
> + unsigned long event_size, array_size, ts_ext_size = 0;
> struct ring_buffer_event *event;
> u32 write, prev_write;
> u64 time_delta;
>
> + event_size = rb_event_size(length);
> + array_size = event_size - RB_EVNT_HDR_SIZE;
> +
> time_delta = timestamp - cpu_buffer->write_stamp;
>
> if (test_time_stamp(time_delta))
> @@ -259,9 +268,13 @@ simple_rb_reserve_next(struct simple_rb_per_cpu *cpu_buffer, unsigned long lengt
> time_delta = 0;
> }
>
> - event->type_len = 0;
> + if (length > RB_MAX_SMALL_DATA || RB_FORCE_8BYTE_ALIGNMENT) {
> + event->type_len = 0;
> + event->array[0] = array_size;
> + } else {
> + event->type_len = DIV_ROUND_UP(array_size, RB_ALIGNMENT);
> + }
> event->time_delta = time_delta;
> - event->array[0] = event_size - RB_EVNT_HDR_SIZE;
>
> return event;
> }
> @@ -284,7 +297,7 @@ void *simple_ring_buffer_reserve(struct simple_rb_per_cpu *cpu_buffer, unsigned
>
> rb_event = simple_rb_reserve_next(cpu_buffer, length, timestamp);
>
> - return &rb_event->array[1];
> + return rb_event->type_len ? &rb_event->array[0] : &rb_event->array[1];
[Severity: High]
Can reading rb_event->type_len back from the shared buffer page cause a
4-byte out-of-bounds write at EL2?
When compiled into the arm64 pKVM hypervisor (arch/arm64/kvm/hyp/nvhe/trace.c),
tail->page is shared with the untrusted host kernel via hyp_pin_shared_mem(),
and RB_FORCE_8BYTE_ALIGNMENT is 0. For length <= RB_MAX_SMALL_DATA,
rb_event_size() does not reserve space for event->array[0], but
simple_ring_buffer_reserve() re-reads rb_event->type_len from shared memory
to choose between &rb_event->array[0] and &rb_event->array[1]:
CPU0 (EL2 hypervisor) CPU1 (EL1 host)
simple_ring_buffer_reserve()
simple_rb_reserve_next()
event->type_len = ...
event->time_delta = ...
rb_event->type_len = 0;
if (rb_event->type_len)
...
return &rb_event->array[1]; <-- 4 bytes past reserved space
If an event is reserved at the end of a page (write == PAGE_SIZE -
BUF_PAGE_HDR_SIZE), the caller writes 4 bytes past the end of tail->page in
EL2 memory. Checking (length > RB_MAX_SMALL_DATA || RB_FORCE_8BYTE_ALIGNMENT)
instead of rb_event->type_len avoids reading back from shared memory.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261106180657.2460376-1-vdonnefort@google.com?part=7
next prev parent reply other threads:[~2026-11-06 18:20 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 18:06 [PATCH v8 00/21] tracing/remotes: Add printk, dump_on_panic and boot parameters Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 01/21] tracing/remotes: Gate tracefs files opening on trace remote registration Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 02/21] tracing/remotes: Release tracefs,eventfs on registration failure Vincent Donnefort
2026-11-06 18:21 ` sashiko-bot
2026-11-06 18:06 ` [PATCH v8 03/21] tracing/remotes: Use kstrtobool for boolean tracefs files Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 04/21] tracing/remotes: Initialise pos in trace_start() Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 05/21] tracing/remotes: Annotate remote shared fields with READ_ONCE/WRITE_ONCE Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 06/21] tracing/remotes: Use a single per-remote polling work Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 07/21] tracing/simple_ring_buffer: Add support for compressed length Vincent Donnefort
2026-11-06 18:20 ` sashiko-bot [this message]
2026-11-06 18:06 ` [PATCH v8 08/21] tracing/remotes: Add dmesg tracefs file Vincent Donnefort
2026-11-06 18:26 ` sashiko-bot
2026-11-06 18:06 ` [PATCH v8 09/21] tracing/remotes: selftests: Add a test for the " Vincent Donnefort
2026-11-06 18:26 ` sashiko-bot
2026-11-06 18:06 ` [PATCH v8 10/21] tracing/remotes: selftests: Prefix hypervisor folder Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 11/21] ring-buffer: Use irqsave for the reader lock in ring_buffer_poll_remote Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 12/21] ring-buffer: Avoid reader_lock deadlock during panic Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 13/21] ring-buffer: Use panic-friendly locking in ring_buffer_iter interface Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 14/21] ring-buffer: Add kerneldoc for ring_buffer_poll_remote Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 15/21] tracing/remotes: Use ring_buffer_capacity() in trace_remote_has_cpu() Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 16/21] tracing/remotes: Add dump_on_panic tracefs file Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 17/21] tracing/remotes: selftests: Add a test for the " Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 18/21] tracing/remotes: Add poll_ms " Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 19/21] tracing/remotes: Add trace_remote cmdline options Vincent Donnefort
2026-11-06 18:33 ` sashiko-bot
2026-11-06 18:06 ` [PATCH v8 20/21] Documentation: tracing/remotes: Add detailed tracefs layout Vincent Donnefort
2026-11-06 18:06 ` [PATCH v8 21/21] Documentation/kernel-parameters: Add trace_remote Vincent Donnefort
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-202012@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=vdonnefort@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox