rtoolbox/
safe_vec.rs

1use std::ops::Deref;
2use std::ops::DerefMut;
3use std::ops::Drop;
4use std::{ptr, sync::atomic};
5
6/// Vec that is zeroed when dropped
7#[derive(Clone, Debug, PartialEq, Eq)]
8pub struct SafeVec {
9    pub inner: Vec<u8>,
10}
11
12impl SafeVec {
13    pub fn new(inner: Vec<u8>) -> SafeVec {
14        SafeVec { inner: inner }
15    }
16
17    pub fn inner_mut(&mut self) -> &mut Vec<u8> {
18        &mut self.inner
19    }
20}
21
22impl Drop for SafeVec {
23    fn drop(&mut self) {
24        let default = u8::default();
25
26        for c in self.inner.as_mut_slice() {
27            unsafe { ptr::write_volatile(c, default) };
28        }
29
30        atomic::fence(atomic::Ordering::SeqCst);
31        atomic::compiler_fence(atomic::Ordering::SeqCst);
32    }
33}
34
35impl Deref for SafeVec {
36    type Target = [u8];
37
38    fn deref(&self) -> &[u8] {
39        self.inner.deref()
40    }
41}
42
43impl DerefMut for SafeVec {
44    fn deref_mut(&mut self) -> &mut [u8] {
45        self.inner.deref_mut()
46    }
47}