Browse Source

Merge pull request #1376 from jasonKercher/master

Added zeroing to new memory regions from _unix_realloc
gingerBill 3 years ago
parent
commit
fb710f8cbf
4 changed files with 16 additions and 2 deletions
  1. 10 2
      core/os/os.odin
  2. 2 0
      core/os/os_darwin.odin
  3. 2 0
      core/os/os_freebsd.odin
  4. 2 0
      core/os/os_linux.odin

+ 10 - 2
core/os/os.odin

@@ -206,11 +206,19 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode,
 		}
 		}
 	}
 	}
 
 
-	aligned_resize :: proc(p: rawptr, old_size: int, new_size: int, new_alignment: int) -> ([]byte, mem.Allocator_Error) {
+	aligned_resize :: proc(p: rawptr, old_size: int, new_size: int, new_alignment: int) -> (new_memory: []byte, err: mem.Allocator_Error) {
 		if p == nil {
 		if p == nil {
 			return nil, nil
 			return nil, nil
 		}
 		}
-		return aligned_alloc(new_size, new_alignment, p)
+
+		new_memory = aligned_alloc(new_size, new_alignment, p) or_return
+		
+		// NOTE: heap_resize does not zero the new memory, so we do it
+		if new_size > old_size {
+			new_region := mem.raw_data(new_memory[old_size:])
+			mem.zero(new_region, new_size - old_size)
+		}
+		return
 	}
 	}
 
 
 	switch mode {
 	switch mode {

+ 2 - 0
core/os/os_darwin.odin

@@ -553,6 +553,8 @@ heap_alloc :: proc(size: int) -> rawptr {
 	return _unix_calloc(1, size)
 	return _unix_calloc(1, size)
 }
 }
 heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
 heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
+	// NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on
+	// POSIX platforms. Ensure your caller takes this into account.
 	return _unix_realloc(ptr, new_size)
 	return _unix_realloc(ptr, new_size)
 }
 }
 heap_free :: proc(ptr: rawptr) {
 heap_free :: proc(ptr: rawptr) {

+ 2 - 0
core/os/os_freebsd.odin

@@ -378,6 +378,8 @@ heap_alloc :: proc(size: int) -> rawptr {
 }
 }
 
 
 heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
 heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
+	// NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on
+	// POSIX platforms. Ensure your caller takes this into account.
 	return _unix_realloc(ptr, c.size_t(new_size));
 	return _unix_realloc(ptr, c.size_t(new_size));
 }
 }
 
 

+ 2 - 0
core/os/os_linux.odin

@@ -727,6 +727,8 @@ heap_alloc :: proc(size: int) -> rawptr {
 }
 }
 
 
 heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
 heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
+	// NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on
+	// POSIX platforms. Ensure your caller takes this into account.
 	return _unix_realloc(ptr, c.size_t(new_size))
 	return _unix_realloc(ptr, c.size_t(new_size))
 }
 }