diff options
| author | Inokentiy Babushkin <twk@twki.de> | 2017-06-11 13:48:54 +0200 |
|---|---|---|
| committer | Inokentiy Babushkin <twk@twki.de> | 2017-06-11 13:48:54 +0200 |
| commit | 9a8bbe9da9a9c5537379ee38e755cf35c7a4fc96 (patch) | |
| tree | fd49c9be5cd815899e40b1bcad7b54b300d57652 | |
| parent | a5b8851e220d7a80222ea04d242603dd3392d17b (diff) | |
| download | rust-9a8bbe9da9a9c5537379ee38e755cf35c7a4fc96.tar.gz rust-9a8bbe9da9a9c5537379ee38e755cf35c7a4fc96.zip | |
Added hash verification to external source loading.
| -rw-r--r-- | src/libsyntax/codemap.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax_pos/lib.rs | 20 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index fb78b18b898..8e04e47e25f 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -567,13 +567,8 @@ impl CodeMapper for CodeMap { }; if *file_map.external_src.borrow() == ExternalSource::AbsentOk { - let mut external_src = file_map.external_src.borrow_mut(); - if let Ok(src) = self.file_loader.read_file(Path::new(&filename)) { - *external_src = ExternalSource::Present(src); - return true; - } else { - *external_src = ExternalSource::AbsentErr; - } + let src = self.file_loader.read_file(Path::new(&filename)).ok(); + return file_map.add_external_src(src); } false diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index 0bac896f6a2..719c25e2410 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -604,6 +604,26 @@ impl FileMap { lines.push(pos); } + /// add externally loaded source. + /// if the hash of the input doesn't match or no input is supplied via None, + /// it is interpreted as an error and the corresponding enum variant is set. + pub fn add_external_src(&self, src: Option<String>) -> bool { + let mut external_src = self.external_src.borrow_mut(); + if let Some(src) = src { + let mut hasher: StableHasher<u128> = StableHasher::new(); + hasher.write(src.as_bytes()); + + if hasher.finish() == self.src_hash { + *external_src = ExternalSource::Present(src); + return true; + } + } else { + *external_src = ExternalSource::AbsentErr; + } + + false + } + /// get a line from the list of pre-computed line-beginnings. /// line-number here is 0-based. pub fn get_line(&self, line_number: usize) -> Option<Cow<str>> { |
