From 0cca44bdb8351ab3f691f828ef94963498a2c6d4 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 30 Aug 2014 10:59:25 +0000 Subject: [PATCH] [FREELDR] - Improve GetPciIrqRoutingTable. Patch by Sergey Chernov (serrox at ya dot ru), small modifications by me. CORE-8440 svn path=/trunk/; revision=63985 --- .../boot/freeldr/freeldr/arch/i386/hwpci.c | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c b/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c index 09a9e8bb060..4154951c9fc 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c @@ -41,6 +41,14 @@ GetPciIrqRoutingTable(VOID) { TRACE("Found signature\n"); + if (Table->TableSize < FIELD_OFFSET(PCI_IRQ_ROUTING_TABLE, Slot) || + Table->TableSize % 16 != 0) + { + ERR("Invalid routing table size (%u) at %p. Continue searching...\n", Table->TableSize, Table); + Table = (PPCI_IRQ_ROUTING_TABLE)((ULONG_PTR)Table + 0x10); + continue; + } + Ptr = (PUCHAR)Table; Sum = 0; for (i = 0; i < Table->TableSize; i++) @@ -50,18 +58,20 @@ GetPciIrqRoutingTable(VOID) if ((Sum & 0xFF) != 0) { - ERR("Invalid routing table\n"); - return NULL; + ERR("Invalid routing table checksum (%#lx) at %p. Continue searching...\n", Sum & 0xFF, Table); + } + else + { + TRACE("Valid checksum\n"); + return Table; } - - TRACE("Valid checksum\n"); - - return Table; } Table = (PPCI_IRQ_ROUTING_TABLE)((ULONG_PTR)Table + 0x10); } + ERR("No valid routing table found!\n"); + return NULL; } -- 2.17.1