pubfn create_helper<R>(
base: &Path,
prefix: &OsStr,
suffix: &OsStr,
random_len: usize, mut f: impl FnMut(PathBuf) -> io::Result<R>,
) -> io::Result<R> { // Make the path absolute. Otherwise, changing the current directory can invalidate a stored // path (causing issues when cleaning up temporary files). letmut base = base; // re-borrow to shrink lifetime let base_path_storage; // slot to store the absolute path, if necessary. if !base.is_absolute() { let cur_dir = std::env::current_dir()?;
base_path_storage = cur_dir.join(base);
base = &base_path_storage;
}
let num_retries = if random_len != 0 { crate::NUM_RETRIES
} else { 1
};
// We fork the fastrand rng. letmut rng = fastrand::Rng::new(); for i in0..num_retries { // If we fail to create the file the first three times, re-seed from system randomness in // case an attacker is predicting our randomness (fastrand is predictable). If re-seeding // doesn't help, either: // // 1. We have lots of temporary files, possibly created by an attacker but not necessarily. // Re-seeding the randomness won't help here. // 2. We're failing to create random files for some other reason. This shouldn't be the case // given that we're checking error kinds, but it could happen. #[cfg(all(
feature = "getrandom",
any(windows, unix, target_os = "redox", target_os = "wasi")
))] if i == 3 { iflet Ok(seed) = getrandom::u64() {
rng.seed(seed);
}
} let _ = i; // avoid unused variable warning for the above.
let path = base.join(tmpname(&mut rng, prefix, suffix, random_len)); returnmatch f(path) {
Err(ref e) if e.kind() == io::ErrorKind::AlreadyExists && num_retries > 1 => continue, // AddrInUse can happen if we're creating a UNIX domain socket and // the path already exists.
Err(ref e) if e.kind() == io::ErrorKind::AddrInUse && num_retries > 1 => continue,
res => res,
};
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.