diff options
Diffstat (limited to 'src/archive.rs')
| -rw-r--r-- | src/archive.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/archive.rs b/src/archive.rs index 9a899bf..ad424c4 100644 --- a/src/archive.rs +++ b/src/archive.rs @@ -26,6 +26,7 @@ impl NativeTarWriter { } let output = output.as_ref(); + reject_output_inside_rootfs(rootfs, output)?; let temporary = temporary_output_path(output)?; let result = (|| { let file = OpenOptions::new() @@ -53,6 +54,24 @@ impl NativeTarWriter { } } +fn reject_output_inside_rootfs(rootfs: &Path, output: &Path) -> Result<()> { + let rootfs = rootfs + .canonicalize() + .with_context(|| format!("canonicalize rootfs {}", rootfs.display()))?; + let output_parent = output.parent().unwrap_or_else(|| Path::new(".")); + let output_parent = output_parent + .canonicalize() + .with_context(|| format!("canonicalize archive output parent {}", output_parent.display()))?; + if output_parent.starts_with(&rootfs) { + bail!( + "archive output must not be inside rootfs: {} is below {}", + output.display(), + rootfs.display() + ); + } + Ok(()) +} + fn temporary_output_path(output: &Path) -> Result<PathBuf> { let name = output .file_name() |