io_uring/rsrc: clean up buffer cloning arg validation

Get rid of some redundant checks and move the src arg validation to
before the buffer table allocation, which simplifies error handling.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by Joanne Koong and committed by Jens Axboe b8201b50 f345be75

Changed files
+6 -21
io_uring
+6 -21
io_uring/rsrc.c
··· 1186 1186 return -EBUSY; 1187 1187 1188 1188 nbufs = src_ctx->buf_table.nr; 1189 + if (!nbufs) 1190 + return -ENXIO; 1189 1191 if (!arg->nr) 1190 1192 arg->nr = nbufs; 1191 1193 else if (arg->nr > nbufs) 1192 1194 return -EINVAL; 1193 1195 else if (arg->nr > IORING_MAX_REG_BUFFERS) 1194 1196 return -EINVAL; 1197 + if (check_add_overflow(arg->nr, arg->src_off, &off) || off > nbufs) 1198 + return -EOVERFLOW; 1195 1199 if (check_add_overflow(arg->nr, arg->dst_off, &nbufs)) 1196 1200 return -EOVERFLOW; 1197 1201 if (nbufs > IORING_MAX_REG_BUFFERS) ··· 1215 1211 } 1216 1212 } 1217 1213 1218 - ret = -ENXIO; 1219 - nbufs = src_ctx->buf_table.nr; 1220 - if (!nbufs) 1221 - goto out_free; 1222 - ret = -EINVAL; 1223 - if (!arg->nr) 1224 - arg->nr = nbufs; 1225 - else if (arg->nr > nbufs) 1226 - goto out_free; 1227 - ret = -EOVERFLOW; 1228 - if (check_add_overflow(arg->nr, arg->src_off, &off)) 1229 - goto out_free; 1230 - if (off > nbufs) 1231 - goto out_free; 1232 - 1233 1214 off = arg->dst_off; 1234 1215 i = arg->src_off; 1235 1216 nr = arg->nr; ··· 1227 1238 } else { 1228 1239 dst_node = io_rsrc_node_alloc(ctx, IORING_RSRC_BUFFER); 1229 1240 if (!dst_node) { 1230 - ret = -ENOMEM; 1231 - goto out_free; 1241 + io_rsrc_data_free(ctx, &data); 1242 + return -ENOMEM; 1232 1243 } 1233 1244 1234 1245 refcount_inc(&src_node->buf->refs); ··· 1254 1265 WARN_ON_ONCE(ctx->buf_table.nr); 1255 1266 ctx->buf_table = data; 1256 1267 return 0; 1257 - 1258 - out_free: 1259 - io_rsrc_data_free(ctx, &data); 1260 - return ret; 1261 1268 } 1262 1269 1263 1270 /*