 9e2e48ff31
			
		
	
	9e2e48ff31
	
	
	
		
			
			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>
		
			
				
	
	
		
			76 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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)) {
 |