build.plat: restrict design names to alphanumeric to avoid quoting issues.
authorwhitequark <whitequark@whitequark.org>
Sun, 22 Sep 2019 06:57:28 +0000 (06:57 +0000)
committerwhitequark <whitequark@whitequark.org>
Sun, 22 Sep 2019 06:57:28 +0000 (06:57 +0000)
nmigen/build/plat.py

index 4b80dfc7c79c31062cbdba31356d7b990ff85706..d5c106097673bbcbcce36aaa9dd60f70766fcf85 100644 (file)
@@ -257,6 +257,17 @@ class TemplatedPlatform(Platform):
     }
 
     def toolchain_prepare(self, fragment, name, **kwargs):
+        # Restrict the name of the design to a strict alphanumeric character set. Platforms will
+        # interpolate the name of the design in many different contexts: filesystem paths, Python
+        # scripts, Tcl scripts, ad-hoc constraint files, and so on. It is not practical to add
+        # escaping code that handles every one of their edge cases, so make sure we never hit them
+        # in the first place.
+        invalid_char = re.match(r"[^A-Za-z0-9_]", name)
+        if invalid_char:
+            raise ValueError("Design name {!r} contains invalid character {!r}; only alphanumeric "
+                             "characters are valid in design names"
+                             .format(name, invalid_char.group(0)))
+
         # This notice serves a dual purpose: to explain that the file is autogenerated,
         # and to incorporate the nMigen version into generated code.
         autogenerated = "Automatically generated by nMigen {}. Do not edit.".format(__version__)