• Shu Wang's avatar
    ftrace: Fix kmemleak in unregister_ftrace_graph · 2b0b8499
    Shu Wang authored
    The trampoline allocated by function tracer was overwriten by function_graph
    tracer, and caused a memory leak. The save_global_trampoline should have
    saved the previous trampoline in register_ftrace_graph() and restored it in
    unregister_ftrace_graph(). But as it is implemented, save_global_trampoline was
    only used in unregister_ftrace_graph as default value 0, and it overwrote the
    previous trampoline's value. Causing the previous allocated trampoline to be
    lost.
    
    kmmeleak backtrace:
        kmemleak_vmalloc+0x77/0xc0
        __vmalloc_node_range+0x1b5/0x2c0
        module_alloc+0x7c/0xd0
        arch_ftrace_update_trampoline+0xb5/0x290
        ftrace_startup+0x78/0x210
        register_ftrace_function+0x8b/0xd0
        function_trace_init+0x4f/0x80
        tracing_set_tracer+0xe6/0x170
        tracing_set_trace_write+0x90/0xd0
        __vfs_write+0x37/0x170
        vfs_write+0xb2/0x1b0
        SyS_write+0x55/0xc0
        do_syscall_64+0x67/0x180
        return_from_SYSCALL_64+0x0/0x6a
    
    [
      Looking further into this, I found that this was left over from when the
      function and function graph tracers shared the same ftrace_ops. But in
      commit 5f151b24 ("ftrace: Fix function_profiler and function tracer
      together"), the two were separated, and the save_global_trampoline no
      longer was necessary (and it may have been broken back then too).
      -- Steven Rostedt
    ]
    
    Link: http://lkml.kernel.org/r/20170912021454.5976-1-shuwang@redhat.com
    
    Cc: stable@vger.kernel.org
    Fixes: 5f151b24 ("ftrace: Fix function_profiler and function tracer together")
    Signed-off-by: default avatarShu Wang <shuwang@redhat.com>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    2b0b8499
ftrace.c 160 KB