@ -29,41 +29,82 @@
# include "SAPI.h"
# include "php_logos.h"
# include "zend_globals.h"
# include "rfc1867.h"
/* for systems that need to override reading of environment variables */
void _php_import_environment_variables ( zval * array_ptr TSRMLS_DC ) ;
PHPAPI void ( * php_import_environment_variables ) ( zval * array_ptr TSRMLS_DC ) = _php_import_environment_variables ;
static int php_decode_raw_var_array ( HashTable * raw_array , zval * track_array TSRMLS_DC ) ;
PHPAPI void php_register_variable ( char * var , char * strval , zval * track_vars_array TSRMLS_DC )
{
php_register_variable_safe ( var , strval , strlen ( strval ) , track_vars_array TSRMLS_CC ) ;
php_register_variable_safe ( IS_STRING , ZSTR ( var ) , ZSTR ( strval ) , strlen ( strval ) , track_vars_array TSRMLS_CC ) ;
}
/* binary-safe version */
PHPAPI void php_register_variable_safe ( char * var , char * strval , int str_len , zval * track_vars_array TSRMLS_DC )
PHPAPI int php_register_variable_with_conv ( UConverter * conv , char * var , int var_len , char * val , int val_len , zval * array_ptr , int filter_arg TSRMLS_DC )
{
zval new_entry ;
assert ( strval ! = NULL ) ;
/* Prepare value */
Z_STRLEN ( new_entry ) = str_len ;
Z_STRVAL ( new_entry ) = estrndup ( strval , Z_STRLEN ( new_entry ) ) ;
Z_TYPE ( new_entry ) = IS_STRING ;
zstr c_var , c_val ;
int c_var_len , c_val_len ;
zend_uchar type = IS_UNICODE ;
if ( conv = = NULL ) {
type = IS_STRING ;
}
if ( type = = IS_UNICODE ) {
c_var . u = c_val . u = NULL ;
if ( zend_string_to_unicode ( conv , & c_var . u , & c_var_len , var , var_len TSRMLS_CC ) = = FAILURE | |
zend_string_to_unicode ( conv , & c_val . u , & c_val_len , val , val_len TSRMLS_CC ) = = FAILURE ) {
if ( c_var . u ) {
efree ( c_var . u ) ;
}
if ( c_val . u ) {
efree ( c_val . u ) ;
}
return FAILURE ;
}
} else {
c_var . s = var ;
c_var_len = var_len ;
c_val . s = val ;
c_val_len = val_len ;
}
/* UTODO
* do input filtering
*/
php_register_variable_safe ( type , c_var , c_val , c_val_len , array_ptr TSRMLS_CC ) ;
php_register_variable_ex ( var , & new_entry , track_vars_array TSRMLS_CC ) ;
if ( type = = IS_UNICODE ) {
efree ( c_var . u ) ;
efree ( c_val . u ) ;
}
return SUCCESS ;
}
PHPAPI void php_u_register_variable_safe ( UChar * var , UChar * strval , int str_len , zval * track_vars_array TSRMLS_DC )
PHPAPI void php_register_variable_safe ( zend_uchar type , zstr var , zstr strval , int str_len , zval * track_vars_array TSRMLS_DC )
{
zval new_entry ;
assert ( strval ! = NULL ) ;
/* Prepare value */
Z_USTRLEN ( new_entry ) = str_len ;
Z_USTRVAL ( new_entry ) = eustrndup ( strval , Z_USTRLEN ( new_entry ) ) ;
Z_TYPE ( new_entry ) = IS_UNICODE ;
assert ( strval . v ! = NULL ) ;
php_u_register_variable_ex ( var , & new_entry , track_vars_array TSRMLS_CC ) ;
if ( type = = IS_UNICODE ) {
/* Prepare value */
Z_USTRLEN ( new_entry ) = str_len ;
Z_USTRVAL ( new_entry ) = eustrndup ( strval . u , Z_USTRLEN ( new_entry ) ) ;
Z_TYPE ( new_entry ) = IS_UNICODE ;
php_u_register_variable_ex ( var . u , & new_entry , track_vars_array TSRMLS_CC ) ;
} else {
/* Prepare value */
Z_STRLEN ( new_entry ) = str_len ;
Z_STRVAL ( new_entry ) = estrndup ( strval . s , Z_STRLEN ( new_entry ) ) ;
Z_TYPE ( new_entry ) = IS_STRING ;
php_register_variable_ex ( var . s , & new_entry , track_vars_array TSRMLS_CC ) ;
}
}
PHPAPI void php_register_variable_ex ( char * var_name , zval * val , zval * track_vars_array TSRMLS_DC )
@ -78,7 +119,7 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
HashTable * symtable1 = NULL ;
assert ( var_name ! = NULL ) ;
if ( track_vars_array ) {
symtable1 = Z_ARRVAL_P ( track_vars_array ) ;
}
@ -119,6 +160,9 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
return ;
}
#if 0
/ / Do we realy need this , now that register_globals is gone ? Is it the job of this
/ / function to guard against calls with active_symbol_table as the array ?
/* GLOBALS hijack attempt, reject parameter */
if ( symtable1 = = EG ( active_symbol_table ) & &
var_len = = sizeof ( " GLOBALS " ) - 1 & &
@ -127,6 +171,7 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
efree ( var_orig ) ;
return ;
}
# endif
index = var ;
index_len = var_len ;
@ -176,7 +221,7 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
return ;
}
* ip = 0 ;
new_idx_len = strlen ( index_s ) ;
new_idx_len = strlen ( index_s ) ;
}
if ( ! index ) {
@ -184,11 +229,11 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
array_init ( gpc_element ) ;
zend_hash_next_index_insert ( symtable1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
} else {
if ( zend_rt_ symtable_find ( symtable1 , index , index_len + 1 , ( void * * ) & gpc_element_p ) = = FAILURE
if ( zend_symtable_find ( symtable1 , index , index_len + 1 , ( void * * ) & gpc_element_p ) = = FAILURE
| | Z_TYPE_PP ( gpc_element_p ) ! = IS_ARRAY ) {
MAKE_STD_ZVAL ( gpc_element ) ;
array_init ( gpc_element ) ;
zend_rt_ symtable_update ( symtable1 , index , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
zend_symtable_update ( symtable1 , index , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
}
}
symtable1 = Z_ARRVAL_PP ( gpc_element_p ) ;
@ -212,18 +257,18 @@ plain_var:
if ( ! index ) {
zend_hash_next_index_insert ( symtable1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
} else {
/*
/*
* According to rfc2965 , more specific paths are listed above the less specific ones .
* If we encounter a duplicate cookie name , we should skip it , since it is not possible
* to have the same ( plain text ) cookie name for the same path and we should not overwrite
* more specific cookies with the less specific ones .
*/
if ( PG ( http_globals ) [ TRACK_VARS_COOKIE ] & &
symtable1 = = Z_ARRVAL_P ( PG ( http_globals ) [ TRACK_VARS_COOKIE ] ) & &
zend_rt_ symtable_exists ( symtable1 , index , index_len + 1 ) ) {
symtable1 = = Z_ARRVAL_P ( PG ( http_globals ) [ TRACK_VARS_COOKIE ] ) & &
zend_symtable_exists ( symtable1 , index , index_len + 1 ) ) {
zval_ptr_dtor ( & gpc_element ) ;
} else {
zend_rt_ symtable_update ( symtable1 , index , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
zend_symtable_update ( symtable1 , index , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
}
}
}
@ -234,7 +279,7 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
{
UChar * p = NULL ;
UChar * ip ; /* index pointer */
UChar * index ;
UChar * index , * var_orig ;
int var_len , index_len ;
zval * gpc_element , * * gpc_element_p ;
zend_bool is_array ;
@ -255,6 +300,7 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
/*
* Prepare variable name
*/
var_orig = eustrdup ( var ) ;
ip = u_strchr ( var , 0x5b /*'['*/ ) ;
if ( ip ) {
is_array = 1 ;
@ -269,6 +315,7 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
var_len = u_strlen ( var ) ;
if ( var_len = = 0 ) { /* empty variable name, or variable name with a space in it */
zval_dtor ( val ) ;
efree ( var_orig ) ;
return ;
}
/* ensure that we don't have spaces or dots in the variable name (not binary safe) */
@ -276,7 +323,7 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
switch ( * p ) {
case 0x20 : /*' '*/
case 0x2e : /*'.'*/
* p = 0x5f ; /*'_'*/
* p = 0x5f ; /*'_'*/
break ;
}
}
@ -287,19 +334,16 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
if ( is_array ) {
int nest_level = 0 ;
while ( 1 ) {
zstr escaped_index = NULL_ZSTR ;
UChar * index_s ;
int new_idx_len = 0 ;
if ( + + nest_level > PG ( max_input_nesting_level ) ) {
HashTable * ht ;
zstr tmp_var ;
/* too many levels of nesting */
ht = Z_ARRVAL_P ( track_vars_array ) ;
tmp_var . u = var ;
zend_u_hash_del ( ht , IS_UNICODE , tmp_var , var_len + 1 ) ;
zend_u_hash_del ( ht , IS_UNICODE , ZSTR ( var ) , var_len + 1 ) ;
zval_dtor ( val ) ;
/* do not output the error message to the screen,
@ -307,6 +351,7 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
if ( ! PG ( display_errors ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Input variable nesting level exceeded %ld. To increase the limit change max_input_nesting_level in php.ini. " , PG ( max_input_nesting_level ) ) ;
}
efree ( var_orig ) ;
return ;
}
@ -331,7 +376,7 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
return ;
}
* ip = 0 ;
new_idx_len = u_strlen ( index_s ) ;
new_idx_len = u_strlen ( index_s ) ;
}
if ( ! index ) {
@ -339,16 +384,11 @@ PHPAPI void php_u_register_variable_ex(UChar *var, zval *val, zval *track_vars_a
array_init ( gpc_element ) ;
zend_hash_next_index_insert ( symtable1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
} else {
escaped_index . u = index ;
if ( zend_u_symtable_find ( symtable1 , IS_UNICODE , escaped_index , index_len + 1 , ( void * * ) & gpc_element_p ) = = FAILURE
if ( zend_u_symtable_find ( symtable1 , IS_UNICODE , ZSTR ( index ) , index_len + 1 , ( void * * ) & gpc_element_p ) = = FAILURE
| | Z_TYPE_PP ( gpc_element_p ) ! = IS_ARRAY ) {
MAKE_STD_ZVAL ( gpc_element ) ;
array_init ( gpc_element ) ;
zend_u_symtable_update ( symtable1 , IS_UNICODE , escaped_index , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
}
if ( index ! = escaped_index . u ) {
efree ( escaped_index . u ) ;
zend_u_symtable_update ( symtable1 , IS_UNICODE , ZSTR ( index ) , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
}
}
symtable1 = Z_ARRVAL_PP ( gpc_element_p ) ;
@ -372,30 +412,34 @@ plain_var:
if ( ! index ) {
zend_hash_next_index_insert ( symtable1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
} else {
/* UTODO fix for php_addslashes case */
/* char *escaped_index = php_addslashes(index, index_len, &index_len, 0 TSRMLS_CC); */
zstr escaped_index ;
escaped_index . u = index ;
zend_u_symtable_update ( symtable1 , IS_UNICODE , escaped_index , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
/* efree(escaped_index); */
/*
* According to rfc2965 , more specific paths are listed above the less specific ones .
* If we encounter a duplicate cookie name , we should skip it , since it is not possible
* to have the same ( plain text ) cookie name for the same path and we should not overwrite
* more specific cookies with the less specific ones .
*/
if ( PG ( http_globals ) [ TRACK_VARS_COOKIE ] & &
symtable1 = = Z_ARRVAL_P ( PG ( http_globals ) [ TRACK_VARS_COOKIE ] ) & &
zend_u_symtable_exists ( symtable1 , IS_UNICODE , ZSTR ( index ) , index_len + 1 ) ) {
zval_ptr_dtor ( & gpc_element ) ;
} else {
zend_u_symtable_update ( symtable1 , IS_UNICODE , ZSTR ( index ) , index_len + 1 , & gpc_element , sizeof ( zval * ) , ( void * * ) & gpc_element_p ) ;
}
}
}
efree ( var_orig ) ;
}
SAPI_API SAPI_POST_HANDLER_FUNC ( php_std_post_handler )
{
char * var , * val , * e , * s , * p ;
zval * array_ptr = ( zval * ) arg ;
UConverter * input_ conv = UG ( http_inpu t_encoding_conv) ;
UConverter * conv = UG ( reques t_encoding_conv) ;
if ( SG ( request_info ) . post_data = = NULL ) {
return ;
}
if ( ! input_conv ) {
input_conv = ZEND_U_CONVERTER ( UG ( output_encoding_conv ) ) ;
}
PG ( request_decoding_error ) = 0 ;
s = SG ( request_info ) . post_data ;
e = s + SG ( request_info ) . post_data_length ;
@ -403,11 +447,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler)
while ( s < e & & ( p = memchr ( s , ' & ' , ( e - s ) ) ) ) {
last_value :
if ( ( val = memchr ( s , ' = ' , ( p - s ) ) ) ) { /* have a value */
UChar * u_var , * u_val ;
int u_var_len , u_val_len ;
int var_len ;
int val_len ;
UErrorCode status1 = U_ZERO_ERROR , status2 = U_ZERO_ERROR ;
var = s ;
var_len = val - s ;
@ -415,16 +456,12 @@ last_value:
php_url_decode ( var , var_len ) ;
val + + ;
val_len = php_url_decode ( val , ( p - val ) ) ;
zend_string_to_unicode_ex ( input_conv , & u_var , & u_var_len , var , var_len , & status1 ) ;
zend_string_to_unicode_ex ( input_conv , & u_val , & u_val_len , val , val_len , & status2 ) ;
if ( U_SUCCESS ( status1 ) & & U_SUCCESS ( status2 ) ) {
/* UTODO add input filtering */
php_u_register_variable_safe ( u_var , u_val , u_val_len , array_ptr TSRMLS_CC ) ;
} else {
/* UTODO set a user-accessible flag to indicate that conversion failed? */
if ( php_register_variable_with_conv ( conv , var , var_len , val , val_len , array_ptr , PARSE_POST ) = = FAILURE ) {
zend_error ( E_WARNING , " Failed to decode _POST array " ) ;
PG ( request_decoding_error ) = 1 ;
zend_hash_clean ( Z_ARRVAL_P ( array_ptr ) ) ;
return ;
}
efree ( u_var ) ;
efree ( u_val ) ;
}
s = p + 1 ;
}
@ -448,8 +485,11 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
zval * array_ptr ;
int free_buffer = 0 ;
char * strtok_buf = NULL ;
UConverter * input_conv = UG ( http_input_encoding_conv ) ;
char * arg_names [ ] = { " _POST " , " _GET " , " _COOKIE " , " string " } ;
UConverter * conv ;
PG ( request_decoding_error ) = 0 ;
switch ( arg ) {
case PARSE_POST :
case PARSE_GET :
@ -484,8 +524,24 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
}
if ( arg = = PARSE_POST ) {
sapi_handle_post ( array_ptr TSRMLS_CC ) ;
return ;
if ( SG ( request_info ) . post_entry & &
SG ( request_info ) . post_entry - > post_handler = = rfc1867_post_handler ) {
if ( SG ( rfc1867_vars ) = = NULL ) {
sapi_handle_post ( NULL TSRMLS_CC ) ;
}
if ( SG ( rfc1867_vars ) ! = NULL ) {
PG ( request_decoding_error ) = 0 ;
if ( php_decode_raw_var_array ( SG ( rfc1867_vars ) , array_ptr TSRMLS_CC ) = = FAILURE ) {
zend_error ( E_WARNING , " Failed to decode _POST array " ) ;
PG ( request_decoding_error ) = 1 ;
zend_hash_clean ( Z_ARRVAL_P ( array_ptr ) ) ;
}
}
return ;
} else {
sapi_handle_post ( array_ptr TSRMLS_CC ) ;
}
}
if ( arg = = PARSE_GET ) { /* GET data */
@ -496,6 +552,7 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
} else {
free_buffer = 0 ;
}
conv = UG ( request_encoding_conv ) ;
} else if ( arg = = PARSE_COOKIE ) { /* Cookie data */
c_var = SG ( request_info ) . cookie_data ;
if ( c_var & & * c_var ) {
@ -507,6 +564,7 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
} else if ( arg = = PARSE_STRING ) { /* String data */
res = str ;
free_buffer = 1 ;
conv = ZEND_U_CONVERTER ( UG ( runtime_encoding_conv ) ) ;
}
if ( ! res ) {
@ -523,18 +581,10 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
break ;
}
if ( ! input_conv ) {
input_conv = ZEND_U_CONVERTER ( UG ( output_encoding_conv ) ) ;
}
var = php_strtok_r ( res , separator , & strtok_buf ) ;
while ( var ) {
int var_len ;
/* unsigned int new_val_len; see below */
UChar * u_var , * u_val ;
int u_var_len , u_val_len ;
UErrorCode status = U_ZERO_ERROR ;
int var_len , val_len ;
val = strchr ( var , ' = ' ) ;
@ -554,37 +604,20 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
var_len = strlen ( var ) ;
php_url_decode ( var , var_len ) ;
zend_string_to_unicode_ex ( input_conv , & u_var , & u_var_len , var , var_len , & status ) ;
if ( U_FAILURE ( status ) ) {
/* UTODO set a user-accessible flag to indicate that conversion failed? */
efree ( u_var ) ;
goto next_var ;
}
if ( val ) { /* have a value */
int val_len ;
val_len = php_url_decode ( val , strlen ( val ) ) ;
zend_string_to_unicode_ex ( input_conv , & u_val , & u_val_len , val , val_len , & status ) ;
if ( U_FAILURE ( status ) ) {
/* UTODO set a user-accessible flag to indicate that conversion failed? */
efree ( u_var ) ;
efree ( u_val ) ;
goto next_var ;
}
} else {
u_val_len = 0 ;
u_val = eustrndup ( EMPTY_STR , 0 ) ;
val = " " ;
val_len = 0 ;
}
php_u_register_variable_safe ( u_var , u_val , u_val_len , array_ptr TSRMLS_CC ) ;
/* UTODO need to make input_filter Unicode aware */
/*
if ( sapi_module . input_filter ( arg , var , & val , val_len , & new_val_len TSRMLS_CC ) ) {
php_register_variable_safe ( var , val , new_val_len , array_ptr TSRMLS_CC ) ;
if ( php_register_variable_with_conv ( conv , var , var_len , val , val_len , array_ptr , arg ) = = FAILURE ) {
zend_error ( E_WARNING , " Failed to decode %s array " , arg_names [ arg ] ) ;
PG ( request_decoding_error ) = 1 ;
zend_hash_clean ( Z_ARRVAL_P ( array_ptr ) ) ;
break ;
}
*/
efree ( u_var ) ;
efree ( u_val ) ;
next_var :
var = php_strtok_r ( NULL , separator , & strtok_buf ) ;
}
@ -624,12 +657,6 @@ void _php_import_environment_variables(zval *array_ptr TSRMLS_DC)
}
}
zend_bool php_std_auto_global_callback ( char * name , uint name_len TSRMLS_DC )
{
zend_printf ( " %s \n " , name ) ;
return 0 ; /* don't rearm */
}
/* {{{ php_build_argv
*/
static void php_build_argv ( char * s , zval * track_vars_array TSRMLS_DC )
@ -637,11 +664,11 @@ static void php_build_argv(char *s, zval *track_vars_array TSRMLS_DC)
zval * arr , * argc , * tmp ;
int count = 0 ;
char * ss , * space ;
if ( ! ( SG ( request_info ) . argc | | track_vars_array ) ) {
return ;
}
ALLOC_INIT_ZVAL ( arr ) ;
array_init ( arr ) ;
@ -668,6 +695,10 @@ static void php_build_argv(char *s, zval *track_vars_array TSRMLS_DC)
}
/* auto-type */
ALLOC_ZVAL ( tmp ) ;
/* UTODO
* use UG ( request_encoding ) here . This also means that we need to clean out
* and re - arm $ _SERVER and clean out $ argv on request_set_encoding ( )
*/
ZVAL_RT_STRING ( tmp , ss , 1 ) ;
INIT_PZVAL ( tmp ) ;
count + + ;
@ -697,7 +728,7 @@ static void php_build_argv(char *s, zval *track_vars_array TSRMLS_DC)
Z_ADDREF_P ( argc ) ;
zend_ascii_hash_update ( & EG ( symbol_table ) , " argv " , sizeof ( " argv " ) , & arr , sizeof ( zval * ) , NULL ) ;
zend_ascii_hash_add ( & EG ( symbol_table ) , " argc " , sizeof ( " argc " ) , & argc , sizeof ( zval * ) , NULL ) ;
}
}
if ( track_vars_array ) {
Z_ADDREF_P ( arr ) ;
Z_ADDREF_P ( argc ) ;
@ -798,9 +829,72 @@ static void php_autoglobal_merge(HashTable *dest, HashTable *src TSRMLS_DC)
}
/* }}} */
static int php_decode_raw_var_array ( HashTable * raw_array , zval * track_array TSRMLS_DC )
{
zstr raw_var ;
uint raw_var_len ;
zval * * raw_value ;
zstr var , value ;
int var_len , value_len ;
ulong num_index ;
zend_uchar type = IS_UNICODE ;
UConverter * conv = UG ( request_encoding_conv ) ;
if ( conv = = NULL ) {
type = IS_STRING ;
}
for ( zend_hash_internal_pointer_reset ( raw_array ) ;
zend_hash_get_current_data ( raw_array , ( void * * ) & raw_value ) = = SUCCESS ;
zend_hash_move_forward ( raw_array ) ) {
zend_hash_get_current_key_ex ( raw_array , & raw_var , & raw_var_len , & num_index , 0 , NULL ) ;
if ( type = = IS_UNICODE ) {
var . u = value . u = NULL ;
if ( zend_string_to_unicode ( conv , & var . u , & var_len , raw_var . s , raw_var_len ) = = FAILURE ) {
return FAILURE ;
}
if ( Z_TYPE_PP ( raw_value ) = = IS_STRING ) {
if ( zend_string_to_unicode ( conv , & value . u , & value_len , Z_STRVAL_PP ( raw_value ) , Z_STRLEN_PP ( raw_value ) ) = = FAILURE ) {
efree ( var . u ) ;
return FAILURE ;
}
/* UTODO add input filtering */
php_register_variable_safe ( IS_UNICODE , var , value , value_len , track_array TSRMLS_CC ) ;
efree ( value . u ) ;
} else {
php_u_register_variable_ex ( var . u , * raw_value , track_array TSRMLS_CC ) ;
}
efree ( var . u ) ;
} else {
var . s = raw_var . s ;
var_len = raw_var_len ;
if ( Z_TYPE_PP ( raw_value ) = = IS_STRING ) {
value . s = Z_STRVAL_PP ( raw_value ) ;
value_len = Z_STRLEN_PP ( raw_value ) ;
/* UTODO add input filtering */
php_register_variable_safe ( IS_STRING , var , value , value_len , track_array TSRMLS_CC ) ;
} else {
php_register_variable_ex ( var . s , * raw_value , track_array TSRMLS_CC ) ;
}
}
}
return SUCCESS ;
}
static zend_bool php_auto_globals_create_server ( char * name , uint name_len TSRMLS_DC ) ;
static zend_bool php_auto_globals_create_env ( char * name , uint name_len TSRMLS_DC ) ;
static zend_bool php_auto_globals_create_request ( char * name , uint name_len TSRMLS_DC ) ;
static zend_bool php_auto_globals_decode_get ( char * name , uint name_len TSRMLS_DC ) ;
static zend_bool php_auto_globals_decode_post ( char * name , uint name_len TSRMLS_DC ) ;
static zend_bool php_auto_globals_decode_files ( char * name , uint name_len TSRMLS_DC ) ;
/* {{{ php_hash_environment
*/
@ -831,13 +925,6 @@ int php_hash_environment(TSRMLS_D)
for ( p = PG ( variables_order ) ; p & & * p ; p + + ) {
switch ( * p ) {
case ' p ' :
case ' P ' :
if ( ! _gpc_flags [ 0 ] & & ! SG ( headers_sent ) & & SG ( request_info ) . request_method & & ! strcasecmp ( SG ( request_info ) . request_method , " POST " ) ) {
sapi_module . treat_data ( PARSE_POST , NULL , NULL TSRMLS_CC ) ; /* POST Data */
_gpc_flags [ 0 ] = 1 ;
}
break ;
case ' c ' :
case ' C ' :
if ( ! _gpc_flags [ 1 ] ) {
@ -845,13 +932,7 @@ int php_hash_environment(TSRMLS_D)
_gpc_flags [ 1 ] = 1 ;
}
break ;
case ' g ' :
case ' G ' :
if ( ! _gpc_flags [ 2 ] ) {
sapi_module . treat_data ( PARSE_GET , NULL , NULL TSRMLS_CC ) ; /* GET Data */
_gpc_flags [ 2 ] = 1 ;
}
break ;
case ' e ' :
case ' E ' :
if ( ! jit_initialization & & ! _gpc_flags [ 3 ] ) {
@ -860,6 +941,7 @@ int php_hash_environment(TSRMLS_D)
_gpc_flags [ 3 ] = 1 ;
}
break ;
case ' s ' :
case ' S ' :
if ( ! jit_initialization & & ! _gpc_flags [ 4 ] ) {
@ -890,16 +972,57 @@ int php_hash_environment(TSRMLS_D)
zend_ascii_hash_update ( & EG ( symbol_table ) , auto_global_records [ i ] . name , auto_global_records [ i ] . name_len , & PG ( http_globals ) [ i ] , sizeof ( zval * ) , NULL ) ;
}
/* Create _REQUEST */
if ( ! jit_initialization ) {
zend_auto_global_disable_jit ( " _REQUEST " , sizeof ( " _REQUEST " ) - 1 TSRMLS_CC ) ;
php_auto_globals_create_request ( " _REQUEST " , sizeof ( " _REQUEST " ) - 1 TSRMLS_CC ) ;
}
return SUCCESS ;
}
/* }}} */
static zend_bool php_auto_globals_decode_get ( char * name , uint name_len TSRMLS_DC )
{
sapi_module . treat_data ( PARSE_GET , NULL , NULL TSRMLS_CC ) ; /* GET Data */
zend_ascii_hash_update ( & EG ( symbol_table ) , name , name_len + 1 , & PG ( http_globals ) [ TRACK_VARS_GET ] , sizeof ( zval * ) , NULL ) ;
Z_ADDREF_P ( PG ( http_globals ) [ TRACK_VARS_GET ] ) ;
return 0 ;
}
static zend_bool php_auto_globals_decode_post ( char * name , uint name_len TSRMLS_DC )
{
if ( SG ( request_info ) . request_method & & ! strcasecmp ( SG ( request_info ) . request_method , " POST " ) ) {
sapi_module . treat_data ( PARSE_POST , NULL , NULL TSRMLS_CC ) ; /* POST Data */
zend_ascii_hash_update ( & EG ( symbol_table ) , name , name_len + 1 , & PG ( http_globals ) [ TRACK_VARS_POST ] , sizeof ( zval * ) , NULL ) ;
Z_ADDREF_P ( PG ( http_globals ) [ TRACK_VARS_POST ] ) ;
}
return 0 ;
}
static zend_bool php_auto_globals_decode_files ( char * name , uint name_len TSRMLS_DC )
{
if ( PG ( http_globals ) [ TRACK_VARS_FILES ] ) {
zval_ptr_dtor ( & PG ( http_globals ) [ TRACK_VARS_FILES ] ) ;
}
ALLOC_ZVAL ( PG ( http_globals ) [ TRACK_VARS_FILES ] ) ;
array_init ( PG ( http_globals ) [ TRACK_VARS_FILES ] ) ;
INIT_PZVAL ( PG ( http_globals ) [ TRACK_VARS_FILES ] ) ;
zend_ascii_hash_update ( & EG ( symbol_table ) , name , name_len + 1 , & PG ( http_globals ) [ TRACK_VARS_FILES ] , sizeof ( zval * ) , NULL ) ;
Z_ADDREF_P ( PG ( http_globals ) [ TRACK_VARS_FILES ] ) ;
if ( SG ( request_info ) . post_entry & &
SG ( request_info ) . post_entry - > post_handler = = rfc1867_post_handler ) {
if ( SG ( rfc1867_files_vars ) = = NULL ) {
sapi_handle_post ( NULL TSRMLS_DC ) ;
}
if ( SG ( rfc1867_files_vars ) ! = NULL ) {
PG ( request_decoding_error ) = 0 ;
if ( php_decode_raw_var_array ( SG ( rfc1867_files_vars ) , PG ( http_globals ) [ TRACK_VARS_FILES ] TSRMLS_CC ) = = FAILURE ) {
zend_error ( E_WARNING , " Failed to decode _FILES array " ) ;
PG ( request_decoding_error ) = 1 ;
zend_hash_clean ( Z_ARRVAL_P ( PG ( http_globals ) [ TRACK_VARS_FILES ] ) ) ;
}
}
}
return 0 ;
}
static zend_bool php_auto_globals_create_server ( char * name , uint name_len TSRMLS_DC )
{
if ( PG ( variables_order ) & & ( strchr ( PG ( variables_order ) , ' S ' ) | | strchr ( PG ( variables_order ) , ' s ' ) ) ) {
@ -918,7 +1041,7 @@ static zend_bool php_auto_globals_create_server(char *name, uint name_len TSRMLS
}
} else {
php_build_argv ( SG ( request_info ) . query_string , PG ( http_globals ) [ TRACK_VARS_SERVER ] TSRMLS_CC ) ;
}
}
}
} else {
@ -948,7 +1071,7 @@ static zend_bool php_auto_globals_create_env(char *name, uint name_len TSRMLS_DC
zval_ptr_dtor ( & PG ( http_globals ) [ TRACK_VARS_ENV ] ) ;
}
PG ( http_globals ) [ TRACK_VARS_ENV ] = env_vars ;
if ( PG ( variables_order ) & & ( strchr ( PG ( variables_order ) , ' E ' ) | | strchr ( PG ( variables_order ) , ' e ' ) ) ) {
php_import_environment_variables ( PG ( http_globals ) [ TRACK_VARS_ENV ] TSRMLS_CC ) ;
}
@ -980,6 +1103,7 @@ static zend_bool php_auto_globals_create_request(char *name, uint name_len TSRML
case ' g ' :
case ' G ' :
if ( ! _gpc_flags [ 0 ] ) {
zend_u_is_auto_global_ex ( IS_STRING , ZSTR ( " _GET " ) , sizeof ( " _GET " ) - 1 , 1 , NULL TSRMLS_CC ) ;
php_autoglobal_merge ( Z_ARRVAL_P ( form_variables ) , Z_ARRVAL_P ( PG ( http_globals ) [ TRACK_VARS_GET ] ) TSRMLS_CC ) ;
_gpc_flags [ 0 ] = 1 ;
}
@ -987,6 +1111,7 @@ static zend_bool php_auto_globals_create_request(char *name, uint name_len TSRML
case ' p ' :
case ' P ' :
if ( ! _gpc_flags [ 1 ] ) {
zend_u_is_auto_global_ex ( IS_STRING , ZSTR ( " _POST " ) , sizeof ( " _POST " ) - 1 , 1 , NULL TSRMLS_CC ) ;
php_autoglobal_merge ( Z_ARRVAL_P ( form_variables ) , Z_ARRVAL_P ( PG ( http_globals ) [ TRACK_VARS_POST ] ) TSRMLS_CC ) ;
_gpc_flags [ 1 ] = 1 ;
}
@ -1007,13 +1132,13 @@ static zend_bool php_auto_globals_create_request(char *name, uint name_len TSRML
void php_startup_auto_globals ( TSRMLS_D )
{
zend_register_auto_global ( " _GET " , sizeof ( " _GET " ) - 1 , NULL TSRMLS_CC ) ;
zend_register_auto_global ( " _POST " , sizeof ( " _POST " ) - 1 , NULL TSRMLS_CC ) ;
zend_register_auto_global_ex ( " _GET " , sizeof ( " _GET " ) - 1 , php_auto_globals_decode_get , 1 TSRMLS_CC ) ;
zend_register_auto_global_ex ( " _POST " , sizeof ( " _POST " ) - 1 , php_auto_globals_decode_post , 1 TSRMLS_CC ) ;
zend_register_auto_global ( " _COOKIE " , sizeof ( " _COOKIE " ) - 1 , NULL TSRMLS_CC ) ;
zend_register_auto_global ( " _SERVER " , sizeof ( " _SERVER " ) - 1 , php_auto_globals_create_server TSRMLS_CC ) ;
zend_register_auto_global ( " _ENV " , sizeof ( " _ENV " ) - 1 , php_auto_globals_create_env TSRMLS_CC ) ;
zend_register_auto_global ( " _REQUEST " , sizeof ( " _REQUEST " ) - 1 , php_auto_globals_create_request TSRMLS_CC ) ;
zend_register_auto_global ( " _FILES " , sizeof ( " _FILES " ) - 1 , NULL TSRMLS_CC ) ;
zend_register_auto_global_ex ( " _REQUEST " , sizeof ( " _REQUEST " ) - 1 , php_auto_globals_create_request , 1 TSRMLS_CC ) ;
zend_register_auto_global_ex ( " _FILES " , sizeof ( " _FILES " ) - 1 , php_auto_globals_decode_files , 1 TSRMLS_CC ) ;
}
/*