• M
    tracing: Sanitize value returned from write(trace_marker, "...", len) · 1aa54bca
    Marcin Slusarz 提交于
    When userspace code writes non-new-line-terminated string to trace_marker
    file, write handler appends new-line and returns number of bytes written
    to trace buffer, so
    write(fd, "abc", 3) will return 4
    
    That's unexpected and unfortunately it confuses glibc's fprintf function.
    
    Example:
    int main() {
      fprintf(stderr, "abc");
      return 0;
    }
    
    $ gcc test.c -o test
    $ echo mmiotrace > /sys/kernel/debug/tracing/current_tracer
    $ ./test 2>/sys/kernel/debug/tracing/trace_marker
    
    results in infinite loop:
    write(fd, "abc", 3) = 4
    write(fd, "", 1) = 0
    write(fd, "", 1) = 0
    write(fd, "", 1) = 0
    write(fd, "", 1) = 0
    write(fd, "", 1) = 0
    write(fd, "", 1) = 0
    write(fd, "", 1) = 0
    (...)
    
    ...and kernel trace buffer full of empty markers.
    
    Fix it by sanitizing write return value.
    Signed-off-by: NMarcin Slusarz <marcin.slusarz@gmail.com>
    LKML-Reference: <20100727231801.GB2826@joi.lan>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
    1aa54bca
trace.c 103.4 KB