From c8574c39dcc263f28dcfa05022fab0874d5c277f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 24 Jul 2024 16:45:04 +0200 Subject: [PATCH] avoid loops in symlinks --- backend/windmill-worker/src/bun_executor.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/windmill-worker/src/bun_executor.rs b/backend/windmill-worker/src/bun_executor.rs index 01f42db976..c355a7d53b 100644 --- a/backend/windmill-worker/src/bun_executor.rs +++ b/backend/windmill-worker/src/bun_executor.rs @@ -462,7 +462,7 @@ pub fn copy_recursively( destination.as_ref().to_path_buf(), 0, )); - + let mut already_visited_symlinks = std::collections::HashSet::new(); while let Some((current_source, current_destination, level)) = stack.pop() { for entry in fs::read_dir(¤t_source)? { let entry = entry?; @@ -475,11 +475,21 @@ pub fn copy_recursively( } } } + let original = entry.path(); + if filetype.is_dir() { + if filetype.is_symlink() { + let link = fs::read_link(original)?; + if already_visited_symlinks.contains(&link) { + continue; + } + already_visited_symlinks.insert(link); + } else { + already_visited_symlinks.insert(original); + } fs::create_dir_all(&destination)?; stack.push((entry.path(), destination, level + 1)); } else { - let original = entry.path(); if let Err(e) = fs::hard_link(&original, &destination) { tracing::error!( "Could not hard link {original:?} to {destination:?}, trying symlink or copy (no_symlink={no_symlink}): {e:#}"