diff options
Diffstat (limited to 'tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch')
-rw-r--r-- | tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch b/tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch new file mode 100644 index 0000000000..7e1abb49bf --- /dev/null +++ b/tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch @@ -0,0 +1,75 @@ +From 6afca0fc5430db0300fe53f2b9cd7d071a3925bb Mon Sep 17 00:00:00 2001 +From: Alexander Graf <agraf@suse.de> +Date: Wed, 25 May 2011 00:46:55 +0200 +Subject: [PATCH 01/12] vmdk: fix endianness bugs + +The vmdk code is sloppy when handling the header descriptor during +creation of an image. Fix all header accesses in the create path to +either store native endianness or convert it when appropriate. + +Reported-by: Yury Tsarev <ytsarev@novell.com> +Signed-off-by: Alexander Graf <agraf@suse.de> +Signed-off-by: Kevin Wolf <kwolf@redhat.com> +--- + block/vmdk.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +--- a/block/vmdk.c ++++ b/block/vmdk.c +@@ -716,11 +716,11 @@ static int vmdk_create(const char *filen + return -errno; + magic = cpu_to_be32(VMDK4_MAGIC); + memset(&header, 0, sizeof(header)); +- header.version = cpu_to_le32(1); +- header.flags = cpu_to_le32(3); /* ?? */ +- header.capacity = cpu_to_le64(total_size); +- header.granularity = cpu_to_le64(128); +- header.num_gtes_per_gte = cpu_to_le32(512); ++ header.version = 1; ++ header.flags = 3; /* ?? */ ++ header.capacity = total_size; ++ header.granularity = 128; ++ header.num_gtes_per_gte = 512; + + grains = (total_size + header.granularity - 1) / header.granularity; + gt_size = ((header.num_gtes_per_gte * sizeof(uint32_t)) + 511) >> 9; +@@ -736,6 +736,12 @@ static int vmdk_create(const char *filen + header.granularity - 1) / header.granularity) * + header.granularity; + ++ /* swap endianness for all header fields */ ++ header.version = cpu_to_le32(header.version); ++ header.flags = cpu_to_le32(header.flags); ++ header.capacity = cpu_to_le64(header.capacity); ++ header.granularity = cpu_to_le64(header.granularity); ++ header.num_gtes_per_gte = cpu_to_le32(header.num_gtes_per_gte); + header.desc_offset = cpu_to_le64(header.desc_offset); + header.desc_size = cpu_to_le64(header.desc_size); + header.rgd_offset = cpu_to_le64(header.rgd_offset); +@@ -759,7 +765,7 @@ static int vmdk_create(const char *filen + goto exit; + } + +- ret = ftruncate(fd, header.grain_offset << 9); ++ ret = ftruncate(fd, le64_to_cpu(header.grain_offset) << 9); + if (ret < 0) { + ret = -errno; + goto exit; +@@ -767,7 +773,7 @@ static int vmdk_create(const char *filen + + /* write grain directory */ + lseek(fd, le64_to_cpu(header.rgd_offset) << 9, SEEK_SET); +- for (i = 0, tmp = header.rgd_offset + gd_size; ++ for (i = 0, tmp = le64_to_cpu(header.rgd_offset) + gd_size; + i < gt_count; i++, tmp += gt_size) { + ret = qemu_write_full(fd, &tmp, sizeof(tmp)); + if (ret != sizeof(tmp)) { +@@ -778,7 +784,7 @@ static int vmdk_create(const char *filen + + /* write backup grain directory */ + lseek(fd, le64_to_cpu(header.gd_offset) << 9, SEEK_SET); +- for (i = 0, tmp = header.gd_offset + gd_size; ++ for (i = 0, tmp = le64_to_cpu(header.gd_offset) + gd_size; + i < gt_count; i++, tmp += gt_size) { + ret = qemu_write_full(fd, &tmp, sizeof(tmp)); + if (ret != sizeof(tmp)) { |