diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c index a52458435327..604ba3e841d2 100644 --- a/fs/tracefs/event_inode.c +++ b/fs/tracefs/event_inode.c @@ -594,6 +594,10 @@ static int eventfs_iterate(struct file *file, struct dir_context *ctx) if (!(ti->flags & TRACEFS_EVENT_INODE)) return -EINVAL; + /* Logic should prevent ctx->pos from going out of range */ + if (WARN_ON_ONCE(ctx->pos < 2 || ctx->pos > 0x7fffffffULL)) + return -EINVAL; + c = ctx->pos - 2; guard(srcu)(&eventfs_srcu); diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 7ce862c92a85..9f8f2d02276c 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -3296,6 +3296,13 @@ event_create_dir(struct eventfs_inode *parent, struct trace_event_file *file) if (WARN_ON_ONCE(strcmp(call->class->system, TRACE_SYSTEM) == 0)) return -ENODEV; + ret = event_define_fields(call); + if (ret < 0) { + pr_warn("Could not initialize trace point events/%s\n", + trace_event_name(call)); + return ret; + } + e_events = event_subsystem_dir(tr, call->class->system, file, parent); if (!e_events) return -ENOMEM; @@ -3314,12 +3321,6 @@ event_create_dir(struct eventfs_inode *parent, struct trace_event_file *file) file->ei = ei; - ret = event_define_fields(call); - if (ret < 0) { - pr_warn("Could not initialize trace point events/%s\n", name); - return ret; - } - /* Gets decremented on freeing of the "enable" file */ event_file_get(file);