@@ -1002,22 +1002,33 @@ int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
10021002}
10031003EXPORT_SYMBOL_GPL (io_buffer_unregister_bvec );
10041004
1005- static int io_import_fixed (int ddir , struct iov_iter * iter ,
1006- struct io_mapped_ubuf * imu ,
1007- u64 buf_addr , size_t len )
1005+ static int validate_fixed_range (u64 buf_addr , size_t len ,
1006+ const struct io_mapped_ubuf * imu )
10081007{
10091008 u64 buf_end ;
1010- size_t offset ;
10111009
1012- if (WARN_ON_ONCE (!imu ))
1013- return - EFAULT ;
10141010 if (unlikely (check_add_overflow (buf_addr , (u64 )len , & buf_end )))
10151011 return - EFAULT ;
10161012 /* not inside the mapped region */
10171013 if (unlikely (buf_addr < imu -> ubuf || buf_end > (imu -> ubuf + imu -> len )))
10181014 return - EFAULT ;
10191015 if (unlikely (len > MAX_RW_COUNT ))
10201016 return - EFAULT ;
1017+ return 0 ;
1018+ }
1019+
1020+ static int io_import_fixed (int ddir , struct iov_iter * iter ,
1021+ struct io_mapped_ubuf * imu ,
1022+ u64 buf_addr , size_t len )
1023+ {
1024+ size_t offset ;
1025+ int ret ;
1026+
1027+ if (WARN_ON_ONCE (!imu ))
1028+ return - EFAULT ;
1029+ ret = validate_fixed_range (buf_addr , len , imu );
1030+ if (unlikely (ret ))
1031+ return ret ;
10211032 if (!(imu -> dir & (1 << ddir )))
10221033 return - EFAULT ;
10231034
@@ -1307,12 +1318,12 @@ static int io_vec_fill_bvec(int ddir, struct iov_iter *iter,
13071318 u64 buf_addr = (u64 )(uintptr_t )iovec [iov_idx ].iov_base ;
13081319 struct bio_vec * src_bvec ;
13091320 size_t offset ;
1310- u64 buf_end ;
1321+ int ret ;
1322+
1323+ ret = validate_fixed_range (buf_addr , iov_len , imu );
1324+ if (unlikely (ret ))
1325+ return ret ;
13111326
1312- if (unlikely (check_add_overflow (buf_addr , (u64 )iov_len , & buf_end )))
1313- return - EFAULT ;
1314- if (unlikely (buf_addr < imu -> ubuf || buf_end > (imu -> ubuf + imu -> len )))
1315- return - EFAULT ;
13161327 if (unlikely (!iov_len ))
13171328 return - EFAULT ;
13181329 if (unlikely (check_add_overflow (total_len , iov_len , & total_len )))
0 commit comments