forked from mirrors/linux
		
	io_uring/af_unix: disable sending io_uring over sockets
File reference cycles have caused lots of problems for io_uring
in the past, and it still doesn't work exactly right and races with
unix_stream_read_generic(). The safest fix would be to completely
disallow sending io_uring files via sockets via SCM_RIGHT, so there
are no possible cycles invloving registered files and thus rendering
SCM accounting on the io_uring side unnecessary.
Cc:  <stable@vger.kernel.org>
Fixes: 0091bfc817 ("io_uring/af_unix: defer registered files gc to io_uring release")
Reported-and-suggested-by: Jann Horn <jannh@google.com>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/c716c88321939156909cfa1bd8b0faaf1c804103.1701868795.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
			
			
This commit is contained in:
		
							parent
							
								
									9865346b7e
								
							
						
					
					
						commit
						705318a99a
					
				
					 2 changed files with 6 additions and 7 deletions
				
			
		|  | @ -77,17 +77,10 @@ int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg, | |||
| 
 | ||||
| int __io_scm_file_account(struct io_ring_ctx *ctx, struct file *file); | ||||
| 
 | ||||
| #if defined(CONFIG_UNIX) | ||||
| static inline bool io_file_need_scm(struct file *filp) | ||||
| { | ||||
| 	return !!unix_get_socket(filp); | ||||
| } | ||||
| #else | ||||
| static inline bool io_file_need_scm(struct file *filp) | ||||
| { | ||||
| 	return false; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static inline int io_scm_file_account(struct io_ring_ctx *ctx, | ||||
| 				      struct file *file) | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ | |||
| #include <linux/nsproxy.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/errqueue.h> | ||||
| #include <linux/io_uring.h> | ||||
| 
 | ||||
| #include <linux/uaccess.h> | ||||
| 
 | ||||
|  | @ -103,6 +104,11 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp) | |||
| 
 | ||||
| 		if (fd < 0 || !(file = fget_raw(fd))) | ||||
| 			return -EBADF; | ||||
| 		/* don't allow io_uring files */ | ||||
| 		if (io_uring_get_socket(file)) { | ||||
| 			fput(file); | ||||
| 			return -EINVAL; | ||||
| 		} | ||||
| 		*fpp++ = file; | ||||
| 		fpl->count++; | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Pavel Begunkov
						Pavel Begunkov