|
@@ -25,6 +25,7 @@
|
|
|
#include <linux/sched/signal.h>
|
|
|
#include <linux/sched/task_stack.h>
|
|
|
#include <linux/mm.h>
|
|
|
+#include <linux/nospec.h>
|
|
|
#include <linux/smp.h>
|
|
|
#include <linux/ptrace.h>
|
|
|
#include <linux/user.h>
|
|
@@ -249,15 +250,20 @@ static struct perf_event *ptrace_hbp_get_event(unsigned int note_type,
|
|
|
|
|
|
switch (note_type) {
|
|
|
case NT_ARM_HW_BREAK:
|
|
|
- if (idx < ARM_MAX_BRP)
|
|
|
- bp = tsk->thread.debug.hbp_break[idx];
|
|
|
+ if (idx >= ARM_MAX_BRP)
|
|
|
+ goto out;
|
|
|
+ idx = array_index_nospec(idx, ARM_MAX_BRP);
|
|
|
+ bp = tsk->thread.debug.hbp_break[idx];
|
|
|
break;
|
|
|
case NT_ARM_HW_WATCH:
|
|
|
- if (idx < ARM_MAX_WRP)
|
|
|
- bp = tsk->thread.debug.hbp_watch[idx];
|
|
|
+ if (idx >= ARM_MAX_WRP)
|
|
|
+ goto out;
|
|
|
+ idx = array_index_nospec(idx, ARM_MAX_WRP);
|
|
|
+ bp = tsk->thread.debug.hbp_watch[idx];
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+out:
|
|
|
return bp;
|
|
|
}
|
|
|
|