Skip to content

Commit 102f5a0

Browse files
yonghuahwenlingz
authored andcommitted
hv: fix potential buffer overflow in vioapic.c
@vioapic_set_pinstate() & vioapic_need_intr(), add checking input value range for 'pin'. Tracked-On: #1479 Signed-off-by: Yonghua Huang <yonghua.huang@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent eb328d7 commit 102f5a0

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

hypervisor/dm/vioapic.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,13 @@ static void
8585
vioapic_set_pinstate(struct acrn_vioapic *vioapic, uint16_t pin, uint32_t level)
8686
{
8787
uint32_t old_lvl;
88-
union ioapic_rte rte = vioapic->rtbl[pin];
88+
union ioapic_rte rte;
8989

90+
if (pin >= REDIR_ENTRIES_HW) {
91+
return;
92+
}
93+
94+
rte = vioapic->rtbl[pin];
9095
old_lvl = (uint32_t)bitmap_test(pin & 0x3FU, &vioapic->pin_state[pin >> 6U]);
9196
if (level == 0U) {
9297
/* clear pin_state and deliver interrupt according to polarity */
@@ -245,9 +250,15 @@ vioapic_indirect_read(struct acrn_vioapic *vioapic, uint32_t addr)
245250

246251
static inline bool vioapic_need_intr(struct acrn_vioapic *vioapic, uint16_t pin)
247252
{
248-
uint32_t lvl =(uint32_t)bitmap_test(pin & 0x3FU,
249-
&vioapic->pin_state[pin >> 6U]);
250-
union ioapic_rte rte = vioapic->rtbl[pin];
253+
uint32_t lvl;
254+
union ioapic_rte rte;
255+
256+
if (pin >= REDIR_ENTRIES_HW) {
257+
return false;
258+
}
259+
260+
rte = vioapic->rtbl[pin];
261+
lvl = (uint32_t)bitmap_test(pin & 0x3FU, &vioapic->pin_state[pin >> 6U]);
251262

252263
return !!((((rte.full & IOAPIC_RTE_INTPOL) != 0UL) && lvl == 0U) ||
253264
(((rte.full & IOAPIC_RTE_INTPOL) == 0UL) && lvl != 0U));

0 commit comments

Comments
 (0)