commit 84f95493fb3d6a6d174bd8275dee528cb28e3cc2
parent c03a30a2fa6b356bad5b763415700bc65af77bab
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Tue, 29 Mar 2022 16:28:06 +0200
libc: Readjust freep realloc() modifies the free list
Freep can be pointing to the block that is modified by
realloc(), so it is needed to set freep to some valid
value (the actual value is not important).
Diffstat:
3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/libc/stdlib/malloc.c b/src/libc/stdlib/malloc.c
@@ -13,7 +13,7 @@
#define ERRADDR ((char *)-1)
static Header base = { .h.next = &base };
-static Header *freep = &base;
+Header *_freep = &base;
/*
* Run over the free list looking for the nearest previous
@@ -25,7 +25,7 @@ _prevchunk(Header *hp)
{
Header *p;
- for (p = freep; ;p = p->h.next) {
+ for (p = _freep; ;p = p->h.next) {
/* hp between p and p->h.next? */
if (p < hp && hp < p->h.next)
break;
@@ -69,7 +69,7 @@ free(void *mem)
prev->h.next = hp;
}
- freep = prev;
+ _freep = prev;
}
static void *
@@ -112,7 +112,7 @@ morecore(size_t nunits)
/* integrate new memory into the list */
free(hp + 1);
- return freep;
+ return _freep;
}
/*
@@ -142,7 +142,7 @@ malloc(size_t nbytes)
/* 1 unit for header plus enough units to fit nbytes */
nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
- for (prev = freep; ; prev = cur) {
+ for (prev = _freep; ; prev = cur) {
cur = prev->h.next;
if (cur->h.size >= nunits) {
if (cur->h.size == nunits) {
@@ -154,12 +154,12 @@ malloc(size_t nbytes)
}
cur->h.next = NULL;
- freep = prev;
+ _freep = prev;
return cur + 1;
}
- if (cur == freep) {
+ if (cur == _freep) {
if ((cur = morecore(nunits)) == NULL)
return NULL;
}
diff --git a/src/libc/stdlib/malloc.h b/src/libc/stdlib/malloc.h
@@ -12,3 +12,5 @@ union header {
};
extern void *_prevchunk(Header *);
+
+extern Header *_freep;
diff --git a/src/libc/stdlib/realloc.c b/src/libc/stdlib/realloc.c
@@ -53,6 +53,7 @@ realloc(void *ptr, size_t nbytes)
prev->h.next = new;
new->h.next = next->h.next;
new->h.size = avail - nunits;
+ _freep = new;
return ptr;
}
}