diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index a2de6364777a..2d1307f13e13 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, ')');