block/vdi: Don't assume that blocks are larger than VdiHeader
Given that the block size is read from the header of the VDI file, a wide variety of sizes might be seen. Rather than re-using a block sized memory region when writing the VDI header, allocate an appropriately sized buffer. Signed-off-by: David Edmondson <david.edmondson@oracle.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: Max Reitz <mreitz@redhat.com> Message-id: 20210325112941.365238-3-pbonzini@redhat.com Message-Id: <20210309144015.557477-3-david.edmondson@oracle.com> Acked-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
				
					committed by
					
						 Stefan Hajnoczi
						Stefan Hajnoczi
					
				
			
			
				
	
			
			
			
						parent
						
							574b8304cf
						
					
				
				
					commit
					07ee2ab4fd
				
			
							
								
								
									
										10
									
								
								block/vdi.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								block/vdi.c
									
									
									
									
									
								
							| @@ -696,18 +696,20 @@ nonallocating_write: | ||||
|  | ||||
|     if (block) { | ||||
|         /* One or more new blocks were allocated. */ | ||||
|         VdiHeader *header = (VdiHeader *) block; | ||||
|         VdiHeader *header; | ||||
|         uint8_t *base; | ||||
|         uint64_t offset; | ||||
|         uint32_t n_sectors; | ||||
|  | ||||
|         g_free(block); | ||||
|         header = g_malloc(sizeof(*header)); | ||||
|  | ||||
|         logout("now writing modified header\n"); | ||||
|         assert(VDI_IS_ALLOCATED(bmap_first)); | ||||
|         *header = s->header; | ||||
|         vdi_header_to_le(header); | ||||
|         ret = bdrv_pwrite(bs->file, 0, block, sizeof(VdiHeader)); | ||||
|         g_free(block); | ||||
|         block = NULL; | ||||
|         ret = bdrv_pwrite(bs->file, 0, header, sizeof(*header)); | ||||
|         g_free(header); | ||||
|  | ||||
|         if (ret < 0) { | ||||
|             return ret; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user