diff options
author | Fam Zheng <famz@redhat.com> | 2013-08-06 15:44:53 +0800 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2013-08-06 15:27:32 +0200 |
commit | 2c43e43c8cec130fff95ef720a860e91efb36685 (patch) | |
tree | 03cce2301a24e14038d02ec8685e7eecb051dcfe /block | |
parent | f8ce04036e333aae480b1d06d969f6436652633d (diff) |
vmdk: check l1 size before opening image
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>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/vmdk.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/block/vmdk.c b/block/vmdk.c index 53020ef3e3..955125a7f4 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; } |