madt: Add entry length validation to prevent infinite loop
diff --git a/common/sys/cpu_riscv.c b/common/sys/cpu_riscv.c
index 1c8c27a1..2f12129f 100644
--- a/common/sys/cpu_riscv.c
+++ b/common/sys/cpu_riscv.c
@@ -101,6 +101,9 @@ static void init_riscv_acpi(void) {
for (uint8_t *madt_ptr = (uint8_t *)madt->madt_entries_begin;
(uintptr_t)madt_ptr + 1 < (uintptr_t)madt + madt->header.length; madt_ptr += *(madt_ptr + 1)) {
+ if (*(madt_ptr + 1) == 0) {
+ break;
+ }
if (*madt_ptr != 0x18) {
continue;
}
diff --git a/common/sys/lapic.c b/common/sys/lapic.c
index 1a8d93c3..5820bdbc 100644
--- a/common/sys/lapic.c
+++ b/common/sys/lapic.c
@@ -109,6 +109,9 @@ void init_io_apics(void) {
for (uint8_t *madt_ptr = (uint8_t *)madt->madt_entries_begin;
(uintptr_t)madt_ptr + 1 < (uintptr_t)madt + madt->header.length;
madt_ptr += *(madt_ptr + 1)) {
+ if (*(madt_ptr + 1) == 0) {
+ break;
+ }
switch (*madt_ptr) {
case 1: {
max_io_apics++;
@@ -123,6 +126,9 @@ void init_io_apics(void) {
for (uint8_t *madt_ptr = (uint8_t *)madt->madt_entries_begin;
(uintptr_t)madt_ptr + 1 < (uintptr_t)madt + madt->header.length;
madt_ptr += *(madt_ptr + 1)) {
+ if (*(madt_ptr + 1) == 0) {
+ break;
+ }
switch (*madt_ptr) {
case 1: {
io_apics[max_io_apics++] = (void *)madt_ptr;
diff --git a/common/sys/smp.c b/common/sys/smp.c
index cb7e1c09..19050722 100644
--- a/common/sys/smp.c
+++ b/common/sys/smp.c
@@ -478,6 +478,9 @@ static struct limine_mp_info *try_acpi_smp(size_t *cpu_count,
for (uint8_t *madt_ptr = (uint8_t *)madt->madt_entries_begin;
(uintptr_t)madt_ptr + 1 < (uintptr_t)madt + madt->header.length;
madt_ptr += *(madt_ptr + 1)) {
+ if (*(madt_ptr + 1) == 0) {
+ break;
+ }
switch (*madt_ptr) {
case 11: {
// GIC CPU Interface
@@ -502,6 +505,9 @@ static struct limine_mp_info *try_acpi_smp(size_t *cpu_count,
for (uint8_t *madt_ptr = (uint8_t *)madt->madt_entries_begin;
(uintptr_t)madt_ptr + 1 < (uintptr_t)madt + madt->header.length;
madt_ptr += *(madt_ptr + 1)) {
+ if (*(madt_ptr + 1) == 0) {
+ break;
+ }
switch (*madt_ptr) {
case 11: {
// GIC CPU Interface
