android_kernel_samsung_msm8226/kernel/trace
Steven Rostedt (Red Hat) 68ad8d0dea UPSTREAM: ring-buffer: Prevent overflow of size in ring_buffer_resize()
(Cherry picked from commit 59643d1535eb220668692a5359de22545af579f6)

If the size passed to ring_buffer_resize() is greater than MAX_LONG - BUF_PAGE_SIZE
then the DIV_ROUND_UP() will return zero.

Here's the details:

  # echo 18014398509481980 > /sys/kernel/debug/tracing/buffer_size_kb

tracing_entries_write() processes this and converts kb to bytes.

 18014398509481980 << 10 = 18446744073709547520

and this is passed to ring_buffer_resize() as unsigned long size.

 size = DIV_ROUND_UP(size, BUF_PAGE_SIZE);

Where DIV_ROUND_UP(a, b) is (a + b - 1)/b

BUF_PAGE_SIZE is 4080 and here

 18446744073709547520 + 4080 - 1 = 18446744073709551599

where 18446744073709551599 is still smaller than 2^64

 2^64 - 18446744073709551599 = 17

But now 18446744073709551599 / 4080 = 4521260802379792

and size = size * 4080 = 18446744073709551360

This is checked to make sure its still greater than 2 * 4080,
which it is.

Then we convert to the number of buffer pages needed.

 nr_page = DIV_ROUND_UP(size, BUF_PAGE_SIZE)

but this time size is 18446744073709551360 and

 2^64 - (18446744073709551360 + 4080 - 1) = -3823

Thus it overflows and the resulting number is less than 4080, which makes

  3823 / 4080 = 0

an nr_pages is set to this. As we already checked against the minimum that
nr_pages may be, this causes the logic to fail as well, and we crash the
kernel.

There's no reason to have the two DIV_ROUND_UP() (that's just result of
historical code changes), clean up the code and fix this bug.

Cc: stable@vger.kernel.org # 3.5+
Fixes: 83f40318dab00 ("ring-buffer: Make removal of ring buffer pages atomic")
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Willy Tarreau <w@1wt.eu>
Change-Id: I1147672317a3ad0fc995b1f32baaa050a7976ac4
Bug: 32659848
CVE-2016-9754
Signed-off-by: Kevin F. Haggerty <haggertk@lineageos.org>
2019-08-06 12:24:25 +02:00
..
Kconfig Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
Makefile Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
blktrace.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
ftrace.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
gpu-traces.c Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
power-traces.c
ring_buffer.c UPSTREAM: ring-buffer: Prevent overflow of size in ring_buffer_resize() 2019-08-06 12:24:25 +02:00
ring_buffer_benchmark.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
rpm-traces.c
trace.c Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
trace.h Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
trace_branch.c
trace_clock.c
trace_cpu_freq_switch.c
trace_entries.h
trace_event_perf.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_events.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_events_filter.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_events_filter_test.h
trace_export.c
trace_functions.c
trace_functions_graph.c Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
trace_irqsoff.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_kdb.c
trace_kprobe.c
trace_mmiotrace.c
trace_nop.c
trace_output.c Merge remote-tracking branch 'google-common/deprecated/android-3.4' into lineage-16.0 2019-08-06 11:41:21 +02:00
trace_output.h
trace_printk.c misc: Import SM-G900H kernel source code 2019-08-02 15:14:10 +02:00
trace_sched_switch.c
trace_sched_wakeup.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_selftest.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_selftest_dynamic.c
trace_stack.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_stat.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_stat.h
trace_syscalls.c Merge tag 'v3.4.113' into lineage-16.0 2019-08-05 14:20:47 +02:00
trace_workqueue.c