block/vdi: Don't take address of fields in packed structs
Taking the address of a field in a packed struct is a bad idea, because it might not be actually aligned enough for that pointer type (and thus cause a crash on dereference on some host architectures). Newer versions of clang warn about this. Avoid the bug by not using the "modify in place" byte swapping functions. There are a few places where the in-place swap function is used on something other than a packed struct field; we convert those anyway, for consistency. Patch produced with scripts/coccinelle/inplace-byteswaps.cocci. There are other places where we take the address of a packed member in this file for other purposes than passing it to a byteswap function (all the calls to qemu_uuid_*()); we leave those for now. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									1229e46d3c
								
							
						
					
					
						commit
						091901841a
					
				
							
								
								
									
										64
									
								
								block/vdi.c
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								block/vdi.c
									
									
									
									
									
								
							@ -187,22 +187,22 @@ typedef struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void vdi_header_to_cpu(VdiHeader *header)
 | 
					static void vdi_header_to_cpu(VdiHeader *header)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    le32_to_cpus(&header->signature);
 | 
					    header->signature = le32_to_cpu(header->signature);
 | 
				
			||||||
    le32_to_cpus(&header->version);
 | 
					    header->version = le32_to_cpu(header->version);
 | 
				
			||||||
    le32_to_cpus(&header->header_size);
 | 
					    header->header_size = le32_to_cpu(header->header_size);
 | 
				
			||||||
    le32_to_cpus(&header->image_type);
 | 
					    header->image_type = le32_to_cpu(header->image_type);
 | 
				
			||||||
    le32_to_cpus(&header->image_flags);
 | 
					    header->image_flags = le32_to_cpu(header->image_flags);
 | 
				
			||||||
    le32_to_cpus(&header->offset_bmap);
 | 
					    header->offset_bmap = le32_to_cpu(header->offset_bmap);
 | 
				
			||||||
    le32_to_cpus(&header->offset_data);
 | 
					    header->offset_data = le32_to_cpu(header->offset_data);
 | 
				
			||||||
    le32_to_cpus(&header->cylinders);
 | 
					    header->cylinders = le32_to_cpu(header->cylinders);
 | 
				
			||||||
    le32_to_cpus(&header->heads);
 | 
					    header->heads = le32_to_cpu(header->heads);
 | 
				
			||||||
    le32_to_cpus(&header->sectors);
 | 
					    header->sectors = le32_to_cpu(header->sectors);
 | 
				
			||||||
    le32_to_cpus(&header->sector_size);
 | 
					    header->sector_size = le32_to_cpu(header->sector_size);
 | 
				
			||||||
    le64_to_cpus(&header->disk_size);
 | 
					    header->disk_size = le64_to_cpu(header->disk_size);
 | 
				
			||||||
    le32_to_cpus(&header->block_size);
 | 
					    header->block_size = le32_to_cpu(header->block_size);
 | 
				
			||||||
    le32_to_cpus(&header->block_extra);
 | 
					    header->block_extra = le32_to_cpu(header->block_extra);
 | 
				
			||||||
    le32_to_cpus(&header->blocks_in_image);
 | 
					    header->blocks_in_image = le32_to_cpu(header->blocks_in_image);
 | 
				
			||||||
    le32_to_cpus(&header->blocks_allocated);
 | 
					    header->blocks_allocated = le32_to_cpu(header->blocks_allocated);
 | 
				
			||||||
    qemu_uuid_bswap(&header->uuid_image);
 | 
					    qemu_uuid_bswap(&header->uuid_image);
 | 
				
			||||||
    qemu_uuid_bswap(&header->uuid_last_snap);
 | 
					    qemu_uuid_bswap(&header->uuid_last_snap);
 | 
				
			||||||
    qemu_uuid_bswap(&header->uuid_link);
 | 
					    qemu_uuid_bswap(&header->uuid_link);
 | 
				
			||||||
@ -211,22 +211,22 @@ static void vdi_header_to_cpu(VdiHeader *header)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void vdi_header_to_le(VdiHeader *header)
 | 
					static void vdi_header_to_le(VdiHeader *header)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    cpu_to_le32s(&header->signature);
 | 
					    header->signature = cpu_to_le32(header->signature);
 | 
				
			||||||
    cpu_to_le32s(&header->version);
 | 
					    header->version = cpu_to_le32(header->version);
 | 
				
			||||||
    cpu_to_le32s(&header->header_size);
 | 
					    header->header_size = cpu_to_le32(header->header_size);
 | 
				
			||||||
    cpu_to_le32s(&header->image_type);
 | 
					    header->image_type = cpu_to_le32(header->image_type);
 | 
				
			||||||
    cpu_to_le32s(&header->image_flags);
 | 
					    header->image_flags = cpu_to_le32(header->image_flags);
 | 
				
			||||||
    cpu_to_le32s(&header->offset_bmap);
 | 
					    header->offset_bmap = cpu_to_le32(header->offset_bmap);
 | 
				
			||||||
    cpu_to_le32s(&header->offset_data);
 | 
					    header->offset_data = cpu_to_le32(header->offset_data);
 | 
				
			||||||
    cpu_to_le32s(&header->cylinders);
 | 
					    header->cylinders = cpu_to_le32(header->cylinders);
 | 
				
			||||||
    cpu_to_le32s(&header->heads);
 | 
					    header->heads = cpu_to_le32(header->heads);
 | 
				
			||||||
    cpu_to_le32s(&header->sectors);
 | 
					    header->sectors = cpu_to_le32(header->sectors);
 | 
				
			||||||
    cpu_to_le32s(&header->sector_size);
 | 
					    header->sector_size = cpu_to_le32(header->sector_size);
 | 
				
			||||||
    cpu_to_le64s(&header->disk_size);
 | 
					    header->disk_size = cpu_to_le64(header->disk_size);
 | 
				
			||||||
    cpu_to_le32s(&header->block_size);
 | 
					    header->block_size = cpu_to_le32(header->block_size);
 | 
				
			||||||
    cpu_to_le32s(&header->block_extra);
 | 
					    header->block_extra = cpu_to_le32(header->block_extra);
 | 
				
			||||||
    cpu_to_le32s(&header->blocks_in_image);
 | 
					    header->blocks_in_image = cpu_to_le32(header->blocks_in_image);
 | 
				
			||||||
    cpu_to_le32s(&header->blocks_allocated);
 | 
					    header->blocks_allocated = cpu_to_le32(header->blocks_allocated);
 | 
				
			||||||
    qemu_uuid_bswap(&header->uuid_image);
 | 
					    qemu_uuid_bswap(&header->uuid_image);
 | 
				
			||||||
    qemu_uuid_bswap(&header->uuid_last_snap);
 | 
					    qemu_uuid_bswap(&header->uuid_last_snap);
 | 
				
			||||||
    qemu_uuid_bswap(&header->uuid_link);
 | 
					    qemu_uuid_bswap(&header->uuid_link);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user