瀏覽代碼

memalign() on freelist: increase padding to protect header from memcpy()

Ioannis Koutras 11 年之前
父節點
當前提交
2984423c91
共有 1 個文件被更改,包括 15 次插入2 次删除
  1. 15 2
      src/freelist/memalign.c

+ 15 - 2
src/freelist/memalign.c

@@ -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);