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