read_ilang: detect overflow of integer literals.
authorwhitequark <whitequark@whitequark.org>
Mon, 6 Apr 2020 10:32:02 +0000 (10:32 +0000)
committerwhitequark <whitequark@whitequark.org>
Mon, 6 Apr 2020 10:32:02 +0000 (10:32 +0000)
frontends/ilang/ilang_lexer.l

index 4fd0ae855a52c3ef15f0b39bee3137b8c80cc92c..e36818e4fc40856a5c44767e12436773d845bec2 100644 (file)
@@ -29,6 +29,7 @@
 #pragma clang diagnostic ignored "-Wdeprecated-register"
 #endif
 
+#include <cstdlib>
 #include "frontends/ilang/ilang_frontend.h"
 #include "ilang_parser.tab.hh"
 
@@ -88,7 +89,16 @@ USING_YOSYS_NAMESPACE
 "."[0-9]+              { rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }
 
 [0-9]+'[01xzm-]*       { rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_VALUE; }
--?[0-9]+               { rtlil_frontend_ilang_yylval.integer = atoi(yytext); return TOK_INT; }
+-?[0-9]+               {
+       char *end = NULL;
+       long value = strtol(yytext, &end, 10);
+       if (end != yytext + strlen(yytext))
+               return TOK_INVALID; // literal out of range of long
+       if (value < INT_MIN || value > INT_MAX)
+               return TOK_INVALID; // literal out of range of int (relevant mostly for LP64 platforms)
+       rtlil_frontend_ilang_yylval.integer = value;
+       return TOK_INT;
+}
 
 \"             { BEGIN(STRING); }
 <STRING>\\.    { yymore(); }