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); | 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) | static inline bool io_file_need_scm(struct file *filp) | ||||||
| { | { | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| static inline int io_scm_file_account(struct io_ring_ctx *ctx, | static inline int io_scm_file_account(struct io_ring_ctx *ctx, | ||||||
| 				      struct file *file) | 				      struct file *file) | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ | ||||||
| #include <linux/nsproxy.h> | #include <linux/nsproxy.h> | ||||||
| #include <linux/slab.h> | #include <linux/slab.h> | ||||||
| #include <linux/errqueue.h> | #include <linux/errqueue.h> | ||||||
|  | #include <linux/io_uring.h> | ||||||
| 
 | 
 | ||||||
| #include <linux/uaccess.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))) | 		if (fd < 0 || !(file = fget_raw(fd))) | ||||||
| 			return -EBADF; | 			return -EBADF; | ||||||
|  | 		/* don't allow io_uring files */ | ||||||
|  | 		if (io_uring_get_socket(file)) { | ||||||
|  | 			fput(file); | ||||||
|  | 			return -EINVAL; | ||||||
|  | 		} | ||||||
| 		*fpp++ = file; | 		*fpp++ = file; | ||||||
| 		fpl->count++; | 		fpl->count++; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel Begunkov
						Pavel Begunkov