From: Steven Price <steven.pr...@arm.com>

If SVE is enabled then 'ret' can be assigned the return value of
kvm_vcpu_enable_sve() which may be 0 causing future "goto out" sites to
erroneously return 0 on failure rather than -EINVAL as expected.

Remove the initialisation of 'ret' and make setting the return value
explicit to avoid this situation in the future.

Fixes: 9a3cdf26e336 ("KVM: arm64/sve: Allow userspace to enable SVE for vcpus")
Cc: sta...@vger.kernel.org
Reported-by: James Morse <james.mo...@arm.com>
Signed-off-by: Steven Price <steven.pr...@arm.com>
Signed-off-by: Marc Zyngier <m...@kernel.org>
Link: https://lore.kernel.org/r/20200617105456.28245-1-steven.pr...@arm.com
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 arch/arm64/kvm/reset.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

--- a/arch/arm64/kvm/reset.c
+++ b/arch/arm64/kvm/reset.c
@@ -258,7 +258,7 @@ static int kvm_vcpu_enable_ptrauth(struc
 int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
 {
        const struct kvm_regs *cpu_reset;
-       int ret = -EINVAL;
+       int ret;
        bool loaded;
 
        /* Reset PMU outside of the non-preemptible section */
@@ -281,15 +281,19 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu
 
        if (test_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, vcpu->arch.features) ||
            test_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, vcpu->arch.features)) {
-               if (kvm_vcpu_enable_ptrauth(vcpu))
+               if (kvm_vcpu_enable_ptrauth(vcpu)) {
+                       ret = -EINVAL;
                        goto out;
+               }
        }
 
        switch (vcpu->arch.target) {
        default:
                if (test_bit(KVM_ARM_VCPU_EL1_32BIT, vcpu->arch.features)) {
-                       if (!cpu_has_32bit_el1())
+                       if (!cpu_has_32bit_el1()) {
+                               ret = -EINVAL;
                                goto out;
+                       }
                        cpu_reset = &default_regs_reset32;
                } else {
                        cpu_reset = &default_regs_reset;


Reply via email to