summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2018-03-13 12:51:26 +0800
committerXinchen Hui <laruence@gmail.com>2018-03-13 12:51:26 +0800
commit4ee9098514bcc4e56dfd9cb444283739c36cb6e3 (patch)
treef8a8e50617a61cb64cec8a7f539c1640ccb826cb
parent4cd64aad8ad2f85de4a3a1ab8b83ae6108ce9388 (diff)
downloadphp-git-4ee9098514bcc4e56dfd9cb444283739c36cb6e3.tar.gz
Fixed bug #76085 (Segmentation fault in buildFromIterator when directory name contains a \n)
-rw-r--r--ext/phar/phar_path_check.c307
-rw-r--r--ext/phar/phar_path_check.re8
2 files changed, 137 insertions, 178 deletions
diff --git a/ext/phar/phar_path_check.c b/ext/phar/phar_path_check.c
index f19ab7828f..c9f78023e6 100644
--- a/ext/phar/phar_path_check.c
+++ b/ext/phar/phar_path_check.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 */
+/* Generated by re2c 0.16 */
#line 1 "ext/phar/phar_path_check.re"
/*
+----------------------------------------------------------------------+
@@ -47,90 +47,105 @@ loop:
{
YYCTYPE yych;
unsigned int yyaccept = 0;
-
if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
yych = *YYCURSOR;
if (yych <= '[') {
if (yych <= ')') {
- if (yych <= '\t') {
- if (yych <= 0x00) goto yy21;
- goto yy23;
+ if (yych <= '\f') {
+ if (yych >= 0x01) goto yy4;
} else {
- if (yych <= '\n') goto yy2;
- if (yych <= 0x19) goto yy23;
- goto yy11;
+ if (yych <= '\r') goto yy6;
+ if (yych <= 0x19) goto yy4;
+ goto yy7;
}
} else {
if (yych <= '/') {
- if (yych <= '*') goto yy7;
- if (yych <= '.') goto yy11;
- goto yy3;
- } else {
- if (yych == '?') goto yy9;
+ if (yych <= '*') goto yy9;
+ if (yych <= '.') goto yy7;
goto yy11;
+ } else {
+ if (yych == '?') goto yy12;
+ goto yy7;
}
}
} else {
if (yych <= 0xEC) {
if (yych <= 0xC1) {
- if (yych <= '\\') goto yy5;
- if (yych <= 0x7F) goto yy11;
- goto yy23;
+ if (yych <= '\\') goto yy14;
+ if (yych <= 0x7F) goto yy7;
+ goto yy4;
} else {
- if (yych <= 0xDF) goto yy12;
- if (yych <= 0xE0) goto yy14;
- goto yy15;
+ if (yych <= 0xDF) goto yy16;
+ if (yych <= 0xE0) goto yy17;
+ goto yy18;
}
} else {
if (yych <= 0xF0) {
- if (yych <= 0xED) goto yy16;
- if (yych <= 0xEF) goto yy17;
- goto yy18;
+ if (yych <= 0xED) goto yy19;
+ if (yych <= 0xEF) goto yy18;
+ goto yy20;
} else {
- if (yych <= 0xF3) goto yy19;
- if (yych <= 0xF4) goto yy20;
- goto yy23;
+ if (yych <= 0xF3) goto yy21;
+ if (yych <= 0xF4) goto yy22;
+ goto yy4;
}
}
}
-yy2:
- YYCURSOR = YYMARKER;
- if (yyaccept <= 0) {
- goto yy4;
- } else {
- goto yy13;
- }
-yy3:
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '-') goto yy4;
- if (yych <= '.') goto yy35;
- if (yych <= '/') goto yy36;
-yy4:
-#line 88 "ext/phar/phar_path_check.re"
+ ++YYCURSOR;
+#line 93 "ext/phar/phar_path_check.re"
{
- goto loop;
+ if (**s == '/') {
+ (*s)++;
+ (*len)--;
+ }
+ if ((p - (const unsigned char*)*s) - 1 != *len)
+ {
+ *error ="illegal character";
+ return pcr_err_illegal_char;
+ }
+ *error = NULL;
+ return pcr_is_ok;
}
-#line 115 "ext/phar/phar_path_check.c"
-yy5:
+#line 110 "ext/phar/phar_path_check.c"
+yy4:
++YYCURSOR;
-#line 72 "ext/phar/phar_path_check.re"
+yy5:
+#line 106 "ext/phar/phar_path_check.re"
{
- *error = "back-slash";
- return pcr_err_back_slash;
+ *error ="illegal character";
+ return pcr_err_illegal_char;
}
-#line 123 "ext/phar/phar_path_check.c"
+#line 119 "ext/phar/phar_path_check.c"
+yy6:
+ yych = *++YYCURSOR;
+ if (yych == '\n') goto yy4;
+ goto yy5;
yy7:
++YYCURSOR;
-#line 76 "ext/phar/phar_path_check.re"
+yy8:
+#line 90 "ext/phar/phar_path_check.re"
{
- *error = "star";
- return pcr_err_star;
+ goto loop;
}
#line 131 "ext/phar/phar_path_check.c"
yy9:
++YYCURSOR;
-#line 80 "ext/phar/phar_path_check.re"
+#line 78 "ext/phar/phar_path_check.re"
+ {
+ *error = "star";
+ return pcr_err_star;
+ }
+#line 139 "ext/phar/phar_path_check.c"
+yy11:
+ yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= '-') goto yy8;
+ if (yych <= '.') goto yy23;
+ if (yych <= '/') goto yy25;
+ goto yy8;
+yy12:
+ ++YYCURSOR;
+#line 82 "ext/phar/phar_path_check.re"
{
if (**s == '/') {
(*s)++;
@@ -139,166 +154,108 @@ yy9:
*error = NULL;
return pcr_use_query;
}
-#line 143 "ext/phar/phar_path_check.c"
-yy11:
- yych = *++YYCURSOR;
- goto yy4;
-yy12:
+#line 158 "ext/phar/phar_path_check.c"
+yy14:
++YYCURSOR;
- if ((yych = *YYCURSOR) <= 0x7F) goto yy13;
- if (yych <= 0xBF) goto yy26;
-yy13:
-#line 104 "ext/phar/phar_path_check.re"
+#line 74 "ext/phar/phar_path_check.re"
{
- *error ="illegal character";
- return pcr_err_illegal_char;
+ *error = "back-slash";
+ return pcr_err_back_slash;
}
-#line 157 "ext/phar/phar_path_check.c"
-yy14:
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x9F) goto yy13;
- if (yych <= 0xBF) goto yy34;
- goto yy13;
-yy15:
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x7F) goto yy13;
- if (yych <= 0xBF) goto yy33;
- goto yy13;
+#line 166 "ext/phar/phar_path_check.c"
yy16:
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x7F) goto yy13;
- if (yych <= 0x9F) goto yy32;
- goto yy13;
+ yych = *++YYCURSOR;
+ if (yych <= 0x7F) goto yy5;
+ if (yych <= 0xBF) goto yy7;
+ goto yy5;
yy17:
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x7F) goto yy13;
- if (yych <= 0xBF) goto yy31;
- goto yy13;
+ if (yych <= 0x9F) goto yy5;
+ if (yych <= 0xBF) goto yy27;
+ goto yy5;
yy18:
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x8F) goto yy13;
- if (yych <= 0xBF) goto yy29;
- goto yy13;
+ if (yych <= 0x7F) goto yy5;
+ if (yych <= 0xBF) goto yy27;
+ goto yy5;
yy19:
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x7F) goto yy13;
- if (yych <= 0xBF) goto yy27;
- goto yy13;
+ if (yych <= 0x7F) goto yy5;
+ if (yych <= 0x9F) goto yy27;
+ goto yy5;
yy20:
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x7F) goto yy13;
- if (yych <= 0x8F) goto yy24;
- goto yy13;
+ if (yych <= 0x8F) goto yy5;
+ if (yych <= 0xBF) goto yy28;
+ goto yy5;
yy21:
- ++YYCURSOR;
-#line 91 "ext/phar/phar_path_check.re"
- {
- if (**s == '/') {
- (*s)++;
- (*len)--;
- }
- if ((p - (const unsigned char*)*s) - 1 != *len)
- {
- *error ="illegal character";
- return pcr_err_illegal_char;
- }
- *error = NULL;
- return pcr_is_ok;
- }
-#line 216 "ext/phar/phar_path_check.c"
+ yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= 0x7F) goto yy5;
+ if (yych <= 0xBF) goto yy28;
+ goto yy5;
+yy22:
+ yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= 0x7F) goto yy5;
+ if (yych <= 0x8F) goto yy28;
+ goto yy5;
yy23:
yych = *++YYCURSOR;
- goto yy13;
+ if (yych <= 0x00) goto yy29;
+ if (yych <= '-') goto yy24;
+ if (yych <= '.') goto yy31;
+ if (yych <= '/') goto yy29;
yy24:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych >= 0xC0) goto yy2;
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych >= 0xC0) goto yy2;
-yy26:
- yych = *++YYCURSOR;
- goto yy4;
-yy27:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych >= 0xC0) goto yy2;
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych <= 0xBF) goto yy26;
- goto yy2;
-yy29:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych >= 0xC0) goto yy2;
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych <= 0xBF) goto yy26;
- goto yy2;
-yy31:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych <= 0xBF) goto yy26;
- goto yy2;
-yy32:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych <= 0xBF) goto yy26;
- goto yy2;
-yy33:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych <= 0xBF) goto yy26;
- goto yy2;
-yy34:
- yych = *++YYCURSOR;
- if (yych <= 0x7F) goto yy2;
- if (yych <= 0xBF) goto yy26;
- goto yy2;
-yy35:
- yych = *++YYCURSOR;
- if (yych <= 0x00) goto yy39;
- if (yych <= '-') goto yy2;
- if (yych <= '.') goto yy38;
- if (yych <= '/') goto yy39;
- goto yy2;
-yy36:
+ YYCURSOR = YYMARKER;
+ if (yyaccept == 0) {
+ goto yy8;
+ } else {
+ goto yy5;
+ }
+yy25:
++YYCURSOR;
-#line 60 "ext/phar/phar_path_check.re"
+#line 62 "ext/phar/phar_path_check.re"
{
*error = "double slash";
return pcr_err_double_slash;
}
-#line 280 "ext/phar/phar_path_check.c"
-yy38:
+#line 228 "ext/phar/phar_path_check.c"
+yy27:
yych = *++YYCURSOR;
- if (yych <= 0x00) goto yy41;
- if (yych == '/') goto yy41;
- goto yy2;
-yy39:
+ if (yych <= 0x7F) goto yy24;
+ if (yych <= 0xBF) goto yy7;
+ goto yy24;
+yy28:
+ yych = *++YYCURSOR;
+ if (yych <= 0x7F) goto yy24;
+ if (yych <= 0xBF) goto yy27;
+ goto yy24;
+yy29:
++YYCURSOR;
-#line 68 "ext/phar/phar_path_check.re"
+#line 70 "ext/phar/phar_path_check.re"
{
*error = "current directory reference";
return pcr_err_curr_dir;
}
-#line 293 "ext/phar/phar_path_check.c"
-yy41:
+#line 246 "ext/phar/phar_path_check.c"
+yy31:
+ yych = *++YYCURSOR;
+ if (yych <= 0x00) goto yy32;
+ if (yych != '/') goto yy24;
+yy32:
++YYCURSOR;
-#line 64 "ext/phar/phar_path_check.re"
+#line 66 "ext/phar/phar_path_check.re"
{
*error = "upper directory reference";
return pcr_err_up_dir;
}
-#line 301 "ext/phar/phar_path_check.c"
+#line 258 "ext/phar/phar_path_check.c"
}
-#line 108 "ext/phar/phar_path_check.re"
+#line 110 "ext/phar/phar_path_check.re"
}
diff --git a/ext/phar/phar_path_check.re b/ext/phar/phar_path_check.re
index fd95207bc2..e4d54a4355 100644
--- a/ext/phar/phar_path_check.re
+++ b/ext/phar/phar_path_check.re
@@ -41,7 +41,8 @@ phar_path_check_result phar_path_check(char **s, int *len, const char **error)
loop:
/*!re2c
-END = "\x00";
+END = "\x00";
+NEWLINE = "\r"? "\n";
UTF8T = [\x80-\xBF] ;
UTF8_1 = [\x1A-\x7F] ;
UTF8_2 = [\xC2-\xDF] UTF8T ;
@@ -55,8 +56,9 @@ UTF8_4B = [\xF1-\xF3] UTF8T{3} ;
UTF8_4C = "\xF4" [\x80-\x8F] UTF8T{2} ;
UTF8_4 = UTF8_4A | UTF8_4B | UTF8_4C ;
UTF8 = UTF8_1 | UTF8_2 | UTF8_3 | UTF8_4 ;
-EOS = "/" | END;
-ANY = .;
+EOS = "/" | END;
+ANY = . | NEWLINE;
+
"//" {
*error = "double slash";
return pcr_err_double_slash;