Commit 02a1f838e6

Matthew Borkowski <matthew.h.borkowski@gmail.com>
2021-12-01 09:56:44
gpa: fix leak in freeLarge and memory limit accounting in resize and resizeLarge
1 parent 8c36243
Changed files (1)
lib/std/heap/general_purpose_allocator.zig
@@ -561,11 +561,13 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
                 }
                 self.total_requested_bytes = new_req_bytes;
             }
-            errdefer if (config.enable_memory_limit) {
-                self.total_requested_bytes = prev_req_bytes;
-            };
 
-            const result_len = self.backing_allocator.rawResize(old_mem, old_align, new_size, len_align, ret_addr) orelse return null;
+            const result_len = self.backing_allocator.rawResize(old_mem, old_align, new_size, len_align, ret_addr) orelse {
+                if (config.enable_memory_limit) {
+                    self.total_requested_bytes = prev_req_bytes;
+                }
+                return null;
+            };
 
             if (config.enable_memory_limit) {
                 entry.value_ptr.requested_size = new_size;
@@ -623,6 +625,10 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
                 });
             }
 
+            if (!config.never_unmap) {
+                self.backing_allocator.rawFree(old_mem, old_align, ret_addr);
+            }
+
             if (config.enable_memory_limit) {
                 self.total_requested_bytes -= entry.value_ptr.requested_size;
             }
@@ -711,9 +717,6 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
                 }
                 self.total_requested_bytes = new_req_bytes;
             }
-            errdefer if (config.enable_memory_limit) {
-                self.total_requested_bytes = prev_req_bytes;
-            };
 
             const new_aligned_size = math.max(new_size, old_align);
             const new_size_class = math.ceilPowerOfTwoAssert(usize, new_aligned_size);
@@ -728,6 +731,10 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
                 }
                 return new_size;
             }
+
+            if (config.enable_memory_limit) {
+                self.total_requested_bytes = prev_req_bytes;
+            }
             return null;
         }