mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	io_uring: reference ->nsproxy for file table commands
If we don't get and assign the namespace for the async work, then certain paths just don't work properly (like /dev/stdin, /proc/mounts, etc). Anything that references the current namespace of the given task should be assigned for async work on behalf of that task. Cc: stable@vger.kernel.org # v5.5+ Reported-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									0f2122045b
								
							
						
					
					
						commit
						9b82849215
					
				
					 3 changed files with 8 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -60,6 +60,7 @@ struct io_worker {
 | 
			
		|||
	const struct cred *cur_creds;
 | 
			
		||||
	const struct cred *saved_creds;
 | 
			
		||||
	struct files_struct *restore_files;
 | 
			
		||||
	struct nsproxy *restore_nsproxy;
 | 
			
		||||
	struct fs_struct *restore_fs;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -153,6 +154,7 @@ static bool __io_worker_unuse(struct io_wqe *wqe, struct io_worker *worker)
 | 
			
		|||
 | 
			
		||||
		task_lock(current);
 | 
			
		||||
		current->files = worker->restore_files;
 | 
			
		||||
		current->nsproxy = worker->restore_nsproxy;
 | 
			
		||||
		task_unlock(current);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -318,6 +320,7 @@ static void io_worker_start(struct io_wqe *wqe, struct io_worker *worker)
 | 
			
		|||
 | 
			
		||||
	worker->flags |= (IO_WORKER_F_UP | IO_WORKER_F_RUNNING);
 | 
			
		||||
	worker->restore_files = current->files;
 | 
			
		||||
	worker->restore_nsproxy = current->nsproxy;
 | 
			
		||||
	worker->restore_fs = current->fs;
 | 
			
		||||
	io_wqe_inc_running(wqe, worker);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -454,6 +457,7 @@ static void io_impersonate_work(struct io_worker *worker,
 | 
			
		|||
	if (work->files && current->files != work->files) {
 | 
			
		||||
		task_lock(current);
 | 
			
		||||
		current->files = work->files;
 | 
			
		||||
		current->nsproxy = work->nsproxy;
 | 
			
		||||
		task_unlock(current);
 | 
			
		||||
	}
 | 
			
		||||
	if (work->fs && current->fs != work->fs)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,6 +88,7 @@ struct io_wq_work {
 | 
			
		|||
	struct files_struct *files;
 | 
			
		||||
	struct mm_struct *mm;
 | 
			
		||||
	const struct cred *creds;
 | 
			
		||||
	struct nsproxy *nsproxy;
 | 
			
		||||
	struct fs_struct *fs;
 | 
			
		||||
	unsigned long fsize;
 | 
			
		||||
	unsigned flags;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5678,6 +5678,7 @@ static void io_req_drop_files(struct io_kiocb *req)
 | 
			
		|||
	spin_unlock_irqrestore(&ctx->inflight_lock, flags);
 | 
			
		||||
	req->flags &= ~REQ_F_INFLIGHT;
 | 
			
		||||
	put_files_struct(req->work.files);
 | 
			
		||||
	put_nsproxy(req->work.nsproxy);
 | 
			
		||||
	req->work.files = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -6086,6 +6087,8 @@ static int io_grab_files(struct io_kiocb *req)
 | 
			
		|||
		return 0;
 | 
			
		||||
 | 
			
		||||
	req->work.files = get_files_struct(current);
 | 
			
		||||
	get_nsproxy(current->nsproxy);
 | 
			
		||||
	req->work.nsproxy = current->nsproxy;
 | 
			
		||||
	req->flags |= REQ_F_INFLIGHT;
 | 
			
		||||
 | 
			
		||||
	spin_lock_irq(&ctx->inflight_lock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue