[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v11 01/12] parallels: Out of image offset in BAT leads to image i
From: |
Alexander Ivanov |
Subject: |
[PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation |
Date: |
Mon, 24 Apr 2023 11:31:36 +0200 |
data_end field in BDRVParallelsState is set to the biggest offset present
in BAT. If this offset is outside of the image, any further write will
create the cluster at this offset and/or the image will be truncated to
this offset on close. This is definitely not correct.
Raise an error in parallels_open() if data_end points outside the image
and it is not a check (let the check to repaire the image). Set data_end
to the end of the cluster with the last correct offset.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/parallels.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/block/parallels.c b/block/parallels.c
index 013684801a..7e563062eb 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -733,6 +733,7 @@ static int parallels_open(BlockDriverState *bs, QDict
*options, int flags,
BDRVParallelsState *s = bs->opaque;
ParallelsHeader ph;
int ret, size, i;
+ int64_t file_nb_sectors;
QemuOpts *opts = NULL;
Error *local_err = NULL;
char *buf;
@@ -742,6 +743,11 @@ static int parallels_open(BlockDriverState *bs, QDict
*options, int flags,
return ret;
}
+ file_nb_sectors = bdrv_nb_sectors(bs->file->bs);
+ if (file_nb_sectors < 0) {
+ return -EINVAL;
+ }
+
ret = bdrv_pread(bs->file, 0, sizeof(ph), &ph, 0);
if (ret < 0) {
goto fail;
@@ -806,6 +812,17 @@ static int parallels_open(BlockDriverState *bs, QDict
*options, int flags,
for (i = 0; i < s->bat_size; i++) {
int64_t off = bat2sect(s, i);
+ if (off >= file_nb_sectors) {
+ if (flags & BDRV_O_CHECK) {
+ continue;
+ }
+ error_setg(errp, "parallels: Offset %" PRIi64 " in BAT[%d] entry "
+ "is larger than file size (%" PRIi64 ")",
+ off << BDRV_SECTOR_BITS, i,
+ file_nb_sectors << BDRV_SECTOR_BITS);
+ ret = -EINVAL;
+ goto fail;
+ }
if (off >= s->data_end) {
s->data_end = off + s->tracks;
}
--
2.34.1
- [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD, (continued)
- [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD, Alexander Ivanov, 2023/04/24
- [PATCH v11 07/12] parallels: Move check of cluster outside image to a separate function, Alexander Ivanov, 2023/04/24
- [PATCH v11 02/12] parallels: Fix high_off calculation in parallels_co_check(), Alexander Ivanov, 2023/04/24
- [PATCH v11 03/12] parallels: Fix image_end_offset and data_end after out-of-image check, Alexander Ivanov, 2023/04/24
- [PATCH v11 04/12] parallels: create parallels_set_bat_entry_helper() to assign BAT value, Alexander Ivanov, 2023/04/24
- [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation, Alexander Ivanov, 2023/04/24
- Re: [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug, Alexander Ivanov, 2023/04/24
- [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug, Alexander Ivanov, 2023/04/24
- [PATCH v11 02/12] parallels: Fix high_off calculation in parallels_co_check(), Alexander Ivanov, 2023/04/24
- [PATCH v11 07/12] parallels: Move check of cluster outside image to a separate function, Alexander Ivanov, 2023/04/24
- [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation,
Alexander Ivanov <=
- [PATCH v11 08/12] parallels: Fix statistics calculation, Alexander Ivanov, 2023/04/24
- [PATCH v11 05/12] parallels: Use generic infrastructure for BAT writing in parallels_co_check(), Alexander Ivanov, 2023/04/24
- [PATCH v11 03/12] parallels: Fix image_end_offset and data_end after out-of-image check, Alexander Ivanov, 2023/04/24
- [PATCH v11 06/12] parallels: Move check of unclean image to a separate function, Alexander Ivanov, 2023/04/24
- [PATCH v11 09/12] parallels: Move check of leaks to a separate function, Alexander Ivanov, 2023/04/24
- [PATCH v11 12/12] parallels: Incorrect condition in out-of-image check, Alexander Ivanov, 2023/04/24
- [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD, Alexander Ivanov, 2023/04/24
- [PATCH v11 10/12] parallels: Move statistic collection to a separate function, Alexander Ivanov, 2023/04/24
- [PATCH v11 04/12] parallels: create parallels_set_bat_entry_helper() to assign BAT value, Alexander Ivanov, 2023/04/24
- Re: [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug, Denis V. Lunev, 2023/04/26