virtio: validate config_len on load
Malformed input can have config_len in migration stream exceed the array size allocated on destination, the result will be heap overflow. To fix, that config_len matches on both sides. CVE-2014-0182 Reported-by: "Dr. David Alan Gilbert" <dgilbert@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> -- v2: use %ix and %zx to print config_len values Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
		
							parent
							
								
									98f93ddd84
								
							
						
					
					
						commit
						a890a2f913
					
				| 
						 | 
				
			
			@ -898,6 +898,7 @@ int virtio_set_features(VirtIODevice *vdev, uint32_t val)
 | 
			
		|||
int virtio_load(VirtIODevice *vdev, QEMUFile *f)
 | 
			
		||||
{
 | 
			
		||||
    int i, ret;
 | 
			
		||||
    int32_t config_len;
 | 
			
		||||
    uint32_t num;
 | 
			
		||||
    uint32_t features;
 | 
			
		||||
    uint32_t supported_features;
 | 
			
		||||
| 
						 | 
				
			
			@ -924,7 +925,12 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f)
 | 
			
		|||
                     features, supported_features);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    vdev->config_len = qemu_get_be32(f);
 | 
			
		||||
    config_len = qemu_get_be32(f);
 | 
			
		||||
    if (config_len != vdev->config_len) {
 | 
			
		||||
        error_report("Unexpected config length 0x%x. Expected 0x%zx",
 | 
			
		||||
                     config_len, vdev->config_len);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    qemu_get_buffer(f, vdev->config, vdev->config_len);
 | 
			
		||||
 | 
			
		||||
    num = qemu_get_be32(f);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue