]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 7 Jan 2020 09:33:34 +0000 (10:33 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 7 Jan 2020 09:33:34 +0000 (10:33 +0100)
added patches:
ftrace-avoid-potential-division-by-zero-in-function-profiler.patch

queue-4.4/ftrace-avoid-potential-division-by-zero-in-function-profiler.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/ftrace-avoid-potential-division-by-zero-in-function-profiler.patch b/queue-4.4/ftrace-avoid-potential-division-by-zero-in-function-profiler.patch
new file mode 100644 (file)
index 0000000..ab2f705
--- /dev/null
@@ -0,0 +1,49 @@
+From e31f7939c1c27faa5d0e3f14519eaf7c89e8a69d Mon Sep 17 00:00:00 2001
+From: Wen Yang <wenyang@linux.alibaba.com>
+Date: Fri, 3 Jan 2020 11:02:48 +0800
+Subject: ftrace: Avoid potential division by zero in function profiler
+
+From: Wen Yang <wenyang@linux.alibaba.com>
+
+commit e31f7939c1c27faa5d0e3f14519eaf7c89e8a69d upstream.
+
+The ftrace_profile->counter is unsigned long and
+do_div truncates it to 32 bits, which means it can test
+non-zero and be truncated to zero for division.
+Fix this issue by using div64_ul() instead.
+
+Link: http://lkml.kernel.org/r/20200103030248.14516-1-wenyang@linux.alibaba.com
+
+Cc: stable@vger.kernel.org
+Fixes: e330b3bcd8319 ("tracing: Show sample std dev in function profiling")
+Fixes: 34886c8bc590f ("tracing: add average time in function to function profiler")
+Signed-off-by: Wen Yang <wenyang@linux.alibaba.com>
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/trace/ftrace.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/kernel/trace/ftrace.c
++++ b/kernel/trace/ftrace.c
+@@ -637,8 +637,7 @@ static int function_stat_show(struct seq
+       }
+ #ifdef CONFIG_FUNCTION_GRAPH_TRACER
+-      avg = rec->time;
+-      do_div(avg, rec->counter);
++      avg = div64_ul(rec->time, rec->counter);
+       if (tracing_thresh && (avg < tracing_thresh))
+               goto out;
+ #endif
+@@ -664,7 +663,8 @@ static int function_stat_show(struct seq
+                * Divide only 1000 for ns^2 -> us^2 conversion.
+                * trace_print_graph_duration will divide 1000 again.
+                */
+-              do_div(stddev, rec->counter * (rec->counter - 1) * 1000);
++              stddev = div64_ul(stddev,
++                                rec->counter * (rec->counter - 1) * 1000);
+       }
+       trace_seq_init(&s);
index b87e34b750a9625314094b2a2a04ffcd173e9d6b..19b2bbb92d671fe1b1f3ae5316591933783b2941 100644 (file)
@@ -19,3 +19,4 @@ dmaengine-fix-access-to-uninitialized-dma_slave_caps.patch
 compat_ioctl-block-handle-persistent-reservations.patch
 gpiolib-fix-up-emulated-open-drain-outputs.patch
 alsa-cs4236-fix-error-return-comparison-of-an-unsigned-integer.patch
+ftrace-avoid-potential-division-by-zero-in-function-profiler.patch