1
1
#![ deny( unsafe_op_in_unsafe_fn) ]
2
2
3
3
use crate :: alloc:: { GlobalAlloc , Layout , System } ;
4
+ use crate :: ptr;
4
5
use crate :: sys:: c;
5
6
use crate :: sys_common:: alloc:: { realloc_fallback, MIN_ALIGN } ;
6
7
@@ -10,7 +11,7 @@ struct Header(*mut u8);
10
11
/// # Safety
11
12
///
12
13
/// There must be a `Header` at `ptr.offset(-1)`.
13
- unsafe fn get_header < ' a > ( ptr : * mut u8 ) -> & ' a mut Header {
14
+ unsafe fn get_header < ' a > ( ptr : * mut u8 ) -> * mut Header {
14
15
// SAFETY: the safety contract must be upheld by the caller
15
16
unsafe { & mut * ( ptr as * mut Header ) . offset ( -1 ) }
16
17
}
@@ -22,7 +23,7 @@ unsafe fn align_ptr(ptr: *mut u8, align: usize) -> *mut u8 {
22
23
// SAFETY: the safety contract must be upheld by the caller
23
24
unsafe {
24
25
let aligned = ptr. add ( align - ( ptr as usize & ( align - 1 ) ) ) ;
25
- * get_header ( aligned) = Header ( ptr) ;
26
+ ptr :: write ( get_header ( aligned) , Header ( ptr) ) ;
26
27
aligned
27
28
}
28
29
}
@@ -74,7 +75,7 @@ unsafe impl GlobalAlloc for System {
74
75
c:: HeapFree ( c:: GetProcessHeap ( ) , 0 , ptr as c:: LPVOID )
75
76
} else {
76
77
let header = get_header ( ptr) ;
77
- c:: HeapFree ( c:: GetProcessHeap ( ) , 0 , header. 0 as c:: LPVOID )
78
+ c:: HeapFree ( c:: GetProcessHeap ( ) , 0 , ( * header) . 0 as c:: LPVOID )
78
79
}
79
80
} ;
80
81
// SAFETY: `c::GetLastError()` cannot fail
0 commit comments