From d16c140b7cd014f03064f6f66f35baaa0b9cb7ce Mon Sep 17 00:00:00 2001 From: gnzlbg Date: Wed, 25 Oct 2017 10:22:24 +0200 Subject: [PATCH] [jemalloc] set correct excess in realloc_excess --- src/liballoc_jemalloc/lib.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/liballoc_jemalloc/lib.rs b/src/liballoc_jemalloc/lib.rs index d153f19c462..a1401e65f38 100644 --- a/src/liballoc_jemalloc/lib.rs +++ b/src/liballoc_jemalloc/lib.rs @@ -67,6 +67,10 @@ mod contents { target_os = "dragonfly", target_os = "windows", target_env = "musl"), link_name = "je_nallocx")] fn nallocx(size: size_t, flags: c_int) -> size_t; + #[cfg_attr(any(target_os = "macos", target_os = "android", target_os = "ios", + target_os = "dragonfly", target_os = "windows", target_env = "musl"), + link_name = "je_sallocx")] + fn sallocx(ptr: *mut c_void, flags: c_int) -> size_t; } const MALLOCX_ZERO: c_int = 0x40; @@ -211,17 +215,28 @@ mod contents { #[no_mangle] #[linkage = "external"] pub unsafe extern fn __rde_realloc_excess(ptr: *mut u8, - old_size: usize, + _old_size: usize, old_align: usize, new_size: usize, new_align: usize, excess: *mut usize, err: *mut u8) -> *mut u8 { - let p = __rde_realloc(ptr, old_size, old_align, new_size, new_align, err); - if !p.is_null() { - *excess = new_size; + if new_align != old_align { + ptr::write(err as *mut AllocErr, + AllocErr::Unsupported { details: "can't change alignments" }); + return 0 as *mut u8 } - return p + + let flags = align_to_flags(new_align); + let ptr = rallocx(ptr as *mut c_void, new_size, flags) as usize; + let alloc_size = sallocx(ptr as *mut c_void, flags); + if ptr.is_null() { + let layout = Layout::from_size_align_unchecked(new_size, new_align); + ptr::write(err as *mut AllocErr, + AllocErr::Exhausted { request: layout }); + } + *excess = alloc_size; + ptr } #[no_mangle]