diff options
Diffstat (limited to 'arch/x86/kernel/step.c')
| -rw-r--r-- | arch/x86/kernel/step.c | 8 | 
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c index 9b4d51d0c0d0..0ccb53a9fcd9 100644 --- a/arch/x86/kernel/step.c +++ b/arch/x86/kernel/step.c @@ -5,6 +5,7 @@  #include <linux/mm.h>  #include <linux/ptrace.h>  #include <asm/desc.h> +#include <asm/mmu_context.h>  unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs)  { @@ -27,13 +28,14 @@ unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *re  		struct desc_struct *desc;  		unsigned long base; -		seg &= ~7UL; +		seg >>= 3;  		mutex_lock(&child->mm->context.lock); -		if (unlikely((seg >> 3) >= child->mm->context.size)) +		if (unlikely(!child->mm->context.ldt || +			     seg >= child->mm->context.ldt->size))  			addr = -1L; /* bogus selector, access would fault */  		else { -			desc = child->mm->context.ldt + seg; +			desc = &child->mm->context.ldt->entries[seg];  			base = get_desc_base(desc);  			/* 16-bit code segment? */  |