summaryrefslogtreecommitdiffstats
path: root/src/tree
diff options
context:
space:
mode:
authorCanop <cano.petrole@gmail.com>2020-10-22 12:30:04 +0200
committerCanop <cano.petrole@gmail.com>2020-10-22 12:30:04 +0200
commit381957355b14ff3e3fc61ed44b965ce67e37fe58 (patch)
tree541e3e3ecbbcc3cca41b25fff202e09e8868fb72 /src/tree
parent6df0b15c17fb2c4062399c050842abb65dffc006 (diff)
parent64956e00be787144245b148e83f630fa90f8ab4b (diff)
Merge branch 'master' into filesystems
Diffstat (limited to 'src/tree')
-rw-r--r--src/tree/tree_line_type.rs9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/tree/tree_line_type.rs b/src/tree/tree_line_type.rs
index eec12e4..9f79ab9 100644
--- a/src/tree/tree_line_type.rs
+++ b/src/tree/tree_line_type.rs
@@ -6,6 +6,9 @@ use {
},
};
+/// longer link chains are probably cyclic
+const MAX_LINK_CHAIN_LENGTH: usize = 10;
+
/// The type of a line which can be displayed as
/// part of a tree
#[derive(Debug, Clone, PartialEq)]
@@ -36,11 +39,17 @@ impl TreeLineType {
let mut final_metadata = fs::symlink_metadata(&final_target)?;
let mut final_ft = final_metadata.file_type();
let mut final_is_dir = final_ft.is_dir();
+ let mut link_chain_length = 1;
while final_ft.is_symlink() {
final_target = read_link(&final_target)?;
final_metadata = fs::symlink_metadata(&final_target)?;
final_ft = final_metadata.file_type();
final_is_dir = final_ft.is_dir();
+ link_chain_length += 1;
+ if link_chain_length > MAX_LINK_CHAIN_LENGTH {
+ info!("too long link chain (maybe cyclic) at {:?}", &direct_target);
+ return Ok(Self::BrokenSymLink(direct_target.to_string_lossy().into_owned()))
+ }
}
let direct_target = direct_target.to_string_lossy().into_owned();
Ok(Self::SymLink {