lkml.org 
[lkml]   [2009]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/7] tracing: do not allow modifying the ftrace events via the event files
    From: Steven Rostedt <srostedt@redhat.com>

    Impact: fix to prevent crash on calling NULL function pointer

    The ftrace internal records have their format exported via the event
    system under the ftrace subsystem. These are only for exporting the
    format to allow binary readers to be able to parse them in a binary
    output.

    The ftrace subsystem events can only be enabled via the ftrace tracers
    and do not have a registering function. The event files expect the
    event record to have registering function and will call it directly.
    Passing in a ftrace subsystem event will cause the kernel to crash
    because it will execute a NULL pointer.

    This patch prevents the ftrace subsystem from being viewable to the
    event enabling files.

    Signed-off-by: Steven Rostedt <srostedt@redhat.com>
    ---
    kernel/trace/trace_events.c | 18 +++++++++++++++---
    1 files changed, 15 insertions(+), 3 deletions(-)

    diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
    index a0b41cc..85ec10f 100644
    --- a/kernel/trace/trace_events.c
    +++ b/kernel/trace/trace_events.c
    @@ -102,7 +102,7 @@ static int ftrace_set_clr_event(char *buf, int set)
    mutex_lock(&event_mutex);
    events_for_each(call) {

    - if (!call->name)
    + if (!call->name || !call->regfunc)
    continue;

    if (match &&
    @@ -207,8 +207,20 @@ t_next(struct seq_file *m, void *v, loff_t *pos)

    (*pos)++;

    - if ((unsigned long)call >= (unsigned long)__stop_ftrace_events)
    - return NULL;
    + for (;;) {
    + if ((unsigned long)call >= (unsigned long)__stop_ftrace_events)
    + return NULL;
    +
    + /*
    + * The ftrace subsystem is for showing formats only.
    + * They can not be enabled or disabled via the event files.
    + */
    + if (call->regfunc)
    + break;
    +
    + call++;
    + next = call;
    + }

    m->private = ++next;

    --
    1.6.1.3
    --


    \
     
     \ /
      Last update: 2009-03-10 22:11    [W:0.021 / U:0.572 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site