Skip to content

Commit b8201b5

Browse files
joannekoongaxboe
authored andcommitted
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>
1 parent f345be7 commit b8201b5

1 file changed

Lines changed: 6 additions & 21 deletions

File tree

io_uring/rsrc.c

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,12 +1186,16 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
11861186
return -EBUSY;
11871187

11881188
nbufs = src_ctx->buf_table.nr;
1189+
if (!nbufs)
1190+
return -ENXIO;
11891191
if (!arg->nr)
11901192
arg->nr = nbufs;
11911193
else if (arg->nr > nbufs)
11921194
return -EINVAL;
11931195
else if (arg->nr > IORING_MAX_REG_BUFFERS)
11941196
return -EINVAL;
1197+
if (check_add_overflow(arg->nr, arg->src_off, &off) || off > nbufs)
1198+
return -EOVERFLOW;
11951199
if (check_add_overflow(arg->nr, arg->dst_off, &nbufs))
11961200
return -EOVERFLOW;
11971201
if (nbufs > IORING_MAX_REG_BUFFERS)
@@ -1211,21 +1215,6 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
12111215
}
12121216
}
12131217

1214-
ret = -ENXIO;
1215-
nbufs = src_ctx->buf_table.nr;
1216-
if (!nbufs)
1217-
goto out_free;
1218-
ret = -EINVAL;
1219-
if (!arg->nr)
1220-
arg->nr = nbufs;
1221-
else if (arg->nr > nbufs)
1222-
goto out_free;
1223-
ret = -EOVERFLOW;
1224-
if (check_add_overflow(arg->nr, arg->src_off, &off))
1225-
goto out_free;
1226-
if (off > nbufs)
1227-
goto out_free;
1228-
12291218
off = arg->dst_off;
12301219
i = arg->src_off;
12311220
nr = arg->nr;
@@ -1238,8 +1227,8 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
12381227
} else {
12391228
dst_node = io_rsrc_node_alloc(ctx, IORING_RSRC_BUFFER);
12401229
if (!dst_node) {
1241-
ret = -ENOMEM;
1242-
goto out_free;
1230+
io_rsrc_data_free(ctx, &data);
1231+
return -ENOMEM;
12431232
}
12441233

12451234
refcount_inc(&src_node->buf->refs);
@@ -1265,10 +1254,6 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
12651254
WARN_ON_ONCE(ctx->buf_table.nr);
12661255
ctx->buf_table = data;
12671256
return 0;
1268-
1269-
out_free:
1270-
io_rsrc_data_free(ctx, &data);
1271-
return ret;
12721257
}
12731258

12741259
/*

0 commit comments

Comments
 (0)