[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 12/14] vmdk: check l1 size before opening image
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 12/14] vmdk: check l1 size before opening image |
Date: |
Tue, 6 Aug 2013 16:39:48 +0200 |
From: Fam Zheng <address@hidden>
L1 table size is calculated from capacity, granularity and l2 table
size. If capacity is too big or later two are too small, the L1 table
will be too big to allocate in memory. Limit it to a reasonable range.
Signed-off-by: Fam Zheng <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/vmdk.c | 8 ++++++++
tests/qemu-iotests/059 | 8 ++++++++
tests/qemu-iotests/059.out | 6 ++++++
3 files changed, 22 insertions(+)
diff --git a/block/vmdk.c b/block/vmdk.c
index 53020ef..955125a 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -597,6 +597,14 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
}
l1_size = (le64_to_cpu(header.capacity) + l1_entry_sectors - 1)
/ l1_entry_sectors;
+ if (l1_size > 512 * 1024 * 1024) {
+ /* although with big capacity and small l1_entry_sectors, we can get a
+ * big l1_size, we don't want unbounded value to allocate the table.
+ * Limit it to 512M, which is 16PB for default cluster and L2 table
+ * size */
+ error_report("L1 size too big");
+ return -EFBIG;
+ }
if (le32_to_cpu(header.flags) & VMDK4_FLAG_RGD) {
l1_backup_offset = le64_to_cpu(header.rgd_offset) << 9;
}
diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059
index 301eaca..b03429d 100755
--- a/tests/qemu-iotests/059
+++ b/tests/qemu-iotests/059
@@ -43,6 +43,7 @@ _supported_fmt vmdk
_supported_proto generic
_supported_os Linux
+capacity_offset=16
granularity_offset=20
grain_table_size_offset=44
@@ -58,6 +59,13 @@ _make_test_img 64M
poke_file "$TEST_IMG" "$grain_table_size_offset" "\xff\xff\xff\xff"
{ $QEMU_IO -c "read 0 512" $TEST_IMG; } 2>&1 | _filter_qemu_io |
_filter_testdir
+echo "=== Testing too big L1 table size ==="
+echo
+_make_test_img 64M
+poke_file "$TEST_IMG" "$capacity_offset" "\xff\xff\xff\xff"
+poke_file "$TEST_IMG" "$grain_table_size_offset" "\x01\x00\x00\x00"
+{ $QEMU_IO -c "read 0 512" $TEST_IMG; } 2>&1 | _filter_qemu_io |
_filter_testdir
+
# success, all done
echo "*** done"
rm -f $seq.full
diff --git a/tests/qemu-iotests/059.out b/tests/qemu-iotests/059.out
index 583955f..9e715e5 100644
--- a/tests/qemu-iotests/059.out
+++ b/tests/qemu-iotests/059.out
@@ -11,4 +11,10 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
L2 table size too big
qemu-io: can't open device TEST_DIR/t.vmdk
no file open, try 'help open'
+=== Testing too big L1 table size ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+L1 size too big
+qemu-io: can't open device TEST_DIR/t.vmdk
+no file open, try 'help open'
*** done
--
1.8.1.4
- [Qemu-devel] [PULL 00/14] Block fixes for 1.6, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 02/14] ignore SIGPIPE in qemu-img and qemu-io, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 03/14] iov: handle EOF in iov_send_recv, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 01/14] qemu-img: Error out for excess arguments, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 05/14] sheepdog: add missing .bdrv_has_zero_init, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 04/14] qemu-iotests: filter QEMU version in monitor banner, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 09/14] qemu-iotests: add empty test case for vmdk, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 07/14] vmdk: use unsigned values for on disk header fields, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 08/14] qemu-iotests: add poke_file utility function, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 11/14] vmdk: check l2 table size when opening, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 12/14] vmdk: check l1 size before opening image,
Kevin Wolf <=
- [Qemu-devel] [PULL 14/14] vmdk: rename num_gtes_per_gte to num_gtes_per_gt, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 13/14] vmdk: use heap allocation for whole_grain, Kevin Wolf, 2013/08/06
- [Qemu-devel] [PULL 10/14] vmdk: check granularity field in opening, Kevin Wolf, 2013/08/06