Prechádzať zdrojové kódy

freelist/memalign(): fix padding

Ioannis Koutras 11 rokov pred
rodič
commit
711c6a83e7
1 zmenil súbory, kde vykonal 8 pridanie a 15 odobranie
  1. 8 15
      src/freelist/memalign.c

+ 8 - 15
src/freelist/memalign.c

@@ -34,19 +34,11 @@
 void * freelist_memalign(freelist_rb_t *raw_block, size_t alignment,
         size_t size) {
     void *return_ptr;
+    /* extra_size denotes the worst-case scenario. Because memcpy() is used,
+     * at least HEADER_SIZE is needed for no memory overlap. */
+    size_t extra_size = HEADER_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);
+    return_ptr = freelist_malloc(raw_block, size + extra_size);
 
     if(return_ptr != NULL) {
 
@@ -59,7 +51,9 @@ check_alignment:
         }
 
         size_t padding = (- (size_t) return_ptr) & (alignment - 1);
-        padding += counter * alignment;
+        while(padding < HEADER_SIZE) {
+            padding += alignment;
+        }
 
         block_header_t *block_header = get_header(return_ptr);
 
@@ -78,8 +72,7 @@ check_alignment:
         if(previous_size_availability == 1) {
             void *old_ptr = return_ptr;
 
-            return_ptr = freelist_malloc(raw_block, size +
-                    (counter + 1) * alignment - 1);
+            return_ptr = freelist_malloc(raw_block, size + extra_size);
 
             freelist_free(raw_block, old_ptr);