Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions ext/standard/url_scanner_ex.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
94 changes: 45 additions & 49 deletions ext/standard/url_scanner_ex.re
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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};
Expand All @@ -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 {
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
}

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_session_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 */ true);
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)
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, 0);
php_url_scanner_add_var_impl(name, name_len, value, value_len, encode, /* is_session */ false);
return SUCCESS;
}


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);
Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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 */
Expand All @@ -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 */
Expand Down Expand Up @@ -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);
}


Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Loading