Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 19 Dec 2014 21:18:31 +0000 (13:18 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 19 Dec 2014 21:18:31 +0000 (13:18 -0800)
Pull x86 fix from Ingo Molnar:
 "This contains a single TLS ABI validation fix from Andy Lutomirski"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/tls: Don't validate lm in set_thread_area() after all

arch/x86/include/uapi/asm/ldt.h
arch/x86/kernel/tls.c

index 46727eb37bfe20915242badc965a2b4985bd28b4..6e1aaf73852ac956156df80f4dfcb931633f5269 100644 (file)
@@ -28,6 +28,13 @@ struct user_desc {
        unsigned int  seg_not_present:1;
        unsigned int  useable:1;
 #ifdef __x86_64__
+       /*
+        * Because this bit is not present in 32-bit user code, user
+        * programs can pass uninitialized values here.  Therefore, in
+        * any context in which a user_desc comes from a 32-bit program,
+        * the kernel must act as though lm == 0, regardless of the
+        * actual value.
+        */
        unsigned int  lm:1;
 #endif
 };
index 3e551eee87b90e2e14785eadf93646ede67cf9a3..4e942f31b1a7c9401a65fb37af093caab5ad0c2e 100644 (file)
@@ -55,12 +55,6 @@ static bool tls_desc_okay(const struct user_desc *info)
        if (info->seg_not_present)
                return false;
 
-#ifdef CONFIG_X86_64
-       /* The L bit makes no sense for data. */
-       if (info->lm)
-               return false;
-#endif
-
        return true;
 }