From ed77c07a351e46cfda8417795497a2c7ece3e789 Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Wed, 12 Jul 2006 17:04:13 +0000 Subject: [PATCH] Commit Sara's patch for supporting filesystem enccoding in include/require. --- Zend/zend.c | 20 +++++++++++++ Zend/zend.h | 2 ++ Zend/zend_vm_def.h | 16 ++++++++++- Zend/zend_vm_execute.h | 64 +++++++++++++++++++++++++++++++++++++++--- main/main.c | 9 ++++++ 5 files changed, 106 insertions(+), 5 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index bff028403e..86f59d8dd2 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -55,6 +55,7 @@ BOOL WINAPI IsDebuggerPresent(VOID); ZEND_API zend_class_entry *zend_standard_class_def = NULL; ZEND_API int (*zend_printf)(const char *format, ...); ZEND_API zend_write_func_t zend_write; +ZEND_API int (*zend_path_encode)(char **encpath, int *encpath_len, const UChar *path, int path_len TSRMLS_DC); ZEND_API FILE *(*zend_fopen)(const char *filename, char **opened_path); ZEND_API int (*zend_stream_open_function)(const char *filename, zend_file_handle *handle TSRMLS_DC); ZEND_API void (*zend_block_interruptions)(void); @@ -607,6 +608,21 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int } } +static int zend_path_encode_wrapper(char **encpath, int *encpath_len, const UChar *path, int path_len TSRMLS_DC) +{ + UErrorCode status = U_ZERO_ERROR; + + zend_convert_from_unicode(ZEND_U_CONVERTER(UG(filesystem_encoding_conv)), encpath, encpath_len, path, path_len, &status); + + if (U_FAILURE(status)) { + efree(*encpath); + *encpath = NULL; + *encpath_len = 0; + return FAILURE; + } + + return SUCCESS; +} static FILE *zend_fopen_wrapper(const char *filename, char **opened_path) { @@ -990,6 +1006,10 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions, i zend_error_cb = utility_functions->error_function; zend_printf = utility_functions->printf_function; zend_write = (zend_write_func_t) utility_functions->write_function; + zend_path_encode = utility_functions->path_encode_function; + if (!zend_path_encode) { + zend_path_encode = zend_path_encode_wrapper; + } zend_fopen = utility_functions->fopen_function; if (!zend_fopen) { zend_fopen = zend_fopen_wrapper; diff --git a/Zend/zend.h b/Zend/zend.h index 64d020512a..443fc2d8d9 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -410,6 +410,7 @@ typedef struct _zend_utility_functions { void (*error_function)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args); int (*printf_function)(const char *format, ...); int (*write_function)(const char *str, uint str_length); + int (*path_encode_function)(char **encpath, int *encpath_len, const UChar *path, int path_len TSRMLS_DC); FILE *(*fopen_function)(const char *filename, char **opened_path); void (*message_handler)(long message, void *data); void (*block_interruptions)(void); @@ -555,6 +556,7 @@ END_EXTERN_C() BEGIN_EXTERN_C() extern ZEND_API int (*zend_printf)(const char *format, ...); extern ZEND_API zend_write_func_t zend_write; +extern ZEND_API int (*zend_path_encode)(char **encpath, int *encpath_len, const UChar *path, int path_len TSRMLS_DC); extern ZEND_API FILE *(*zend_fopen)(const char *filename, char **opened_path); extern ZEND_API void (*zend_block_interruptions)(void); extern ZEND_API void (*zend_unblock_interruptions)(void); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 92ebef8cb7..cf8c4b9764 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2761,7 +2761,19 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY) convert_to_unicode(&tmp_inc_filename); inc_filename = &tmp_inc_filename; } - } else if (Z_TYPE_P(inc_filename)!=IS_STRING) { + } else if (Z_TYPE_P(inc_filename) == IS_UNICODE) { + char *encpath; + int encpath_len; + + if (FAILURE == zend_path_encode(&encpath, &encpath_len, Z_USTRVAL_P(inc_filename), Z_USTRLEN_P(inc_filename) TSRMLS_CC)) { + failure_retval = 0; + zend_error(E_ERROR, "Failure converting '%R' to filesystem encoding", IS_UNICODE, Z_USTRVAL_P(inc_filename)); + goto skip_compile; + } + + ZVAL_STRINGL(&tmp_inc_filename, encpath, encpath_len, 0); + inc_filename = &tmp_inc_filename; + } else if (Z_TYPE_P(inc_filename) != IS_STRING) { tmp_inc_filename = *inc_filename; zval_copy_ctor(&tmp_inc_filename); convert_to_string(&tmp_inc_filename); @@ -2824,6 +2836,8 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY) break; EMPTY_SWITCH_DEFAULT_CASE() } + +skip_compile: if (inc_filename==&tmp_inc_filename) { zval_dtor(&tmp_inc_filename); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 065f47aa61..34ab6f4f0a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1870,7 +1870,19 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) convert_to_unicode(&tmp_inc_filename); inc_filename = &tmp_inc_filename; } - } else if (Z_TYPE_P(inc_filename)!=IS_STRING) { + } else if (Z_TYPE_P(inc_filename) == IS_UNICODE) { + char *encpath; + int encpath_len; + + if (FAILURE == zend_path_encode(&encpath, &encpath_len, Z_USTRVAL_P(inc_filename), Z_USTRLEN_P(inc_filename) TSRMLS_CC)) { + failure_retval = 0; + zend_error(E_ERROR, "Failure converting '%R' to filesystem encoding", IS_UNICODE, Z_USTRVAL_P(inc_filename)); + goto skip_compile; + } + + ZVAL_STRINGL(&tmp_inc_filename, encpath, encpath_len, 0); + inc_filename = &tmp_inc_filename; + } else if (Z_TYPE_P(inc_filename) != IS_STRING) { tmp_inc_filename = *inc_filename; zval_copy_ctor(&tmp_inc_filename); convert_to_string(&tmp_inc_filename); @@ -1933,6 +1945,8 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) break; EMPTY_SWITCH_DEFAULT_CASE() } + +skip_compile: if (inc_filename==&tmp_inc_filename) { zval_dtor(&tmp_inc_filename); } @@ -4436,7 +4450,19 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) convert_to_unicode(&tmp_inc_filename); inc_filename = &tmp_inc_filename; } - } else if (Z_TYPE_P(inc_filename)!=IS_STRING) { + } else if (Z_TYPE_P(inc_filename) == IS_UNICODE) { + char *encpath; + int encpath_len; + + if (FAILURE == zend_path_encode(&encpath, &encpath_len, Z_USTRVAL_P(inc_filename), Z_USTRLEN_P(inc_filename) TSRMLS_CC)) { + failure_retval = 0; + zend_error(E_ERROR, "Failure converting '%R' to filesystem encoding", IS_UNICODE, Z_USTRVAL_P(inc_filename)); + goto skip_compile; + } + + ZVAL_STRINGL(&tmp_inc_filename, encpath, encpath_len, 0); + inc_filename = &tmp_inc_filename; + } else if (Z_TYPE_P(inc_filename) != IS_STRING) { tmp_inc_filename = *inc_filename; zval_copy_ctor(&tmp_inc_filename); convert_to_string(&tmp_inc_filename); @@ -4499,6 +4525,8 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) break; EMPTY_SWITCH_DEFAULT_CASE() } + +skip_compile: if (inc_filename==&tmp_inc_filename) { zval_dtor(&tmp_inc_filename); } @@ -7599,7 +7627,19 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) convert_to_unicode(&tmp_inc_filename); inc_filename = &tmp_inc_filename; } - } else if (Z_TYPE_P(inc_filename)!=IS_STRING) { + } else if (Z_TYPE_P(inc_filename) == IS_UNICODE) { + char *encpath; + int encpath_len; + + if (FAILURE == zend_path_encode(&encpath, &encpath_len, Z_USTRVAL_P(inc_filename), Z_USTRLEN_P(inc_filename) TSRMLS_CC)) { + failure_retval = 0; + zend_error(E_ERROR, "Failure converting '%R' to filesystem encoding", IS_UNICODE, Z_USTRVAL_P(inc_filename)); + goto skip_compile; + } + + ZVAL_STRINGL(&tmp_inc_filename, encpath, encpath_len, 0); + inc_filename = &tmp_inc_filename; + } else if (Z_TYPE_P(inc_filename) != IS_STRING) { tmp_inc_filename = *inc_filename; zval_copy_ctor(&tmp_inc_filename); convert_to_string(&tmp_inc_filename); @@ -7662,6 +7702,8 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) break; EMPTY_SWITCH_DEFAULT_CASE() } + +skip_compile: if (inc_filename==&tmp_inc_filename) { zval_dtor(&tmp_inc_filename); } @@ -20358,7 +20400,19 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) convert_to_unicode(&tmp_inc_filename); inc_filename = &tmp_inc_filename; } - } else if (Z_TYPE_P(inc_filename)!=IS_STRING) { + } else if (Z_TYPE_P(inc_filename) == IS_UNICODE) { + char *encpath; + int encpath_len; + + if (FAILURE == zend_path_encode(&encpath, &encpath_len, Z_USTRVAL_P(inc_filename), Z_USTRLEN_P(inc_filename) TSRMLS_CC)) { + failure_retval = 0; + zend_error(E_ERROR, "Failure converting '%R' to filesystem encoding", IS_UNICODE, Z_USTRVAL_P(inc_filename)); + goto skip_compile; + } + + ZVAL_STRINGL(&tmp_inc_filename, encpath, encpath_len, 0); + inc_filename = &tmp_inc_filename; + } else if (Z_TYPE_P(inc_filename) != IS_STRING) { tmp_inc_filename = *inc_filename; zval_copy_ctor(&tmp_inc_filename); convert_to_string(&tmp_inc_filename); @@ -20421,6 +20475,8 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) break; EMPTY_SWITCH_DEFAULT_CASE() } + +skip_compile: if (inc_filename==&tmp_inc_filename) { zval_dtor(&tmp_inc_filename); } diff --git a/main/main.c b/main/main.c index 0454241b88..5b48a6a3fd 100644 --- a/main/main.c +++ b/main/main.c @@ -974,6 +974,14 @@ PHP_FUNCTION(set_time_limit) } /* }}} */ +/* {{{ php_path_encode_for_zend + */ +static int php_path_encode_for_zend(char **encpath, int *encpath_len, const UChar *path, int path_len TSRMLS_DC) +{ + return php_stream_path_encode(NULL, encpath, encpath_len, path, path_len, 0, NULL); +} +/* }}} */ + /* {{{ php_fopen_wrapper_for_zend */ static FILE *php_fopen_wrapper_for_zend(const char *filename, char **opened_path) @@ -1522,6 +1530,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod zuf.error_function = php_error_cb; zuf.printf_function = php_printf; zuf.write_function = php_output_wrapper; + zuf.path_encode_function = php_path_encode_for_zend; zuf.fopen_function = php_fopen_wrapper_for_zend; zuf.message_handler = php_message_handler_for_zend; zuf.block_interruptions = sapi_module.block_interruptions; -- 2.40.0