From 56636b54c4895296ffb6e50ab5e08ee77a03f81a Mon Sep 17 00:00:00 2001 From: Guillem George Date: Fri, 7 Nov 2025 23:30:27 +0100 Subject: [PATCH 1/4] backup --- malloc/library | Bin 17152 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 malloc/library diff --git a/malloc/library b/malloc/library deleted file mode 100755 index 9e8ed5c580f8adb3c2cbed4c385678806ead2765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17152 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 Date: Fri, 7 Nov 2025 23:38:51 +0100 Subject: [PATCH 2/4] nul --- malloc/tests/test-cmd.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/malloc/tests/test-cmd.sh b/malloc/tests/test-cmd.sh index e561d85..e633a4c 100755 --- a/malloc/tests/test-cmd.sh +++ b/malloc/tests/test-cmd.sh @@ -1,3 +1,24 @@ #!/bi/sh +RED='\033[0;31m' +NC='\033[0m' # No color + echo Hello world! + +check() +{ + if [ $? -ne 0 ]; then + echo $RED ERROR $NC + fi +} +LD_PRELOAD=./libmalloc.so ls 1> /dev/null +check +LD_PRELOAD=./libmalloc.so ip a 1> /dev/null +check +LD_PRELOAD=./libmalloc.so grep 1> /dev/null +check +LD_PRELOAD=./libmalloc.so find 1> /dev/null +check +LD_PRELOAD=./libmalloc.so tree 1> /dev/null +check +LD_PRELOAD=./libmalloc.so git status 1> /dev/null From 4f8a0bb720e1d6668ba9cb7618e29b840019edee Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Thu, 18 Dec 2025 18:06:44 +0100 Subject: [PATCH 3/4] malloc moi le fion --- malloc/src/helpers/allocate.c | 30 ++++++++++++--------- malloc/src/helpers/helpers.c | 51 ++++++++++++++++++++++++----------- malloc/src/malloc.c | 14 ++++++++-- malloc/tests/test-cmd.sh | 2 +- 4 files changed, 66 insertions(+), 31 deletions(-) diff --git a/malloc/src/helpers/allocate.c b/malloc/src/helpers/allocate.c index 9bfef58..350a38b 100644 --- a/malloc/src/helpers/allocate.c +++ b/malloc/src/helpers/allocate.c @@ -12,7 +12,7 @@ void *allocate_block(struct bucket *biquette, int block_number) return NULL; // Update header - unsigned char byte_mask = 1 << (8 - 1 - (block_number % 8)); + unsigned char byte_mask = 1 << (block_number % 8); biquette->alloc_blk_cnt++; biquette->free_map[block_number / 8] |= byte_mask; @@ -22,17 +22,24 @@ void *allocate_block(struct bucket *biquette, int block_number) struct bucket *create_bucket(size_t min_alloc_size) { - // Round up - size_t alloc_size; + size_t page_alloc_size; + size_t block_alloc_size; + if (min_alloc_size > PAGE_SIZE - sizeof(struct bucket)) + { // Huge page - alloc_size = min_alloc_size; + page_alloc_size = min_alloc_size + sizeof(struct bucket); + block_alloc_size = page_alloc_size; + } else + { // Regular page - alloc_size = s2p(min_alloc_size); + page_alloc_size = PAGE_SIZE; + block_alloc_size = s2p(min_alloc_size); + } // Get page - void *page = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE, + void *page = mmap(NULL, page_alloc_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (page == NULL) @@ -40,9 +47,9 @@ struct bucket *create_bucket(size_t min_alloc_size) // Init bucket struct bucket *header = page; - header->block_size = alloc_size; + header->block_size = block_alloc_size; header->alloc_blk_cnt = 0; - header->alloc_size = alloc_size; + header->alloc_size = page_alloc_size; memset(header->free_map, 0, FREE_LIST_SIZE); return header; @@ -73,14 +80,11 @@ void free_block(void *ptr, struct bucket **list) if (block_number == -1) return; - unsigned char byte_mask = 1 << ((block_number % 8) - 1); + unsigned char byte_mask = 1 << ((block_number % 8)); header->free_map[block_number / 8] &= ~byte_mask; + header->alloc_blk_cnt--; // Huge page - if (header->block_size > BUCKET_SIZE) - // Delete bucket - header->alloc_blk_cnt = 0; - // free bucket if necessary if (header->alloc_blk_cnt == 0) { diff --git a/malloc/src/helpers/helpers.c b/malloc/src/helpers/helpers.c index 8b37f4a..04ef038 100644 --- a/malloc/src/helpers/helpers.c +++ b/malloc/src/helpers/helpers.c @@ -32,19 +32,29 @@ size_t s2p(size_t s) int find_free_block(struct bucket *buck) { - unsigned maplength = PAGE_SIZE / buck->block_size / 8; - // for each block + // Huge pages + if (buck->block_size > BUCKET_SIZE) + { + // Check block 0 + if (!(buck->free_map[0] & (1 << 0))) + return 0; + return -1; + } + + size_t num_blocks_in_page = (PAGE_SIZE - sizeof(struct bucket)) / buck->block_size; + size_t maplength = (num_blocks_in_page + 7) / 8; // +7 for ceiling division (oui c'est moche mais ça marche) + + // Foreach byte for (unsigned i = 0; i < maplength; i++) { unsigned char map_byte = buck->free_map[i]; - unsigned char bit = 1; - // Test byte - for (unsigned j = 0; j < 8; j <<= 1) - { - if (map_byte ^ bit) // Test if free - return i * 8 + j; + if (map_byte == 0xFF) // Skip if used + continue; - bit <<= 1; + for (unsigned j = 0; j < 8; j++) + { + if ((i * 8 + j) < num_blocks_in_page && !(map_byte & (1 << j))) // Check if free + return i * 8 + j; } } @@ -68,11 +78,20 @@ int get_block_number(struct bucket *biquette, void *block) return -1; char *block_nul = block; - void *biquetteounette = biquette; - char *biquette_cherie = biquetteounette; + char* bibiche = get_data_begin(biquette); // Célèbre bar Capcinois, venez à l'occasion + + return (block_nul - bibiche) / biquette->block_size; + + // Au revoir mes belles + // Vous manquerez à papa + // (mais fallait marcher, là ça marche pas) + + // void *biquetteounette = biquette; + // char *biquette_cherie = biquetteounette; + + // return (block_nul - biquette_cherie - sizeof(struct bucket)) + // / biquette->block_size; - return (block_nul - biquette_cherie - sizeof(struct bucket)) - / biquette->block_size; } // Gets a bucket with at least a block_size of size @@ -93,7 +112,9 @@ struct bucket *get_bucket(struct bucket *head, size_t size) // Computes the buckets first block address void *get_data_begin(struct bucket *biquette) { - return biquette + sizeof(struct bucket); + void* maisqueltrucdemerde = biquette; + char* biquettas = maisqueltrucdemerde; + return biquettas + sizeof(struct bucket); } // Computes the beginning address of the page containing ptr @@ -130,7 +151,7 @@ void bucket_list_remove(struct bucket **head, struct bucket *elt) if (*head == elt) { - *head = NULL; + *head = elt->next; return; } diff --git a/malloc/src/malloc.c b/malloc/src/malloc.c index 961d899..535c23e 100644 --- a/malloc/src/malloc.c +++ b/malloc/src/malloc.c @@ -28,7 +28,8 @@ __attribute__((visibility("default"))) void *malloc(size_t size) buck = create_bucket(size); bucket_list_append(&head, buck); - return allocate_block(buck, 1); + int first_free_buche = find_free_block(buck); // De noel (pas la mienne) + return allocate_block(buck, first_free_buche); } __attribute__((visibility("default"))) void free(void *ptr) @@ -56,6 +57,8 @@ __attribute__((visibility("default"))) void *realloc(void *ptr, size_t size) else { void *new_ptr = malloc(size); + if (new_ptr == NULL) + return NULL; memcpy(new_ptr, ptr, header->block_size); free(ptr); return new_ptr; @@ -66,7 +69,14 @@ __attribute__((visibility("default"))) void *realloc(void *ptr, size_t size) __attribute__((visibility("default"))) void *calloc(size_t nmemb, size_t size) { - char *res = malloc(nmemb * size); + // Check overflow + size_t c; + if (__builtin_mul_overflow(nmemb, size, &c)) + return NULL; + + char *res = malloc(c); + if (res == NULL) + return NULL; memset(res, 0, nmemb * size); return res; } diff --git a/malloc/tests/test-cmd.sh b/malloc/tests/test-cmd.sh index e633a4c..4ff60e6 100755 --- a/malloc/tests/test-cmd.sh +++ b/malloc/tests/test-cmd.sh @@ -15,7 +15,7 @@ LD_PRELOAD=./libmalloc.so ls 1> /dev/null check LD_PRELOAD=./libmalloc.so ip a 1> /dev/null check -LD_PRELOAD=./libmalloc.so grep 1> /dev/null +LD_PRELOAD=./libmalloc.so grep --help 1> /dev/null check LD_PRELOAD=./libmalloc.so find 1> /dev/null check From a09cf2de17a909ac39b9c2fa33ef546669bd63a9 Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Fri, 19 Dec 2025 19:02:50 +0100 Subject: [PATCH 4/4] masterclass le dementor --- malloc/src/helpers/helpers.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/malloc/src/helpers/helpers.c b/malloc/src/helpers/helpers.c index 04ef038..bde2907 100644 --- a/malloc/src/helpers/helpers.c +++ b/malloc/src/helpers/helpers.c @@ -41,8 +41,10 @@ int find_free_block(struct bucket *buck) return -1; } - size_t num_blocks_in_page = (PAGE_SIZE - sizeof(struct bucket)) / buck->block_size; - size_t maplength = (num_blocks_in_page + 7) / 8; // +7 for ceiling division (oui c'est moche mais ça marche) + size_t num_blocks_in_page = + (PAGE_SIZE - sizeof(struct bucket)) / buck->block_size; + size_t maplength = (num_blocks_in_page + 7) + / 8; // +7 for ceiling division (oui c'est moche mais ça marche) // Foreach byte for (unsigned i = 0; i < maplength; i++) @@ -52,8 +54,9 @@ int find_free_block(struct bucket *buck) continue; for (unsigned j = 0; j < 8; j++) - { - if ((i * 8 + j) < num_blocks_in_page && !(map_byte & (1 << j))) // Check if free + { + if ((i * 8 + j) < num_blocks_in_page + && !(map_byte & (1 << j))) // Check if free return i * 8 + j; } } @@ -78,7 +81,8 @@ int get_block_number(struct bucket *biquette, void *block) return -1; char *block_nul = block; - char* bibiche = get_data_begin(biquette); // Célèbre bar Capcinois, venez à l'occasion + char *bibiche = + get_data_begin(biquette); // Célèbre bar Capcinois, venez à l'occasion return (block_nul - bibiche) / biquette->block_size; @@ -91,7 +95,6 @@ int get_block_number(struct bucket *biquette, void *block) // return (block_nul - biquette_cherie - sizeof(struct bucket)) // / biquette->block_size; - } // Gets a bucket with at least a block_size of size @@ -112,8 +115,8 @@ struct bucket *get_bucket(struct bucket *head, size_t size) // Computes the buckets first block address void *get_data_begin(struct bucket *biquette) { - void* maisqueltrucdemerde = biquette; - char* biquettas = maisqueltrucdemerde; + void *maisqueltrucdemerde = biquette; + char *biquettas = maisqueltrucdemerde; return biquettas + sizeof(struct bucket); }