|
|
9ae3a8 |
From 6442a27eaebb5a42ef26a73f0efcf0166f70b235 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
From: Fam Zheng <famz@redhat.com>
|
|
|
9ae3a8 |
Date: Tue, 6 Aug 2013 15:44:52 +0800
|
|
|
9ae3a8 |
Subject: [PATCH 06/13] vmdk: check l2 table size when opening
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Message-id: <1377573001-27070-7-git-send-email-famz@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 53787
|
|
|
9ae3a8 |
O-Subject: [RHEL-7 qemu-kvm PATCH 06/13] vmdk: check l2 table size when opening
|
|
|
9ae3a8 |
Bugzilla: 995866
|
|
|
9ae3a8 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
header.num_gtes_per_gte determines size for L2 table. Check for too big
|
|
|
9ae3a8 |
value before using it. Limit to 512M entries (2GB per one L2 table).
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Fam Zheng <famz@redhat.com>
|
|
|
9ae3a8 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
9ae3a8 |
(cherry picked from commit f8ce04036e333aae480b1d06d969f6436652633d)
|
|
|
9ae3a8 |
Signed-off-by: Fam Zheng <famz@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
block/vmdk.c | 5 +++++
|
|
|
9ae3a8 |
tests/qemu-iotests/059 | 7 +++++++
|
|
|
9ae3a8 |
tests/qemu-iotests/059.out | 6 ++++++
|
|
|
9ae3a8 |
3 files changed, 18 insertions(+), 0 deletions(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/block/vmdk.c b/block/vmdk.c
|
|
|
9ae3a8 |
index 8f59697..b2a3fe2 100644
|
|
|
9ae3a8 |
--- a/block/vmdk.c
|
|
|
9ae3a8 |
+++ b/block/vmdk.c
|
|
|
9ae3a8 |
@@ -585,6 +585,11 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
|
|
|
9ae3a8 |
return -ENOTSUP;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+ if (le32_to_cpu(header.num_gtes_per_gte) > 512) {
|
|
|
9ae3a8 |
+ error_report("L2 table size too big");
|
|
|
9ae3a8 |
+ return -EINVAL;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
l1_entry_sectors = le32_to_cpu(header.num_gtes_per_gte)
|
|
|
9ae3a8 |
* le64_to_cpu(header.granularity);
|
|
|
9ae3a8 |
if (l1_entry_sectors == 0) {
|
|
|
9ae3a8 |
diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059
|
|
|
9ae3a8 |
index 9545e82..301eaca 100755
|
|
|
9ae3a8 |
--- a/tests/qemu-iotests/059
|
|
|
9ae3a8 |
+++ b/tests/qemu-iotests/059
|
|
|
9ae3a8 |
@@ -44,6 +44,7 @@ _supported_proto generic
|
|
|
9ae3a8 |
_supported_os Linux
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
granularity_offset=20
|
|
|
9ae3a8 |
+grain_table_size_offset=44
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
echo "=== Testing invalid granularity ==="
|
|
|
9ae3a8 |
echo
|
|
|
9ae3a8 |
@@ -51,6 +52,12 @@ _make_test_img 64M
|
|
|
9ae3a8 |
poke_file "$TEST_IMG" "$granularity_offset" "\xff\xff\xff\xff\xff\xff\xff\xff"
|
|
|
9ae3a8 |
{ $QEMU_IO -c "read 0 512" $TEST_IMG; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+echo "=== Testing too big L2 table size ==="
|
|
|
9ae3a8 |
+echo
|
|
|
9ae3a8 |
+_make_test_img 64M
|
|
|
9ae3a8 |
+poke_file "$TEST_IMG" "$grain_table_size_offset" "\xff\xff\xff\xff"
|
|
|
9ae3a8 |
+{ $QEMU_IO -c "read 0 512" $TEST_IMG; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
# success, all done
|
|
|
9ae3a8 |
echo "*** done"
|
|
|
9ae3a8 |
rm -f $seq.full
|
|
|
9ae3a8 |
diff --git a/tests/qemu-iotests/059.out b/tests/qemu-iotests/059.out
|
|
|
9ae3a8 |
index 380ca3d..583955f 100644
|
|
|
9ae3a8 |
--- a/tests/qemu-iotests/059.out
|
|
|
9ae3a8 |
+++ b/tests/qemu-iotests/059.out
|
|
|
9ae3a8 |
@@ -5,4 +5,10 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
|
|
9ae3a8 |
invalid granularity, image may be corrupt
|
|
|
9ae3a8 |
qemu-io: can't open device TEST_DIR/t.vmdk
|
|
|
9ae3a8 |
no file open, try 'help open'
|
|
|
9ae3a8 |
+=== Testing too big L2 table size ===
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
|
|
9ae3a8 |
+L2 table size too big
|
|
|
9ae3a8 |
+qemu-io: can't open device TEST_DIR/t.vmdk
|
|
|
9ae3a8 |
+no file open, try 'help open'
|
|
|
9ae3a8 |
*** done
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.7.1
|
|
|
9ae3a8 |
|