Skip to main content

hardened_malloc/
lib.rs

1//
2// hardened-malloc: Global allocator using GrapheneOS allocator
3// src/lib.rs: Global allocator definition
4//
5// Copyright (c) 2025, 2026 Ali Polatel <alip@chesswob.org>
6// Based in part upon hardened_malloc-rs/src/lib.rs which is
7//   Copyright (c) strawberry <strawberry@puppygock.gay>
8//   SPDX-License-Identifier: Apache-2.0 OR MIT
9//
10// SPDX-License-Identifier: MIT
11
12#![no_std]
13
14use core::{
15    alloc::{GlobalAlloc, Layout},
16    ffi::c_void,
17};
18
19// C standard
20pub use hardened_malloc_sys::{malloc, calloc, realloc, aligned_alloc, free};
21
22// POSIX
23pub use hardened_malloc_sys::posix_memalign;
24
25// hardened_malloc extensions
26pub use hardened_malloc_sys::{malloc_object_size, malloc_object_size_fast, free_sized};
27
28pub struct HardenedMalloc;
29
30unsafe impl GlobalAlloc for HardenedMalloc {
31    #[inline]
32    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
33        malloc(layout.size()) as *mut u8
34    }
35
36    #[inline]
37    unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
38        calloc(layout.size(), 1) as *mut u8
39    }
40
41    #[inline]
42    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
43        // Deallocate memory using free_sized.
44        // Pass the size of the allocation to ensure proper sized deallocation.
45        free_sized(ptr as *mut c_void, layout.size());
46    }
47
48    #[inline]
49    unsafe fn realloc(&self, ptr: *mut u8, _layout: Layout, size: usize) -> *mut u8 {
50        realloc(ptr as *mut c_void, size) as *mut u8
51    }
52}