Skip to contentSkip to conversation

FAILED: patch "[PATCH] ftrace: Fix function pid filter on instances" failed to apply to 4.4-stable tree

PATCH [email protected] 2 participants 3 messages Apr 19, 2017

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

Quoted 1 line

From d879d0b8c183aabeb9a65eba91f3f9e3c7e7b905 Mon Sep 17 00:00:00 2001

From: Namhyung Kim <[email protected]>
Date: Mon, 17 Apr 2017 11:44:27 +0900
Subject: [PATCH] ftrace: Fix function pid filter on instances

When function tracer has a pid filter, it adds a probe to sched_switch to track if current task can be ignored. The probe checks the ftrace_ignore_pid from current tr to filter tasks. But it misses to delete the probe when removing an instance so that it can cause a crash due to the invalid tr pointer (use-after-free).

This is easily reproducible with the following:

  # cd /sys/kernel/debug/tracing
  # mkdir instances/buggy
  # echo $$ > instances/buggy/set_ftrace_pid
  # rmdir instances/buggy

============================================================================

  BUG: KASAN: use-after-free in ftrace_filter_pid_sched_switch_probe+0x3d/0x90
  Read of size 8 by task kworker/0:1/17
  CPU: 0 PID: 17 Comm: kworker/0:1 Tainted: G    B           4.11.0-rc3  #198
  Call Trace:
   dump_stack+0x68/0x9f
   kasan_object_err+0x21/0x70
   kasan_report.part.1+0x22b/0x500
   ? ftrace_filter_pid_sched_switch_probe+0x3d/0x90
   kasan_report+0x25/0x30
   __asan_load8+0x5e/0x70
   ftrace_filter_pid_sched_switch_probe+0x3d/0x90
   ? fpid_start+0x130/0x130
   __schedule+0x571/0xce0
   ...

To fix it, use ftrace_clear_pids() to unregister the probe. As instance_rmdir() already updated ftrace codes, it can just free the filter safely.

Fixes 0c8916c34203 ("tracing: Add rmdir to remove multibuffer instances")
Cc Ingo Molnar <[email protected]>
kernel/trace/ftrace.c +9 -0
index 27bb2e61276e..dd3e91d68dc7 100644
@@ -5566,6 +5566,15 @@ static void clear_ftrace_pids(struct trace_array *tr)
 	trace_free_pid_list(pid_list);
 }
 
+void ftrace_clear_pids(struct trace_array *tr)
+{
+	mutex_lock(&ftrace_lock);
+
+	clear_ftrace_pids(tr);
+
+	mutex_unlock(&ftrace_lock);
+}
+
 static void ftrace_pid_reset(struct trace_array *tr)
 {
 	mutex_lock(&ftrace_lock);
kernel/trace/trace.c +1 -0
index f35109514a01..d484452ae648 100644
@@ -7402,6 +7402,7 @@ static int instance_rmdir(const char *name)
 
 	tracing_set_nop(tr);
 	event_trace_del_tracer(tr);
+	ftrace_clear_pids(tr);
 	ftrace_destroy_function_files(tr);
 	tracefs_remove_recursive(tr->dir);
 	free_trace_buffers(tr);
kernel/trace/trace.h +2 -0
index ae1cce91fead..d19d52d600d6 100644
@@ -896,6 +896,7 @@ int using_ftrace_ops_list_func(void);
 void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer);
 void ftrace_init_tracefs_toplevel(struct trace_array *tr,
 				  struct dentry *d_tracer);
+void ftrace_clear_pids(struct trace_array *tr);
 #else
 static inline int ftrace_trace_task(struct trace_array *tr)
 {
@@ -914,6 +915,7 @@ ftrace_init_global_array_ops(struct trace_array *tr) { }
 static inline void ftrace_reset_array_ops(struct trace_array *tr) { }
 static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d) { }
 static inline void ftrace_init_tracefs_toplevel(struct trace_array *tr, struct dentry *d) { }
+static inline void ftrace_clear_pids(struct trace_array *tr) { }
 /* ftace_func_t type is not defined, use macro instead of static inline */
 #define ftrace_init_array_ops(tr, func) do { } while (0)
 #endif /* CONFIG_FUNCTION_TRACER */
maintainer
#1 lore raw
Quoted 5 lines · On Wed, 19 Apr 2017 13:42:40 +0200 <[email protected]> wrote:

The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

[..]

Quoted 8 lines

To fix it, use ftrace_clear_pids() to unregister the probe. As instance_rmdir() already updated ftrace codes, it can just free the filter safely.

Fixes 0c8916c34203 ("tracing: Add rmdir to remove multibuffer instances")

Hmm, this is wrong. It should have been:

Fixes 345ddcc882d8 ("ftrace: Have set_ftrace_pid use the bitmap like events do")

Which was added in 4.8.

I doesn't need to go back further than that. Thanks!

-- Steve

author maintainer
#2 lore raw
Quoted 20 lines · Steven Rostedt
Quoted 5 lines · On Wed, 19 Apr 2017 13:42:40 +0200 <[email protected]> wrote:

The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

[..]

Quoted 8 lines

To fix it, use ftrace_clear_pids() to unregister the probe. As instance_rmdir() already updated ftrace codes, it can just free the filter safely.

Fixes 0c8916c34203 ("tracing: Add rmdir to remove multibuffer instances")
Quoted 7 lines

Hmm, this is wrong. It should have been:

Fixes 345ddcc882d8 ("ftrace: Have set_ftrace_pid use the bitmap like events do")

Which was added in 4.8.

I doesn't need to go back further than that. Thanks!

Ah, thanks for clearing that up, much appreciated.

greg k-h