Fixed RTLIL::SigSpec::parse() for out-of-range bit- and part-selects
authorClifford Wolf <clifford@clifford.at>
Wed, 15 Oct 2014 22:54:14 +0000 (00:54 +0200)
committerClifford Wolf <clifford@clifford.at>
Wed, 15 Oct 2014 22:54:14 +0000 (00:54 +0200)
kernel/rtlil.cc

index 28f0dfdc5f103a443f9036fc713e432275ba80e8..5a94008d83023b4ae342377204275f4917366cf6 100644 (file)
@@ -2980,7 +2980,10 @@ bool RTLIL::SigSpec::parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::stri
                        sigspec_parse_split(index_tokens, indices.substr(1, indices.size()-2), ':');
                        if (index_tokens.size() == 1) {
                                cover("kernel.rtlil.sigspec.parse.bit_sel");
-                               sig.append(RTLIL::SigSpec(wire, atoi(index_tokens.at(0).c_str())));
+                               int a = atoi(index_tokens.at(0).c_str());
+                               if (a < 0 || a >= wire->width)
+                                       return false;
+                               sig.append(RTLIL::SigSpec(wire, a));
                        } else {
                                cover("kernel.rtlil.sigspec.parse.part_sel");
                                int a = atoi(index_tokens.at(0).c_str());
@@ -2989,6 +2992,10 @@ bool RTLIL::SigSpec::parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::stri
                                        int tmp = a;
                                        a = b, b = tmp;
                                }
+                               if (a < 0 || a >= wire->width)
+                                       return false;
+                               if (b < 0 || b >= wire->width)
+                                       return false;
                                sig.append(RTLIL::SigSpec(wire, a, b-a+1));
                        }
                } else