pids: sys_getsid: make sure we don't return 0 instead of -ESRCH
PATCH 1/1 pids: sys_getsid: make sure we don't return 0 instead of -ESRCH
The task can exit between find_task_by_vpid() and task_session_vnr(), in that unlikely case sys_getsid() returns 0 instead of -ESRCH.
The bug was introduced by me in ac9a8e3f0f43d20fc316162e8e5f9186d295ff49.
Signed-off-by Oleg Nesterov <[email protected]>
kernel/sys.c renamed from kernel/sys.c~1_GETSID +3 -3
@@ -1019,19 +1019,19 @@ asmlinkage long sys_getsid(pid_t pid)if (!pid)return task_session_vnr (current);else { -int retval; +int retval =0 ;struct task_struct *p;rcu_read_lock (); p =find_task_by_vpid (pid); - retval = -ESRCH ;if (p) { retval =security_task_getsid (p);if (!retval) retval =task_session_vnr (p); }rcu_read_unlock (); -return retval; + +return retval ?: -ESRCH ; } }
Sorry! please ignore this patch and
"[PATCH] pids: sys_getpgid: use rcu_read_lock() instead of tasklist_lock",
I'll send the updated version.
It turns out that sys_getsid/sys_getpgid have other problems which should be fixed.
Quoted 33 lines · Oleg Nesterov
The task can exit between
find_task_by_vpid()andtask_session_vnr(), in that unlikely casesys_getsid()returns 0 instead of-ESRCH.The bug was introduced by me in
ac9a8e3f0f43d20fc316162e8e5f9186d295ff49.Signed-off-by Oleg Nesterov <[email protected]>kernel/sys.c renamed from kernel/sys.c~1_GETSID +3
-3@@ -1019,19 +1019,19 @@ asmlinkage long sys_getsid(pid_t pid)if (!pid)return task_session_vnr (current);else { -int retval; +int retval =0 ;struct task_struct *p;rcu_read_lock (); p =find_task_by_vpid (pid); - retval = -ESRCH ;if (p) { retval =security_task_getsid (p);if (!retval) retval =task_session_vnr (p); }rcu_read_unlock (); -return retval; + +return retval ?: -ESRCH ; } }