mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 13:22:43 +00:00 
			
		
		
		
	 6132193bd4
			
		
	
	
		6132193bd4
		
	
	
	
	
		
			
			This syscall had a TOCTOU where it checked the peer's PPID before locking the protected data (where the PPID is stored). After closing the race window, we can mark the syscall as not needing the big lock.
		
			
				
	
	
		
			27 lines
		
	
	
	
		
			676 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
	
		
			676 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <Kernel/Process.h>
 | |
| 
 | |
| namespace Kernel {
 | |
| 
 | |
| ErrorOr<FlatPtr> Process::sys$disown(ProcessID pid)
 | |
| {
 | |
|     VERIFY_NO_PROCESS_BIG_LOCK(this);
 | |
|     TRY(require_promise(Pledge::proc));
 | |
|     auto process = Process::from_pid_in_same_jail(pid);
 | |
|     if (!process)
 | |
|         return ESRCH;
 | |
|     TRY(process->with_mutable_protected_data([this](auto& protected_data) -> ErrorOr<void> {
 | |
|         if (protected_data.ppid != this->pid())
 | |
|             return ECHILD;
 | |
|         protected_data.ppid = 0;
 | |
|         return {};
 | |
|     }));
 | |
|     process->disowned_by_waiter(*this);
 | |
|     return 0;
 | |
| }
 | |
| }
 |