]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - scripts/dtc/dtc-lexer.l
scripts/dtc: Update to upstream commit b06e55c88b9b
[mirror_ubuntu-artful-kernel.git] / scripts / dtc / dtc-lexer.l
index 0ee1caf03dd057bee8c212002568941f0658edd7..790fbf6cf2d75349780a5c849cdb9cdb697f5019 100644 (file)
@@ -73,24 +73,32 @@ static void lexical_error(const char *fmt, ...);
                }
 
 <*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? {
-                       char *line, *tmp, *fn;
+                       char *line, *fnstart, *fnend;
+                       struct data fn;
                        /* skip text before line # */
                        line = yytext;
                        while (!isdigit((unsigned char)*line))
                                line++;
-                       /* skip digits in line # */
-                       tmp = line;
-                       while (!isspace((unsigned char)*tmp))
-                               tmp++;
-                       /* "NULL"-terminate line # */
-                       *tmp = '\0';
-                       /* start of filename */
-                       fn = strchr(tmp + 1, '"') + 1;
-                       /* strip trailing " from filename */
-                       tmp = strchr(fn, '"');
-                       *tmp = 0;
+
+                       /* regexp ensures that first and list "
+                        * in the whole yytext are those at
+                        * beginning and end of the filename string */
+                       fnstart = memchr(yytext, '"', yyleng);
+                       for (fnend = yytext + yyleng - 1;
+                            *fnend != '"'; fnend--)
+                               ;
+                       assert(fnstart && fnend && (fnend > fnstart));
+
+                       fn = data_copy_escape_string(fnstart + 1,
+                                                    fnend - fnstart - 1);
+
+                       /* Don't allow nuls in filenames */
+                       if (memchr(fn.val, '\0', fn.len - 1))
+                               lexical_error("nul in line number directive");
+
                        /* -1 since #line is the number of the next line */
-                       srcpos_set_line(xstrdup(fn), atoi(line) - 1);
+                       srcpos_set_line(xstrdup(fn.val), atoi(line) - 1);
+                       data_free(fn);
                }
 
 <*><<EOF>>             {
@@ -153,7 +161,10 @@ static void lexical_error(const char *fmt, ...);
                        errno = 0;
                        yylval.integer = strtoull(yytext, &e, 0);
 
-                       assert(!(*e) || !e[strspn(e, "UL")]);
+                       if (*e && e[strspn(e, "UL")]) {
+                               lexical_error("Bad integer literal '%s'",
+                                             yytext);
+                       }
 
                        if (errno == ERANGE)
                                lexical_error("Integer literal '%s' out of range",