diff --git a/src/contract.rs b/src/contract.rs index 3940b1a..38fd1c8 100644 --- a/src/contract.rs +++ b/src/contract.rs @@ -218,7 +218,12 @@ impl Metadata { self.sources() .into_iter() .map(|(path, entry)| { - let path = root.join(path); + // This is relevant because the etherscan [Metadata](crate::contract::Metadata) can + // contain absolute paths (supported by standard-json-input). See also: + // for example, we want to ensure "/contracts/SimpleToken.sol" is mapped to + // `/contracts/SimpleToken.sol`. + let sanitized_path = crate::source_tree::sanitize_path(path); + let path = root.join(sanitized_path); SourceTreeEntry { path, contents: entry.content } }) .collect() diff --git a/src/source_tree.rs b/src/source_tree.rs index 4ec55ad..06f2e7f 100644 --- a/src/source_tree.rs +++ b/src/source_tree.rs @@ -36,8 +36,9 @@ impl SourceTree { } /// Remove any components in a smart contract source path that could cause a directory traversal. -fn sanitize_path(path: &Path) -> PathBuf { - let sanitized = Path::new(path) +pub(crate) fn sanitize_path(path: impl AsRef) -> PathBuf { + let sanitized = path + .as_ref() .components() .filter(|x| x.as_os_str() != Component::ParentDir.as_os_str()) .collect::();