diff options
| -rw-r--r-- | arch/x86/kvm/svm.c | 12 |
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; |
