Skip to content

Commit 912b0ee

Browse files
mhiramatrostedt
authored andcommitted
tracing: ring-buffer: Fix to check event length before using
Check the event length before adding it for accessing next index in rb_read_data_buffer(). Since this function is used for validating possibly broken ring buffers, the length of the event could be broken. In that case, the new event (e + len) can point a wrong address. To avoid invalid memory access at boot, check whether the length of each event is in the possible range before using it. Cc: stable@vger.kernel.org Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Fixes: 5f3b6e8 ("ring-buffer: Validate boot range memory events") Link: https://patch.msgid.link/177123421541.142205.9414352170164678966.stgit@devnote2 Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent f154777 commit 912b0ee

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

kernel/trace/ring_buffer.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1849,16 +1849,20 @@ static int rb_read_data_buffer(struct buffer_data_page *dpage, int tail, int cpu
18491849
struct ring_buffer_event *event;
18501850
u64 ts, delta;
18511851
int events = 0;
1852+
int len;
18521853
int e;
18531854

18541855
*delta_ptr = 0;
18551856
*timestamp = 0;
18561857

18571858
ts = dpage->time_stamp;
18581859

1859-
for (e = 0; e < tail; e += rb_event_length(event)) {
1860+
for (e = 0; e < tail; e += len) {
18601861

18611862
event = (struct ring_buffer_event *)(dpage->data + e);
1863+
len = rb_event_length(event);
1864+
if (len <= 0 || len > tail - e)
1865+
return -1;
18621866

18631867
switch (event->type_len) {
18641868

0 commit comments

Comments
 (0)