From: Fam Zheng <famz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Fam Zheng <famz@redhat.com>
Subject: [Qemu-devel] [PATCH EMBARGOED 7/7] vmdk: check l1 size before opening image
Date: Fri, 2 Aug 2013 15:48:41 +0800 [thread overview]
Message-ID: <1375429721-15276-8-git-send-email-famz@redhat.com> (raw)
In-Reply-To: <1375429721-15276-1-git-send-email-famz@redhat.com>
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 <famz@redhat.com>
---
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 e28bfc8..2114ef6 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -596,6 +596,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 aa9eb57..e09e041 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.3.4
prev parent reply other threads:[~2013-08-02 21:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1375429721-15276-1-git-send-email-famz@redhat.com>
2013-08-02 7:48 ` [Qemu-devel] [PATCH EMBARGOED 1/7] vmdk: Make VMDK3Header QEMU_PACKED Fam Zheng
2013-08-02 7:48 ` [Qemu-devel] [PATCH EMBARGOED 2/7] vmdk: use unsigned values for on disk header fields Fam Zheng
2013-08-02 7:48 ` [Qemu-devel] [PATCH EMBARGOED 3/7] qemu-iotests: add empty test case for vmdk Fam Zheng
2013-08-02 7:48 ` [Qemu-devel] [PATCH EMBARGOED 4/7] vmdk: check granularity field in opening Fam Zheng
2013-08-02 7:48 ` [Qemu-devel] [PATCH EMBARGOED 5/7] vmdk: check cluster size in vmdk_open Fam Zheng
2013-08-02 7:48 ` [Qemu-devel] [PATCH EMBARGOED 6/7] vmdk: check l2 table size when opening Fam Zheng
2013-08-02 7:48 ` Fam Zheng [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1375429721-15276-8-git-send-email-famz@redhat.com \
--to=famz@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).