linux/kernel/trace
Steven Rostedt (Red Hat) 239b40eb61 fgraph: Handle a case where a tracer ignores set_graph_notrace
commit 794de08a16 upstream.

Both the wakeup and irqsoff tracers can use the function graph tracer when
the display-graph option is set. The problem is that they ignore the notrace
file, and record the entry of functions that would be ignored by the
function_graph tracer. This causes the trace->depth to be recorded into the
ring buffer. The set_graph_notrace uses a trick by adding a large negative
number to the trace->depth when a graph function is to be ignored.

On trace output, the graph function uses the depth to record a stack of
functions. But since the depth is negative, it accesses the array with a
negative number and causes an out of bounds access that can cause a kernel
oops or corrupt data.

Have the print functions handle cases where a tracer still records functions
even when they are in set_graph_notrace.

Also add warnings if the depth is below zero before accessing the array.

Note, the function graph logic will still prevent the return of these
functions from being recorded, which means that they will be left hanging
without a return. For example:

   # echo '*spin*' > set_graph_notrace
   # echo 1 > options/display-graph
   # echo wakeup > current_tracer
   # cat trace
   [...]
      _raw_spin_lock() {
        preempt_count_add() {
        do_raw_spin_lock() {
      update_rq_clock();

Where it should look like:

      _raw_spin_lock() {
        preempt_count_add();
        do_raw_spin_lock();
      }
      update_rq_clock();

Cc: Namhyung Kim <namhyung.kim@lge.com>
Fixes: 29ad23b004 ("ftrace: Add set_graph_notrace filter")
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-01-09 08:32:23 +01:00
..
blktrace.c block: Fix secure erase 2016-08-16 09:16:51 -06:00
bpf_trace.c bpf: add BPF_CALL_x macros for declaring helpers 2016-09-09 19:36:04 -07:00
ftrace.c ftrace: Add more checks for FTRACE_FL_DISABLED in processing ip records 2016-11-14 16:31:49 -05:00
Kconfig This release cycle is rather small. Just a few fixes to tracing. 2016-10-06 11:48:41 -07:00
Makefile Disable the __builtin_return_address() warning globally after all 2016-10-12 10:23:41 -07:00
power-traces.c cpufreq: schedutil: New governor based on scheduler utilization data 2016-04-02 01:09:12 +02:00
ring_buffer_benchmark.c ring_buffer: Remove unneeded smp_wmb() before wakeup of reader benchmark 2015-11-03 16:19:02 -05:00
ring_buffer.c ring-buffer: Prevent overflow of size in ring_buffer_resize() 2016-05-13 16:44:20 -04:00
rpm-traces.c
trace_benchmark.c tracing: Only benchmark the time tracepoints take if tracing is on 2015-11-02 13:34:58 -05:00
trace_benchmark.h
trace_branch.c tracing: Remove {start,stop}_branch_trace 2015-10-21 10:10:09 -04:00
trace_clock.c
trace_entries.h tracing: Add NMI tracing in hwlat detector 2016-09-02 12:47:55 -04:00
trace_event_perf.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2016-05-17 16:26:30 -07:00
trace_events_filter_test.h
trace_events_filter.c tracing: Use temp buffer when filtering events 2016-05-03 17:59:24 -04:00
trace_events_hist.c tracing: Fix use-after-free in hist_register_trigger() 2016-08-02 15:16:30 -04:00
trace_events_trigger.c tracing: Call traceoff trigger after event is recorded 2016-09-23 09:47:59 -04:00
trace_events.c tracing: Show the preempt count of when the event was called 2016-06-20 09:54:21 -04:00
trace_export.c tracing: ftrace_event_is_function() can return boolean 2015-11-02 14:28:05 -05:00
trace_functions_graph.c fgraph: Handle a case where a tracer ignores set_graph_notrace 2017-01-09 08:32:23 +01:00
trace_functions.c ftrace: Have set_ftrace_pid use the bitmap like events do 2016-06-20 09:54:19 -04:00
trace_hwlat.c tracing: Add NMI tracing in hwlat detector 2016-09-02 12:47:55 -04:00
trace_irqsoff.c tracing: Remove redundant reset per-CPU buff in irqsoff tracer 2016-03-18 16:39:11 -04:00
trace_kdb.c tracing: Move trace_flags from global to a trace_array field 2015-09-30 15:22:55 -04:00
trace_kprobe.c ftrace: kprobe: uprobe: Add x8/x16/x32/x64 for hexadecimal types 2016-08-23 15:38:09 -03:00
trace_mmiotrace.c tracing: Expose CPU physical addresses (resource values) for PCI devices 2016-06-20 09:54:22 -04:00
trace_nop.c tracing: Fix typoes in code comment and printk in trace_nop.c 2016-03-08 11:23:57 -05:00
trace_output.c tracing: Add NMI tracing in hwlat detector 2016-09-02 12:47:55 -04:00
trace_output.h tracing: Turn seq_print_user_ip() into a static function 2015-09-28 10:16:12 -04:00
trace_printk.c tracing: Handle NULL formats in hold_module_trace_bprintk_format() 2016-06-20 09:46:12 -04:00
trace_probe.c ftrace: kprobe: uprobe: Show u8/u16/u32/u64 types in decimal 2016-08-23 17:06:38 -03:00
trace_probe.h ftrace: kprobe: uprobe: Show u8/u16/u32/u64 types in decimal 2016-08-23 17:06:38 -03:00
trace_sched_switch.c sched/core: Fix trace_sched_switch() 2015-10-06 17:08:15 +02:00
trace_sched_wakeup.c Most of the changes are clean ups and small fixes. Some of them have 2015-11-06 13:30:20 -08:00
trace_selftest_dynamic.c
trace_selftest.c
trace_seq.c
trace_stack.c tracing, kasan: Silence Kasan warning in check_stack of stack_tracer 2016-02-19 12:36:44 -05:00
trace_stat.c kernel/...: convert pr_warning to pr_warn 2016-03-22 15:36:02 -07:00
trace_stat.h
trace_syscalls.c tracing/syscalls: fix multiline in error message text 2016-09-29 10:25:23 +02:00
trace_uprobe.c This release cycle is rather small. Just a few fixes to tracing. 2016-10-06 11:48:41 -07:00
trace.c This release cycle is rather small. Just a few fixes to tracing. 2016-10-06 11:48:41 -07:00
trace.h tracing: Have max_latency be defined for HWLAT_TRACER as well 2016-09-12 09:59:46 -04:00
tracing_map.c tracing: Handle tracing_map_alloc_elts() error path correctly 2016-04-26 09:40:30 -04:00
tracing_map.h tracing: Update some tracing_map constants and comments 2016-04-19 12:16:06 -04:00