|
@@ -35,7 +35,18 @@ void * freelist_memalign(freelist_rb_t *raw_block, size_t alignment,
|
|
|
size_t size) {
|
|
|
void *return_ptr;
|
|
|
|
|
|
- return_ptr = freelist_malloc(raw_block, size + alignment - 1);
|
|
|
+ /* To avoid issues with overwriting the memory block header, the header will
|
|
|
+ * always be padded at least the size of the header. */
|
|
|
+ unsigned int counter = 0;
|
|
|
+ if(alignment < HEADER_SIZE) {
|
|
|
+ size_t new_alignment = alignment;
|
|
|
+ for(counter = 0; new_alignment < HEADER_SIZE; ++counter) {
|
|
|
+ new_alignment += alignment;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return_ptr = freelist_malloc(raw_block, size + (counter + 1) * alignment
|
|
|
+ - 1);
|
|
|
|
|
|
if(return_ptr != NULL) {
|
|
|
|
|
@@ -48,6 +59,7 @@ check_alignment:
|
|
|
}
|
|
|
|
|
|
size_t padding = (- (size_t) return_ptr) & (alignment - 1);
|
|
|
+ padding += counter * alignment;
|
|
|
|
|
|
block_header_t *block_header = get_header(return_ptr);
|
|
|
|
|
@@ -66,7 +78,8 @@ check_alignment:
|
|
|
if(previous_size_availability == 1) {
|
|
|
void *old_ptr = return_ptr;
|
|
|
|
|
|
- return_ptr = freelist_malloc(raw_block, size + alignment - 1);
|
|
|
+ return_ptr = freelist_malloc(raw_block, size +
|
|
|
+ (counter + 1) * alignment - 1);
|
|
|
|
|
|
freelist_free(raw_block, old_ptr);
|
|
|
|