On Wed, Nov 17, 2021 at 08:52:20PM -0500, Steven Rostedt wrote: > On Tue, 16 Nov 2021 13:11:50 -0800 > Beau Belgrave <beaub@xxxxxxxxxxxxxxxxxxx> wrote: > > > On Mon, Nov 15, 2021 at 04:50:47PM -0800, Beau Belgrave wrote: > > > +static int user_event_validate(struct user_event *user, void *data, int len) > > > +{ > > > + struct list_head *head = &user->validators; > > > + struct user_event_validator *validator; > > > + void *pos, *end = data + len; > > > + u16 *val, offset, size; > > > + > > > + list_for_each_entry(validator, head, link) { > > > + pos = data + validator->offset; > > > + val = pos; > > > + > > > + /* Already done min_size check, no bounds check here */ > > > + offset = *val++; > > > + size = *val++; > > > > I believe I have these backwards, size should come first for both dyn > > and rel data. Is this correct? > > it's size << 16 | offset; > > > > > > > diff --git a/tools/testing/selftests/user_events/ftrace_test.c b/tools/testing/selftests/user_events/ftrace_test.c > > > index 9d53717139e6..bea694e9df8c 100644 > > > --- a/tools/testing/selftests/user_events/ftrace_test.c > > > +++ b/tools/testing/selftests/user_events/ftrace_test.c > > > @@ -21,6 +21,11 @@ const char *status_file = "/sys/kernel/debug/tracing/user_events_status"; > > > const char *enable_file = "/sys/kernel/debug/tracing/events/user_events/__test_event/enable"; > > > const char *trace_file = "/sys/kernel/debug/tracing/trace"; > > > > > > +struct rel_loc { > > > + __u16 offset; > > > + __u16 size; > > > +} __packed; > > > + > > > > Same here. > > I would not use pointer arithmetic or the above structure, as I'm not sure > they work the same for both big and little endian. It's best to just use > u32 and '|' (or) the two unsigned shorts into one integer. > > -- Steve Got it, totally makes sense now, thank you! -Beau