From 5a033707ccbc99c0279faa765b857d3c7f6bd9d4 Mon Sep 17 00:00:00 2001 From: Matheus Date: Fri, 24 Apr 2026 23:49:58 -0300 Subject: [PATCH] block: better checks to see if partition entry is valid --- kernel-src/io/block/block.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/kernel-src/io/block/block.c b/kernel-src/io/block/block.c index bd800274..7063ec94 100644 --- a/kernel-src/io/block/block.c +++ b/kernel-src/io/block/block.c @@ -220,6 +220,25 @@ static int detectpart(blockdesc_t *desc) { return ret; } +static bool gptentryvalid(blockdesc_t *desc, gptheader_t *header, gptentry_t *entry) { + if (entry->typeguid[0] == 0 && entry->typeguid[1] == 0) + return false; + + if (entry->guid[0] == 0 && entry->guid[1] == 0) + return false; + + if (entry->startlba > entry->endlba) + return false; + + if (entry->startlba < header->firstusable || entry->endlba > header->lastusable) + return false; + + if (entry->endlba >= desc->blockcapacity) + return false; + + return true; +} + static void dogpt(blockdesc_t *desc, char *name) { // get header void *lba1 = vmm_map(NULL, desc->blocksize, VMM_FLAGS_ALLOCATE, MAP_FLAGS, NULL); @@ -242,7 +261,7 @@ static void dogpt(blockdesc_t *desc, char *name) { for (int i = 0; i < header->entrycount; ++i) { gptentry_t *entry = (gptentry_t *)((uintptr_t)tablebuffer + header->entrybytesize * i); - if (entry->typeguid[0] == 0 && entry->typeguid[1] == 0) + if (gptentryvalid(desc, header, entry) == false) continue; snprintf(partname, namebuflen, "%sp%d", name, partid++);