diff options
author | Canop <cano.petrole@gmail.com> | 2020-10-22 12:30:04 +0200 |
---|---|---|
committer | Canop <cano.petrole@gmail.com> | 2020-10-22 12:30:04 +0200 |
commit | 381957355b14ff3e3fc61ed44b965ce67e37fe58 (patch) | |
tree | 541e3e3ecbbcc3cca41b25fff202e09e8868fb72 /src/tree | |
parent | 6df0b15c17fb2c4062399c050842abb65dffc006 (diff) | |
parent | 64956e00be787144245b148e83f630fa90f8ab4b (diff) |
Merge branch 'master' into filesystems
Diffstat (limited to 'src/tree')
-rw-r--r-- | src/tree/tree_line_type.rs | 9 |
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 { |