Skip to contentSkip to conversation

pids: sys_getsid: make sure we don't return 0 instead of -ESRCH

PATCH In review Oleg Nesterov 1 participant 2 messages Mar 23, 2008 – Mar 24, 2008

lore
Share & tools
lore
#0 lore raw

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.

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;
 	}
 }
 
#1 lore raw

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() and task_session_vnr(), in that unlikely case sys_getsid() returns 0 instead of -ESRCH.

The bug was introduced by me in ac9a8e3f0f43d20fc316162e8e5f9186d295ff49.

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;
 	}
 }