aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch
diff options
context:
space:
mode:
authorBrett Mastbergen <bmastbergen@untangle.com>2019-10-02 10:28:16 -0400
committerHauke Mehrtens <hauke@hauke-m.de>2019-12-23 00:22:06 +0100
commit9e2e48ff31cea669cfc9c1476f49b815ea9ac1b1 (patch)
tree15532a58e45a1ba9470de39c566ad84678606941 /tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch
parentdc34c695c4faa46efc6e2367a2ba06a47caa4840 (diff)
downloadupstream-9e2e48ff31cea669cfc9c1476f49b815ea9ac1b1.tar.gz
upstream-9e2e48ff31cea669cfc9c1476f49b815ea9ac1b1.tar.bz2
upstream-9e2e48ff31cea669cfc9c1476f49b815ea9ac1b1.zip
tools: qemu: Add patches to support adapter_type and monolithicFlat
Its way more trouble to update this to a newer version of qemu than it is to backport the two additional features we need. Signed-off-by: Brett Mastbergen <bmastbergen@untangle.com>
Diffstat (limited to 'tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch')
-rw-r--r--tools/qemu/patches/0001-vmdk-fix-endianness-bugs.patch75
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)) {