The bug is here:
        if (!p)
                return ret;

The list iterator value 'p' will *always* be set and non-NULL by
list_for_each_entry(), so it is incorrect to assume that the iterator
value will be NULL if the list is empty or no element is found.

To fix the bug, Use a new value 'iter' as the list iterator, while use
the old value 'p' as a dedicated variable to point to the found element.

Cc: sta...@vger.kernel.org
Fixes: dfaa973ae9605 ("KVM: PPC: Book3S HV: In H_SVM_INIT_DONE, migrate 
remaining normal-GFNs to secure-GFNs")
Signed-off-by: Xiaomeng Tong <xiam0nd.t...@gmail.com>
---
 arch/powerpc/kvm/book3s_hv_uvmem.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_hv_uvmem.c 
b/arch/powerpc/kvm/book3s_hv_uvmem.c
index e414ca44839f..0cb20ee6a632 100644
--- a/arch/powerpc/kvm/book3s_hv_uvmem.c
+++ b/arch/powerpc/kvm/book3s_hv_uvmem.c
@@ -360,13 +360,15 @@ static bool kvmppc_gfn_is_uvmem_pfn(unsigned long gfn, 
struct kvm *kvm,
 static bool kvmppc_next_nontransitioned_gfn(const struct kvm_memory_slot 
*memslot,
                struct kvm *kvm, unsigned long *gfn)
 {
-       struct kvmppc_uvmem_slot *p;
+       struct kvmppc_uvmem_slot *p = NULL, *iter;
        bool ret = false;
        unsigned long i;
 
-       list_for_each_entry(p, &kvm->arch.uvmem_pfns, list)
-               if (*gfn >= p->base_pfn && *gfn < p->base_pfn + p->nr_pfns)
+       list_for_each_entry(iter, &kvm->arch.uvmem_pfns, list)
+               if (*gfn >= iter->base_pfn && *gfn < iter->base_pfn + 
iter->nr_pfns) {
+                       p = iter;
                        break;
+               }
        if (!p)
                return ret;
        /*
-- 
2.17.1

Reply via email to