diff options
| -rw-r--r-- | arch/x86/kernel/ldt.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c index ebc987398923..af1d14a9ebda 100644 --- a/arch/x86/kernel/ldt.c +++ b/arch/x86/kernel/ldt.c | |||
| @@ -229,6 +229,17 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) | |||
| 229 | } | 229 | } |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | /* | ||
| 233 | * On x86-64 we do not support 16-bit segments due to | ||
| 234 | * IRET leaking the high bits of the kernel stack address. | ||
| 235 | */ | ||
| 236 | #ifdef CONFIG_X86_64 | ||
| 237 | if (!ldt_info.seg_32bit) { | ||
| 238 | error = -EINVAL; | ||
| 239 | goto out_unlock; | ||
| 240 | } | ||
| 241 | #endif | ||
| 242 | |||
| 232 | fill_ldt(&ldt, &ldt_info); | 243 | fill_ldt(&ldt, &ldt_info); |
| 233 | if (oldmode) | 244 | if (oldmode) |
| 234 | ldt.avl = 0; | 245 | ldt.avl = 0; |
