aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/ldt.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/ldt.c')
-rw-r--r--arch/x86/kernel/ldt.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c
index a8cdca3615bf..7eb0c8a45734 100644
--- a/arch/x86/kernel/ldt.c
+++ b/arch/x86/kernel/ldt.c
@@ -186,7 +186,7 @@ static int read_default_ldt(void __user *ptr, unsigned long bytecount)
186static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) 186static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
187{ 187{
188 struct mm_struct *mm = current->mm; 188 struct mm_struct *mm = current->mm;
189 __u32 entry_1, entry_2; 189 struct desc_struct ldt;
190 int error; 190 int error;
191 struct user_desc ldt_info; 191 struct user_desc ldt_info;
192 192
@@ -218,21 +218,20 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
218 /* Allow LDTs to be cleared by the user. */ 218 /* Allow LDTs to be cleared by the user. */
219 if (ldt_info.base_addr == 0 && ldt_info.limit == 0) { 219 if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
220 if (oldmode || LDT_empty(&ldt_info)) { 220 if (oldmode || LDT_empty(&ldt_info)) {
221 entry_1 = 0; 221 memset(&ldt, 0, sizeof(ldt));
222 entry_2 = 0;
223 goto install; 222 goto install;
224 } 223 }
225 } 224 }
226 225
227 entry_1 = LDT_entry_a(&ldt_info); 226 ldt.a = LDT_entry_a(&ldt_info);
228 entry_2 = LDT_entry_b(&ldt_info); 227 ldt.b = LDT_entry_b(&ldt_info);
229 if (oldmode) 228 if (oldmode)
230 entry_2 &= ~(1 << 20); 229 ldt.avl = 0;
231 230
232 /* Install the new entry ... */ 231 /* Install the new entry ... */
233install: 232install:
234 write_ldt_entry(mm->context.ldt, ldt_info.entry_number, entry_1, 233 write_ldt_entry(mm->context.ldt, ldt_info.entry_number,
235 entry_2); 234 ldt.a, ldt.b);
236 error = 0; 235 error = 0;
237 236
238out_unlock: 237out_unlock: