From 913b33f74b22cc0d109a9e2511144eca92e4107e Mon Sep 17 00:00:00 2001 From: tomoron Date: Wed, 4 Dec 2024 18:49:53 +0100 Subject: [PATCH] fix get_prev_alloc, add "invalid pointer" message when an invalid pointer is passed to free or realloc --- main.c | 12 +++--------- srcs/free.c | 18 +++++++++++++----- srcs/realloc.c | 8 ++++---- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/main.c b/main.c index bbedbf9..07126d4 100644 --- a/main.c +++ b/main.c @@ -3,14 +3,8 @@ int main(void) { - int i; - - i = 0; - while(i < 110) - { - malloc(256); - i++; - } - show_alloc_mem(); + void *ptr; + ptr = malloc(1203); + free(ptr); } diff --git a/srcs/free.c b/srcs/free.c index 7f5f27f..7512f60 100644 --- a/srcs/free.c +++ b/srcs/free.c @@ -6,12 +6,19 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/30 18:46:07 by tomoron #+# #+# */ -/* Updated: 2024/12/03 18:59:13 by tomoron ### ########.fr */ +/* Updated: 2024/12/04 18:23:00 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ #include "includes/malloc.h" +void invalid_pointer(char *fnc) +{ + (void)fnc; + write(2, fnc, ft_strlen(fnc)); + write(2, "(): invalid pointer\n", 21); +} + t_mem_chunk *get_alloc_chunk(t_alloc *alloc, t_mem_chunk *first, int is_small) { size_t size; @@ -30,7 +37,7 @@ t_mem_chunk *get_alloc_chunk(t_alloc *alloc, t_mem_chunk *first, int is_small) return (0); } -int get_prev_alloc(t_alloc **alloc, t_alloc **res, t_alloc *cur) +int get_prev_alloc(t_alloc **alloc, t_alloc **res, t_alloc *cur, char *fnc) { t_alloc *prev; @@ -45,7 +52,7 @@ int get_prev_alloc(t_alloc **alloc, t_alloc **res, t_alloc *cur) *res = cur; return (1); } - if (cur->next > *alloc && cur <= *alloc && ((t_ul)alloc - \ + if ((cur->next > *alloc || cur->next == 0) && cur <= *alloc && ((t_ul)*alloc - \ (t_ul)cur) <= cur->size) { *alloc = cur; @@ -55,6 +62,7 @@ int get_prev_alloc(t_alloc **alloc, t_alloc **res, t_alloc *cur) prev = cur; cur = cur->next; } + invalid_pointer(fnc); return (0); } @@ -68,7 +76,7 @@ static int free_prealloc(t_alloc *alloc, t_mem_chunk **main_chunk, \ chunk = get_alloc_chunk(alloc, *main_chunk, is_small); if (!chunk) return (0); - if (!get_prev_alloc(&alloc, &prev, chunk->first)) + if (!get_prev_alloc(&alloc, &prev, chunk->first, "free")) return (1); chunk->space_left -= alloc->size + sizeof(t_alloc); if (chunk->first == alloc) @@ -92,7 +100,7 @@ static void free_large(t_alloc *alloc) { t_alloc *prev; - if (!get_prev_alloc(&alloc, &prev, g_allocs.large)) + if (!get_prev_alloc(&alloc, &prev, g_allocs.large, "free")) return ; if (alloc == g_allocs.large) g_allocs.large = alloc->next; diff --git a/srcs/realloc.c b/srcs/realloc.c index cc4b5e3..4aa8317 100644 --- a/srcs/realloc.c +++ b/srcs/realloc.c @@ -6,14 +6,14 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/02 14:41:22 by tomoron #+# #+# */ -/* Updated: 2024/12/03 18:57:50 by tomoron ### ########.fr */ +/* Updated: 2024/12/04 17:22:37 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ #include "includes/malloc.h" t_mem_chunk *get_alloc_chunk(t_alloc *alloc, t_mem_chunk *first, size_t size); -int get_prev_alloc(t_alloc **alloc, t_alloc **res, t_alloc *cur); +int get_prev_alloc(t_alloc **alloc, t_alloc **res, t_alloc *cur, char *fnc); static void *realloc_recreate(t_alloc *alloc, size_t size) { @@ -35,7 +35,7 @@ static void *realloc_prealloc(t_alloc *alloc, t_mem_chunk *chunk, \ chunk = get_alloc_chunk(alloc, chunk, is_small); if (!chunk) return (0); - if (!get_prev_alloc(&alloc, &prev, chunk->first)) + if (!get_prev_alloc(&alloc, &prev, chunk->first, "realloc")) return (0); if (alloc->size >= size) { @@ -56,7 +56,7 @@ static void *realloc_large(t_alloc *alloc, size_t size) { t_alloc *prev; - if (!get_prev_alloc(&alloc, &prev, g_allocs.large)) + if (!get_prev_alloc(&alloc, &prev, g_allocs.large, "realloc")) return (0); return (realloc_recreate(alloc, size)); }