Pass the exact length of the string to is_printable_array instead of the
entire field size.

Signed-off-by: Arun Kalyanasundaram <arunk...@google.com>
---
 tools/perf/util/scripting-engines/trace-event-python.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/scripting-engines/trace-event-python.c 
b/tools/perf/util/scripting-engines/trace-event-python.c
index c7187f067d31..45cc0c6635bb 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -601,6 +601,7 @@ static void python_process_tracepoint(struct perf_sample 
*sample,
        for (field = event->format.fields; field; field = field->next) {
                unsigned int offset, len;
                unsigned long long val;
+               char *end_ptr = NULL;
 
                if (field->flags & FIELD_IS_ARRAY) {
                        offset = field->offset;
@@ -612,8 +613,12 @@ static void python_process_tracepoint(struct perf_sample 
*sample,
                                len     = offset >> 16;
                                offset &= 0xffff;
                        }
-                       if (field->flags & FIELD_IS_STRING &&
-                           is_printable_array(data + offset, len)) {
+                       /* field may contain unused chars after the null char */
+                       if (field->flags & FIELD_IS_STRING)
+                               end_ptr = memchr(data + offset, '\0', len);
+                       if (end_ptr &&
+                           is_printable_array(data + offset,
+                               (int)(end_ptr - ((char *)data + offset)) + 1)) {
                                obj = PyString_FromString((char *) data + 
offset);
                        } else {
                                obj = PyByteArray_FromStringAndSize((const char 
*) data + offset, len);
-- 
2.14.0.434.g98096fd7a8-goog

Reply via email to