@@ -1002,22 +1002,33 @@ int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index,
1002
1002
}
1003
1003
EXPORT_SYMBOL_GPL (io_buffer_unregister_bvec );
1004
1004
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 )
1008
1007
{
1009
1008
u64 buf_end ;
1010
- size_t offset ;
1011
1009
1012
- if (WARN_ON_ONCE (!imu ))
1013
- return - EFAULT ;
1014
1010
if (unlikely (check_add_overflow (buf_addr , (u64 )len , & buf_end )))
1015
1011
return - EFAULT ;
1016
1012
/* not inside the mapped region */
1017
1013
if (unlikely (buf_addr < imu -> ubuf || buf_end > (imu -> ubuf + imu -> len )))
1018
1014
return - EFAULT ;
1019
1015
if (unlikely (len > MAX_RW_COUNT ))
1020
1016
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 ;
1021
1032
if (!(imu -> dir & (1 << ddir )))
1022
1033
return - EFAULT ;
1023
1034
@@ -1307,12 +1318,12 @@ static int io_vec_fill_bvec(int ddir, struct iov_iter *iter,
1307
1318
u64 buf_addr = (u64 )(uintptr_t )iovec [iov_idx ].iov_base ;
1308
1319
struct bio_vec * src_bvec ;
1309
1320
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 ;
1311
1326
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 ;
1316
1327
if (unlikely (!iov_len ))
1317
1328
return - EFAULT ;
1318
1329
if (unlikely (check_add_overflow (total_len , iov_len , & total_len )))
0 commit comments