[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/29] block/vpc.c: Detect too-large vpc file
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 07/29] block/vpc.c: Detect too-large vpc file |
Date: |
Wed, 3 Aug 2011 16:14:02 +0200 |
From: "Serge E. Hallyn" <address@hidden>
VHD files technically can be up to 2Tb, but virtual pc is limited
to 127G. Currently qemu-img refused to create vpc files > 127G,
but it is failing to return error when converting from a non-vpc
VHD file which is >127G. It returns success, but creates a truncated
converted image. Also, qemu-img info claims the vpc file is 127G
(and clean).
This patch detects a too-large vpc file and returns -EFBIG. Without
this patch,
=============================================================
address@hidden:~/qemu-fixed# qemu-img info /mnt/140g-dynamic.vhd
image: /mnt/140g-dynamic.vhd
file format: vpc
virtual size: 127G (136899993600 bytes)
disk size: 284K
address@hidden:~/qemu-fixed# qemu-img convert -f vpc -O raw
/mnt/140g-dynamic.vhd /mnt/y
address@hidden:~/qemu-fixed# echo $?
0
address@hidden:~/qemu-fixed# qemu-img info /mnt/y
image: /mnt/y
file format: raw
virtual size: 127G (136899993600 bytes)
disk size: 0
=============================================================
(The 140G image was truncated with no warning or error.)
With the patch, I get:
=============================================================
address@hidden:~/qemu-fixed# ./qemu-img info /mnt/140g-dynamic.vhd
qemu-img: Could not open '/mnt/140g-dynamic.vhd': File too large
address@hidden:~/qemu-fixed# ./qemu-img convert -f vpc -O raw
/mnt/140g-dynamic.vhd /mnt/y
qemu-img: Could not open '/mnt/140g-dynamic.vhd': File too large
qemu-img: Could not open '/mnt/140g-dynamic.vhd'
=============================================================
See https://bugs.launchpad.net/qemu/+bug/814222 for details.
Signed-off-by: Serge Hallyn <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/vpc.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/block/vpc.c b/block/vpc.c
index 56865da..fdd5236 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -156,6 +156,7 @@ static int vpc_open(BlockDriverState *bs, int flags)
struct vhd_dyndisk_header* dyndisk_header;
uint8_t buf[HEADER_SIZE];
uint32_t checksum;
+ int err = -1;
if (bdrv_pread(bs->file, 0, s->footer_buf, HEADER_SIZE) != HEADER_SIZE)
goto fail;
@@ -176,6 +177,11 @@ static int vpc_open(BlockDriverState *bs, int flags)
bs->total_sectors = (int64_t)
be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl;
+ if (bs->total_sectors >= 65535 * 16 * 255) {
+ err = -EFBIG;
+ goto fail;
+ }
+
if (bdrv_pread(bs->file, be64_to_cpu(footer->data_offset), buf,
HEADER_SIZE)
!= HEADER_SIZE)
goto fail;
@@ -222,7 +228,7 @@ static int vpc_open(BlockDriverState *bs, int flags)
return 0;
fail:
- return -1;
+ return err;
}
/*
--
1.7.6
- [Qemu-devel] [PULL 00/29] Block patches, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 01/29] blockdev: Make eject fail for non-removable drives even with -f, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 02/29] block: Reset device model callbacks on detach, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 04/29] block: Make BlockDriver method bdrv_set_locked() return void, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 03/29] block/raw-win32: Drop disabled code for removable host devices, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 05/29] block: Make BlockDriver method bdrv_eject() return void, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 06/29] block: Don't let locked flag prevent medium load, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 07/29] block/vpc.c: Detect too-large vpc file,
Kevin Wolf <=
- [Qemu-devel] [PATCH 09/29] scsi: Remove references to SET_WINDOW, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 12/29] scsi-disk: Remove 'drive_kind', Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 11/29] scsi: Sanitize command definitions, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 08/29] scsi-disk: Codingstyle fixes, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 13/29] block: Removed unused function bdrv_write_sync, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 14/29] raw-posix: Typo fix, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 10/29] scsi: Remove REZERO_UNIT emulation, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 15/29] raw-posix: Always check paio_init result, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 18/29] coroutine: add test-coroutine automated tests, Kevin Wolf, 2011/08/03
- [Qemu-devel] [PATCH 16/29] coroutine: introduce coroutines, Kevin Wolf, 2011/08/03