mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:12:43 +00:00 
			
		
		
		
	Kernel: Make sys$getsid not require the big lock
Reorganize the code slightly to avoid creating a TOCTOU bug, then mark the syscall as not needing the big lock anymore.
This commit is contained in:
		
							parent
							
								
									1382439267
								
							
						
					
					
						commit
						41f5598516
					
				
					 2 changed files with 8 additions and 7 deletions
				
			
		|  | @ -104,7 +104,7 @@ enum class NeedsBigProcessLock { | ||||||
|     S(getresgid, NeedsBigProcessLock::No)                   \ |     S(getresgid, NeedsBigProcessLock::No)                   \ | ||||||
|     S(getresuid, NeedsBigProcessLock::No)                   \ |     S(getresuid, NeedsBigProcessLock::No)                   \ | ||||||
|     S(getrusage, NeedsBigProcessLock::Yes)                  \ |     S(getrusage, NeedsBigProcessLock::Yes)                  \ | ||||||
|     S(getsid, NeedsBigProcessLock::Yes)                     \ |     S(getsid, NeedsBigProcessLock::No)                      \ | ||||||
|     S(getsockname, NeedsBigProcessLock::Yes)                \ |     S(getsockname, NeedsBigProcessLock::Yes)                \ | ||||||
|     S(getsockopt, NeedsBigProcessLock::No)                  \ |     S(getsockopt, NeedsBigProcessLock::No)                  \ | ||||||
|     S(gettid, NeedsBigProcessLock::No)                      \ |     S(gettid, NeedsBigProcessLock::No)                      \ | ||||||
|  |  | ||||||
|  | @ -12,16 +12,17 @@ namespace Kernel { | ||||||
| 
 | 
 | ||||||
| ErrorOr<FlatPtr> Process::sys$getsid(pid_t pid) | ErrorOr<FlatPtr> Process::sys$getsid(pid_t pid) | ||||||
| { | { | ||||||
|     VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); |     VERIFY_NO_PROCESS_BIG_LOCK(this); | ||||||
|     TRY(require_promise(Pledge::stdio)); |     TRY(require_promise(Pledge::stdio)); | ||||||
|     if (pid == 0) |     if (pid == 0 || pid == this->pid()) | ||||||
|         return sid().value(); |         return sid().value(); | ||||||
|     auto process = Process::from_pid_in_same_jail(pid); |     auto peer = Process::from_pid_in_same_jail(pid); | ||||||
|     if (!process) |     if (!peer) | ||||||
|         return ESRCH; |         return ESRCH; | ||||||
|     if (sid() != process->sid()) |     auto peer_sid = peer->sid(); | ||||||
|  |     if (sid() != peer_sid) | ||||||
|         return EPERM; |         return EPERM; | ||||||
|     return process->sid().value(); |     return peer_sid.value(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<FlatPtr> Process::sys$setsid() | ErrorOr<FlatPtr> Process::sys$setsid() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling