lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 377/757] tracing: Fix parse_synth_field() error handling
    Date
    From: Tom Zanussi <zanussi@kernel.org>

    [ Upstream commit 8fbeb52a598c7ab5aa603d6bb083b8a8d16d607a ]

    synth_field_size() returns either a positive size or an error (zero or
    a negative value). However, the existing code assumes the only error
    value is 0. It doesn't handle negative error codes, as it assigns
    directly to field->size (a size_t; unsigned), thereby interpreting the
    error code as a valid size instead.

    Do the test before assignment to field->size.

    [ axelrasmussen@google.com: changelog addition, first paragraph above ]

    Link: https://lkml.kernel.org/r/9b6946d9776b2eeb43227678158196de1c3c6e1d.1601848695.git.zanussi@kernel.org

    Fixes: 4b147936fa50 (tracing: Add support for 'synthetic' events)
    Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
    Tested-by: Axel Rasmussen <axelrasmussen@google.com>
    Signed-off-by: Tom Zanussi <zanussi@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/trace/trace_events_synth.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c
    index c6cca0d1d5840..46a96686e93c6 100644
    --- a/kernel/trace/trace_events_synth.c
    +++ b/kernel/trace/trace_events_synth.c
    @@ -465,6 +465,7 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
    struct synth_field *field;
    const char *prefix = NULL, *field_type = argv[0], *field_name, *array;
    int len, ret = 0;
    + ssize_t size;

    if (field_type[0] == ';')
    field_type++;
    @@ -520,11 +521,12 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
    field->type[len - 1] = '\0';
    }

    - field->size = synth_field_size(field->type);
    - if (!field->size) {
    + size = synth_field_size(field->type);
    + if (size <= 0) {
    ret = -EINVAL;
    goto free;
    }
    + field->size = size;

    if (synth_field_is_string(field->type))
    field->is_string = true;
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:11    [W:3.978 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site