[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 07/16] block/io: improve bdrv_check_request: check qiov too
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v4 07/16] block/io: improve bdrv_check_request: check qiov too |
Date: |
Fri, 11 Dec 2020 21:39:25 +0300 |
Operations with qiov add more restrictions on bytes, let's cover it.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
block/io.c | 46 +++++++++++++++++++++++++++++++++++++++-------
1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/block/io.c b/block/io.c
index 4a057660f8..42e687a388 100644
--- a/block/io.c
+++ b/block/io.c
@@ -898,8 +898,14 @@ static bool coroutine_fn
bdrv_wait_serialising_requests(BdrvTrackedRequest *self
return waited;
}
-int bdrv_check_request(int64_t offset, int64_t bytes, Error **errp)
+static int bdrv_check_qiov_request(int64_t offset, int64_t bytes,
+ QEMUIOVector *qiov, size_t qiov_offset,
+ Error **errp)
{
+ /*
+ * Check generic offset/bytes correctness
+ */
+
if (offset < 0) {
error_setg(errp, "offset is negative: %" PRIi64, offset);
return -EIO;
@@ -929,12 +935,38 @@ int bdrv_check_request(int64_t offset, int64_t bytes,
Error **errp)
return -EIO;
}
+ if (!qiov) {
+ return 0;
+ }
+
+ /*
+ * Check qiov and qiov_offset
+ */
+
+ if (qiov_offset > qiov->size) {
+ error_setg(errp, "qiov_offset(%zu) overflow io vector size(%zu)",
+ qiov_offset, qiov->size);
+ return -EIO;
+ }
+
+ if (bytes > qiov->size - qiov_offset) {
+ error_setg(errp, "bytes(%" PRIi64 ") + qiov_offset(%zu) overflow io "
+ "vector size(%zu)", bytes, qiov_offset, qiov->size);
+ return -EIO;
+ }
+
return 0;
}
-static int bdrv_check_request32(int64_t offset, int64_t bytes)
+int bdrv_check_request(int64_t offset, int64_t bytes, Error **errp)
+{
+ return bdrv_check_qiov_request(offset, bytes, NULL, 0, errp);
+}
+
+static int bdrv_check_request32(int64_t offset, int64_t bytes,
+ QEMUIOVector *qiov, size_t qiov_offset)
{
- int ret = bdrv_check_request(offset, bytes, NULL);
+ int ret = bdrv_check_qiov_request(offset, bytes, qiov, qiov_offset, NULL);
if (ret < 0) {
return ret;
}
@@ -1708,7 +1740,7 @@ int coroutine_fn bdrv_co_preadv_part(BdrvChild *child,
return -ENOMEDIUM;
}
- ret = bdrv_check_request32(offset, bytes);
+ ret = bdrv_check_request32(offset, bytes, qiov, qiov_offset);
if (ret < 0) {
return ret;
}
@@ -2129,7 +2161,7 @@ int coroutine_fn bdrv_co_pwritev_part(BdrvChild *child,
return -ENOMEDIUM;
}
- ret = bdrv_check_request32(offset, bytes);
+ ret = bdrv_check_request32(offset, bytes, qiov, qiov_offset);
if (ret < 0) {
return ret;
}
@@ -3135,7 +3167,7 @@ static int coroutine_fn bdrv_co_copy_range_internal(
if (!dst || !dst->bs || !bdrv_is_inserted(dst->bs)) {
return -ENOMEDIUM;
}
- ret = bdrv_check_request32(dst_offset, bytes);
+ ret = bdrv_check_request32(dst_offset, bytes, NULL, 0);
if (ret) {
return ret;
}
@@ -3146,7 +3178,7 @@ static int coroutine_fn bdrv_co_copy_range_internal(
if (!src || !src->bs || !bdrv_is_inserted(src->bs)) {
return -ENOMEDIUM;
}
- ret = bdrv_check_request32(src_offset, bytes);
+ ret = bdrv_check_request32(src_offset, bytes, NULL, 0);
if (ret) {
return ret;
}
--
2.25.4
- [PATCH v4 00/16] 64bit block-layer: part I, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 01/16] block: refactor bdrv_check_request: add errp, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 02/16] util/iov: make qemu_iovec_init_extended() honest, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 05/16] block/io: bdrv_pad_request(): support qemu_iovec_init_extended failure, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 04/16] block/io: refactor bdrv_pad_request(): move bdrv_pad_request() up, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 07/16] block/io: improve bdrv_check_request: check qiov too,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v4 08/16] block: use int64_t as bytes type in tracked requests, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 03/16] block: fix theoretical overflow in bdrv_init_padding(), Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 06/16] block/throttle-groups: throttle_group_co_io_limits_intercept(): 64bit bytes, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 15/16] block/io: support int64_t bytes in read/write wrappers, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 16/16] block/io: use int64_t bytes in copy_range, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 11/16] block/io: support int64_t bytes in bdrv_aligned_pwritev(), Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 13/16] block/io: support int64_t bytes in bdrv_aligned_preadv(), Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 09/16] block/io: use int64_t bytes in driver wrappers, Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 14/16] block/io: support int64_t bytes in bdrv_co_p{read, write}v_part(), Vladimir Sementsov-Ogievskiy, 2020/12/11
- [PATCH v4 10/16] block/io: support int64_t bytes in bdrv_co_do_pwrite_zeroes(), Vladimir Sementsov-Ogievskiy, 2020/12/11