KVM: arm64: Fix page leak in user_mem_abort()

commit 5f9466b50c upstream.

The user_mem_abort() function acquires a page reference via
__kvm_faultin_pfn() early in its execution. However, the subsequent
checks for mismatched attributes between stage 1 and stage 2 mappings
would return an error code directly, bypassing the corresponding page
release.

Fix this by storing the error and releasing the unused page before
returning the error.

Fixes: 6d674e28f6 ("KVM: arm/arm64: Properly handle faulting of device mappings")
Fixes: 2a8dfab266 ("KVM: arm64: Block cacheable PFNMAP mapping")
Signed-off-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Fuad Tabba
2025-09-17 14:07:37 +01:00
committed by Greg Kroah-Hartman
parent 4f7af3d8a1
commit 05ec0186b4

View File

@@ -1673,7 +1673,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
* cache maintenance. * cache maintenance.
*/ */
if (!kvm_supports_cacheable_pfnmap()) if (!kvm_supports_cacheable_pfnmap())
return -EFAULT; ret = -EFAULT;
} else { } else {
/* /*
* If the page was identified as device early by looking at * If the page was identified as device early by looking at
@@ -1696,7 +1696,12 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
} }
if (exec_fault && s2_force_noncacheable) if (exec_fault && s2_force_noncacheable)
return -ENOEXEC; ret = -ENOEXEC;
if (ret) {
kvm_release_page_unused(page);
return ret;
}
/* /*
* Potentially reduce shadow S2 permissions to match the guest's own * Potentially reduce shadow S2 permissions to match the guest's own