x86/fsgsbase/64: Use TASK_SIZE_MAX for FSBASE/GSBASE upper limits
authorAndy Lutomirski <luto@kernel.org>
Tue, 10 May 2016 16:18:46 +0000 (09:18 -0700)
committerIngo Molnar <mingo@kernel.org>
Fri, 20 May 2016 07:10:03 +0000 (09:10 +0200)
The GSBASE upper limit exists to prevent user code from confusing
the paranoid idtentry path.  The FSBASE upper limit is just for
consistency.  There's no need to enforce a smaller limit for 32-bit
tasks.

Just use TASK_SIZE_MAX.  This simplifies the logic and will save a
few bytes of code.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/5357f2fe0f103eabf005773b70722451eab09a89.1462897104.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/process_64.c
arch/x86/kernel/ptrace.c

index 6b16c36..6e789ca 100644 (file)
@@ -532,7 +532,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
 
        switch (code) {
        case ARCH_SET_GS:
-               if (addr >= TASK_SIZE_OF(task))
+               if (addr >= TASK_SIZE_MAX)
                        return -EPERM;
                cpu = get_cpu();
                task->thread.gsindex = 0;
@@ -546,7 +546,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
        case ARCH_SET_FS:
                /* Not strictly needed for fs, but do it for symmetry
                   with gs */
-               if (addr >= TASK_SIZE_OF(task))
+               if (addr >= TASK_SIZE_MAX)
                        return -EPERM;
                cpu = get_cpu();
                task->thread.fsindex = 0;
index e60ef91..600edd2 100644 (file)
@@ -392,7 +392,7 @@ static int putreg(struct task_struct *child,
 
 #ifdef CONFIG_X86_64
        case offsetof(struct user_regs_struct,fs_base):
-               if (value >= TASK_SIZE_OF(child))
+               if (value >= TASK_SIZE_MAX)
                        return -EIO;
                /*
                 * When changing the segment base, use do_arch_prctl
@@ -406,7 +406,7 @@ static int putreg(struct task_struct *child,
                /*
                 * Exactly the same here as the %fs handling above.
                 */
-               if (value >= TASK_SIZE_OF(child))
+               if (value >= TASK_SIZE_MAX)
                        return -EIO;
                if (child->thread.gsbase != value)
                        return do_arch_prctl(child, ARCH_SET_GS, value);