Fix NULL dereference in gfn_to_hva_prot()
authorGleb Natapov <gleb@redhat.com>
Tue, 1 Oct 2013 16:58:36 +0000 (19:58 +0300)
committerGleb Natapov <gleb@redhat.com>
Thu, 3 Oct 2013 07:08:52 +0000 (10:08 +0300)
gfn_to_memslot() can return NULL or invalid slot. We need to check slot
validity before accessing it.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
virt/kvm/kvm_main.c

index 979bff485fb0b343cb5e1fd4328d7cf046dafef7..a9dd682cf5e3f5117de017156396337a8352914f 100644 (file)
@@ -1064,10 +1064,12 @@ EXPORT_SYMBOL_GPL(gfn_to_hva);
 unsigned long gfn_to_hva_prot(struct kvm *kvm, gfn_t gfn, bool *writable)
 {
        struct kvm_memory_slot *slot = gfn_to_memslot(kvm, gfn);
-       if (writable)
+       unsigned long hva = __gfn_to_hva_many(slot, gfn, NULL, false);
+
+       if (!kvm_is_error_hva(hva) && writable)
                *writable = !memslot_is_readonly(slot);
 
-       return __gfn_to_hva_many(gfn_to_memslot(kvm, gfn), gfn, NULL, false);
+       return hva;
 }
 
 static int kvm_read_hva(void *data, void __user *hva, int len)