about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJethro Beekman <jethro@jbeekman.nl>2018-07-13 10:14:16 -0700
committerJethro Beekman <jethro@jbeekman.nl>2018-07-13 10:14:16 -0700
commit488472d754a70d6b1c98e4d901dff438257ab06d (patch)
treec4c39acecd93104c1f78abf90b9ad53e3caa7d19
parente5f6498d3d5c9dac841009d7b49738923826af75 (diff)
downloadrust-488472d754a70d6b1c98e4d901dff438257ab06d.tar.gz
rust-488472d754a70d6b1c98e4d901dff438257ab06d.zip
Don't silently ignore invalid data in target spec
-rw-r--r--src/librustc_target/spec/mod.rs26
-rw-r--r--src/test/run-make-fulldeps/target-specs/my-x86_64-unknown-linux-gnu-platform.json2
2 files changed, 16 insertions, 12 deletions
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index 19e353c6a94..07c3ae69739 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -861,23 +861,27 @@ impl Target {
             } );
             ($key_name:ident, link_args) => ( {
                 let name = (stringify!($key_name)).replace("_", "-");
-                if let Some(obj) = obj.find(&name[..]).and_then(|o| o.as_object()) {
+                if let Some(val) = obj.find(&name[..]) {
+                    let obj = val.as_object().ok_or_else(|| format!("{}: expected a \
+                        JSON object with fields per linker-flavor.", name))?;
                     let mut args = LinkArgs::new();
                     for (k, v) in obj {
-                        let k = LinkerFlavor::from_str(&k).ok_or_else(|| {
+                        let flavor = LinkerFlavor::from_str(&k).ok_or_else(|| {
                             format!("{}: '{}' is not a valid value for linker-flavor. \
                                      Use 'em', 'gcc', 'ld' or 'msvc'", name, k)
                         })?;
 
-                        let v = v.as_array().map(|a| {
-                            a
-                                .iter()
-                                .filter_map(|o| o.as_string())
-                                .map(|s| s.to_owned())
-                                .collect::<Vec<_>>()
-                        }).unwrap_or(vec![]);
-
-                        args.insert(k, v);
+                        let v = v.as_array().ok_or_else(||
+                            format!("{}.{}: expected a JSON array", name, k)
+                        )?.iter().enumerate()
+                            .map(|(i,s)| {
+                                let s = s.as_string().ok_or_else(||
+                                    format!("{}.{}[{}]: expected a JSON string", name, k, i))?;
+                                Ok(s.to_owned())
+                            })
+                            .collect::<Result<Vec<_>, String>>()?;
+
+                        args.insert(flavor, v);
                     }
                     base.options.$key_name = args;
                 }
diff --git a/src/test/run-make-fulldeps/target-specs/my-x86_64-unknown-linux-gnu-platform.json b/src/test/run-make-fulldeps/target-specs/my-x86_64-unknown-linux-gnu-platform.json
index 3ae01d72fcc..48040ae3da0 100644
--- a/src/test/run-make-fulldeps/target-specs/my-x86_64-unknown-linux-gnu-platform.json
+++ b/src/test/run-make-fulldeps/target-specs/my-x86_64-unknown-linux-gnu-platform.json
@@ -1,5 +1,5 @@
 {
-    "pre-link-args": ["-m64"],
+    "pre-link-args": {"gcc": ["-m64"]},
     "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
     "linker-flavor": "gcc",
     "llvm-target": "x86_64-unknown-linux-gnu",