Skip to content

Commit

Permalink
correct malloc
Browse files Browse the repository at this point in the history
  • Loading branch information
Marc-Ducret committed May 11, 2017
1 parent dac86c2 commit 8da59a1
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 31 deletions.
15 changes: 8 additions & 7 deletions programs/lib/malloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

malloc_header_t *first_block;

void init_malloc() { //TODO rm
void init_malloc() {
first_block = NULL;
malloc(0);
}

void *expand_heap(int size) {
void *h = resize_heap(size);
printf("New heap pointer: %x\n", h);
return h;
}

Expand All @@ -27,20 +27,21 @@ void *malloc(u32 size) {
new_block->size = size;
block->next_block->prev_block = new_block;
block->next_block = new_block;
//printf("found gap of size %x at %x\n", size, new_block);
return (void *) new_block + sizeof(malloc_header_t);
}
prev_block = block;
}
malloc_header_t *new_block = (malloc_header_t *) expand_heap(size);
//printf("new block of size %x at %x\n", size, new_block);
if(!new_block) return NULL;
new_block->size = size;
new_block->next_block = NULL;
if(prev_block) {
prev_block->next_block = new_block;
new_block->prev_block = prev_block;
//TODO CHECK prev_block + prev_block->size = new_block
if((void*) prev_block + prev_block->size != (void*) new_block) {
printf("Corrupted malloc\n");
return NULL;
}
} else {
new_block->prev_block = NULL;
first_block = new_block;
Expand All @@ -49,16 +50,16 @@ void *malloc(u32 size) {
}

void free(void *allocated) {
//printf("free %x\n", allocated);
malloc_header_t *block = (malloc_header_t*) allocated - 1;
if(block->prev_block) {
block->prev_block->next_block = block->next_block;
if(block->next_block)
block->next_block->prev_block = block->prev_block;
else {
shrink_heap(block->size);
shrink_heap((u32) block + block->size - (u32) block->prev_block - block->prev_block->size);
}
} else {
printf("free first block...\n");
shrink_heap(block->size);
first_block = NULL;
}
Expand Down
1 change: 1 addition & 0 deletions programs/lib/malloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ struct malloc_header {

void *malloc(u32 size);
void free(void *allocated);
void init_malloc();
#endif
31 changes: 7 additions & 24 deletions programs/src/malloc_test/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,6 @@

int main() {
printf("Hello!\n");
/*
if(!resize_heap(0x50000)) {
printf("resize fail\n");
exit(-1);
}
printf("PRE %x - %x\n", *((u32 *) 0x88008C04), *((u32 *) 0x88040BFB + 2));
*((u32 *) 0x88008C04) = 0x1337;
printf("PS* %x - %x\n", *((u32 *) 0x88008C04), *((u32 *) 0x88040BFB + 2));
return 0;
//*/
init_malloc();
u32 *x = (u32*) malloc(sizeof(u32));
*x = 0xFEE;
Expand All @@ -30,25 +19,19 @@ int main() {
printf("z = %x, *z = %x\n", z, *z);

u32 n = 0x80;
u32 m = 0x1005;
u32 m = 0x1800;
void ** pointers = (void **) malloc(n * sizeof(void **));
for(int i = 0; i < n; i ++) pointers[i] = NULL;
for(u32 ct = 0; ct < 0x1000; ct++) {
print = ct >= 0x820;
print = 0;
if(print) {
printf("# %x #\n", ct);
malloc_header_t *b = (malloc_header_t*) 0x88040BFB;
printf("BAD GUY: %x %x %x\n", b, b->prev_block, b->next_block);
}
int i = rand() % n;
if(pointers[i]) free(pointers[i]);
if(print) {
malloc_header_t *b = (malloc_header_t*) 0x88040BFB;
printf("BAD GUY: %x %x %x\n", b, b->prev_block, b->next_block);
}
pointers[i] = malloc(rand() % m);
flush(STDOUT);
if(!pointers[i]) break;
if(!pointers[i]) {
printf("fail\n");
exit(-1);
}
}

printf("success\n");
}

0 comments on commit 8da59a1

Please sign in to comment.