lkml.org 
[lkml]   [2018]   [Apr]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 041/183] tools lib traceevent: Fix get_field_str() for dynamic strings
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>


    [ Upstream commit d777f8de99b05d399c0e4e51cdce016f26bd971b ]

    If a field is a dynamic string, get_field_str() returned just the
    offset/size value and not the string. Have it parse the offset/size
    correctly to return the actual string. Otherwise filtering fails when
    trying to filter fields that are dynamic strings.

    Reported-by: Gopanapalli Pradeep <prap_hai@yahoo.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Acked-by: Namhyung Kim <namhyung@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Link: http://lkml.kernel.org/r/20180112004823.146333275@goodmis.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    tools/lib/traceevent/parse-filter.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/tools/lib/traceevent/parse-filter.c
    +++ b/tools/lib/traceevent/parse-filter.c
    @@ -1879,17 +1879,25 @@ static const char *get_field_str(struct
    struct pevent *pevent;
    unsigned long long addr;
    const char *val = NULL;
    + unsigned int size;
    char hex[64];

    /* If the field is not a string convert it */
    if (arg->str.field->flags & FIELD_IS_STRING) {
    val = record->data + arg->str.field->offset;
    + size = arg->str.field->size;
    +
    + if (arg->str.field->flags & FIELD_IS_DYNAMIC) {
    + addr = *(unsigned int *)val;
    + val = record->data + (addr & 0xffff);
    + size = addr >> 16;
    + }

    /*
    * We need to copy the data since we can't be sure the field
    * is null terminated.
    */
    - if (*(val + arg->str.field->size - 1)) {
    + if (*(val + size - 1)) {
    /* copy it */
    memcpy(arg->str.buffer, val, arg->str.field->size);
    /* the buffer is already NULL terminated */

    \
     
     \ /
      Last update: 2018-04-25 13:28    [W:3.163 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site