diff options
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_p4.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_p4.c b/arch/x86/kernel/cpu/perf_event_p4.c index b8c2d379eea..a603930271f 100644 --- a/arch/x86/kernel/cpu/perf_event_p4.c +++ b/arch/x86/kernel/cpu/perf_event_p4.c | |||
@@ -418,6 +418,7 @@ static int p4_hw_config(struct perf_event *event) | |||
418 | { | 418 | { |
419 | int cpu = get_cpu(); | 419 | int cpu = get_cpu(); |
420 | int rc = 0; | 420 | int rc = 0; |
421 | unsigned int evnt; | ||
421 | u32 escr, cccr; | 422 | u32 escr, cccr; |
422 | 423 | ||
423 | /* | 424 | /* |
@@ -436,6 +437,14 @@ static int p4_hw_config(struct perf_event *event) | |||
436 | event->hw.config = p4_set_ht_bit(event->hw.config); | 437 | event->hw.config = p4_set_ht_bit(event->hw.config); |
437 | 438 | ||
438 | if (event->attr.type == PERF_TYPE_RAW) { | 439 | if (event->attr.type == PERF_TYPE_RAW) { |
440 | |||
441 | /* user data may have out-of-bound event index */ | ||
442 | evnt = p4_config_unpack_event(event->attr.config); | ||
443 | if (evnt >= ARRAY_SIZE(p4_event_bind_map)) { | ||
444 | rc = -EINVAL; | ||
445 | goto out; | ||
446 | } | ||
447 | |||
439 | /* | 448 | /* |
440 | * We don't control raw events so it's up to the caller | 449 | * We don't control raw events so it's up to the caller |
441 | * to pass sane values (and we don't count the thread number | 450 | * to pass sane values (and we don't count the thread number |
@@ -451,8 +460,8 @@ static int p4_hw_config(struct perf_event *event) | |||
451 | } | 460 | } |
452 | 461 | ||
453 | rc = x86_setup_perfctr(event); | 462 | rc = x86_setup_perfctr(event); |
463 | out: | ||
454 | put_cpu(); | 464 | put_cpu(); |
455 | |||
456 | return rc; | 465 | return rc; |
457 | } | 466 | } |
458 | 467 | ||