diff options
| author | Xinchen Hui <laruence@gmail.com> | 2017-08-06 17:48:05 +0800 |
|---|---|---|
| committer | Xinchen Hui <laruence@gmail.com> | 2017-08-06 17:48:05 +0800 |
| commit | 513b0093c2b480bb752fb354012f42c446769486 (patch) | |
| tree | 71b34ea413aef37d25f233324122bcdb278b7eda /ext/standard/url_scanner_ex.c | |
| parent | 6546c516dd61f7f9efecbd9144c02218614d4c51 (diff) | |
| download | php-git-513b0093c2b480bb752fb354012f42c446769486.tar.gz | |
Refactor php_url struct to save memory dup in common cases
Diffstat (limited to 'ext/standard/url_scanner_ex.c')
| -rw-r--r-- | ext/standard/url_scanner_ex.c | 395 |
1 files changed, 230 insertions, 165 deletions
diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c index 484d5d9c13..af8a3781d6 100644 --- a/ext/standard/url_scanner_ex.c +++ b/ext/standard/url_scanner_ex.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 */ +/* Generated by re2c 0.13.5 */ #line 1 "ext/standard/url_scanner_ex.re" /* +----------------------------------------------------------------------+ @@ -182,8 +182,6 @@ PHP_INI_END() static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *url_app, const char *separator) { php_url *url_parts; - char *tmp; - size_t tmp_len; smart_str_0(url); /* FIXME: Bug #70480 php_url_parse_ex() crashes by processing chars exceed len */ url_parts = php_url_parse_ex(ZSTR_VAL(url->s), ZSTR_LEN(url->s)); @@ -196,21 +194,23 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st /* Check protocol. Only http/https is allowed. */ if (url_parts->scheme - && strcasecmp("http", url_parts->scheme) - && strcasecmp("https", url_parts->scheme)) { + && !zend_string_equals_literal_ci(url_parts->scheme, "http") + && !zend_string_equals_literal_ci(url_parts->scheme, "https")) { smart_str_append_smart_str(dest, url); php_url_free(url_parts); return; } /* Check host whitelist. If it's not listed, do nothing. */ - if (url_parts->host - && (tmp_len = strlen(url_parts->host)) - && (tmp = php_strtolower(url_parts->host, tmp_len)) - && !zend_hash_str_find(&BG(url_adapt_session_hosts_ht), tmp, tmp_len)) { - smart_str_append_smart_str(dest, url); - php_url_free(url_parts); - return; + if (url_parts->host) { + zend_string *tmp = zend_string_tolower(url_parts->host); + if (!zend_hash_exists(&BG(url_adapt_session_hosts_ht), tmp)) { + zend_string_release(tmp); + smart_str_append_smart_str(dest, url); + php_url_free(url_parts); + return; + } + zend_string_release(tmp); } /* @@ -229,32 +229,32 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st } if (url_parts->scheme) { - smart_str_appends(dest, url_parts->scheme); + smart_str_appends(dest, ZSTR_VAL(url_parts->scheme)); smart_str_appends(dest, "://"); } else if (*(ZSTR_VAL(url->s)) == '/' && *(ZSTR_VAL(url->s)+1) == '/') { smart_str_appends(dest, "//"); } if (url_parts->user) { - smart_str_appends(dest, url_parts->user); + smart_str_appends(dest, ZSTR_VAL(url_parts->user)); if (url_parts->pass) { - smart_str_appends(dest, url_parts->pass); + smart_str_appends(dest, ZSTR_VAL(url_parts->pass)); smart_str_appendc(dest, ':'); } smart_str_appendc(dest, '@'); } if (url_parts->host) { - smart_str_appends(dest, url_parts->host); + smart_str_appends(dest, ZSTR_VAL(url_parts->host)); } if (url_parts->port) { smart_str_appendc(dest, ':'); smart_str_append_unsigned(dest, (long)url_parts->port); } if (url_parts->path) { - smart_str_appends(dest, url_parts->path); + smart_str_appends(dest, ZSTR_VAL(url_parts->path)); } smart_str_appendc(dest, '?'); if (url_parts->query) { - smart_str_appends(dest, url_parts->query); + smart_str_appends(dest, ZSTR_VAL(url_parts->query)); smart_str_appends(dest, separator); smart_str_append_smart_str(dest, url_app); } else { @@ -262,7 +262,7 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st } if (url_parts->fragment) { smart_str_appendc(dest, '#'); - smart_str_appends(dest, url_parts->fragment); + smart_str_appends(dest, ZSTR_VAL(url_parts->fragment)); } php_url_free(url_parts); } @@ -383,8 +383,8 @@ static int check_host_whitelist(url_adapt_state_ex_t *ctx) if (url_parts->scheme) { /* Only http/https should be handled. A bit hacky check this here, but saves a URL parse. */ - if (strcasecmp(url_parts->scheme, "http") && - strcasecmp(url_parts->scheme, "https")) { + if (!zend_string_equals_literal_ci(url_parts->scheme, "http") && + !zend_string_equals_literal_ci(url_parts->scheme, "https")) { php_url_free(url_parts); return FAILURE; } @@ -394,13 +394,11 @@ static int check_host_whitelist(url_adapt_state_ex_t *ctx) return SUCCESS; } if (!zend_hash_num_elements(allowed_hosts) && - check_http_host(url_parts->host) == SUCCESS) { + check_http_host(ZSTR_VAL(url_parts->host)) == SUCCESS) { php_url_free(url_parts); return SUCCESS; } - if (!zend_hash_str_find(allowed_hosts, - url_parts->host, - strlen(url_parts->host))) { + if (!zend_hash_find(allowed_hosts, url_parts->host)) { php_url_free(url_parts); return FAILURE; } @@ -513,7 +511,7 @@ state_plain_begin: state_plain: start = YYCURSOR; -#line 517 "ext/standard/url_scanner_ex.c" +#line 515 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -550,35 +548,34 @@ state_plain: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; + if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy2; + goto yy4; } - goto yy5; -yy2: + ++YYCURSOR; +#line 517 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); STATE = STATE_TAG; goto state_tag; } +#line 561 "ext/standard/url_scanner_ex.c" +yy4: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy2; + goto yy4; } -#line 520 "ext/standard/url_scanner_ex.re" +#line 518 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); goto state_plain; } -#line 569 "ext/standard/url_scanner_ex.c" -yy5: - ++YYCURSOR; -#line 519 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); STATE = STATE_TAG; goto state_tag; } -#line 574 "ext/standard/url_scanner_ex.c" +#line 571 "ext/standard/url_scanner_ex.c" } -#line 521 "ext/standard/url_scanner_ex.re" +#line 519 "ext/standard/url_scanner_ex.re" state_tag: start = YYCURSOR; -#line 582 "ext/standard/url_scanner_ex.c" +#line 579 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -615,27 +612,39 @@ state_tag: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - if (YYLIMIT <= YYCURSOR) YYFILL(1); + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy11; + if (yych <= '@') { + if (yych != ':') goto yy11; + } else { + if (yych <= 'Z') goto yy9; + if (yych <= '`') goto yy11; + if (yych >= '{') goto yy11; } +yy9: ++YYCURSOR; -#line 527 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); goto state_plain_begin; } -#line 627 "ext/standard/url_scanner_ex.c" + yych = *YYCURSOR; + goto yy14; +yy10: +#line 524 "ext/standard/url_scanner_ex.re" + { handle_tag(STD_ARGS); /* Sets STATE */; passthru(STD_ARGS); if (STATE == STATE_PLAIN) goto state_plain; else goto state_next_arg; } +#line 632 "ext/standard/url_scanner_ex.c" yy11: ++YYCURSOR; +#line 525 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); goto state_plain_begin; } +#line 637 "ext/standard/url_scanner_ex.c" +yy13: + ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; +yy14: if (yybm[0+yych] & 128) { - goto yy11; + goto yy13; } -#line 526 "ext/standard/url_scanner_ex.re" - { handle_tag(STD_ARGS); /* Sets STATE */; passthru(STD_ARGS); if (STATE == STATE_PLAIN) goto state_plain; else goto state_next_arg; } -#line 637 "ext/standard/url_scanner_ex.c" + goto yy10; } -#line 528 "ext/standard/url_scanner_ex.re" +#line 526 "ext/standard/url_scanner_ex.re" state_next_arg_begin: @@ -644,7 +653,7 @@ state_next_arg_begin: state_next_arg: start = YYCURSOR; -#line 648 "ext/standard/url_scanner_ex.c" +#line 657 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -683,57 +692,78 @@ state_next_arg: }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy18; - } - if (yych <= '>') { - if (yych == '/') goto yy21; - if (yych >= '>') goto yy22; + if (yych <= '.') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy25; + if (yych <= '\v') goto yy21; + goto yy25; + } else { + if (yych <= '\r') goto yy21; + if (yych == ' ') goto yy21; + goto yy25; + } } else { - if (yych <= 'Z') { - if (yych >= 'A') goto yy24; + if (yych <= '@') { + if (yych <= '/') goto yy17; + if (yych == '>') goto yy19; + goto yy25; } else { - if (yych <= '`') goto yy16; - if (yych <= 'z') goto yy24; + if (yych <= 'Z') goto yy23; + if (yych <= '`') goto yy25; + if (yych <= 'z') goto yy23; + goto yy25; } } -yy16: - ++YYCURSOR; yy17: -#line 539 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); goto state_plain_begin; } -#line 706 "ext/standard/url_scanner_ex.c" -yy18: ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy18; - } + if ((yych = *YYCURSOR) == '>') goto yy28; +yy18: #line 537 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); goto state_next_arg; } -#line 716 "ext/standard/url_scanner_ex.c" + { passthru(STD_ARGS); goto state_plain_begin; } +#line 724 "ext/standard/url_scanner_ex.c" +yy19: + ++YYCURSOR; +yy20: +#line 534 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); handle_form(STD_ARGS); goto state_plain_begin; } +#line 730 "ext/standard/url_scanner_ex.c" yy21: - yych = *++YYCURSOR; - if (yych != '>') goto yy17; + ++YYCURSOR; + yych = *YYCURSOR; + goto yy27; yy22: +#line 535 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); goto state_next_arg; } +#line 738 "ext/standard/url_scanner_ex.c" +yy23: ++YYCURSOR; #line 536 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); handle_form(STD_ARGS); goto state_plain_begin; } -#line 724 "ext/standard/url_scanner_ex.c" -yy24: - ++YYCURSOR; -#line 538 "ext/standard/url_scanner_ex.re" { --YYCURSOR; STATE = STATE_ARG; goto state_arg; } -#line 729 "ext/standard/url_scanner_ex.c" +#line 743 "ext/standard/url_scanner_ex.c" +yy25: + yych = *++YYCURSOR; + goto yy18; +yy26: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy27: + if (yybm[0+yych] & 128) { + goto yy26; + } + goto yy22; +yy28: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy20; } -#line 540 "ext/standard/url_scanner_ex.re" +#line 538 "ext/standard/url_scanner_ex.re" state_arg: start = YYCURSOR; -#line 737 "ext/standard/url_scanner_ex.c" +#line 767 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -770,35 +800,42 @@ state_arg: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - if (YYLIMIT <= YYCURSOR) YYFILL(1); + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yych <= '@') goto yy28; - if (yych <= 'Z') goto yy30; - if (yych <= '`') goto yy28; - if (yych <= 'z') goto yy30; -yy28: + if (yych <= '@') goto yy33; + if (yych <= 'Z') goto yy31; + if (yych <= '`') goto yy33; + if (yych >= '{') goto yy33; +yy31: ++YYCURSOR; -#line 546 "ext/standard/url_scanner_ex.re" + yych = *YYCURSOR; + goto yy36; +yy32: +#line 543 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto state_before_val; } +#line 817 "ext/standard/url_scanner_ex.c" +yy33: + ++YYCURSOR; +#line 544 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); STATE = STATE_NEXT_ARG; goto state_next_arg; } -#line 784 "ext/standard/url_scanner_ex.c" -yy30: +#line 822 "ext/standard/url_scanner_ex.c" +yy35: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; +yy36: if (yybm[0+yych] & 128) { - goto yy30; + goto yy35; } -#line 545 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto state_before_val; } -#line 794 "ext/standard/url_scanner_ex.c" + goto yy32; } -#line 547 "ext/standard/url_scanner_ex.re" +#line 545 "ext/standard/url_scanner_ex.re" state_before_val: start = YYCURSOR; -#line 802 "ext/standard/url_scanner_ex.c" +#line 839 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -837,44 +874,54 @@ state_before_val: }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yych == ' ') goto yy37; - if (yych == '=') goto yy38; - ++YYCURSOR; -yy36: -#line 553 "ext/standard/url_scanner_ex.re" - { --YYCURSOR; goto state_next_arg_begin; } -#line 847 "ext/standard/url_scanner_ex.c" -yy37: + if (yych == ' ') goto yy39; + if (yych == '=') goto yy41; + goto yy43; +yy39: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ' ') goto yy41; - if (yych != '=') goto yy36; -yy38: + if (yych == ' ') goto yy46; + if (yych == '=') goto yy44; +yy40: +#line 551 "ext/standard/url_scanner_ex.re" + { --YYCURSOR; goto state_next_arg_begin; } +#line 888 "ext/standard/url_scanner_ex.c" +yy41: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy45; +yy42: +#line 550 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; } +#line 896 "ext/standard/url_scanner_ex.c" +yy43: + yych = *++YYCURSOR; + goto yy40; +yy44: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; +yy45: if (yybm[0+yych] & 128) { - goto yy38; + goto yy44; } -#line 552 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; } -#line 861 "ext/standard/url_scanner_ex.c" -yy41: + goto yy42; +yy46: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yych == ' ') goto yy41; - if (yych == '=') goto yy38; + if (yych == ' ') goto yy46; + if (yych == '=') goto yy44; YYCURSOR = YYMARKER; - goto yy36; + goto yy40; } -#line 554 "ext/standard/url_scanner_ex.re" +#line 552 "ext/standard/url_scanner_ex.re" state_val: start = YYCURSOR; -#line 878 "ext/standard/url_scanner_ex.c" +#line 925 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -882,7 +929,7 @@ state_val: 224, 192, 192, 224, 224, 192, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, - 192, 224, 128, 224, 224, 224, 224, 64, + 192, 224, 64, 224, 224, 224, 224, 128, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 0, 224, @@ -913,69 +960,87 @@ state_val: }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 32) { - goto yy46; + if (yych <= ' ') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy54; + if (yych <= '\n') goto yy56; + goto yy54; + } else { + if (yych <= '\r') goto yy56; + if (yych <= 0x1F) goto yy54; + goto yy56; + } + } else { + if (yych <= '&') { + if (yych != '"') goto yy54; + } else { + if (yych <= '\'') goto yy53; + if (yych == '>') goto yy56; + goto yy54; + } } - if (yych <= ' ') goto yy49; - if (yych <= '"') goto yy51; - if (yych <= '\'') goto yy52; - goto yy49; -yy46: + yych = *(YYMARKER = ++YYCURSOR); + if (yych != '>') goto yy65; +yy52: +#line 561 "ext/standard/url_scanner_ex.re" + { passthru(STD_ARGS); goto state_next_arg_begin; } +#line 988 "ext/standard/url_scanner_ex.c" +yy53: + yych = *(YYMARKER = ++YYCURSOR); + if (yych == '>') goto yy52; + goto yy60; +yy54: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy58; +yy55: +#line 560 "ext/standard/url_scanner_ex.re" + { handle_val(STD_ARGS, 0, ' '); goto state_next_arg_begin; } +#line 1000 "ext/standard/url_scanner_ex.c" +yy56: + yych = *++YYCURSOR; + goto yy52; +yy57: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; +yy58: if (yybm[0+yych] & 32) { - goto yy46; + goto yy57; } -#line 562 "ext/standard/url_scanner_ex.re" - { handle_val(STD_ARGS, 0, ' '); goto state_next_arg_begin; } -#line 933 "ext/standard/url_scanner_ex.c" -yy49: - ++YYCURSOR; -yy50: -#line 563 "ext/standard/url_scanner_ex.re" - { passthru(STD_ARGS); goto state_next_arg_begin; } -#line 939 "ext/standard/url_scanner_ex.c" -yy51: - yych = *(YYMARKER = ++YYCURSOR); - if (yych == '>') goto yy50; - goto yy54; -yy52: - yych = *(YYMARKER = ++YYCURSOR); - if (yych == '>') goto yy50; - goto yy59; -yy53: + goto yy55; +yy59: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy54: +yy60: if (yybm[0+yych] & 64) { - goto yy53; + goto yy59; } - if (yych <= '"') goto yy56; -yy55: + if (yych <= '=') goto yy62; +yy61: YYCURSOR = YYMARKER; - goto yy50; -yy56: + goto yy52; +yy62: ++YYCURSOR; -#line 560 "ext/standard/url_scanner_ex.re" - { handle_val(STD_ARGS, 1, '"'); goto state_next_arg_begin; } -#line 964 "ext/standard/url_scanner_ex.c" -yy58: +#line 559 "ext/standard/url_scanner_ex.re" + { handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; } +#line 1029 "ext/standard/url_scanner_ex.c" +yy64: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy59: +yy65: if (yybm[0+yych] & 128) { - goto yy58; + goto yy64; } - if (yych >= '(') goto yy55; + if (yych >= '>') goto yy61; ++YYCURSOR; -#line 561 "ext/standard/url_scanner_ex.re" - { handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; } -#line 977 "ext/standard/url_scanner_ex.c" +#line 558 "ext/standard/url_scanner_ex.re" + { handle_val(STD_ARGS, 1, '"'); goto state_next_arg_begin; } +#line 1042 "ext/standard/url_scanner_ex.c" } -#line 564 "ext/standard/url_scanner_ex.re" +#line 562 "ext/standard/url_scanner_ex.re" stop: @@ -1103,7 +1168,7 @@ static inline void php_url_scanner_session_handler_impl(char *output, size_t out if (ZSTR_LEN(url_state->url_app.s) != 0) { *handled_output = url_adapt_ext(output, output_len, &len, (zend_bool) (mode & (PHP_OUTPUT_HANDLER_END | PHP_OUTPUT_HANDLER_CONT | PHP_OUTPUT_HANDLER_FLUSH | PHP_OUTPUT_HANDLER_FINAL) ? 1 : 0), url_state); - if (sizeof(uint32_t) < sizeof(size_t)) { + if (sizeof(uint) < sizeof(size_t)) { if (len > UINT_MAX) len = UINT_MAX; } |
