Skip to content

Commit

Permalink
- Fix bug #28568 (known_post_content_types is not thread safe).
Browse files Browse the repository at this point in the history
# What is eventually necessiated is entire SAPI redesign, I think.
  • Loading branch information
Moriyoshi Koizumi committed Feb 21, 2005
1 parent 38dfd68 commit 0d78453
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 61 deletions.
39 changes: 6 additions & 33 deletions ext/mbstring/mb_gpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,49 +48,22 @@

ZEND_EXTERN_MODULE_GLOBALS(mbstring)

/* {{{ static sapi_post_entry mbstr_post_entries[] */
static sapi_post_entry mbstr_post_entries[] = {
{ DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_mb_post_handler },
{ MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler },
{ NULL, 0, NULL, NULL }
};
/* }}} */

/* {{{ static sapi_post_entry php_post_entries[] */
static sapi_post_entry php_post_entries[] = {
{ DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler },
{ MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler },
{ NULL, 0, NULL, NULL }
};
/* }}} */

/* {{{ int _php_mb_enable_encoding_translation(int flag) */
int _php_mb_enable_encoding_translation(int flag)
{
if (flag) {
sapi_unregister_post_entry(php_post_entries);
sapi_register_post_entries(mbstr_post_entries);
sapi_register_treat_data(mbstr_treat_data);
} else {
sapi_unregister_post_entry(mbstr_post_entries);
sapi_register_post_entries(php_post_entries);
sapi_register_treat_data(php_default_treat_data);
}
return SUCCESS;
}
/* }}} */

/* {{{ MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
* http input processing */
MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
{
char *res = NULL, *separator=NULL;
const char *c_var;
pval *array_ptr;
zval *array_ptr;
int free_buffer=0;
enum mbfl_no_encoding detected;
php_mb_encoding_handler_info_t info;

if (!MBSTRG(encoding_translation)) {
php_default_treat_data(arg, str, destArray TSRMLS_CC);
return;
}

switch (arg) {
case PARSE_POST:
case PARSE_GET:
Expand Down
32 changes: 24 additions & 8 deletions ext/mbstring/mbstring.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,14 @@ zend_module_entry mbstring_module_entry = {
};
/* }}} */

/* {{{ static sapi_post_entry php_post_entries[] */
static sapi_post_entry php_post_entries[] = {
{ DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler },
{ MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler },
{ NULL, 0, NULL, NULL }
};
/* }}} */

ZEND_DECLARE_MODULE_GLOBALS(mbstring)

#ifdef COMPILE_DL_MBSTRING
Expand Down Expand Up @@ -283,6 +291,14 @@ static mbfl_allocators _php_mb_allocators = {
};
/* }}} */

/* {{{ static sapi_post_entry mbstr_post_entries[] */
static sapi_post_entry mbstr_post_entries[] = {
{ DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_mb_post_handler },
{ MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler },
{ NULL, 0, NULL, NULL }
};
/* }}} */

/* {{{ static int php_mb_parse_encoding_list()
* Return 0 if input contains any illegal encoding, otherwise 1.
* Even if any illegal encoding is detected the result may contain a list
Expand Down Expand Up @@ -680,10 +696,13 @@ static PHP_INI_MH(OnUpdate_mbstring_encoding_translation)

OnUpdateBool(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);

if (MBSTRG(encoding_translation)){
_php_mb_enable_encoding_translation(1);
if (MBSTRG(encoding_translation)) {
sapi_unregister_post_entry(php_post_entries TSRMLS_CC);
sapi_register_post_entries(mbstr_post_entries TSRMLS_CC);
sapi_register_treat_data(mbstr_treat_data);
} else {
_php_mb_enable_encoding_translation(0);
sapi_unregister_post_entry(mbstr_post_entries TSRMLS_CC);
sapi_register_post_entries(php_post_entries TSRMLS_CC);
}

return SUCCESS;
Expand Down Expand Up @@ -774,7 +793,8 @@ PHP_MINIT_FUNCTION(mbstring)
REGISTER_INI_ENTRIES();

if (MBSTRG(encoding_translation)) {
_php_mb_enable_encoding_translation(1);
sapi_register_post_entries(mbstr_post_entries TSRMLS_CC);
sapi_register_treat_data(mbstr_treat_data);
}

REGISTER_LONG_CONSTANT("MB_OVERLOAD_MAIL", MB_OVERLOAD_MAIL, CONST_CS | CONST_PERSISTENT);
Expand Down Expand Up @@ -809,10 +829,6 @@ PHP_MSHUTDOWN_FUNCTION(mbstring)
free(MBSTRG(detect_order_list));
}

if (MBSTRG(encoding_translation)) {
_php_mb_enable_encoding_translation(0);
}

#if HAVE_MBREGEX
PHP_MSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
#endif
Expand Down
40 changes: 27 additions & 13 deletions main/SAPI.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@

#include "php_content_types.h"

static HashTable known_post_content_types;

#ifdef ZTS
SAPI_API int sapi_globals_id;
#else
Expand All @@ -62,6 +60,13 @@ sapi_globals_struct sapi_globals;
static void sapi_globals_ctor(sapi_globals_struct *sapi_globals TSRMLS_DC)
{
memset(sapi_globals, 0, sizeof(*sapi_globals));
zend_hash_init_ex(&sapi_globals->known_post_content_types, 5,
NULL, NULL, 1, 0);
}

static void sapi_globals_dtor(sapi_globals_struct *sapi_globals TSRMLS_DC)
{
zend_hash_destroy(&sapi_globals->known_post_content_types);
}

/* True globals (no need for thread safety) */
Expand All @@ -71,11 +76,11 @@ SAPI_API sapi_module_struct sapi_module;
SAPI_API void sapi_startup(sapi_module_struct *sf)
{
sapi_module = *sf;
zend_hash_init_ex(&known_post_content_types, 5, NULL, NULL, 1, 0);

#ifdef ZTS
ts_allocate_id(&sapi_globals_id, sizeof(sapi_globals_struct), (ts_allocate_ctor) sapi_globals_ctor, NULL);
ts_allocate_id(&sapi_globals_id, sizeof(sapi_globals_struct), (ts_allocate_ctor) sapi_globals_ctor, (ts_allocate_dtor) sapi_globals_dtor);
#else
TSRMLS_FETCH();
sapi_globals_ctor(&sapi_globals TSRMLS_CC);
#endif

Expand All @@ -90,15 +95,20 @@ SAPI_API void sapi_startup(sapi_module_struct *sf)

SAPI_API void sapi_shutdown(void)
{
#ifdef ZTS
ts_free_id(&sapi_globals_id);
#else
TSRMLS_FETCH();
sapi_globals_dtor(&sapi_globals TSRMLS_CC);
#endif

reentrancy_shutdown();

virtual_cwd_shutdown();

#ifdef PHP_WIN32
tsrm_win32_shutdown();
#endif

zend_hash_destroy(&known_post_content_types);
}


Expand Down Expand Up @@ -151,7 +161,8 @@ static void sapi_read_post_data(TSRMLS_D)
}

/* now try to find an appropriate POST content handler */
if (zend_hash_find(&known_post_content_types, content_type, content_type_length+1, (void **) &post_entry) == SUCCESS) {
if (zend_hash_find(&SG(known_post_content_types), content_type,
content_type_length+1, (void **) &post_entry) == SUCCESS) {
/* found one, register it for use */
SG(request_info).post_entry = post_entry;
post_reader_func = post_entry->post_reader;
Expand Down Expand Up @@ -802,12 +813,12 @@ SAPI_API int sapi_send_headers(TSRMLS_D)
}


SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entries)
SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entries TSRMLS_DC)
{
sapi_post_entry *p=post_entries;

while (p->content_type) {
if (sapi_register_post_entry(p) == FAILURE) {
if (sapi_register_post_entry(p TSRMLS_CC) == FAILURE) {
return FAILURE;
}
p++;
Expand All @@ -816,14 +827,17 @@ SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entries)
}


SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry)
SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry TSRMLS_DC)
{
return zend_hash_add(&known_post_content_types, post_entry->content_type, post_entry->content_type_len+1, (void *) post_entry, sizeof(sapi_post_entry), NULL);
return zend_hash_add(&SG(known_post_content_types),
post_entry->content_type, post_entry->content_type_len+1,
(void *) post_entry, sizeof(sapi_post_entry), NULL);
}

SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry)
SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry TSRMLS_DC)
{
zend_hash_del(&known_post_content_types, post_entry->content_type, post_entry->content_type_len+1);
zend_hash_del(&SG(known_post_content_types), post_entry->content_type,
post_entry->content_type_len+1);
}


Expand Down
7 changes: 4 additions & 3 deletions main/SAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ typedef struct _sapi_globals_struct {
int options;
zend_bool sapi_started;
time_t global_request_time;
HashTable known_post_content_types;
} sapi_globals_struct;


Expand Down Expand Up @@ -180,9 +181,9 @@ SAPI_API int sapi_send_headers(TSRMLS_D);
SAPI_API void sapi_free_header(sapi_header_struct *sapi_header);
SAPI_API void sapi_handle_post(void *arg TSRMLS_DC);

SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entry);
SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry);
SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry);
SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entry TSRMLS_DC);
SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry TSRMLS_DC);
SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry TSRMLS_DC);
SAPI_API int sapi_register_default_post_reader(void (*default_post_reader)(TSRMLS_D));
SAPI_API int sapi_register_treat_data(void (*treat_data)(int arg, char *str, zval *destArray TSRMLS_DC));
SAPI_API int sapi_register_input_filter(unsigned int (*input_filter)(int arg, char *var, char **val, unsigned int val_len, unsigned int *new_val_len TSRMLS_DC));
Expand Down
2 changes: 1 addition & 1 deletion main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1415,7 +1415,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
zuv.import_use_extension = ".php";
php_startup_auto_globals(TSRMLS_C);
zend_set_utility_values(&zuv);
php_startup_sapi_content_types();
php_startup_sapi_content_types(TSRMLS_C);

REGISTER_MAIN_STRINGL_CONSTANT("PHP_VERSION", PHP_VERSION, sizeof(PHP_VERSION)-1, CONST_PERSISTENT | CONST_CS);
REGISTER_MAIN_STRINGL_CONSTANT("PHP_OS", php_os, strlen(php_os), CONST_PERSISTENT | CONST_CS);
Expand Down
4 changes: 2 additions & 2 deletions main/php_content_types.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)

/* {{{ php_startup_sapi_content_types
*/
int php_startup_sapi_content_types(void)
int php_startup_sapi_content_types(TSRMLS_D)
{
sapi_register_post_entries(php_post_entries);
sapi_register_post_entries(php_post_entries TSRMLS_CC);
sapi_register_default_post_reader(php_default_post_reader);
sapi_register_treat_data(php_default_treat_data);
sapi_register_input_filter(php_default_input_filter);
Expand Down
2 changes: 1 addition & 1 deletion main/php_content_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@

SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader);
SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler);
int php_startup_sapi_content_types(void);
int php_startup_sapi_content_types(TSRMLS_D);

#endif /* PHP_CONTENT_TYPES_H */

0 comments on commit 0d78453

Please sign in to comment.