From: Kirill Korotaev sys_getppid() optimization can access a freed memory. On kernels with DEBUG_SLAB turned ON, this results in Oops. As Dave Hansen noted, this optimization is also unsafe for memory hotplug. So this patch always takes the lock to be safe. Signed-off-by: Kirill Korotaev Cc: Cc: Dave Hansen Signed-off-by: Andrew Morton --- kernel/timer.c | 23 +++-------------------- 1 files changed, 3 insertions(+), 20 deletions(-) diff -puN kernel/timer.c~sys_getppid-oopses-on-debug-kernel-v2 kernel/timer.c --- a/kernel/timer.c~sys_getppid-oopses-on-debug-kernel-v2 +++ a/kernel/timer.c @@ -1342,28 +1342,11 @@ asmlinkage long sys_getpid(void) asmlinkage long sys_getppid(void) { int pid; - struct task_struct *me = current; - struct task_struct *parent; - parent = me->group_leader->real_parent; - for (;;) { - pid = parent->tgid; -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) -{ - struct task_struct *old = parent; + read_lock(&tasklist_lock); + pid = current->group_leader->real_parent->tgid; + read_unlock(&tasklist_lock); - /* - * Make sure we read the pid before re-reading the - * parent pointer: - */ - smp_rmb(); - parent = me->group_leader->real_parent; - if (old != parent) - continue; -} -#endif - break; - } return pid; } _