aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/svm.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 947c35a1e545..e0a791c3d4fc 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -6799,7 +6799,8 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec)
6799 struct page **src_p, **dst_p; 6799 struct page **src_p, **dst_p;
6800 struct kvm_sev_dbg debug; 6800 struct kvm_sev_dbg debug;
6801 unsigned long n; 6801 unsigned long n;
6802 int ret, size; 6802 unsigned int size;
6803 int ret;
6803 6804
6804 if (!sev_guest(kvm)) 6805 if (!sev_guest(kvm))
6805 return -ENOTTY; 6806 return -ENOTTY;
@@ -6807,6 +6808,11 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec)
6807 if (copy_from_user(&debug, (void __user *)(uintptr_t)argp->data, sizeof(debug))) 6808 if (copy_from_user(&debug, (void __user *)(uintptr_t)argp->data, sizeof(debug)))
6808 return -EFAULT; 6809 return -EFAULT;
6809 6810
6811 if (!debug.len || debug.src_uaddr + debug.len < debug.src_uaddr)
6812 return -EINVAL;
6813 if (!debug.dst_uaddr)
6814 return -EINVAL;
6815
6810 vaddr = debug.src_uaddr; 6816 vaddr = debug.src_uaddr;
6811 size = debug.len; 6817 size = debug.len;
6812 vaddr_end = vaddr + size; 6818 vaddr_end = vaddr + size;
@@ -6857,8 +6863,8 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec)
6857 dst_vaddr, 6863 dst_vaddr,
6858 len, &argp->error); 6864 len, &argp->error);
6859 6865
6860 sev_unpin_memory(kvm, src_p, 1); 6866 sev_unpin_memory(kvm, src_p, n);
6861 sev_unpin_memory(kvm, dst_p, 1); 6867 sev_unpin_memory(kvm, dst_p, n);
6862 6868
6863 if (ret) 6869 if (ret)
6864 goto err; 6870 goto err;