commit 0083b63a10a5661ea6f167f4732cd6fb8c35b94b Author: Alexander Korolkov Date: Sun Oct 23 01:38:35 2011 +0400 Race condition diff --git a/linuxkernel/linux-2.6.27/arch/arm/include/asm/system.h b/linuxkernel/linux-2.6.27/arch/arm/include/asm/system.h index 514af79..708be12 100644 --- a/linuxkernel/linux-2.6.27/arch/arm/include/asm/system.h +++ b/linuxkernel/linux-2.6.27/arch/arm/include/asm/system.h @@ -265,7 +265,10 @@ extern struct task_struct *__switch_to(struct task_struct *, struct thread_info #define switch_to(prev,next,last) \ do { \ + unsigned long __iflags; \ + local_irq_save(__iflags); \ last = __switch_to(prev,task_thread_info(prev), task_thread_info(next)); \ + local_irq_restore(__iflags); \ } while (0) #if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) diff --git a/linuxkernel/linux-2.6.27/arch/arm/include/asm/uaccess.h b/linuxkernel/linux-2.6.27/arch/arm/include/asm/uaccess.h index d0f51ff..b754116 100644 --- a/linuxkernel/linux-2.6.27/arch/arm/include/asm/uaccess.h +++ b/linuxkernel/linux-2.6.27/arch/arm/include/asm/uaccess.h @@ -60,8 +60,11 @@ extern int __put_user_bad(void); static inline void set_fs(mm_segment_t fs) { + unsigned long flags; + local_irq_save(flags); current_thread_info()->addr_limit = fs; modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); + local_irq_restore(flags); } #define segment_eq(a,b) ((a) == (b))