diff options
Diffstat (limited to 'arch/arm/kvm/arm.c')
| -rw-r--r-- | arch/arm/kvm/arm.c | 15 | 
1 files changed, 13 insertions, 2 deletions
| diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 37d216d814cd..ef1703b9587b 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -492,6 +492,11 @@ static void vcpu_pause(struct kvm_vcpu *vcpu)  	wait_event_interruptible(*wq, !vcpu->arch.pause);  } +static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) +{ +	return vcpu->arch.target >= 0; +} +  /**   * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code   * @vcpu:	The VCPU pointer @@ -508,8 +513,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)  	int ret;  	sigset_t sigsaved; -	/* Make sure they initialize the vcpu with KVM_ARM_VCPU_INIT */ -	if (unlikely(vcpu->arch.target < 0)) +	if (unlikely(!kvm_vcpu_initialized(vcpu)))  		return -ENOEXEC;  	ret = kvm_vcpu_first_run_init(vcpu); @@ -710,6 +714,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,  	case KVM_SET_ONE_REG:  	case KVM_GET_ONE_REG: {  		struct kvm_one_reg reg; + +		if (unlikely(!kvm_vcpu_initialized(vcpu))) +			return -ENOEXEC; +  		if (copy_from_user(®, argp, sizeof(reg)))  			return -EFAULT;  		if (ioctl == KVM_SET_ONE_REG) @@ -722,6 +730,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,  		struct kvm_reg_list reg_list;  		unsigned n; +		if (unlikely(!kvm_vcpu_initialized(vcpu))) +			return -ENOEXEC; +  		if (copy_from_user(®_list, user_list, sizeof(reg_list)))  			return -EFAULT;  		n = reg_list.n; |