summaryrefslogtreecommitdiffstats
path: root/src/depfile_parser.cc
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2011-12-29 20:44:15 (GMT)
committerEvan Martin <martine@danga.com>2011-12-29 20:44:15 (GMT)
commit47ba90bd530cfd269f40e61e5d41e87298812ddb (patch)
tree036c43c3d07eab02b49ca593eca4e54b5a9a8727 /src/depfile_parser.cc
parenteaf1ff190423b1cf41eb1b905192be07aeb6b22e (diff)
downloadNinja-47ba90bd530cfd269f40e61e5d41e87298812ddb.zip
Ninja-47ba90bd530cfd269f40e61e5d41e87298812ddb.tar.gz
Ninja-47ba90bd530cfd269f40e61e5d41e87298812ddb.tar.bz2
handle nuls more carefully in re2c rules
- '.' in re2c matches anything except \n, which means it matches \000. Be more careful about which characters we match. - The fallback rule [^] reads ahead another character, which means it can read past the trailing \000. Add a separate rule to match it specifically. This was found by Valgrind.
Diffstat (limited to 'src/depfile_parser.cc')
-rw-r--r--src/depfile_parser.cc51
1 files changed, 29 insertions, 22 deletions
diff --git a/src/depfile_parser.cc b/src/depfile_parser.cc
index 832ad65..4e842f8 100644
--- a/src/depfile_parser.cc
+++ b/src/depfile_parser.cc
@@ -84,42 +84,44 @@ bool DepfileParser::Parse(string* content, string* err) {
yych = *in;
if (yych <= '[') {
if (yych <= ':') {
- if (yych <= '*') goto yy6;
+ if (yych <= 0x00) goto yy6;
+ if (yych <= '*') goto yy8;
goto yy4;
} else {
- if (yych <= '@') goto yy6;
+ if (yych <= '@') goto yy8;
if (yych <= 'Z') goto yy4;
- goto yy6;
+ goto yy8;
}
} else {
if (yych <= '_') {
if (yych <= '\\') goto yy2;
- if (yych <= '^') goto yy6;
+ if (yych <= '^') goto yy8;
goto yy4;
} else {
- if (yych <= '`') goto yy6;
+ if (yych <= '`') goto yy8;
if (yych <= 'z') goto yy4;
- goto yy6;
+ goto yy8;
}
}
yy2:
++in;
if ((yych = *in) <= '$') {
- if (yych <= 0x1F) {
- if (yych != '\n') goto yy9;
+ if (yych <= '\n') {
+ if (yych <= 0x00) goto yy3;
+ if (yych <= '\t') goto yy11;
} else {
- if (yych <= ' ') goto yy11;
- if (yych <= '"') goto yy9;
- goto yy11;
+ if (yych == ' ') goto yy13;
+ if (yych <= '"') goto yy11;
+ goto yy13;
}
} else {
if (yych <= 'Z') {
- if (yych == '*') goto yy11;
- goto yy9;
+ if (yych == '*') goto yy13;
+ goto yy11;
} else {
- if (yych <= '\\') goto yy11;
- if (yych == '|') goto yy11;
- goto yy9;
+ if (yych <= '\\') goto yy13;
+ if (yych == '|') goto yy13;
+ goto yy11;
}
}
yy3:
@@ -131,7 +133,7 @@ yy3:
yy4:
++in;
yych = *in;
- goto yy8;
+ goto yy10;
yy5:
{
// Got a span of plain text. Copy it to out if necessary.
@@ -142,17 +144,22 @@ yy5:
continue;
}
yy6:
+ ++in;
+ {
+ break;
+ }
+yy8:
yych = *++in;
goto yy3;
-yy7:
+yy9:
++in;
yych = *in;
-yy8:
+yy10:
if (yybm[0+yych] & 128) {
- goto yy7;
+ goto yy9;
}
goto yy5;
-yy9:
+yy11:
++in;
{
// Let backslash before other characters through verbatim.
@@ -160,7 +167,7 @@ yy9:
*out++ = yych;
continue;
}
-yy11:
+yy13:
++in;
{
// De-escape backslashed character.