Skip to content

Commit 368340a

Browse files
sean-jcbonzini
authored andcommitted
KVM: SVM: Invert user pointer casting in SEV {en,de}crypt helpers
Invert the user pointer params for SEV's helpers for encrypting and decrypting guest memory so that they take a pointer and cast to an unsigned long as necessary, as opposed to doing the opposite. Tagging a non-pointer as __user is confusing and weird since a cast of some form needs to occur to actually access the user data. This also fixes Sparse warnings triggered by directly consuming the unsigned longs, which are "noderef" due to the __user tag. Cc: Brijesh Singh <[email protected]> Cc: Tom Lendacky <[email protected]> Cc: Ashish Kalra <[email protected]> Signed-off-by: Sean Christopherson <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 258785e commit 368340a

File tree

1 file changed

+11
-13
lines changed

1 file changed

+11
-13
lines changed

arch/x86/kvm/svm/sev.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ static int __sev_dbg_decrypt(struct kvm *kvm, unsigned long src_paddr,
763763
}
764764

765765
static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr,
766-
unsigned long __user dst_uaddr,
766+
void __user *dst_uaddr,
767767
unsigned long dst_paddr,
768768
int size, int *err)
769769
{
@@ -787,8 +787,7 @@ static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr,
787787

788788
if (tpage) {
789789
offset = paddr & 15;
790-
if (copy_to_user((void __user *)(uintptr_t)dst_uaddr,
791-
page_address(tpage) + offset, size))
790+
if (copy_to_user(dst_uaddr, page_address(tpage) + offset, size))
792791
ret = -EFAULT;
793792
}
794793

@@ -800,23 +799,22 @@ static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr,
800799
}
801800

802801
static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
803-
unsigned long __user vaddr,
802+
void __user *vaddr,
804803
unsigned long dst_paddr,
805-
unsigned long __user dst_vaddr,
804+
void __user *dst_vaddr,
806805
int size, int *error)
807806
{
808807
struct page *src_tpage = NULL;
809808
struct page *dst_tpage = NULL;
810809
int ret, len = size;
811810

812811
/* If source buffer is not aligned then use an intermediate buffer */
813-
if (!IS_ALIGNED(vaddr, 16)) {
812+
if (!IS_ALIGNED((unsigned long)vaddr, 16)) {
814813
src_tpage = alloc_page(GFP_KERNEL);
815814
if (!src_tpage)
816815
return -ENOMEM;
817816

818-
if (copy_from_user(page_address(src_tpage),
819-
(void __user *)(uintptr_t)vaddr, size)) {
817+
if (copy_from_user(page_address(src_tpage), vaddr, size)) {
820818
__free_page(src_tpage);
821819
return -EFAULT;
822820
}
@@ -830,7 +828,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
830828
* - copy the source buffer in an intermediate buffer
831829
* - use the intermediate buffer as source buffer
832830
*/
833-
if (!IS_ALIGNED(dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
831+
if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
834832
int dst_offset;
835833

836834
dst_tpage = alloc_page(GFP_KERNEL);
@@ -855,7 +853,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
855853
page_address(src_tpage), size);
856854
else {
857855
if (copy_from_user(page_address(dst_tpage) + dst_offset,
858-
(void __user *)(uintptr_t)vaddr, size)) {
856+
vaddr, size)) {
859857
ret = -EFAULT;
860858
goto e_free;
861859
}
@@ -935,15 +933,15 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec)
935933
if (dec)
936934
ret = __sev_dbg_decrypt_user(kvm,
937935
__sme_page_pa(src_p[0]) + s_off,
938-
dst_vaddr,
936+
(void __user *)dst_vaddr,
939937
__sme_page_pa(dst_p[0]) + d_off,
940938
len, &argp->error);
941939
else
942940
ret = __sev_dbg_encrypt_user(kvm,
943941
__sme_page_pa(src_p[0]) + s_off,
944-
vaddr,
942+
(void __user *)vaddr,
945943
__sme_page_pa(dst_p[0]) + d_off,
946-
dst_vaddr,
944+
(void __user *)dst_vaddr,
947945
len, &argp->error);
948946

949947
sev_unpin_memory(kvm, src_p, n);

0 commit comments

Comments
 (0)