mirror of
https://github.com/torvalds/linux.git
synced 2026-07-29 02:31:27 +02:00
RISC-V: KVM: Fix NULL pointer dereference in AIA IMSIC functions
Fuzzer reported a NULL pointer dereference in
kvm_riscv_vcpu_aia_imsic_put() when a VCPU's imsic_state was NULL while
kvm_riscv_aia_initialized() returned true.
The global initialized flag is set per-VM in aia_init(), but imsic_state
is allocated per-VCPU in kvm_riscv_vcpu_aia_imsic_init(). If a VCPU is
created after aia_init() has already run, its imsic_state remains NULL
while the global flag is true. When this VCPU is preempted, kvm_sched_out()
calls kvm_arch_vcpu_put() -> kvm_riscv_vcpu_aia_put() ->
kvm_riscv_vcpu_aia_imsic_put() which dereferences NULL.
Add NULL pointer guards to kvm_riscv_vcpu_aia_imsic_put(), consistent with
the NULL checks already present in all other functions in the same file.
Also add a NULL guard to kvm_riscv_vcpu_aia_imsic_release() and
kvm_riscv_vcpu_aia_imsic_has_interrupt() for the same reason.
Fixes: 4cec89db80 ("RISC-V: KVM: Move HGEI[E|P] CSR access to IMSIC virtualization")
Signed-off-by: Jiakai Xu <jiakaiPeanut@gmail.com>
Signed-off-by: Jiakai Xu <xujiakai2025@iscas.ac.cn>
Assisted-by: YuanSheng:DeepSeek-V3.2
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260526031517.1166025-1-xujiakai2025@iscas.ac.cn
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
parent
ce31a1ee2a
commit
76ae7c7ee0
|
|
@ -683,6 +683,9 @@ bool kvm_riscv_vcpu_aia_imsic_has_interrupt(struct kvm_vcpu *vcpu)
|
|||
unsigned long flags;
|
||||
bool ret = false;
|
||||
|
||||
if (!imsic)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* The IMSIC SW-file directly injects interrupt via hvip so
|
||||
* only check for interrupt when IMSIC VS-file is being used.
|
||||
|
|
@ -722,6 +725,9 @@ void kvm_riscv_vcpu_aia_imsic_put(struct kvm_vcpu *vcpu)
|
|||
struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
|
||||
unsigned long flags;
|
||||
|
||||
if (!imsic)
|
||||
return;
|
||||
|
||||
if (!kvm_vcpu_is_blocking(vcpu))
|
||||
return;
|
||||
|
||||
|
|
@ -738,6 +744,9 @@ void kvm_riscv_vcpu_aia_imsic_release(struct kvm_vcpu *vcpu)
|
|||
int old_vsfile_hgei, old_vsfile_cpu;
|
||||
struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
|
||||
|
||||
if (!imsic)
|
||||
return;
|
||||
|
||||
/* Read and clear IMSIC VS-file details */
|
||||
write_lock_irqsave(&imsic->vsfile_lock, flags);
|
||||
old_vsfile_hgei = imsic->vsfile_hgei;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user