summaryrefslogtreecommitdiff
path: root/kernel/lib/kalloc.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-05-01 19:52:41 -0400
committerFreya Murphy <freya@freyacat.org>2025-05-01 19:52:41 -0400
commitfa9f4baeecd1e18fc2db9192660d0de5d8b54e8c (patch)
treef4a2435da4699cbe051bd3da832298162ab7de4d /kernel/lib/kalloc.c
parentcomment out non contigous phys page allocator, its causing problems and this ... (diff)
downloadcomus-fa9f4baeecd1e18fc2db9192660d0de5d8b54e8c.tar.gz
comus-fa9f4baeecd1e18fc2db9192660d0de5d8b54e8c.tar.bz2
comus-fa9f4baeecd1e18fc2db9192660d0de5d8b54e8c.zip
FUCKING OFF BY ONE ERRORS
Diffstat (limited to 'kernel/lib/kalloc.c')
-rw-r--r--kernel/lib/kalloc.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/lib/kalloc.c b/kernel/lib/kalloc.c
index 0141149..02e9457 100644
--- a/kernel/lib/kalloc.c
+++ b/kernel/lib/kalloc.c
@@ -34,7 +34,7 @@ static struct page_header *get_header(void *ptr)
static void *alloc_new(size_t size)
{
- size_t pages = ((size + header_len) / PAGE_SIZE) + 1;
+ size_t pages = ((size + header_len + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE;
void *addr = kalloc_pages(pages);
void *mem = (char *)addr + header_len;
@@ -180,7 +180,7 @@ void kfree(void *ptr)
for (neighbor = header->prev; neighbor != NULL; neighbor = neighbor->prev) {
if (neighbor->node_number != header->node_number)
break;
- if (neighbor->used && header->used)
+ if (neighbor->used || header->used)
break;
neighbor->free += header->free + header_len;
neighbor->next = header->next;