about summary refs log tree commit diff
diff options
context:
space:
mode:
authorInokentiy Babushkin <twk@twki.de>2017-06-11 13:48:54 +0200
committerInokentiy Babushkin <twk@twki.de>2017-06-11 13:48:54 +0200
commit9a8bbe9da9a9c5537379ee38e755cf35c7a4fc96 (patch)
treefd49c9be5cd815899e40b1bcad7b54b300d57652
parenta5b8851e220d7a80222ea04d242603dd3392d17b (diff)
downloadrust-9a8bbe9da9a9c5537379ee38e755cf35c7a4fc96.tar.gz
rust-9a8bbe9da9a9c5537379ee38e755cf35c7a4fc96.zip
Added hash verification to external source loading.
-rw-r--r--src/libsyntax/codemap.rs9
-rw-r--r--src/libsyntax_pos/lib.rs20
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>> {