KVM: x86: Fix the NULL pointer parameter in check_cr_write()
Routine check_cr_write() will trigger emulator_get_cpuid()->
kvm_cpuid() to get maxphyaddr, and NULL is passed as values
for ebx/ecx/edx. This is problematic because kvm_cpuid() will
dereference these pointers.
Fixes: d1cd3ce900
("KVM: MMU: check guest CR3 reserved bits based on its physical address width.")
Reported-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
This commit is contained in:
parent
95e2a3b3ef
commit
d6500149bc
|
@ -4102,10 +4102,12 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
|
||||||
ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
|
ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
|
||||||
if (efer & EFER_LMA) {
|
if (efer & EFER_LMA) {
|
||||||
u64 maxphyaddr;
|
u64 maxphyaddr;
|
||||||
u32 eax = 0x80000008;
|
u32 eax, ebx, ecx, edx;
|
||||||
|
|
||||||
if (ctxt->ops->get_cpuid(ctxt, &eax, NULL, NULL,
|
eax = 0x80000008;
|
||||||
NULL, false))
|
ecx = 0;
|
||||||
|
if (ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx,
|
||||||
|
&edx, false))
|
||||||
maxphyaddr = eax & 0xff;
|
maxphyaddr = eax & 0xff;
|
||||||
else
|
else
|
||||||
maxphyaddr = 36;
|
maxphyaddr = 36;
|
||||||
|
|
Loading…
Reference in New Issue