diff options
Diffstat (limited to 'ext/standard/url_scanner_ex.c')
| -rw-r--r-- | ext/standard/url_scanner_ex.c | 148 |
1 files changed, 75 insertions, 73 deletions
diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c index 5784de98d2..54995dc0b1 100644 --- a/ext/standard/url_scanner_ex.c +++ b/ext/standard/url_scanner_ex.c @@ -89,13 +89,17 @@ static int php_ini_on_update_tags(zend_ini_entry *entry, zend_string *new_value, if (val) { char *q; size_t keylen; + zend_string *str; *val++ = '\0'; for (q = key; *q; q++) { *q = tolower(*q); } keylen = q - key; - zend_hash_str_add_mem(ctx->tags, key, keylen, val, strlen(val)+1); + str = zend_string_init(key, keylen, 1); + GC_MAKE_PERSISTENT_LOCAL(str); + zend_hash_add_mem(ctx->tags, str, val, strlen(val)+1); + zend_string_release(str); } } @@ -170,7 +174,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("url_rewriter.hosts", "", PHP_INI_ALL, OnUpdateOutputHosts, url_adapt_session_hosts_ht, php_basic_globals, basic_globals) PHP_INI_END() -#line 177 "ext/standard/url_scanner_ex.re" +#line 181 "ext/standard/url_scanner_ex.re" #define YYFILL(n) goto done @@ -182,8 +186,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)); @@ -203,21 +205,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); } /* @@ -235,32 +239,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 { @@ -268,7 +272,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); } @@ -389,8 +393,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; } @@ -400,13 +404,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; } @@ -519,7 +521,7 @@ state_plain_begin: state_plain: start = YYCURSOR; -#line 523 "ext/standard/url_scanner_ex.c" +#line 525 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -569,22 +571,22 @@ yy2: if (yybm[0+yych] & 128) { goto yy2; } -#line 526 "ext/standard/url_scanner_ex.re" +#line 528 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); goto state_plain; } -#line 575 "ext/standard/url_scanner_ex.c" +#line 577 "ext/standard/url_scanner_ex.c" yy5: ++YYCURSOR; -#line 525 "ext/standard/url_scanner_ex.re" +#line 527 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); STATE = STATE_TAG; goto state_tag; } -#line 580 "ext/standard/url_scanner_ex.c" +#line 582 "ext/standard/url_scanner_ex.c" } -#line 527 "ext/standard/url_scanner_ex.re" +#line 529 "ext/standard/url_scanner_ex.re" state_tag: start = YYCURSOR; -#line 588 "ext/standard/url_scanner_ex.c" +#line 590 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -627,9 +629,9 @@ state_tag: goto yy11; } ++YYCURSOR; -#line 533 "ext/standard/url_scanner_ex.re" +#line 535 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); goto state_plain_begin; } -#line 633 "ext/standard/url_scanner_ex.c" +#line 635 "ext/standard/url_scanner_ex.c" yy11: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -637,11 +639,11 @@ yy11: if (yybm[0+yych] & 128) { goto yy11; } -#line 532 "ext/standard/url_scanner_ex.re" +#line 534 "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 643 "ext/standard/url_scanner_ex.c" +#line 645 "ext/standard/url_scanner_ex.c" } -#line 534 "ext/standard/url_scanner_ex.re" +#line 536 "ext/standard/url_scanner_ex.re" state_next_arg_begin: @@ -650,7 +652,7 @@ state_next_arg_begin: state_next_arg: start = YYCURSOR; -#line 654 "ext/standard/url_scanner_ex.c" +#line 656 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -706,9 +708,9 @@ state_next_arg: yy16: ++YYCURSOR; yy17: -#line 545 "ext/standard/url_scanner_ex.re" +#line 547 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); goto state_plain_begin; } -#line 712 "ext/standard/url_scanner_ex.c" +#line 714 "ext/standard/url_scanner_ex.c" yy18: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -716,30 +718,30 @@ yy18: if (yybm[0+yych] & 128) { goto yy18; } -#line 543 "ext/standard/url_scanner_ex.re" +#line 545 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); goto state_next_arg; } -#line 722 "ext/standard/url_scanner_ex.c" +#line 724 "ext/standard/url_scanner_ex.c" yy21: yych = *++YYCURSOR; if (yych != '>') goto yy17; yy22: ++YYCURSOR; -#line 542 "ext/standard/url_scanner_ex.re" +#line 544 "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" +#line 732 "ext/standard/url_scanner_ex.c" yy24: ++YYCURSOR; -#line 544 "ext/standard/url_scanner_ex.re" +#line 546 "ext/standard/url_scanner_ex.re" { --YYCURSOR; STATE = STATE_ARG; goto state_arg; } -#line 735 "ext/standard/url_scanner_ex.c" +#line 737 "ext/standard/url_scanner_ex.c" } -#line 546 "ext/standard/url_scanner_ex.re" +#line 548 "ext/standard/url_scanner_ex.re" state_arg: start = YYCURSOR; -#line 743 "ext/standard/url_scanner_ex.c" +#line 745 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -784,9 +786,9 @@ state_arg: if (yych <= 'z') goto yy30; yy28: ++YYCURSOR; -#line 552 "ext/standard/url_scanner_ex.re" +#line 554 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); STATE = STATE_NEXT_ARG; goto state_next_arg; } -#line 790 "ext/standard/url_scanner_ex.c" +#line 792 "ext/standard/url_scanner_ex.c" yy30: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -794,17 +796,17 @@ yy30: if (yybm[0+yych] & 128) { goto yy30; } -#line 551 "ext/standard/url_scanner_ex.re" +#line 553 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto state_before_val; } -#line 800 "ext/standard/url_scanner_ex.c" +#line 802 "ext/standard/url_scanner_ex.c" } -#line 553 "ext/standard/url_scanner_ex.re" +#line 555 "ext/standard/url_scanner_ex.re" state_before_val: start = YYCURSOR; -#line 808 "ext/standard/url_scanner_ex.c" +#line 810 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -847,9 +849,9 @@ state_before_val: if (yych == '=') goto yy38; ++YYCURSOR; yy36: -#line 559 "ext/standard/url_scanner_ex.re" +#line 561 "ext/standard/url_scanner_ex.re" { --YYCURSOR; goto state_next_arg_begin; } -#line 853 "ext/standard/url_scanner_ex.c" +#line 855 "ext/standard/url_scanner_ex.c" yy37: yych = *(YYMARKER = ++YYCURSOR); if (yych == ' ') goto yy41; @@ -861,9 +863,9 @@ yy38: if (yybm[0+yych] & 128) { goto yy38; } -#line 558 "ext/standard/url_scanner_ex.re" +#line 560 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; } -#line 867 "ext/standard/url_scanner_ex.c" +#line 869 "ext/standard/url_scanner_ex.c" yy41: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -873,14 +875,14 @@ yy41: YYCURSOR = YYMARKER; goto yy36; } -#line 560 "ext/standard/url_scanner_ex.re" +#line 562 "ext/standard/url_scanner_ex.re" state_val: start = YYCURSOR; -#line 884 "ext/standard/url_scanner_ex.c" +#line 886 "ext/standard/url_scanner_ex.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -933,15 +935,15 @@ yy46: if (yybm[0+yych] & 32) { goto yy46; } -#line 568 "ext/standard/url_scanner_ex.re" +#line 570 "ext/standard/url_scanner_ex.re" { handle_val(STD_ARGS, 0, ' '); goto state_next_arg_begin; } -#line 939 "ext/standard/url_scanner_ex.c" +#line 941 "ext/standard/url_scanner_ex.c" yy49: ++YYCURSOR; yy50: -#line 569 "ext/standard/url_scanner_ex.re" +#line 571 "ext/standard/url_scanner_ex.re" { passthru(STD_ARGS); goto state_next_arg_begin; } -#line 945 "ext/standard/url_scanner_ex.c" +#line 947 "ext/standard/url_scanner_ex.c" yy51: yych = *(YYMARKER = ++YYCURSOR); if (yych == '>') goto yy50; @@ -964,9 +966,9 @@ yy55: goto yy50; yy56: ++YYCURSOR; -#line 566 "ext/standard/url_scanner_ex.re" +#line 568 "ext/standard/url_scanner_ex.re" { handle_val(STD_ARGS, 1, '"'); goto state_next_arg_begin; } -#line 970 "ext/standard/url_scanner_ex.c" +#line 972 "ext/standard/url_scanner_ex.c" yy58: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -977,11 +979,11 @@ yy59: } if (yych >= '(') goto yy55; ++YYCURSOR; -#line 567 "ext/standard/url_scanner_ex.re" +#line 569 "ext/standard/url_scanner_ex.re" { handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; } -#line 983 "ext/standard/url_scanner_ex.c" +#line 985 "ext/standard/url_scanner_ex.c" } -#line 570 "ext/standard/url_scanner_ex.re" +#line 572 "ext/standard/url_scanner_ex.re" stop: @@ -1109,7 +1111,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; } @@ -1323,9 +1325,9 @@ static inline int php_url_scanner_reset_var_impl(zend_string *name, int encode, php_url_scanner_reset_vars_impl(type); goto finish; } - /* Check preceeding separator */ + /* Check preceding separator */ if (!sep_removed - && start - PG(arg_separator).output >= separator_len + && (size_t)(start - PG(arg_separator).output) >= separator_len && !memcmp(start - separator_len, PG(arg_separator).output, separator_len)) { start -= separator_len; } |
