kvm: Ensure negative return value on kvm_init() error handling path
We need to ensure ret < 0 when going through the error path, or QEMU may try to run the half-initialized VM and crash. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									28fb26f19f
								
							
						
					
					
						commit
						0e1dac6c41
					
				@ -1374,7 +1374,7 @@ int kvm_init(MachineClass *mc)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
 | 
					    ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
 | 
				
			||||||
    if (ret < KVM_API_VERSION) {
 | 
					    if (ret < KVM_API_VERSION) {
 | 
				
			||||||
        if (ret > 0) {
 | 
					        if (ret >= 0) {
 | 
				
			||||||
            ret = -EINVAL;
 | 
					            ret = -EINVAL;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        fprintf(stderr, "kvm version too old\n");
 | 
					        fprintf(stderr, "kvm version too old\n");
 | 
				
			||||||
@ -1425,6 +1425,7 @@ int kvm_init(MachineClass *mc)
 | 
				
			|||||||
    if (mc->kvm_type) {
 | 
					    if (mc->kvm_type) {
 | 
				
			||||||
        type = mc->kvm_type(kvm_type);
 | 
					        type = mc->kvm_type(kvm_type);
 | 
				
			||||||
    } else if (kvm_type) {
 | 
					    } else if (kvm_type) {
 | 
				
			||||||
 | 
					        ret = -EINVAL;
 | 
				
			||||||
        fprintf(stderr, "Invalid argument kvm-type=%s\n", kvm_type);
 | 
					        fprintf(stderr, "Invalid argument kvm-type=%s\n", kvm_type);
 | 
				
			||||||
        goto err;
 | 
					        goto err;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1525,6 +1526,7 @@ int kvm_init(MachineClass *mc)
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err:
 | 
					err:
 | 
				
			||||||
 | 
					    assert(ret < 0);
 | 
				
			||||||
    if (s->vmfd >= 0) {
 | 
					    if (s->vmfd >= 0) {
 | 
				
			||||||
        close(s->vmfd);
 | 
					        close(s->vmfd);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user