From: Steven Rostedt <rost...@goodmis.org>

When displaying the contents of the user space data passed to the kernel,
instead of just showing the array values, also print any printable
content.

Instead of just:

  bash-1113    [003] .....  3433.290654: sys_write(fd: 2, buf: 0x555a8deeddb0 
(72:6f:6f:74:40:64:65:62:69:61:6e:2d:78:38:36:2d:36:34:3a:7e:23:20), count: 
0x16)

Display:

  bash-1113    [003] .....  3433.290654: sys_write(fd: 2, buf: 0x555a8deeddb0 
(72:6f:6f:74:40:64:65:62:69:61:6e:2d:78:38:36:2d:36:34:3a:7e:23:20) 
"root@debian-x86-64:~# ", count: 0x16)

Signed-off-by: Steven Rostedt (Google) <rost...@goodmis.org>
---
 kernel/trace/trace_syscalls.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index 367e10096c6f..0625a32f01dd 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -155,6 +155,8 @@ print_syscall_enter(struct trace_iterator *iter, int flags,
        trace_seq_printf(s, "%s(", entry->name);
 
        for (i = 0; i < entry->nb_args; i++) {
+               bool printable = false;
+               char *str;
 
                if (trace_seq_has_overflowed(s))
                        goto end;
@@ -193,8 +195,11 @@ print_syscall_enter(struct trace_iterator *iter, int flags,
 
                val = trace->args[entry->user_arg_size];
 
+               str = ptr;
                trace_seq_puts(s, " (");
                for (int x = 0; x < len; x++, ptr++) {
+                       if (isascii(*ptr) && isprint(*ptr))
+                               printable = true;
                        if (x)
                                trace_seq_putc(s, ':');
                        trace_seq_printf(s, "%02x", *ptr);
@@ -203,6 +208,22 @@ print_syscall_enter(struct trace_iterator *iter, int flags,
                        trace_seq_printf(s, ", %s", EXTRA);
 
                trace_seq_putc(s, ')');
+
+               /* If nothing is printable, don't bother printing anything */
+               if (!printable)
+                       continue;
+
+               trace_seq_puts(s, " \"");
+               for (int x = 0; x < len; x++) {
+                       if (isascii(str[x]) && isprint(str[x]))
+                               trace_seq_putc(s, str[x]);
+                       else
+                               trace_seq_putc(s, '.');
+               }
+               if (len < val)
+                       trace_seq_printf(s, "\"%s", EXTRA);
+               else
+                       trace_seq_putc(s, '"');
        }
 
        trace_seq_putc(s, ')');
-- 
2.50.1



Reply via email to