| From foo@baz Sun May 27 17:33:37 CEST 2018 |
| From: "Steven Rostedt (VMware)" <rostedt@goodmis.org> |
| Date: Thu, 11 Jan 2018 19:47:51 -0500 |
| Subject: tools lib traceevent: Fix get_field_str() for dynamic strings |
| |
| 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 */ |