| From 0937b71d42fdc3c972e08db8a67d9963caa93795 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Jun 2019 09:59:53 +0530 |
| Subject: perf/ioctl: Add check for the sample_period value |
| |
| From: Ravi Bangoria <ravi.bangoria@linux.ibm.com> |
| |
| [ Upstream commit 913a90bc5a3a06b1f04c337320e9aeee2328dd77 ] |
| |
| perf_event_open() limits the sample_period to 63 bits. See: |
| |
| 0819b2e30ccb ("perf: Limit perf_event_attr::sample_period to 63 bits") |
| |
| Make ioctl() consistent with it. |
| |
| Also on PowerPC, negative sample_period could cause a recursive |
| PMIs leading to a hang (reported when running perf-fuzzer). |
| |
| Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Vince Weaver <vincent.weaver@maine.edu> |
| Cc: acme@kernel.org |
| Cc: linuxppc-dev@lists.ozlabs.org |
| Cc: maddy@linux.vnet.ibm.com |
| Cc: mpe@ellerman.id.au |
| Fixes: 0819b2e30ccb ("perf: Limit perf_event_attr::sample_period to 63 bits") |
| Link: https://lkml.kernel.org/r/20190604042953.914-1-ravi.bangoria@linux.ibm.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/events/core.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/kernel/events/core.c b/kernel/events/core.c |
| index 5bbf7537a6121..64ace5e9af2a0 100644 |
| --- a/kernel/events/core.c |
| +++ b/kernel/events/core.c |
| @@ -4624,6 +4624,9 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg) |
| if (perf_event_check_period(event, value)) |
| return -EINVAL; |
| |
| + if (!event->attr.freq && (value & (1ULL << 63))) |
| + return -EINVAL; |
| + |
| event_function_call(event, __perf_event_period, &value); |
| |
| return 0; |
| -- |
| 2.20.1 |
| |