diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs index b4e27d80c3..315df2a770 100644 --- a/src/header/string/mod.rs +++ b/src/header/string/mod.rs @@ -20,20 +20,23 @@ use crate::{ /// See . #[unsafe(no_mangle)] pub unsafe extern "C" fn memccpy( - dest: *mut c_void, - src: *const c_void, + s1: *mut c_void, + s2: *const c_void, c: c_int, n: size_t, ) -> *mut c_void { - let to = memchr(src, c, n); + let to = unsafe {memchr(s2, c, n)}; + let dist = if to.is_null() { + n + } else { + ((to as usize) - (s2 as usize)) + 1 + }; + unsafe {memcpy(s1, s2, dist)}; if to.is_null() { - return to; + ptr::null_mut() + } else { + unsafe {(s1 as *mut u8).add(dist) as *mut c_void} } - let dist = (to as usize) - (src as usize); - if memcpy(dest, src, dist).is_null() { - return ptr::null_mut(); - } - (dest as *mut u8).add(dist + 1) as *mut c_void } /// See . @@ -53,7 +56,6 @@ pub unsafe extern "C" fn memchr( /// See . #[unsafe(no_mangle)] -#[unsafe(no_mangle)] pub unsafe extern "C" fn memcmp(s1: *const c_void, s2: *const c_void, n: usize) -> c_int { let (div, rem) = (n / mem::size_of::(), n % mem::size_of::()); let mut a = s1 as *const usize;