1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

ext/standard: Minor refactoring to URL scanner code (#15321)

This commit is contained in:
Gina Peter Banyard
2024-08-10 20:12:54 +01:00
committed by GitHub
parent 8740fdf1f6
commit edc88ee629
2 changed files with 54 additions and 58 deletions

View File

@@ -23,13 +23,13 @@ PHP_MSHUTDOWN_FUNCTION(url_scanner_ex);
PHP_RINIT_FUNCTION(url_scanner_ex);
PHP_RSHUTDOWN_FUNCTION(url_scanner_ex);
PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen, int encode);
PHPAPI int php_url_scanner_add_session_var(const char *name, size_t name_len, const char *value, size_t value_len, int encode);
PHPAPI int php_url_scanner_reset_session_var(zend_string *name, int encode);
PHPAPI int php_url_scanner_reset_session_vars(void);
PHPAPI int php_url_scanner_add_var(const char *name, size_t name_len, const char *value, size_t value_len, int encode);
PHPAPI int php_url_scanner_reset_var(zend_string *name, int encode);
PHPAPI int php_url_scanner_reset_vars(void);
PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen, bool encode);
PHPAPI zend_result php_url_scanner_add_session_var(const char *name, size_t name_len, const char *value, size_t value_len, bool encode);
PHPAPI zend_result php_url_scanner_reset_session_var(zend_string *name, int encode);
PHPAPI zend_result php_url_scanner_reset_session_vars(void);
PHPAPI zend_result php_url_scanner_add_var(const char *name, size_t name_len, const char *value, size_t value_len, bool encode);
PHPAPI zend_result php_url_scanner_reset_var(zend_string *name, int encode);
PHPAPI zend_result php_url_scanner_reset_vars(void);
#include "zend_smart_str_public.h"

View File

@@ -45,14 +45,14 @@ static void tag_dtor(zval *zv)
free(Z_PTR_P(zv));
}
static int php_ini_on_update_tags(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage, int type)
static zend_result php_ini_on_update_tags(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage, bool is_session)
{
url_adapt_state_ex_t *ctx;
char *key;
char *tmp;
char *lasts = NULL;
if (type) {
if (is_session) {
ctx = &BG(url_adapt_session_ex);
} else {
ctx = &BG(url_adapt_output_ex);
@@ -102,22 +102,22 @@ static int php_ini_on_update_tags(zend_ini_entry *entry, zend_string *new_value,
static PHP_INI_MH(OnUpdateSessionTags)
{
return php_ini_on_update_tags(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, 1);
return php_ini_on_update_tags(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, /* is_session */ true);
}
static PHP_INI_MH(OnUpdateOutputTags)
{
return php_ini_on_update_tags(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, 0);
return php_ini_on_update_tags(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, /* is_session */ false);
}
static int php_ini_on_update_hosts(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage, int type)
static zend_result php_ini_on_update_hosts(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage, bool is_session)
{
HashTable *hosts;
char *key;
char *tmp;
char *lasts = NULL;
if (type) {
if (is_session) {
hosts = &BG(url_adapt_session_hosts_ht);
} else {
hosts = &BG(url_adapt_output_hosts_ht);
@@ -152,12 +152,12 @@ static int php_ini_on_update_hosts(zend_ini_entry *entry, zend_string *new_value
static PHP_INI_MH(OnUpdateSessionHosts)
{
return php_ini_on_update_hosts(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, 1);
return php_ini_on_update_hosts(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, /* is_session */ true);
}
static PHP_INI_MH(OnUpdateOutputHosts)
{
return php_ini_on_update_hosts(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, 0);
return php_ini_on_update_hosts(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage, /* is_session */ false);
}
/* FIXME: OnUpdate*Hosts cannot set default to $_SERVER['HTTP_HOST'] at startup */
@@ -349,7 +349,7 @@ static inline void passthru(STD_PARA)
}
static int check_http_host(char *target)
static zend_result check_http_host(char *target)
{
zval *host, *tmp;
zend_string *host_tmp;
@@ -375,7 +375,7 @@ static int check_http_host(char *target)
return FAILURE;
}
static int check_host_whitelist(url_adapt_state_ex_t *ctx)
static zend_result check_host_whitelist(url_adapt_state_ex_t *ctx)
{
php_url *url_parts = NULL;
HashTable *allowed_hosts = ctx->type ? &BG(url_adapt_session_hosts_ht) : &BG(url_adapt_output_hosts_ht);
@@ -583,7 +583,7 @@ stop:
}
PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen, int encode)
PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen, bool encode)
{
char *result;
smart_str surl = {0};
@@ -647,26 +647,24 @@ static char *url_adapt_ext(const char *src, size_t srclen, size_t *newlen, bool
return retval;
}
static int php_url_scanner_ex_activate(int type)
static void php_url_scanner_ex_activate(bool is_session)
{
url_adapt_state_ex_t *ctx;
if (type) {
if (is_session) {
ctx = &BG(url_adapt_session_ex);
} else {
ctx = &BG(url_adapt_output_ex);
}
memset(ctx, 0, XtOffsetOf(url_adapt_state_ex_t, tags));
return SUCCESS;
}
static int php_url_scanner_ex_deactivate(int type)
static void php_url_scanner_ex_deactivate(bool is_session)
{
url_adapt_state_ex_t *ctx;
if (type) {
if (is_session) {
ctx = &BG(url_adapt_session_ex);
} else {
ctx = &BG(url_adapt_output_ex);
@@ -677,16 +675,14 @@ static int php_url_scanner_ex_deactivate(int type)
smart_str_free(&ctx->tag);
smart_str_free(&ctx->arg);
smart_str_free(&ctx->attr_val);
return SUCCESS;
}
static inline void php_url_scanner_session_handler_impl(char *output, size_t output_len, char **handled_output, size_t *handled_output_len, int mode, int type)
static inline void php_url_scanner_session_handler_impl(char *output, size_t output_len, char **handled_output, size_t *handled_output_len, int mode, bool is_session)
{
size_t len;
url_adapt_state_ex_t *url_state;
if (type) {
if (is_session) {
url_state = &BG(url_adapt_session_ex);
} else {
url_state = &BG(url_adapt_output_ex);
@@ -720,15 +716,15 @@ static inline void php_url_scanner_session_handler_impl(char *output, size_t out
static void php_url_scanner_session_handler(char *output, size_t output_len, char **handled_output, size_t *handled_output_len, int mode)
{
php_url_scanner_session_handler_impl(output, output_len, handled_output, handled_output_len, mode, 1);
php_url_scanner_session_handler_impl(output, output_len, handled_output, handled_output_len, mode, /* is_session */ true);
}
static void php_url_scanner_output_handler(char *output, size_t output_len, char **handled_output, size_t *handled_output_len, int mode)
{
php_url_scanner_session_handler_impl(output, output_len, handled_output, handled_output_len, mode, 0);
php_url_scanner_session_handler_impl(output, output_len, handled_output, handled_output_len, mode, /* is_session */ false);
}
static inline int php_url_scanner_add_var_impl(const char *name, size_t name_len, const char *value, size_t value_len, int encode, int type)
static inline void php_url_scanner_add_var_impl(const char *name, size_t name_len, const char *value, size_t value_len, bool encode, bool is_session)
{
smart_str sname = {0};
smart_str svalue = {0};
@@ -739,7 +735,7 @@ static inline int php_url_scanner_add_var_impl(const char *name, size_t name_len
php_output_handler_func_t handler;
bool should_start = false;
if (type) {
if (is_session) {
url_state = &BG(url_adapt_session_ex);
handler = php_url_scanner_session_handler;
} else {
@@ -748,10 +744,10 @@ static inline int php_url_scanner_add_var_impl(const char *name, size_t name_len
}
if (!url_state->active) {
php_url_scanner_ex_activate(type);
php_url_scanner_ex_activate(is_session);
should_start = true;
url_state->active = 1;
url_state->type = type;
url_state->type = is_session;
}
if (url_state->url_app.s && ZSTR_LEN(url_state->url_app.s) != 0) {
@@ -792,27 +788,27 @@ static inline int php_url_scanner_add_var_impl(const char *name, size_t name_len
if (should_start) {
php_output_start_internal(ZEND_STRL("URL-Rewriter"), handler, 0, PHP_OUTPUT_HANDLER_STDFLAGS);
}
}
PHPAPI zend_result php_url_scanner_add_session_var(const char *name, size_t name_len, const char *value, size_t value_len, bool encode)
{
php_url_scanner_add_var_impl(name, name_len, value, value_len, encode, /* is_session */ true);
return SUCCESS;
}
PHPAPI int php_url_scanner_add_session_var(const char *name, size_t name_len, const char *value, size_t value_len, int encode)
PHPAPI zend_result php_url_scanner_add_var(const char *name, size_t name_len, const char *value, size_t value_len, bool encode)
{
return php_url_scanner_add_var_impl(name, name_len, value, value_len, encode, 1);
php_url_scanner_add_var_impl(name, name_len, value, value_len, encode, /* is_session */ false);
return SUCCESS;
}
PHPAPI int php_url_scanner_add_var(const char *name, size_t name_len, const char *value, size_t value_len, int encode)
{
return php_url_scanner_add_var_impl(name, name_len, value, value_len, encode, 0);
}
static inline void php_url_scanner_reset_vars_impl(int type) {
static inline void php_url_scanner_reset_vars_impl(bool is_session) {
url_adapt_state_ex_t *url_state;
if (type) {
if (is_session) {
url_state = &BG(url_adapt_session_ex);
} else {
url_state = &BG(url_adapt_output_ex);
@@ -827,21 +823,21 @@ static inline void php_url_scanner_reset_vars_impl(int type) {
}
PHPAPI int php_url_scanner_reset_session_vars(void)
PHPAPI zend_result php_url_scanner_reset_session_vars(void)
{
php_url_scanner_reset_vars_impl(1);
php_url_scanner_reset_vars_impl(true);
return SUCCESS;
}
PHPAPI int php_url_scanner_reset_vars(void)
PHPAPI zend_result php_url_scanner_reset_vars(void)
{
php_url_scanner_reset_vars_impl(0);
php_url_scanner_reset_vars_impl(false);
return SUCCESS;
}
static inline int php_url_scanner_reset_var_impl(zend_string *name, int encode, int type)
static inline zend_result php_url_scanner_reset_var_impl(zend_string *name, int encode, bool is_session)
{
char *start, *end, *limit;
size_t separator_len;
@@ -854,7 +850,7 @@ static inline int php_url_scanner_reset_var_impl(zend_string *name, int encode,
bool sep_removed = 0;
url_adapt_state_ex_t *url_state;
if (type) {
if (is_session) {
url_state = &BG(url_adapt_session_ex);
} else {
url_state = &BG(url_adapt_output_ex);
@@ -911,7 +907,7 @@ static inline int php_url_scanner_reset_var_impl(zend_string *name, int encode,
}
/* Remove all when this is the only rewrite var */
if (ZSTR_LEN(url_state->url_app.s) == end - start) {
php_url_scanner_reset_vars_impl(type);
php_url_scanner_reset_vars_impl(is_session);
goto finish;
}
/* Check preceding separator */
@@ -933,7 +929,7 @@ static inline int php_url_scanner_reset_var_impl(zend_string *name, int encode,
if (!start) {
/* Should not happen */
ret = FAILURE;
php_url_scanner_reset_vars_impl(type);
php_url_scanner_reset_vars_impl(is_session);
goto finish;
}
/* Get end of form var */
@@ -961,15 +957,15 @@ finish:
}
PHPAPI int php_url_scanner_reset_session_var(zend_string *name, int encode)
PHPAPI zend_result php_url_scanner_reset_session_var(zend_string *name, int encode)
{
return php_url_scanner_reset_var_impl(name, encode, 1);
return php_url_scanner_reset_var_impl(name, encode, /* is_session */ true);
}
PHPAPI int php_url_scanner_reset_var(zend_string *name, int encode)
PHPAPI zend_result php_url_scanner_reset_var(zend_string *name, int encode)
{
return php_url_scanner_reset_var_impl(name, encode, 0);
return php_url_scanner_reset_var_impl(name, encode, /* is_session */ false);
}
@@ -1000,7 +996,7 @@ PHP_RINIT_FUNCTION(url_scanner)
PHP_RSHUTDOWN_FUNCTION(url_scanner)
{
if (BG(url_adapt_session_ex).active) {
php_url_scanner_ex_deactivate(1);
php_url_scanner_ex_deactivate(true);
BG(url_adapt_session_ex).active = 0;
BG(url_adapt_session_ex).tag_type = 0;
BG(url_adapt_session_ex).attr_type = 0;
@@ -1009,7 +1005,7 @@ PHP_RSHUTDOWN_FUNCTION(url_scanner)
smart_str_free(&BG(url_adapt_session_ex).url_app);
if (BG(url_adapt_output_ex).active) {
php_url_scanner_ex_deactivate(0);
php_url_scanner_ex_deactivate(false);
BG(url_adapt_output_ex).active = 0;
BG(url_adapt_output_ex).tag_type = 0;
BG(url_adapt_output_ex).attr_type = 0;