From 44f343bec8db8fbca649c11764353d21a0fbce6b Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen@gmail.com>
Date: Sat, 5 Jun 2021 18:49:25 +0100
Subject: [PATCH] explicit_bzero implementation proposal

---
 src/header/strings/mod.rs | 10 +++++++++-
 tests/strings.c           |  4 ++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/header/strings/mod.rs b/src/header/strings/mod.rs
index a902c414..c27fa32e 100644
--- a/src/header/strings/mod.rs
+++ b/src/header/strings/mod.rs
@@ -1,5 +1,5 @@
 //! strings implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/strings.h.html
-
+#![feature(llvm_asm)]
 use core::ptr;
 
 use crate::{
@@ -22,6 +22,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;
+    }
+    llvm_asm!("" :: "r"(s) : "memory")
+}
+
 #[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 6d3c4742..ede5d628 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);
 }
-- 
GitLab