@@ -72,8 +72,7 @@ mod contents {
7272 const MALLOCX_ZERO : c_int = 0x40 ;
7373
7474 // 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.
7776 #[ cfg( all( any( target_arch = "arm" ,
7877 target_arch = "mips" ,
7978 target_arch = "powerpc" ) ) ) ]
@@ -92,8 +91,8 @@ mod contents {
9291 a. trailing_zeros ( ) as c_int
9392 }
9493
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 {
9796 0
9897 } else {
9998 mallocx_align ( align)
@@ -111,7 +110,7 @@ mod contents {
111110 pub unsafe extern fn __rde_alloc ( size : usize ,
112111 align : usize ,
113112 err : * mut u8 ) -> * mut u8 {
114- let flags = align_to_flags ( align) ;
113+ let flags = align_to_flags ( align, size ) ;
115114 let ptr = mallocx ( size as size_t , flags) as * mut u8 ;
116115 if ptr. is_null ( ) {
117116 let layout = Layout :: from_size_align_unchecked ( size, align) ;
@@ -132,7 +131,7 @@ mod contents {
132131 pub unsafe extern fn __rde_dealloc ( ptr : * mut u8 ,
133132 size : usize ,
134133 align : usize ) {
135- let flags = align_to_flags ( align) ;
134+ let flags = align_to_flags ( align, size ) ;
136135 sdallocx ( ptr as * mut c_void , size, flags) ;
137136 }
138137
@@ -142,7 +141,7 @@ mod contents {
142141 min : * mut usize ,
143142 max : * mut usize ) {
144143 let layout = & * ( layout as * const Layout ) ;
145- let flags = align_to_flags ( layout. align ( ) ) ;
144+ let flags = align_to_flags ( layout. align ( ) , layout . size ( ) ) ;
146145 let size = nallocx ( layout. size ( ) , flags) as usize ;
147146 * min = layout. size ( ) ;
148147 if size > 0 {
@@ -166,7 +165,7 @@ mod contents {
166165 return 0 as * mut u8
167166 }
168167
169- let flags = align_to_flags ( new_align) ;
168+ let flags = align_to_flags ( new_align, new_size ) ;
170169 let ptr = rallocx ( ptr as * mut c_void , new_size, flags) as * mut u8 ;
171170 if ptr. is_null ( ) {
172171 let layout = Layout :: from_size_align_unchecked ( new_size, new_align) ;
@@ -181,10 +180,10 @@ mod contents {
181180 pub unsafe extern fn __rde_alloc_zeroed ( size : usize ,
182181 align : usize ,
183182 err : * mut u8 ) -> * mut u8 {
184- let ptr = if align <= MIN_ALIGN {
183+ let ptr = if align <= MIN_ALIGN && align <= size {
185184 calloc ( size as size_t , 1 ) as * mut u8
186185 } else {
187- let flags = align_to_flags ( align) | MALLOCX_ZERO ;
186+ let flags = align_to_flags ( align, size ) | MALLOCX_ZERO ;
188187 mallocx ( size as size_t , flags) as * mut u8
189188 } ;
190189 if ptr. is_null ( ) {
@@ -203,7 +202,7 @@ mod contents {
203202 err : * mut u8 ) -> * mut u8 {
204203 let p = __rde_alloc ( size, align, err) ;
205204 if !p. is_null ( ) {
206- let flags = align_to_flags ( align) ;
205+ let flags = align_to_flags ( align, size ) ;
207206 * excess = nallocx ( size, flags) as usize ;
208207 }
209208 return p
@@ -220,7 +219,7 @@ mod contents {
220219 err : * mut u8 ) -> * mut u8 {
221220 let p = __rde_realloc ( ptr, old_size, old_align, new_size, new_align, err) ;
222221 if !p. is_null ( ) {
223- let flags = align_to_flags ( new_align) ;
222+ let flags = align_to_flags ( new_align, new_size ) ;
224223 * excess = nallocx ( new_size, flags) as usize ;
225224 }
226225 p
@@ -244,7 +243,7 @@ mod contents {
244243 new_size : usize ,
245244 new_align : usize ) -> u8 {
246245 if old_align == new_align {
247- let flags = align_to_flags ( new_align) ;
246+ let flags = align_to_flags ( new_align, new_size ) ;
248247 ( xallocx ( ptr as * mut c_void , new_size, 0 , flags) == new_size) as u8
249248 } else {
250249 0
0 commit comments