]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
virt: guest_memfd: fix reference leak on hwpoisoned page
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 11 Jun 2024 08:22:18 +0000 (04:22 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 20 Jun 2024 21:12:11 +0000 (17:12 -0400)
If kvm_gmem_get_pfn() detects an hwpoisoned page, it returns -EHWPOISON
but it does not put back the reference that kvm_gmem_get_folio() had
grabbed.  Add the forgotten folio_put().

Fixes: a7800aa80ea4 ("KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for guest-specific backing memory")
Cc: stable@vger.kernel.org
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
Reviewed-by: Isaku Yamahata <isaku.yamahata@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
virt/kvm/guest_memfd.c

index 0f4e0cf4f158b1a8298d24db5c341479aea1b342..747fe251e445bbe30034603632ae501909180a02 100644 (file)
@@ -510,8 +510,10 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
        }
 
        if (folio_test_hwpoison(folio)) {
+               folio_unlock(folio);
+               folio_put(folio);
                r = -EHWPOISON;
-               goto out_unlock;
+               goto out_fput;
        }
 
        page = folio_file_page(folio, index);
@@ -522,7 +524,6 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
 
        r = 0;
 
-out_unlock:
        folio_unlock(folio);
 out_fput:
        fput(file);