diff options
author | Xinchen Hui <laruence@gmail.com> | 2018-03-13 12:51:26 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2018-03-13 12:51:26 +0800 |
commit | 4ee9098514bcc4e56dfd9cb444283739c36cb6e3 (patch) | |
tree | f8a8e50617a61cb64cec8a7f539c1640ccb826cb | |
parent | 4cd64aad8ad2f85de4a3a1ab8b83ae6108ce9388 (diff) | |
download | php-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.c | 307 | ||||
-rw-r--r-- | ext/phar/phar_path_check.re | 8 |
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; |