@@ -72,8 +72,7 @@ mod contents {
72
72
const MALLOCX_ZERO : c_int = 0x40 ;
73
73
74
74
// The minimum alignment guaranteed by the architecture. This value is used to
75
- // add fast paths for low alignment values. In practice, the alignment is a
76
- // constant at the call site and the branch will be optimized out.
75
+ // add fast paths for low alignment values.
77
76
#[ cfg( all( any( target_arch = "arm" ,
78
77
target_arch = "mips" ,
79
78
target_arch = "powerpc" ) ) ) ]
@@ -92,8 +91,8 @@ mod contents {
92
91
a. trailing_zeros ( ) as c_int
93
92
}
94
93
95
- fn align_to_flags ( align : usize ) -> c_int {
96
- if align <= MIN_ALIGN {
94
+ fn align_to_flags ( align : usize , size : usize ) -> c_int {
95
+ if align <= MIN_ALIGN && align <= size {
97
96
0
98
97
} else {
99
98
mallocx_align ( align)
@@ -111,7 +110,7 @@ mod contents {
111
110
pub unsafe extern fn __rde_alloc ( size : usize ,
112
111
align : usize ,
113
112
err : * mut u8 ) -> * mut u8 {
114
- let flags = align_to_flags ( align) ;
113
+ let flags = align_to_flags ( align, size ) ;
115
114
let ptr = mallocx ( size as size_t , flags) as * mut u8 ;
116
115
if ptr. is_null ( ) {
117
116
let layout = Layout :: from_size_align_unchecked ( size, align) ;
@@ -132,7 +131,7 @@ mod contents {
132
131
pub unsafe extern fn __rde_dealloc ( ptr : * mut u8 ,
133
132
size : usize ,
134
133
align : usize ) {
135
- let flags = align_to_flags ( align) ;
134
+ let flags = align_to_flags ( align, size ) ;
136
135
sdallocx ( ptr as * mut c_void , size, flags) ;
137
136
}
138
137
@@ -142,7 +141,7 @@ mod contents {
142
141
min : * mut usize ,
143
142
max : * mut usize ) {
144
143
let layout = & * ( layout as * const Layout ) ;
145
- let flags = align_to_flags ( layout. align ( ) ) ;
144
+ let flags = align_to_flags ( layout. align ( ) , layout . size ( ) ) ;
146
145
let size = nallocx ( layout. size ( ) , flags) as usize ;
147
146
* min = layout. size ( ) ;
148
147
if size > 0 {
@@ -166,7 +165,7 @@ mod contents {
166
165
return 0 as * mut u8
167
166
}
168
167
169
- let flags = align_to_flags ( new_align) ;
168
+ let flags = align_to_flags ( new_align, new_size ) ;
170
169
let ptr = rallocx ( ptr as * mut c_void , new_size, flags) as * mut u8 ;
171
170
if ptr. is_null ( ) {
172
171
let layout = Layout :: from_size_align_unchecked ( new_size, new_align) ;
@@ -181,10 +180,10 @@ mod contents {
181
180
pub unsafe extern fn __rde_alloc_zeroed ( size : usize ,
182
181
align : usize ,
183
182
err : * mut u8 ) -> * mut u8 {
184
- let ptr = if align <= MIN_ALIGN {
183
+ let ptr = if align <= MIN_ALIGN && align <= size {
185
184
calloc ( size as size_t , 1 ) as * mut u8
186
185
} else {
187
- let flags = align_to_flags ( align) | MALLOCX_ZERO ;
186
+ let flags = align_to_flags ( align, size ) | MALLOCX_ZERO ;
188
187
mallocx ( size as size_t , flags) as * mut u8
189
188
} ;
190
189
if ptr. is_null ( ) {
@@ -203,7 +202,7 @@ mod contents {
203
202
err : * mut u8 ) -> * mut u8 {
204
203
let p = __rde_alloc ( size, align, err) ;
205
204
if !p. is_null ( ) {
206
- let flags = align_to_flags ( align) ;
205
+ let flags = align_to_flags ( align, size ) ;
207
206
* excess = nallocx ( size, flags) as usize ;
208
207
}
209
208
return p
@@ -220,7 +219,7 @@ mod contents {
220
219
err : * mut u8 ) -> * mut u8 {
221
220
let p = __rde_realloc ( ptr, old_size, old_align, new_size, new_align, err) ;
222
221
if !p. is_null ( ) {
223
- let flags = align_to_flags ( new_align) ;
222
+ let flags = align_to_flags ( new_align, new_size ) ;
224
223
* excess = nallocx ( new_size, flags) as usize ;
225
224
}
226
225
p
@@ -244,7 +243,7 @@ mod contents {
244
243
new_size : usize ,
245
244
new_align : usize ) -> u8 {
246
245
if old_align == new_align {
247
- let flags = align_to_flags ( new_align) ;
246
+ let flags = align_to_flags ( new_align, new_size ) ;
248
247
( xallocx ( ptr as * mut c_void , new_size, 0 , flags) == new_size) as u8
249
248
} else {
250
249
0
0 commit comments