diff --git a/src/header/strings/mod.rs b/src/header/strings/mod.rs index a902c414d4..dcf6266685 100644 --- a/src/header/strings/mod.rs +++ b/src/header/strings/mod.rs @@ -1,6 +1,7 @@ //! strings implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/strings.h.html use core::ptr; +use core::arch; use crate::{ header::{ctype, string}, @@ -22,6 +23,14 @@ pub unsafe extern "C" fn bzero(dst: *mut c_void, n: size_t) { ptr::write_bytes(dst as *mut u8, 0, n); } +#[no_mangle] +pub unsafe extern "C" fn explicit_bzero(s: *mut c_void, n: size_t) { + for i in 0..n { + *(s as *mut u8).add(i) = 0 as u8; + } + arch::asm!(""); +} + #[no_mangle] pub extern "C" fn ffs(i: c_int) -> c_int { if i == 0 { diff --git a/tests/strings.c b/tests/strings.c index 6d3c4742cb..ede5d6289c 100644 --- a/tests/strings.c +++ b/tests/strings.c @@ -40,4 +40,8 @@ int main(void) { char* str = "hihih"; assert(index(str, 'i') == str + 1); assert(rindex(str, 'i') == str + 3); + + char buf[] = "password"; + explicit_bzero(buf, sizeof(buf)); + assert(buf[0] == 0); }