summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiu Xiaodong <xiaodong.liu@intel.com>2023-01-31 02:05:52 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-02-09 11:28:08 +0100
commitee1e3fe4b4579f856997190a00ea4db0307b4332 (patch)
tree91512806b0eeab709738c43a46d923c9751566bd
parenta1512f11ec02458c0986f169f29c90a92c150cc4 (diff)
downloadlinux-stable-ee1e3fe4b4579f856997190a00ea4db0307b4332.tar.gz
linux-stable-ee1e3fe4b4579f856997190a00ea4db0307b4332.tar.bz2
linux-stable-ee1e3fe4b4579f856997190a00ea4db0307b4332.zip
block: ublk: extending queue_size to fix overflow
[ Upstream commit 29baef789c838bd5c02f50c88adbbc6b955aaf61 ] When validating drafted SPDK ublk target, in a case that assigning large queue depth to multiqueue ublk device, ublk target would run into a weird incorrect state. During rounds of review and debug, An overflow bug was found in ublk driver. In ublk_cmd.h, UBLK_MAX_QUEUE_DEPTH is 4096 which means each ublk queue depth can be set as large as 4096. But when setting qd for a ublk device, sizeof(struct ublk_queue) + depth * sizeof(struct ublk_io) will be larger than 65535 if qd is larger than 2728. Then queue_size is overflowed, and ublk_get_queue() references a wrong pointer position. The wrong content of ublk_queue elements will lead to out-of-bounds memory access. Extend queue_size in ublk_device as "unsigned int". Signed-off-by: Liu Xiaodong <xiaodong.liu@intel.com> Fixes: 71f28f3136af ("ublk_drv: add io_uring based userspace block driver") Reviewed-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20230131070552.115067-1-xiaodong.liu@intel.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/block/ublk_drv.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
index e54693204630..6368b56eacf1 100644
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@ -137,7 +137,7 @@ struct ublk_device {
char *__queues;
- unsigned short queue_size;
+ unsigned int queue_size;
struct ublksrv_ctrl_dev_info dev_info;
struct blk_mq_tag_set tag_set;