* [PATCH] hw/intc/loongarch_pch_pic: Validate htmsi_vector before indexing parent_irq
@ 2026-08-04 7:34 Bin Guo
2026-08-05 3:00 ` Bibo Mao
0 siblings, 1 reply; 2+ messages in thread
From: Bin Guo @ 2026-08-04 7:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Song Gao, Bibo Mao, Xianglai Li, Jiaxun Yang, qemu-stable
pch_pic_update_irq() used the guest-writable htmsi_vector[irq] value as an
index into parent_irq[] without checking bounds. A value >= irq_num (64 in
the array, but only 32 are used by the virt machine) causes an out-of-bounds
read and a guest-triggerable QEMU crash.
Validate the vector before calling qemu_set_irq() in both the raise and lower
paths and log a guest error if it is out of range.
Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4114
Cc: qemu-stable@nongnu.org
Signed-off-by: Bin Guo <guobin@linux.alibaba.com>
---
hw/intc/loongarch_pch_pic.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/hw/intc/loongarch_pch_pic.c b/hw/intc/loongarch_pch_pic.c
index 82e16be391..e87c7497c1 100644
--- a/hw/intc/loongarch_pch_pic.c
+++ b/hw/intc/loongarch_pch_pic.c
@@ -19,13 +19,21 @@ static void pch_pic_update_irq(LoongArchPICCommonState *s, uint64_t mask,
{
uint64_t val;
int irq;
+ uint8_t vector;
if (level) {
val = mask & s->intirr & ~s->int_mask;
if (val) {
irq = ctz64(val);
+ vector = s->htmsi_vector[irq];
+ if (vector >= s->irq_num) {
+ qemu_log_mask(LOG_GUEST_ERROR,
+ "%s: htmsi_vector[%d]=%u out of range\n",
+ __func__, irq, vector);
+ return;
+ }
s->intisr |= MAKE_64BIT_MASK(irq, 1);
- qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 1);
+ qemu_set_irq(s->parent_irq[vector], 1);
}
} else {
/*
@@ -35,8 +43,15 @@ static void pch_pic_update_irq(LoongArchPICCommonState *s, uint64_t mask,
val = mask & s->intisr & ~s->intirr;
if (val) {
irq = ctz64(val);
+ vector = s->htmsi_vector[irq];
+ if (vector >= s->irq_num) {
+ qemu_log_mask(LOG_GUEST_ERROR,
+ "%s: htmsi_vector[%d]=%u out of range\n",
+ __func__, irq, vector);
+ return;
+ }
s->intisr &= ~MAKE_64BIT_MASK(irq, 1);
- qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 0);
+ qemu_set_irq(s->parent_irq[vector], 0);
}
}
}
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] hw/intc/loongarch_pch_pic: Validate htmsi_vector before indexing parent_irq
2026-08-04 7:34 [PATCH] hw/intc/loongarch_pch_pic: Validate htmsi_vector before indexing parent_irq Bin Guo
@ 2026-08-05 3:00 ` Bibo Mao
0 siblings, 0 replies; 2+ messages in thread
From: Bibo Mao @ 2026-08-05 3:00 UTC (permalink / raw)
To: Bin Guo, qemu-devel; +Cc: Song Gao, Xianglai Li, Jiaxun Yang, qemu-stable
On 2026/8/4 下午3:34, Bin Guo wrote:
> pch_pic_update_irq() used the guest-writable htmsi_vector[irq] value as an
> index into parent_irq[] without checking bounds. A value >= irq_num (64 in
> the array, but only 32 are used by the virt machine) causes an out-of-bounds
> read and a guest-triggerable QEMU crash.
>
> Validate the vector before calling qemu_set_irq() in both the raise and lower
> paths and log a guest error if it is out of range.
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4114
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Bin Guo <guobin@linux.alibaba.com>
> ---
> hw/intc/loongarch_pch_pic.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/hw/intc/loongarch_pch_pic.c b/hw/intc/loongarch_pch_pic.c
> index 82e16be391..e87c7497c1 100644
> --- a/hw/intc/loongarch_pch_pic.c
> +++ b/hw/intc/loongarch_pch_pic.c
> @@ -19,13 +19,21 @@ static void pch_pic_update_irq(LoongArchPICCommonState *s, uint64_t mask,
> {
> uint64_t val;
> int irq;
> + uint8_t vector;
>
> if (level) {
> val = mask & s->intirr & ~s->int_mask;
> if (val) {
> irq = ctz64(val);
> + vector = s->htmsi_vector[irq];
> + if (vector >= s->irq_num) {
> + qemu_log_mask(LOG_GUEST_ERROR,
> + "%s: htmsi_vector[%d]=%u out of range\n",
> + __func__, irq, vector);
> + return;
> + }
> s->intisr |= MAKE_64BIT_MASK(irq, 1);
> - qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 1);
> + qemu_set_irq(s->parent_irq[vector], 1);
> }
> } else {
> /*
> @@ -35,8 +43,15 @@ static void pch_pic_update_irq(LoongArchPICCommonState *s, uint64_t mask,
> val = mask & s->intisr & ~s->intirr;
> if (val) {
> irq = ctz64(val);
> + vector = s->htmsi_vector[irq];
> + if (vector >= s->irq_num) {
> + qemu_log_mask(LOG_GUEST_ERROR,
> + "%s: htmsi_vector[%d]=%u out of range\n",
> + __func__, irq, vector);
> + return;
> + }
> s->intisr &= ~MAKE_64BIT_MASK(irq, 1);
> - qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 0);
> + qemu_set_irq(s->parent_irq[vector], 0);
> }
> }
> }
>
Hi Bin,
Thanks for solving this problem.
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
Regards
Bibo Mao
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-08-05 3:01 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-04 7:34 [PATCH] hw/intc/loongarch_pch_pic: Validate htmsi_vector before indexing parent_irq Bin Guo
2026-08-05 3:00 ` Bibo Mao
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.