From 2a3d0c1d29f99c96004564a74c0dc04f7713d870 Mon Sep 17 00:00:00 2001 From: Maya <96890070+VioletEternity@users.noreply.github.com> Date: Fri, 11 Mar 2022 23:31:23 +0000 Subject: [PATCH 1/2] ecp5: verify hex strings contain only valid characters. --- ecp5/bitstream.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ecp5/bitstream.cc b/ecp5/bitstream.cc index a23e4cd2..b1c60ccb 100644 --- a/ecp5/bitstream.cc +++ b/ecp5/bitstream.cc @@ -149,6 +149,8 @@ std::vector parse_init_str(const Property &p, int length, const char *cell for (int i = 0; i < int(str.length()) - 2; i++) { char c = str.at((str.size() - i) - 1); int nibble = chtohex(c); + if (nibble == (int)std::string::npos) + log_error("hex string has invalid char '%c' at position %d.\n", c, i); result.at(i * 4) = nibble & 0x1; if (i * 4 + 1 < length) result.at(i * 4 + 1) = nibble & 0x2; @@ -582,13 +584,16 @@ static std::vector parse_config_str(const Property &p, int length) if (base == "0b") { for (int i = 0; i < int(str.length()) - 2; i++) { char c = str.at((str.size() - 1) - i); - NPNR_ASSERT(c == '0' || c == '1'); + if (!(c == '0' || c == '1')) + log_error("binary string has invalid char '%c' at position %d.\n", c, i); word.at(i) = (c == '1'); } } else if (base == "0x") { for (int i = 0; i < int(str.length()) - 2; i++) { char c = str.at((str.size() - i) - 1); int nibble = chtohex(c); + if (nibble == (int)std::string::npos) + log_error("hex string has invalid char '%c' at position %d.\n", c, i); word.at(i * 4) = nibble & 0x1; if (i * 4 + 1 < length) word.at(i * 4 + 1) = nibble & 0x2; From 9f53bd42788460d6bebd4f2f50af32a710667c93 Mon Sep 17 00:00:00 2001 From: Maya <96890070+VioletEternity@users.noreply.github.com> Date: Fri, 11 Mar 2022 23:34:45 +0000 Subject: [PATCH 2/2] ecp5: accept lowercase characters in hex strings. --- ecp5/bitstream.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecp5/bitstream.cc b/ecp5/bitstream.cc index b1c60ccb..40d843b9 100644 --- a/ecp5/bitstream.cc +++ b/ecp5/bitstream.cc @@ -131,7 +131,7 @@ static void tie_cib_signal(Context *ctx, ChipConfig &cc, WireId wire, bool value inline int chtohex(char c) { static const std::string hex = "0123456789ABCDEF"; - return hex.find(c); + return hex.find(std::toupper(c)); } std::vector parse_init_str(const Property &p, int length, const char *cellname)