:: commit 84fad36b41c473aeba6df9749ce727e0cec37607

Mintsuki <mintsuki@protonmail.com> — 2026-02-07 05:40

parents: 89321360df

lib/elf: Add overflow check on p_paddr + p_memsz in load_elsewhere

diff --git a/common/lib/elf.c b/common/lib/elf.c
index 3514c651..fff63d91 100644
--- a/common/lib/elf.c
+++ b/common/lib/elf.c
@@ -995,8 +995,9 @@ bool elf32_load_elsewhere(uint8_t *elf, uint64_t *entry_point,
             min_paddr = phdr->p_paddr;
         }
 
-        if (phdr->p_paddr + phdr->p_memsz > max_paddr) {
-            max_paddr = phdr->p_paddr + phdr->p_memsz;
+        uint64_t top = (uint64_t)phdr->p_paddr + phdr->p_memsz;
+        if (top > max_paddr) {
+            max_paddr = top;
         }
     }
     image_size = max_paddr - min_paddr;
@@ -1064,8 +1065,12 @@ bool elf64_load_elsewhere(uint8_t *elf, uint64_t *entry_point,
             min_paddr = phdr->p_paddr;
         }
 
-        if (phdr->p_paddr + phdr->p_memsz > max_paddr) {
-            max_paddr = phdr->p_paddr + phdr->p_memsz;
+        uint64_t top;
+        if (__builtin_add_overflow(phdr->p_paddr, phdr->p_memsz, &top)) {
+            panic(true, "elf: p_paddr + p_memsz overflow");
+        }
+        if (top > max_paddr) {
+            max_paddr = top;
         }
     }
     image_size = max_paddr - min_paddr;
tab: 248 wrap: offon