|
@@ -394,8 +394,20 @@ __visible long do_fast_syscall_32(struct pt_regs *regs)
|
|
|
* WARNING: We are in CONTEXT_USER and RCU isn't paying attention!
|
|
|
*/
|
|
|
local_irq_enable();
|
|
|
- if (get_user(*(u32 *)®s->cx,
|
|
|
- (u32 __user __force *)(unsigned long)(u32)regs->sp)) {
|
|
|
+ if (
|
|
|
+#ifdef CONFIG_X86_64
|
|
|
+ /*
|
|
|
+ * Micro-optimization: the pointer we're following is explicitly
|
|
|
+ * 32 bits, so it can't be out of range.
|
|
|
+ */
|
|
|
+ __get_user(*(u32 *)®s->cx,
|
|
|
+ (u32 __user __force *)(unsigned long)(u32)regs->sp)
|
|
|
+#else
|
|
|
+ get_user(*(u32 *)®s->cx,
|
|
|
+ (u32 __user __force *)(unsigned long)(u32)regs->sp)
|
|
|
+#endif
|
|
|
+ ) {
|
|
|
+
|
|
|
/* User code screwed up. */
|
|
|
local_irq_disable();
|
|
|
regs->ax = -EFAULT;
|