Restore persistent system path composition
This commit is contained in:
parent
84bb22a7db
commit
7aff8e542e
2 changed files with 338 additions and 30 deletions
|
|
@ -265,6 +265,7 @@ fn validate_owned_directory(descriptor: &OwnedFd, uid: u32) -> Result<(), Config
|
|||
pub(super) fn validate_persistent_destinations(
|
||||
destinations: &[String],
|
||||
protected: &BTreeSet<String>,
|
||||
nested_transient_overrides: &BTreeSet<String>,
|
||||
) -> Result<Vec<String>, ConfigurationError> {
|
||||
require_pairwise_non_ancestral(
|
||||
destinations.iter().map(String::as_str),
|
||||
|
|
@ -272,11 +273,32 @@ pub(super) fn validate_persistent_destinations(
|
|||
)?;
|
||||
for destination in destinations {
|
||||
validate_sandbox_path(destination)?;
|
||||
require_clear_of_protected(destination, protected)?;
|
||||
require_persistent_clear_of_protected(destination, protected, nested_transient_overrides)?;
|
||||
}
|
||||
Ok(destinations.to_vec())
|
||||
}
|
||||
|
||||
fn require_persistent_clear_of_protected(
|
||||
destination: &str,
|
||||
protected: &BTreeSet<String>,
|
||||
nested_transient_overrides: &BTreeSet<String>,
|
||||
) -> Result<(), ConfigurationError> {
|
||||
let conflict = protected.iter().any(|protected| {
|
||||
destination == protected
|
||||
|| sandbox_is_strict_descendant(destination, protected)
|
||||
|| (sandbox_is_strict_descendant(protected, destination)
|
||||
&& !nested_transient_overrides.contains(protected))
|
||||
});
|
||||
if conflict {
|
||||
Err(ConfigurationError::new(
|
||||
ConfigurationErrorKind::PathConflict,
|
||||
"configured sandbox destination intersects a protected destination",
|
||||
))
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn require_clear_of_protected(
|
||||
destination: &str,
|
||||
protected: &BTreeSet<String>,
|
||||
|
|
|
|||
|
|
@ -150,6 +150,7 @@ pub fn load_trusted_configuration(
|
|||
let persistent_dirs = validate_persistent_destinations(
|
||||
&selected.persistent_dirs,
|
||||
request.sandbox_layout.protected_destinations(),
|
||||
request.sandbox_layout.nested_transient_overrides(),
|
||||
)?;
|
||||
let (effective_allow_prefixes, effective_deny_prefixes) =
|
||||
resolve_network(&configuration, selected)?;
|
||||
|
|
|
|||
Loading…
Reference in a new issue