|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/export.h>
|
|
|
#include <linux/context_tracking.h>
|
|
|
#include <linux/user-return-notifier.h>
|
|
|
+#include <linux/nospec.h>
|
|
|
#include <linux/uprobes.h>
|
|
|
#include <linux/livepatch.h>
|
|
|
#include <linux/syscalls.h>
|
|
@@ -282,7 +283,8 @@ __visible void do_syscall_64(struct pt_regs *regs)
|
|
|
* regs->orig_ax, which changes the behavior of some syscalls.
|
|
|
*/
|
|
|
if (likely((nr & __SYSCALL_MASK) < NR_syscalls)) {
|
|
|
- regs->ax = sys_call_table[nr & __SYSCALL_MASK](
|
|
|
+ nr = array_index_nospec(nr & __SYSCALL_MASK, NR_syscalls);
|
|
|
+ regs->ax = sys_call_table[nr](
|
|
|
regs->di, regs->si, regs->dx,
|
|
|
regs->r10, regs->r8, regs->r9);
|
|
|
}
|
|
@@ -318,6 +320,7 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs)
|
|
|
}
|
|
|
|
|
|
if (likely(nr < IA32_NR_syscalls)) {
|
|
|
+ nr = array_index_nospec(nr, IA32_NR_syscalls);
|
|
|
/*
|
|
|
* It's possible that a 32-bit syscall implementation
|
|
|
* takes a 64-bit parameter but nonetheless assumes that
|