]> git.lizzy.rs Git - rust.git/commitdiff
Don't silently ignore invalid data in target spec
authorJethro Beekman <jethro@jbeekman.nl>
Fri, 13 Jul 2018 17:14:16 +0000 (10:14 -0700)
committerJethro Beekman <jethro@jbeekman.nl>
Fri, 13 Jul 2018 17:14:16 +0000 (10:14 -0700)
src/librustc_target/spec/mod.rs
src/test/run-make-fulldeps/target-specs/my-x86_64-unknown-linux-gnu-platform.json

index 19e353c6a942d67211d8e0c4e68af8cb6a7073ef..07c3ae6973969038e93ca9e43db257fb51ed3aa6 100644 (file)
@@ -861,23 +861,27 @@ macro_rules! key {
             } );
             ($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;
                 }
index 3ae01d72fcc18c4e0f617ef535ec99b81b4f38f8..48040ae3da0ef37223989998078d64bd383f1d5f 100644 (file)
@@ -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",