Commit 73a166d9 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe

ublk_drv: don't probe partitions if the ubq daemon isn't trusted

If any ubq daemon is unprivileged, the ublk char device is allowed
for unprivileged user actually, and we can't trust the current user,
so not probe partitions.

Fixes: 71f28f31 ("ublk_drv: add io_uring based userspace block driver")
Reviewed-by: default avatarZiyangZhang <ZiyangZhang@linux.alibaba.com>
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20230106041711.914434-3-ming.lei@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent ed878d1c
...@@ -159,6 +159,7 @@ struct ublk_device { ...@@ -159,6 +159,7 @@ struct ublk_device {
struct completion completion; struct completion completion;
unsigned int nr_queues_ready; unsigned int nr_queues_ready;
unsigned int nr_privileged_daemon;
/* /*
* Our ubq->daemon may be killed without any notification, so * Our ubq->daemon may be killed without any notification, so
...@@ -1178,6 +1179,9 @@ static void ublk_mark_io_ready(struct ublk_device *ub, struct ublk_queue *ubq) ...@@ -1178,6 +1179,9 @@ static void ublk_mark_io_ready(struct ublk_device *ub, struct ublk_queue *ubq)
ubq->ubq_daemon = current; ubq->ubq_daemon = current;
get_task_struct(ubq->ubq_daemon); get_task_struct(ubq->ubq_daemon);
ub->nr_queues_ready++; ub->nr_queues_ready++;
if (capable(CAP_SYS_ADMIN))
ub->nr_privileged_daemon++;
} }
if (ub->nr_queues_ready == ub->dev_info.nr_hw_queues) if (ub->nr_queues_ready == ub->dev_info.nr_hw_queues)
complete_all(&ub->completion); complete_all(&ub->completion);
...@@ -1534,6 +1538,10 @@ static int ublk_ctrl_start_dev(struct io_uring_cmd *cmd) ...@@ -1534,6 +1538,10 @@ static int ublk_ctrl_start_dev(struct io_uring_cmd *cmd)
if (ret) if (ret)
goto out_put_disk; goto out_put_disk;
/* don't probe partitions if any one ubq daemon is un-trusted */
if (ub->nr_privileged_daemon != ub->nr_queues_ready)
set_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
get_device(&ub->cdev_dev); get_device(&ub->cdev_dev);
ret = add_disk(disk); ret = add_disk(disk);
if (ret) { if (ret) {
...@@ -1935,6 +1943,7 @@ static int ublk_ctrl_start_recovery(struct io_uring_cmd *cmd) ...@@ -1935,6 +1943,7 @@ static int ublk_ctrl_start_recovery(struct io_uring_cmd *cmd)
/* set to NULL, otherwise new ubq_daemon cannot mmap the io_cmd_buf */ /* set to NULL, otherwise new ubq_daemon cannot mmap the io_cmd_buf */
ub->mm = NULL; ub->mm = NULL;
ub->nr_queues_ready = 0; ub->nr_queues_ready = 0;
ub->nr_privileged_daemon = 0;
init_completion(&ub->completion); init_completion(&ub->completion);
ret = 0; ret = 0;
out_unlock: out_unlock:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment