/rust/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.4.3/src/utils/sanitizer.rs
Line | Count | Source |
1 | | use core::mem::MaybeUninit; |
2 | | |
3 | | /// Unpoisons `buf` if MSAN support is enabled. |
4 | | /// |
5 | | /// Most backends do not need to unpoison their output. Rust language- and |
6 | | /// library- provided functionality unpoisons automatically. Similarly, libc |
7 | | /// either natively supports MSAN and/or MSAN hooks libc-provided functions |
8 | | /// to unpoison outputs on success. Only when all of these things are |
9 | | /// bypassed do we need to do it ourselves. |
10 | | /// |
11 | | /// The call to unpoison should be done as close to the write as possible. |
12 | | /// For example, if the backend partially fills the output buffer in chunks, |
13 | | /// each chunk should be unpoisoned individually. This way, the correctness of |
14 | | /// the chunking logic can be validated (in part) using MSAN. |
15 | 0 | pub unsafe fn unpoison(buf: &mut [MaybeUninit<u8>]) { |
16 | | cfg_if! { |
17 | | if #[cfg(getrandom_msan)] { |
18 | | unsafe extern "C" { |
19 | | fn __msan_unpoison(a: *mut core::ffi::c_void, size: usize); |
20 | | } |
21 | | let a = buf.as_mut_ptr().cast(); |
22 | | let size = buf.len(); |
23 | | unsafe { __msan_unpoison(a, size) }; |
24 | | } else { |
25 | 0 | let _ = buf; |
26 | | } |
27 | | } |
28 | 0 | } |