From 3fd5a4055634a62efa7a635d29f9b19e440d842b Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 20 Feb 2013 18:53:17 +0100 Subject: [PATCH 0001/1256] Dont reset other counters when incrementing slow_rq --- sapi/fpm/fpm/fpm_php_trace.c | 2 +- sapi/fpm/fpm/fpm_scoreboard.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sapi/fpm/fpm/fpm_php_trace.c b/sapi/fpm/fpm/fpm_php_trace.c index d95d66a754c3e..925f2de64e93f 100644 --- a/sapi/fpm/fpm/fpm_php_trace.c +++ b/sapi/fpm/fpm/fpm_php_trace.c @@ -138,7 +138,7 @@ static int fpm_php_trace_dump(struct fpm_child_s *child, FILE *slowlog TSRMLS_DC void fpm_php_trace(struct fpm_child_s *child) /* {{{ */ { TSRMLS_FETCH(); - fpm_scoreboard_update(0, 0, 0, 0, 0, 0, 1, FPM_SCOREBOARD_ACTION_SET, child->wp->scoreboard); + fpm_scoreboard_update(0, 0, 0, 0, 0, 0, 1, FPM_SCOREBOARD_ACTION_INC, child->wp->scoreboard); FILE *slowlog; zlog(ZLOG_NOTICE, "about to trace %d", (int) child->pid); diff --git a/sapi/fpm/fpm/fpm_scoreboard.c b/sapi/fpm/fpm/fpm_scoreboard.c index 24463a90dddfd..8d0868182d763 100644 --- a/sapi/fpm/fpm/fpm_scoreboard.c +++ b/sapi/fpm/fpm/fpm_scoreboard.c @@ -111,7 +111,7 @@ void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int request scoreboard->max_children_reached = max_children_reached; } if (slow_rq > 0) { - scoreboard->slow_rq += slow_rq; + scoreboard->slow_rq = slow_rq; } } else { if (scoreboard->idle + idle > 0) { @@ -137,6 +137,12 @@ void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int request } else { scoreboard->max_children_reached = 0; } + + if (scoreboard->slow_rq + slow_rq > 0) { + scoreboard->slow_rq += slow_rq; + } else { + scoreboard->slow_rq = 0; + } } if (scoreboard->active > scoreboard->active_max) { From 5dd41627bed892e76492ae3945e3b0d9cac21019 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Tue, 16 Jul 2013 20:39:33 +0200 Subject: [PATCH 0002/1256] Add new 'use function' sequence for importing namespaced functions This is specified as the use_function RFC: * https://wiki.php.net/rfc/use_function --- Zend/tests/use_function/alias.phpt | 30 ++++++++ Zend/tests/use_function/basic.phpt | 26 +++++++ Zend/tests/use_function/conflicting_use.phpt | 25 ++++++ .../use_function/no_global_fallback.phpt | 18 +++++ Zend/tests/use_function/shadow_core.phpt | 26 +++++++ Zend/tests/use_function/shadow_global.phpt | 32 ++++++++ .../use_function/shadow_global_same_ns.phpt | 25 ++++++ Zend/zend_compile.c | 77 +++++++++++++++++++ Zend/zend_compile.h | 1 + Zend/zend_globals.h | 1 + Zend/zend_language_parser.y | 13 ++++ 11 files changed, 274 insertions(+) create mode 100644 Zend/tests/use_function/alias.phpt create mode 100644 Zend/tests/use_function/basic.phpt create mode 100644 Zend/tests/use_function/conflicting_use.phpt create mode 100644 Zend/tests/use_function/no_global_fallback.phpt create mode 100644 Zend/tests/use_function/shadow_core.phpt create mode 100644 Zend/tests/use_function/shadow_global.phpt create mode 100644 Zend/tests/use_function/shadow_global_same_ns.phpt diff --git a/Zend/tests/use_function/alias.phpt b/Zend/tests/use_function/alias.phpt new file mode 100644 index 0000000000000..5f7e97fff87f0 --- /dev/null +++ b/Zend/tests/use_function/alias.phpt @@ -0,0 +1,30 @@ +--TEST-- +aliasing imported functions to resolve naming conflicts +--FILE-- + +--EXPECT-- +string(7) "foo.baz" +string(7) "bar.baz" +Done diff --git a/Zend/tests/use_function/basic.phpt b/Zend/tests/use_function/basic.phpt new file mode 100644 index 0000000000000..513a96620c17b --- /dev/null +++ b/Zend/tests/use_function/basic.phpt @@ -0,0 +1,26 @@ +--TEST-- +import namespaced function +--FILE-- + +--EXPECT-- +string(11) "foo.bar.baz" +string(11) "foo.bar.baz" +Done diff --git a/Zend/tests/use_function/conflicting_use.phpt b/Zend/tests/use_function/conflicting_use.phpt new file mode 100644 index 0000000000000..ed531e4febe0d --- /dev/null +++ b/Zend/tests/use_function/conflicting_use.phpt @@ -0,0 +1,25 @@ +--TEST-- +use function statements with conflicting names +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use bar\baz as baz because the name is already in use in %s on line %d diff --git a/Zend/tests/use_function/no_global_fallback.phpt b/Zend/tests/use_function/no_global_fallback.phpt new file mode 100644 index 0000000000000..018ae92afc029 --- /dev/null +++ b/Zend/tests/use_function/no_global_fallback.phpt @@ -0,0 +1,18 @@ +--TEST-- +non-existent imported functions should not be looked up in the global table +--FILE-- + +--EXPECTF-- +Fatal error: Call to undefined function foo\bar\baz() in %s on line %d diff --git a/Zend/tests/use_function/shadow_core.phpt b/Zend/tests/use_function/shadow_core.phpt new file mode 100644 index 0000000000000..b06fbfce2e173 --- /dev/null +++ b/Zend/tests/use_function/shadow_core.phpt @@ -0,0 +1,26 @@ +--TEST-- +shadowing a global core function with a local version +--FILE-- + +--EXPECT-- +int(11) +int(4) +Done diff --git a/Zend/tests/use_function/shadow_global.phpt b/Zend/tests/use_function/shadow_global.phpt new file mode 100644 index 0000000000000..b3182993b378c --- /dev/null +++ b/Zend/tests/use_function/shadow_global.phpt @@ -0,0 +1,32 @@ +--TEST-- +shadowing a global function with a local version +--FILE-- + +--EXPECT-- +string(10) "global bar" +string(9) "local bar" +Done diff --git a/Zend/tests/use_function/shadow_global_same_ns.phpt b/Zend/tests/use_function/shadow_global_same_ns.phpt new file mode 100644 index 0000000000000..7a30c8238f302 --- /dev/null +++ b/Zend/tests/use_function/shadow_global_same_ns.phpt @@ -0,0 +1,25 @@ +--TEST-- +shadowing global functions defined in the same namespace as use +--FILE-- + +--EXPECT-- +string(5) "local" +Done diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f250b2be20879..7696960c204d5 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -204,6 +204,7 @@ void zend_init_compiler_data_structures(TSRMLS_D) /* {{{ */ CG(in_namespace) = 0; CG(has_bracketed_namespaces) = 0; CG(current_import) = NULL; + CG(current_import_function) = NULL; init_compiler_declarables(TSRMLS_C); zend_stack_init(&CG(context_stack)); @@ -2094,6 +2095,20 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace return; } + if (CG(current_import_function)) { + len = Z_STRLEN(element_name->u.constant)+1; + lcname = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); + /* Check if function matches imported name */ + if (zend_hash_find(CG(current_import_function), lcname, len, (void**)&ns) == SUCCESS) { + zval_dtor(&element_name->u.constant); + element_name->u.constant = **ns; + zval_copy_ctor(&element_name->u.constant); + efree(lcname); + return; + } + efree(lcname); + } + if (compound && CG(current_import)) { len = compound - Z_STRVAL(element_name->u.constant); lcname = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); @@ -6997,6 +7012,12 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC CG(current_import) = NULL; } + if (CG(current_import_function)) { + zend_hash_destroy(CG(current_import_function)); + efree(CG(current_import_function)); + CG(current_import_function) = NULL; + } + if (CG(doc_comment)) { efree(CG(doc_comment)); CG(doc_comment) = NULL; @@ -7089,6 +7110,57 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } /* }}} */ +void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{{ */ +{ + char *lcname; + zval *name, *ns, tmp; + zend_bool warn = 0; + + if (!CG(current_import_function)) { + CG(current_import_function) = emalloc(sizeof(HashTable)); + zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); + } + + ALLOC_ZVAL(ns); + *ns = ns_name->u.constant; + if (new_name) { + name = &new_name->u.constant; + } else { + const char *p; + + /* The form "use A\B" is eqivalent to "use A\B as B". + So we extract the last part of compound name to use as a new_name */ + name = &tmp; + p = zend_memrchr(Z_STRVAL_P(ns), '\\', Z_STRLEN_P(ns)); + if (p) { + ZVAL_STRING(name, p+1, 1); + } else { + *name = *ns; + zval_copy_ctor(name); + warn = !is_global && !CG(current_namespace); + } + } + + lcname = zend_str_tolower_dup(Z_STRVAL_P(name), Z_STRLEN_P(name)); + + if (((Z_STRLEN_P(name) == sizeof("self")-1) && + !memcmp(lcname, "self", sizeof("self")-1)) || + ((Z_STRLEN_P(name) == sizeof("parent")-1) && + !memcmp(lcname, "parent", sizeof("parent")-1))) { + zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); + } + + if (zend_hash_add(CG(current_import_function), lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { + zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } + if (warn) { + zend_error(E_WARNING, "The use statement with non-compound name '%s' has no effect", Z_STRVAL_P(name)); + } + efree(lcname); + zval_dtor(name); +} +/* }}} */ + void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ { zend_op *opline; @@ -7141,6 +7213,11 @@ void zend_do_end_namespace(TSRMLS_D) /* {{{ */ efree(CG(current_import)); CG(current_import) = NULL; } + if (CG(current_import_function)) { + zend_hash_destroy(CG(current_import_function)); + efree(CG(current_import_function)); + CG(current_import_function) = NULL; + } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 9c55b5ebe8812..f2078ed85b693 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -636,6 +636,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_brackets TSRMLS_D void zend_do_end_namespace(TSRMLS_D); void zend_verify_namespace(TSRMLS_D); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); +void zend_do_use_function(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_end_compilation(TSRMLS_D); void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static TSRMLS_DC); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index b9a5b39914a6c..2a1194affc6d7 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -131,6 +131,7 @@ struct _zend_compiler_globals { zval *current_namespace; HashTable *current_import; + HashTable *current_import_function; zend_bool in_namespace; zend_bool has_bracketed_namespaces; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 6a9a24a87ea72..df3e55f95fbd4 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -240,6 +240,7 @@ top_statement: | T_NAMESPACE '{' { zend_do_begin_namespace(NULL, 1 TSRMLS_CC); } top_statement_list '}' { zend_do_end_namespace(TSRMLS_C); } | T_USE use_declarations ';' { zend_verify_namespace(TSRMLS_C); } + | T_USE T_FUNCTION use_function_declarations ';' { zend_verify_namespace(TSRMLS_C); } | constant_declaration ';' { zend_verify_namespace(TSRMLS_C); } ; @@ -255,6 +256,18 @@ use_declaration: | T_NS_SEPARATOR namespace_name T_AS T_STRING { zend_do_use(&$2, &$4, 1 TSRMLS_CC); } ; +use_function_declarations: + use_function_declarations ',' use_function_declaration + | use_function_declaration +; + +use_function_declaration: + namespace_name { zend_do_use_function(&$1, NULL, 0 TSRMLS_CC); } + | namespace_name T_AS T_STRING { zend_do_use_function(&$1, &$3, 0 TSRMLS_CC); } + | T_NS_SEPARATOR namespace_name { zend_do_use_function(&$2, NULL, 1 TSRMLS_CC); } + | T_NS_SEPARATOR namespace_name T_AS T_STRING { zend_do_use_function(&$2, &$4, 1 TSRMLS_CC); } +; + constant_declaration: constant_declaration ',' T_STRING '=' static_scalar { zend_do_declare_constant(&$3, &$5 TSRMLS_CC); } | T_CONST T_STRING '=' static_scalar { zend_do_declare_constant(&$2, &$4 TSRMLS_CC); } From e1125a6a894a8b005aaea6b8ce2e0ea6bf39e483 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Tue, 23 Jul 2013 21:08:49 +0200 Subject: [PATCH 0003/1256] Correctly distinguish between functions and constants So far 'use function' applied to both constants and functions. This patch correctly separates the two. --- Zend/tests/use_function/ignore_constants.phpt | 23 ++++++++++++++++++ Zend/zend_compile.c | 24 ++++++++++++++----- Zend/zend_compile.h | 4 +++- 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/use_function/ignore_constants.phpt diff --git a/Zend/tests/use_function/ignore_constants.phpt b/Zend/tests/use_function/ignore_constants.phpt new file mode 100644 index 0000000000000..c50ff7357af17 --- /dev/null +++ b/Zend/tests/use_function/ignore_constants.phpt @@ -0,0 +1,23 @@ +--TEST-- +use function should ignore namespaced constants +--FILE-- + +--EXPECT-- +int(43) +Done diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7696960c204d5..8013a1e5d19ba 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1938,7 +1938,7 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace char *lcname; char *is_compound = memchr(Z_STRVAL(function_name->u.constant), '\\', Z_STRLEN(function_name->u.constant)); - zend_resolve_non_class_name(function_name, check_namespace TSRMLS_CC); + zend_resolve_function_name(function_name, check_namespace TSRMLS_CC); if (check_namespace && CG(current_namespace) && !is_compound) { /* We assume we call function from the current namespace @@ -2077,7 +2077,7 @@ void zend_do_begin_dynamic_function_call(znode *function_name, int ns_call TSRML } /* }}} */ -void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ +void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ { znode tmp; int len; @@ -2095,11 +2095,11 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace return; } - if (CG(current_import_function)) { + if (current_import_sub) { len = Z_STRLEN(element_name->u.constant)+1; lcname = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); /* Check if function matches imported name */ - if (zend_hash_find(CG(current_import_function), lcname, len, (void**)&ns) == SUCCESS) { + if (zend_hash_find(current_import_sub, lcname, len, (void**)&ns) == SUCCESS) { zval_dtor(&element_name->u.constant); element_name->u.constant = **ns; zval_copy_ctor(&element_name->u.constant); @@ -2142,6 +2142,18 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace } /* }}} */ +void zend_resolve_function_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ +{ + zend_resolve_non_class_name(element_name, check_namespace, CG(current_import_function) TSRMLS_CC); +} +/* }}} */ + +void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ +{ + zend_resolve_non_class_name(element_name, check_namespace, NULL TSRMLS_CC); +} +/* }}} */ + void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static TSRMLS_DC) /* {{{ */ { char *lcname; @@ -5644,7 +5656,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con break; } - zend_resolve_non_class_name(constant_name, check_namespace TSRMLS_CC); + zend_resolve_const_name(constant_name, check_namespace TSRMLS_CC); if(!compound) { fetch_type |= IS_CONSTANT_UNQUALIFIED; @@ -5656,7 +5668,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con case ZEND_RT: compound = memchr(Z_STRVAL(constant_name->u.constant), '\\', Z_STRLEN(constant_name->u.constant)); - zend_resolve_non_class_name(constant_name, check_namespace TSRMLS_CC); + zend_resolve_const_name(constant_name, check_namespace TSRMLS_CC); if(zend_constant_ct_subst(result, &constant_name->u.constant, 1 TSRMLS_CC)) { break; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f2078ed85b693..066c517089d87 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -437,7 +437,9 @@ ZEND_API char *zend_get_compiled_filename(TSRMLS_D); ZEND_API int zend_get_compiled_lineno(TSRMLS_D); ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D); -void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); +void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, HashTable *current_import_sub TSRMLS_DC); +void zend_resolve_function_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); +void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC); ZEND_API const char* zend_get_compiled_variable_name(const zend_op_array *op_array, zend_uint var, int* name_len); From 4adf49eeaffc23cc6f4be53c2d89c720bd96d0c3 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Tue, 23 Jul 2013 20:21:48 +0200 Subject: [PATCH 0004/1256] Import namespaced constants via new 'use const' sequence --- Zend/tests/use_const/alias.phpt | 26 ++++++++++ Zend/tests/use_const/basic.phpt | 22 +++++++++ Zend/tests/use_const/conflicting_use.phpt | 21 +++++++++ Zend/tests/use_const/function_and_cons.phpt | 25 ++++++++++ Zend/tests/use_const/no_global_fallback.phpt | 18 +++++++ Zend/tests/use_const/shadow_core.phpt | 24 ++++++++++ Zend/tests/use_const/shadow_core_null.phpt | 12 +++++ Zend/tests/use_const/shadow_global.phpt | 28 +++++++++++ .../use_const/shadow_global_same_ns.phpt | 21 +++++++++ Zend/zend_compile.c | 47 +++++++++++++++---- Zend/zend_compile.h | 2 + Zend/zend_globals.h | 1 + Zend/zend_language_parser.y | 13 +++++ 13 files changed, 251 insertions(+), 9 deletions(-) create mode 100644 Zend/tests/use_const/alias.phpt create mode 100644 Zend/tests/use_const/basic.phpt create mode 100644 Zend/tests/use_const/conflicting_use.phpt create mode 100644 Zend/tests/use_const/function_and_cons.phpt create mode 100644 Zend/tests/use_const/no_global_fallback.phpt create mode 100644 Zend/tests/use_const/shadow_core.phpt create mode 100644 Zend/tests/use_const/shadow_core_null.phpt create mode 100644 Zend/tests/use_const/shadow_global.phpt create mode 100644 Zend/tests/use_const/shadow_global_same_ns.phpt diff --git a/Zend/tests/use_const/alias.phpt b/Zend/tests/use_const/alias.phpt new file mode 100644 index 0000000000000..f179393006bef --- /dev/null +++ b/Zend/tests/use_const/alias.phpt @@ -0,0 +1,26 @@ +--TEST-- +aliasing imported constants to resolve naming conflicts +--FILE-- + +--EXPECT-- +int(42) +int(43) +Done diff --git a/Zend/tests/use_const/basic.phpt b/Zend/tests/use_const/basic.phpt new file mode 100644 index 0000000000000..6eaed7f27d379 --- /dev/null +++ b/Zend/tests/use_const/basic.phpt @@ -0,0 +1,22 @@ +--TEST-- +import namespaced constant +--FILE-- + +--EXPECT-- +int(42) +int(43) +Done diff --git a/Zend/tests/use_const/conflicting_use.phpt b/Zend/tests/use_const/conflicting_use.phpt new file mode 100644 index 0000000000000..f873fdcc65304 --- /dev/null +++ b/Zend/tests/use_const/conflicting_use.phpt @@ -0,0 +1,21 @@ +--TEST-- +use const statements with conflicting names +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use bar\baz as baz because the name is already in use in %s on line %d diff --git a/Zend/tests/use_const/function_and_cons.phpt b/Zend/tests/use_const/function_and_cons.phpt new file mode 100644 index 0000000000000..6c975ba923cb6 --- /dev/null +++ b/Zend/tests/use_const/function_and_cons.phpt @@ -0,0 +1,25 @@ +--TEST-- +use function and use const in the same block +--FILE-- + +--EXPECT-- +string(11) "local const" +string(14) "local function" +Done diff --git a/Zend/tests/use_const/no_global_fallback.phpt b/Zend/tests/use_const/no_global_fallback.phpt new file mode 100644 index 0000000000000..fad18797ba688 --- /dev/null +++ b/Zend/tests/use_const/no_global_fallback.phpt @@ -0,0 +1,18 @@ +--TEST-- +non-existent imported constants should not be looked up in the global table +--FILE-- + +--EXPECTF-- +Notice: Use of undefined constant baz - assumed 'baz' in %s on line %d +string(3) "baz" diff --git a/Zend/tests/use_const/shadow_core.phpt b/Zend/tests/use_const/shadow_core.phpt new file mode 100644 index 0000000000000..8052baebc65e0 --- /dev/null +++ b/Zend/tests/use_const/shadow_core.phpt @@ -0,0 +1,24 @@ +--TEST-- +shadowing a global core constant with a local version +--FILE-- + +--EXPECTF-- +string(%d) "%s" +int(42) +Done diff --git a/Zend/tests/use_const/shadow_core_null.phpt b/Zend/tests/use_const/shadow_core_null.phpt new file mode 100644 index 0000000000000..5bbc9329dfd4e --- /dev/null +++ b/Zend/tests/use_const/shadow_core_null.phpt @@ -0,0 +1,12 @@ +--TEST-- +shadowing null with a local version +--FILE-- + +--EXPECTF-- +Fatal error: Cannot redeclare constant 'null' in %s on line %d diff --git a/Zend/tests/use_const/shadow_global.phpt b/Zend/tests/use_const/shadow_global.phpt new file mode 100644 index 0000000000000..ddd47a264c0b1 --- /dev/null +++ b/Zend/tests/use_const/shadow_global.phpt @@ -0,0 +1,28 @@ +--TEST-- +shadowing a global constant with a local version +--FILE-- + +--EXPECT-- +string(10) "global bar" +string(9) "local bar" +Done diff --git a/Zend/tests/use_const/shadow_global_same_ns.phpt b/Zend/tests/use_const/shadow_global_same_ns.phpt new file mode 100644 index 0000000000000..7e8a8710277b6 --- /dev/null +++ b/Zend/tests/use_const/shadow_global_same_ns.phpt @@ -0,0 +1,21 @@ +--TEST-- +shadowing global constants defined in the same namespace as use +--FILE-- + +--EXPECT-- +string(5) "local" +Done diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 8013a1e5d19ba..2660781e60367 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -205,6 +205,7 @@ void zend_init_compiler_data_structures(TSRMLS_D) /* {{{ */ CG(has_bracketed_namespaces) = 0; CG(current_import) = NULL; CG(current_import_function) = NULL; + CG(current_import_const) = NULL; init_compiler_declarables(TSRMLS_C); zend_stack_init(&CG(context_stack)); @@ -2098,7 +2099,7 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, if (current_import_sub) { len = Z_STRLEN(element_name->u.constant)+1; lcname = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); - /* Check if function matches imported name */ + /* Check if function/const matches imported name */ if (zend_hash_find(current_import_sub, lcname, len, (void**)&ns) == SUCCESS) { zval_dtor(&element_name->u.constant); element_name->u.constant = **ns; @@ -2150,7 +2151,7 @@ void zend_resolve_function_name(znode *element_name, zend_bool check_namespace T void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ { - zend_resolve_non_class_name(element_name, check_namespace, NULL TSRMLS_CC); + zend_resolve_non_class_name(element_name, check_namespace, CG(current_import_const) TSRMLS_CC); } /* }}} */ @@ -7030,6 +7031,12 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC CG(current_import_function) = NULL; } + if (CG(current_import_const)) { + zend_hash_destroy(CG(current_import_const)); + efree(CG(current_import_const)); + CG(current_import_const) = NULL; + } + if (CG(doc_comment)) { efree(CG(doc_comment)); CG(doc_comment) = NULL; @@ -7122,17 +7129,12 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } /* }}} */ -void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{{ */ +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ { char *lcname; zval *name, *ns, tmp; zend_bool warn = 0; - if (!CG(current_import_function)) { - CG(current_import_function) = emalloc(sizeof(HashTable)); - zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); - } - ALLOC_ZVAL(ns); *ns = ns_name->u.constant; if (new_name) { @@ -7162,7 +7164,7 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_ zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); } - if (zend_hash_add(CG(current_import_function), lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { + if (zend_hash_add(current_import_sub, lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } if (warn) { @@ -7173,6 +7175,28 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_ } /* }}} */ +void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{{ */ +{ + if (!CG(current_import_function)) { + CG(current_import_function) = emalloc(sizeof(HashTable)); + zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); + } + + zend_do_use_non_class(ns_name, new_name, is_global, CG(current_import_function) TSRMLS_CC); +} +/* }}} */ + +void zend_do_use_const(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{{ */ +{ + if (!CG(current_import_const)) { + CG(current_import_const) = emalloc(sizeof(HashTable)); + zend_hash_init(CG(current_import_const), 0, NULL, ZVAL_PTR_DTOR, 0); + } + + zend_do_use_non_class(ns_name, new_name, is_global, CG(current_import_const) TSRMLS_CC); +} +/* }}} */ + void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ { zend_op *opline; @@ -7230,6 +7254,11 @@ void zend_do_end_namespace(TSRMLS_D) /* {{{ */ efree(CG(current_import_function)); CG(current_import_function) = NULL; } + if (CG(current_import_const)) { + zend_hash_destroy(CG(current_import_const)); + efree(CG(current_import_const)); + CG(current_import_const) = NULL; + } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 066c517089d87..3c944e45a6dce 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -638,7 +638,9 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_brackets TSRMLS_D void zend_do_end_namespace(TSRMLS_D); void zend_verify_namespace(TSRMLS_D); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, HashTable *current_import_sub TSRMLS_DC); void zend_do_use_function(znode *name, znode *new_name, int is_global TSRMLS_DC); +void zend_do_use_const(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_end_compilation(TSRMLS_D); void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static TSRMLS_DC); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 2a1194affc6d7..ddb5fc5df745d 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -132,6 +132,7 @@ struct _zend_compiler_globals { zval *current_namespace; HashTable *current_import; HashTable *current_import_function; + HashTable *current_import_const; zend_bool in_namespace; zend_bool has_bracketed_namespaces; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index df3e55f95fbd4..7cfab914debb4 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -241,6 +241,7 @@ top_statement: top_statement_list '}' { zend_do_end_namespace(TSRMLS_C); } | T_USE use_declarations ';' { zend_verify_namespace(TSRMLS_C); } | T_USE T_FUNCTION use_function_declarations ';' { zend_verify_namespace(TSRMLS_C); } + | T_USE T_CONST use_const_declarations ';' { zend_verify_namespace(TSRMLS_C); } | constant_declaration ';' { zend_verify_namespace(TSRMLS_C); } ; @@ -268,6 +269,18 @@ use_function_declaration: | T_NS_SEPARATOR namespace_name T_AS T_STRING { zend_do_use_function(&$2, &$4, 1 TSRMLS_CC); } ; +use_const_declarations: + use_const_declarations ',' use_const_declaration + | use_const_declaration +; + +use_const_declaration: + namespace_name { zend_do_use_const(&$1, NULL, 0 TSRMLS_CC); } + | namespace_name T_AS T_STRING { zend_do_use_const(&$1, &$3, 0 TSRMLS_CC); } + | T_NS_SEPARATOR namespace_name { zend_do_use_const(&$2, NULL, 1 TSRMLS_CC); } + | T_NS_SEPARATOR namespace_name T_AS T_STRING { zend_do_use_const(&$2, &$4, 1 TSRMLS_CC); } +; + constant_declaration: constant_declaration ',' T_STRING '=' static_scalar { zend_do_declare_constant(&$3, &$5 TSRMLS_CC); } | T_CONST T_STRING '=' static_scalar { zend_do_declare_constant(&$2, &$4 TSRMLS_CC); } From 2dbbb8ae4b8f20f68c4d9f0f708d4391bbf49d07 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Wed, 21 Aug 2013 16:31:17 +0200 Subject: [PATCH 0005/1256] Add test case for conflicting use and use function alias (stas) --- .../use_function/conflicting_use_alias.phpt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Zend/tests/use_function/conflicting_use_alias.phpt diff --git a/Zend/tests/use_function/conflicting_use_alias.phpt b/Zend/tests/use_function/conflicting_use_alias.phpt new file mode 100644 index 0000000000000..2870512014de0 --- /dev/null +++ b/Zend/tests/use_function/conflicting_use_alias.phpt @@ -0,0 +1,20 @@ +--TEST-- +use and use function with the same alias +--FILE-- + +--EXPECT-- +string(3) "foo" From 6b385ebc85ea8f01db726fbf06b82b4587fee332 Mon Sep 17 00:00:00 2001 From: Danack Date: Thu, 22 Aug 2013 02:24:59 +0100 Subject: [PATCH 0006/1256] Removed assumption that \\ will be present The function zend_add_ns_func_name_literal is called if the parser finds a function that is not in the global or current namespace. It assumes such a function will have a \\ in it, which is no longer true with the use function patch. The code change above removes that assumption and makes the test work: PASS use and use function with the same alias [Zend/tests/use_function/conflicting_use_alias.phpt] --- Zend/zend_compile.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 2660781e60367..8725083d5bed7 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -426,12 +426,16 @@ int zend_add_ns_func_name_literal(zend_op_array *op_array, const zval *zv TSRMLS lc_literal = zend_add_literal(CG(active_op_array), &c TSRMLS_CC); CALCULATE_LITERAL_HASH(lc_literal); - ns_separator = (const char*)zend_memrchr(Z_STRVAL_P(zv), '\\', Z_STRLEN_P(zv)) + 1; - lc_len = Z_STRLEN_P(zv) - (ns_separator - Z_STRVAL_P(zv)); - lc_name = zend_str_tolower_dup(ns_separator, lc_len); - ZVAL_STRINGL(&c, lc_name, lc_len, 0); - lc_literal = zend_add_literal(CG(active_op_array), &c TSRMLS_CC); - CALCULATE_LITERAL_HASH(lc_literal); + ns_separator = (const char*)zend_memrchr(Z_STRVAL_P(zv), '\\', Z_STRLEN_P(zv)); + + if (ns_separator != NULL) { + ns_separator += 1; + lc_len = Z_STRLEN_P(zv) - (ns_separator - Z_STRVAL_P(zv)); + lc_name = zend_str_tolower_dup(ns_separator, lc_len); + ZVAL_STRINGL(&c, lc_name, lc_len, 0); + lc_literal = zend_add_literal(CG(active_op_array), &c TSRMLS_CC); + CALCULATE_LITERAL_HASH(lc_literal); + } return ret; } From 31d77053a14f59748c12afce82d31fb880dbc962 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Thu, 22 Aug 2013 12:10:15 +0200 Subject: [PATCH 0007/1256] More test cases for conflicting aliases --- .../use_const/conflicting_use_alias.phpt | 18 +++++++++++++++ .../conflicting_use_const_alias.phpt | 23 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 Zend/tests/use_const/conflicting_use_alias.phpt create mode 100644 Zend/tests/use_function/conflicting_use_const_alias.phpt diff --git a/Zend/tests/use_const/conflicting_use_alias.phpt b/Zend/tests/use_const/conflicting_use_alias.phpt new file mode 100644 index 0000000000000..91cd020968eb5 --- /dev/null +++ b/Zend/tests/use_const/conflicting_use_alias.phpt @@ -0,0 +1,18 @@ +--TEST-- +use and use function with the same alias +--FILE-- + +--EXPECT-- +string(3) "foo" diff --git a/Zend/tests/use_function/conflicting_use_const_alias.phpt b/Zend/tests/use_function/conflicting_use_const_alias.phpt new file mode 100644 index 0000000000000..b8472a582123a --- /dev/null +++ b/Zend/tests/use_function/conflicting_use_const_alias.phpt @@ -0,0 +1,23 @@ +--TEST-- +use and use function with the same alias +--FILE-- + +--EXPECT-- +string(9) "foo.const" +string(12) "foo.function" From 5b18530e8cc8635592cfb98da0ecbc045c83bfe6 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Thu, 22 Aug 2013 22:12:34 +0200 Subject: [PATCH 0008/1256] Add test cases for conflicting use and definition in same ns (stas) --- Zend/tests/use_const/define_imported.phpt | 14 +++++++++++ .../use_const/define_imported_before.phpt | 14 +++++++++++ .../use_const/shadow_global_same_ns.phpt | 21 ---------------- Zend/tests/use_function/define_imported.phpt | 14 +++++++++++ .../use_function/define_imported_before.phpt | 14 +++++++++++ .../use_function/shadow_global_same_ns.phpt | 25 ------------------- 6 files changed, 56 insertions(+), 46 deletions(-) create mode 100644 Zend/tests/use_const/define_imported.phpt create mode 100644 Zend/tests/use_const/define_imported_before.phpt delete mode 100644 Zend/tests/use_const/shadow_global_same_ns.phpt create mode 100644 Zend/tests/use_function/define_imported.phpt create mode 100644 Zend/tests/use_function/define_imported_before.phpt delete mode 100644 Zend/tests/use_function/shadow_global_same_ns.phpt diff --git a/Zend/tests/use_const/define_imported.phpt b/Zend/tests/use_const/define_imported.phpt new file mode 100644 index 0000000000000..5eb44be64a058 --- /dev/null +++ b/Zend/tests/use_const/define_imported.phpt @@ -0,0 +1,14 @@ +--TEST-- +defining const with same name as imported should fail +--FILE-- + +--EXPECTF-- +Fatal error: Cannot declare const bar because the name is already in use in %s on line %d diff --git a/Zend/tests/use_const/define_imported_before.phpt b/Zend/tests/use_const/define_imported_before.phpt new file mode 100644 index 0000000000000..19374a2c5868b --- /dev/null +++ b/Zend/tests/use_const/define_imported_before.phpt @@ -0,0 +1,14 @@ +--TEST-- +using const with same name as defined should fail +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use const foo\bar as bar because the name is already in use in %s on line %d diff --git a/Zend/tests/use_const/shadow_global_same_ns.phpt b/Zend/tests/use_const/shadow_global_same_ns.phpt deleted file mode 100644 index 7e8a8710277b6..0000000000000 --- a/Zend/tests/use_const/shadow_global_same_ns.phpt +++ /dev/null @@ -1,21 +0,0 @@ ---TEST-- -shadowing global constants defined in the same namespace as use ---FILE-- - ---EXPECT-- -string(5) "local" -Done diff --git a/Zend/tests/use_function/define_imported.phpt b/Zend/tests/use_function/define_imported.phpt new file mode 100644 index 0000000000000..c542a4d5494b9 --- /dev/null +++ b/Zend/tests/use_function/define_imported.phpt @@ -0,0 +1,14 @@ +--TEST-- +defining function with same name as imported should fail +--FILE-- + +--EXPECTF-- +Fatal error: Cannot declare function bar because the name is already in use in %s on line %d diff --git a/Zend/tests/use_function/define_imported_before.phpt b/Zend/tests/use_function/define_imported_before.phpt new file mode 100644 index 0000000000000..ff5d5ca28d364 --- /dev/null +++ b/Zend/tests/use_function/define_imported_before.phpt @@ -0,0 +1,14 @@ +--TEST-- +using function with same name as defined should fail +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use function foo\bar as bar because the name is already in use in %s on line %d diff --git a/Zend/tests/use_function/shadow_global_same_ns.phpt b/Zend/tests/use_function/shadow_global_same_ns.phpt deleted file mode 100644 index 7a30c8238f302..0000000000000 --- a/Zend/tests/use_function/shadow_global_same_ns.phpt +++ /dev/null @@ -1,25 +0,0 @@ ---TEST-- -shadowing global functions defined in the same namespace as use ---FILE-- - ---EXPECT-- -string(5) "local" -Done From 30f16c354060f730dbc321799613527e5a7ea00e Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Fri, 23 Aug 2013 23:39:42 +0200 Subject: [PATCH 0009/1256] Compile error on function definition conflicting with import --- Zend/zend_compile.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 8725083d5bed7..95723c92f1efe 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -428,7 +428,7 @@ int zend_add_ns_func_name_literal(zend_op_array *op_array, const zval *zv TSRMLS ns_separator = (const char*)zend_memrchr(Z_STRVAL_P(zv), '\\', Z_STRLEN_P(zv)); - if (ns_separator != NULL) { + if (ns_separator != NULL) { ns_separator += 1; lc_len = Z_STRLEN_P(zv) - (ns_separator - Z_STRVAL_P(zv)); lc_name = zend_str_tolower_dup(ns_separator, lc_len); @@ -1701,6 +1701,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n } else { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); zval key; + zval **ns_name; if (CG(current_namespace)) { /* Prefix function name with current namespace name */ @@ -1716,6 +1717,19 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n lcname = zend_str_tolower_dup(name, name_len); } + /* Function name must not conflict with import names */ + if (CG(current_import_function) && + zend_hash_find(CG(current_import_function), lcname, Z_STRLEN(function_name->u.constant)+1, (void**)&ns_name) == SUCCESS) { + + char *tmp = zend_str_tolower_dup(Z_STRVAL_PP(ns_name), Z_STRLEN_PP(ns_name)); + + if (Z_STRLEN_PP(ns_name) != Z_STRLEN(function_name->u.constant) || + memcmp(tmp, lcname, Z_STRLEN(function_name->u.constant))) { + zend_error(E_COMPILE_ERROR, "Cannot declare function %s because the name is already in use", Z_STRVAL(function_name->u.constant)); + } + efree(tmp); + } + opline->opcode = ZEND_DECLARE_FUNCTION; opline->op1_type = IS_CONST; build_runtime_defined_function_key(&key, lcname, name_len TSRMLS_CC); From 85d4cfb00ddda70ae2418db283b0f53431ca62a8 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sat, 24 Aug 2013 23:53:43 +0200 Subject: [PATCH 0010/1256] Disallow using functions/consts defined in the same file * Keep track of defined function and const filenames * Prohibit use function foo if function foo exists * Prohibit use const foo if const foo exists --- Zend/tests/use_const/includes/foo_bar.php | 5 +++ .../use_const/includes/foo_php_version.php | 5 +++ Zend/tests/use_const/includes/global_bar.php | 3 ++ Zend/tests/use_const/includes/global_baz.php | 3 ++ Zend/tests/use_const/no_global_fallback.phpt | 10 ++--- Zend/tests/use_const/shadow_core.phpt | 16 ++------ Zend/tests/use_const/shadow_global.phpt | 7 +--- Zend/tests/use_function/includes/foo_bar.php | 7 ++++ .../use_function/includes/foo_strlen.php | 7 ++++ .../use_function/includes/global_bar.php | 5 +++ .../use_function/includes/global_baz.php | 4 ++ .../use_function/no_global_fallback.phpt | 11 ++--- Zend/tests/use_function/shadow_core.phpt | 18 ++------ Zend/tests/use_function/shadow_global.phpt | 11 +---- Zend/zend_compile.c | 41 +++++++++++++++++-- Zend/zend_compile.h | 2 +- Zend/zend_globals.h | 3 ++ 17 files changed, 99 insertions(+), 59 deletions(-) create mode 100644 Zend/tests/use_const/includes/foo_bar.php create mode 100644 Zend/tests/use_const/includes/foo_php_version.php create mode 100644 Zend/tests/use_const/includes/global_bar.php create mode 100644 Zend/tests/use_const/includes/global_baz.php create mode 100644 Zend/tests/use_function/includes/foo_bar.php create mode 100644 Zend/tests/use_function/includes/foo_strlen.php create mode 100644 Zend/tests/use_function/includes/global_bar.php create mode 100644 Zend/tests/use_function/includes/global_baz.php diff --git a/Zend/tests/use_const/includes/foo_bar.php b/Zend/tests/use_const/includes/foo_bar.php new file mode 100644 index 0000000000000..90ed451f364d0 --- /dev/null +++ b/Zend/tests/use_const/includes/foo_bar.php @@ -0,0 +1,5 @@ + --EXPECTF-- diff --git a/Zend/tests/use_const/shadow_core.phpt b/Zend/tests/use_const/shadow_core.phpt index 8052baebc65e0..7d8bcbd1892f4 100644 --- a/Zend/tests/use_const/shadow_core.phpt +++ b/Zend/tests/use_const/shadow_core.phpt @@ -3,22 +3,14 @@ shadowing a global core constant with a local version --FILE-- --EXPECTF-- -string(%d) "%s" int(42) Done diff --git a/Zend/tests/use_const/shadow_global.phpt b/Zend/tests/use_const/shadow_global.phpt index ddd47a264c0b1..930cc9f0b8778 100644 --- a/Zend/tests/use_const/shadow_global.phpt +++ b/Zend/tests/use_const/shadow_global.phpt @@ -4,11 +4,8 @@ shadowing a global constant with a local version --EXPECTF-- diff --git a/Zend/tests/use_function/shadow_core.phpt b/Zend/tests/use_function/shadow_core.phpt index b06fbfce2e173..8f92ff1e1be86 100644 --- a/Zend/tests/use_function/shadow_core.phpt +++ b/Zend/tests/use_function/shadow_core.phpt @@ -3,24 +3,14 @@ shadowing a global core function with a local version --FILE-- --EXPECT-- -int(11) int(4) Done diff --git a/Zend/tests/use_function/shadow_global.phpt b/Zend/tests/use_function/shadow_global.phpt index b3182993b378c..791bcdf4d50d6 100644 --- a/Zend/tests/use_function/shadow_global.phpt +++ b/Zend/tests/use_function/shadow_global.phpt @@ -4,15 +4,8 @@ shadowing a global function with a local version op2.constant); opline->extended_value = ZEND_DECLARE_FUNCTION; zend_hash_quick_update(CG(function_table), Z_STRVAL(key), Z_STRLEN(key), Z_HASH_P(&CONSTANT(opline->op1.constant)), &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); + zend_hash_add(&CG(function_filenames), lcname, strlen(lcname)+1, CG(compiled_filename), strlen(CG(compiled_filename))+1, NULL); zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context))); zend_init_compiler_context(TSRMLS_C); } @@ -7147,9 +7152,10 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } /* }}} */ -void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC) /* {{{ */ { char *lcname; + char *filename; zval *name, *ns, tmp; zend_bool warn = 0; @@ -7182,6 +7188,33 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, HashT zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); } + if (CG(current_namespace)) { + /* Prefix import name with current namespace name to avoid conflicts with classes */ + char *c_ns_name = emalloc(Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) + 1); + + zend_str_tolower_copy(c_ns_name, Z_STRVAL_P(CG(current_namespace)), Z_STRLEN_P(CG(current_namespace))); + c_ns_name[Z_STRLEN_P(CG(current_namespace))] = '\\'; + memcpy(c_ns_name+Z_STRLEN_P(CG(current_namespace))+1, lcname, Z_STRLEN_P(name)+1); + if (zend_hash_exists(lookup_table, c_ns_name, Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name)+1)) { + char *tmp2 = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); + + if (Z_STRLEN_P(ns) != Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) || + memcmp(tmp2, c_ns_name, Z_STRLEN_P(ns))) { + zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } + efree(tmp2); + } + efree(c_ns_name); + } else if (zend_hash_find(lookup_table, lcname, Z_STRLEN_P(name)+1, (void **)&filename) == SUCCESS && strcmp(filename, CG(compiled_filename)) == 0) { + char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); + + if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || + memcmp(c_tmp, lcname, Z_STRLEN_P(ns))) { + zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } + efree(c_tmp); + } + if (zend_hash_add(current_import_sub, lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } @@ -7200,7 +7233,7 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_ zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, CG(current_import_function) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, "function", CG(current_import_function), &CG(function_filenames) TSRMLS_CC); } /* }}} */ @@ -7211,7 +7244,7 @@ void zend_do_use_const(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) zend_hash_init(CG(current_import_const), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, CG(current_import_const) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, "const", CG(current_import_const), &CG(const_filenames) TSRMLS_CC); } /* }}} */ @@ -7243,6 +7276,8 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ SET_UNUSED(opline->result); SET_NODE(opline->op1, name); SET_NODE(opline->op2, value); + + zend_hash_add(&CG(const_filenames), Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1, CG(compiled_filename), strlen(CG(compiled_filename))+1, NULL); } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 3c944e45a6dce..8145b1cc9ba72 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -638,7 +638,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_brackets TSRMLS_D void zend_do_end_namespace(TSRMLS_D); void zend_verify_namespace(TSRMLS_D); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); -void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, HashTable *current_import_sub TSRMLS_DC); +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC); void zend_do_use_function(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_use_const(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_end_compilation(TSRMLS_D); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index ddb5fc5df745d..19c29c68f324e 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -136,6 +136,9 @@ struct _zend_compiler_globals { zend_bool in_namespace; zend_bool has_bracketed_namespaces; + HashTable function_filenames; + HashTable const_filenames; + zend_compiler_context context; zend_stack context_stack; From 115c5ec7269c6dd7dfaeaa853a3a78a075d88e17 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sun, 25 Aug 2013 00:05:55 +0200 Subject: [PATCH 0011/1256] Compile error on const definition conflicting with import --- Zend/zend_compile.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 6770670d31157..29d0760f600d2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7251,6 +7251,7 @@ void zend_do_use_const(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ { zend_op *opline; + zval **ns_name; if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants"); @@ -7271,6 +7272,19 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ *name = tmp; } + /* Constant name must not conflict with import names */ + if (CG(current_import_const) && + zend_hash_find(CG(current_import_const), Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1, (void**)&ns_name) == SUCCESS) { + + char *tmp = zend_str_tolower_dup(Z_STRVAL_PP(ns_name), Z_STRLEN_PP(ns_name)); + + if (Z_STRLEN_PP(ns_name) != Z_STRLEN(name->u.constant) || + memcmp(tmp, Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant))) { + zend_error(E_COMPILE_ERROR, "Cannot declare const %s because the name is already in use", Z_STRVAL(name->u.constant)); + } + efree(tmp); + } + opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_DECLARE_CONST; SET_UNUSED(opline->result); From bc473228c83a6163350e0362ff3b0722f73b068c Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sun, 25 Aug 2013 14:03:07 +0200 Subject: [PATCH 0012/1256] Adjust some test names, remove obsolete and duplicate tests (nikic) --- .../use_const/conflicting_use_alias.phpt | 2 +- Zend/tests/use_const/function_and_cons.phpt | 25 ------------------- Zend/tests/use_const/shadow_core_null.phpt | 12 --------- .../conflicting_use_const_alias.phpt | 2 +- 4 files changed, 2 insertions(+), 39 deletions(-) delete mode 100644 Zend/tests/use_const/function_and_cons.phpt delete mode 100644 Zend/tests/use_const/shadow_core_null.phpt diff --git a/Zend/tests/use_const/conflicting_use_alias.phpt b/Zend/tests/use_const/conflicting_use_alias.phpt index 91cd020968eb5..8b563a4ca975e 100644 --- a/Zend/tests/use_const/conflicting_use_alias.phpt +++ b/Zend/tests/use_const/conflicting_use_alias.phpt @@ -1,5 +1,5 @@ --TEST-- -use and use function with the same alias +use and use const with the same alias --FILE-- ---EXPECT-- -string(11) "local const" -string(14) "local function" -Done diff --git a/Zend/tests/use_const/shadow_core_null.phpt b/Zend/tests/use_const/shadow_core_null.phpt deleted file mode 100644 index 5bbc9329dfd4e..0000000000000 --- a/Zend/tests/use_const/shadow_core_null.phpt +++ /dev/null @@ -1,12 +0,0 @@ ---TEST-- -shadowing null with a local version ---FILE-- - ---EXPECTF-- -Fatal error: Cannot redeclare constant 'null' in %s on line %d diff --git a/Zend/tests/use_function/conflicting_use_const_alias.phpt b/Zend/tests/use_function/conflicting_use_const_alias.phpt index b8472a582123a..2e0faf0da21a6 100644 --- a/Zend/tests/use_function/conflicting_use_const_alias.phpt +++ b/Zend/tests/use_function/conflicting_use_const_alias.phpt @@ -1,5 +1,5 @@ --TEST-- -use and use function with the same alias +use const and use function with the same alias --FILE-- Date: Sun, 25 Aug 2013 15:08:26 +0200 Subject: [PATCH 0013/1256] self and parent are valid function and const names (nikic) --- Zend/tests/use_const/self_parent.phpt | 12 ++++++++++++ Zend/tests/use_function/self_parent.phpt | 12 ++++++++++++ Zend/zend_compile.c | 7 ------- 3 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/use_const/self_parent.phpt create mode 100644 Zend/tests/use_function/self_parent.phpt diff --git a/Zend/tests/use_const/self_parent.phpt b/Zend/tests/use_const/self_parent.phpt new file mode 100644 index 0000000000000..b71f2ecc81fee --- /dev/null +++ b/Zend/tests/use_const/self_parent.phpt @@ -0,0 +1,12 @@ +--TEST-- +Allow self and parent in use const statement +--FILE-- + +--EXPECT-- diff --git a/Zend/tests/use_function/self_parent.phpt b/Zend/tests/use_function/self_parent.phpt new file mode 100644 index 0000000000000..f1e1fa84f1de1 --- /dev/null +++ b/Zend/tests/use_function/self_parent.phpt @@ -0,0 +1,12 @@ +--TEST-- +Allow self and parent in use function statement +--FILE-- + +--EXPECT-- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 29d0760f600d2..b2367cbd244e2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7181,13 +7181,6 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const lcname = zend_str_tolower_dup(Z_STRVAL_P(name), Z_STRLEN_P(name)); - if (((Z_STRLEN_P(name) == sizeof("self")-1) && - !memcmp(lcname, "self", sizeof("self")-1)) || - ((Z_STRLEN_P(name) == sizeof("parent")-1) && - !memcmp(lcname, "parent", sizeof("parent")-1))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); - } - if (CG(current_namespace)) { /* Prefix import name with current namespace name to avoid conflicts with classes */ char *c_ns_name = emalloc(Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) + 1); From 28fa0896df908fd72c1766c5a6fe22d441e96494 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sun, 25 Aug 2013 15:09:19 +0200 Subject: [PATCH 0014/1256] Comment nitpick (nikic) --- Zend/zend_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b2367cbd244e2..bdb0e84dcf0e2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7182,7 +7182,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const lcname = zend_str_tolower_dup(Z_STRVAL_P(name), Z_STRLEN_P(name)); if (CG(current_namespace)) { - /* Prefix import name with current namespace name to avoid conflicts with classes */ + /* Prefix import name with current namespace name to avoid conflicts with functions/consts */ char *c_ns_name = emalloc(Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) + 1); zend_str_tolower_copy(c_ns_name, Z_STRVAL_P(CG(current_namespace)), Z_STRLEN_P(CG(current_namespace))); From 6263f221ffeaa2a54b11249a40436b6f9bd6ca47 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sun, 25 Aug 2013 16:21:51 +0200 Subject: [PATCH 0015/1256] Handle case sensivity of constants (nikic) --- Zend/tests/use_const/case_sensivity.phpt | 12 ++++ Zend/tests/use_function/case_insensivity.phpt | 13 +++++ Zend/zend_compile.c | 58 +++++++++++-------- Zend/zend_compile.h | 4 +- 4 files changed, 62 insertions(+), 25 deletions(-) create mode 100644 Zend/tests/use_const/case_sensivity.phpt create mode 100644 Zend/tests/use_function/case_insensivity.phpt diff --git a/Zend/tests/use_const/case_sensivity.phpt b/Zend/tests/use_const/case_sensivity.phpt new file mode 100644 index 0000000000000..1977daa93bb9a --- /dev/null +++ b/Zend/tests/use_const/case_sensivity.phpt @@ -0,0 +1,12 @@ +--TEST-- +importing const with same name but different case +--FILE-- + +--EXPECT-- diff --git a/Zend/tests/use_function/case_insensivity.phpt b/Zend/tests/use_function/case_insensivity.phpt new file mode 100644 index 0000000000000..53ae3658a9771 --- /dev/null +++ b/Zend/tests/use_function/case_insensivity.phpt @@ -0,0 +1,13 @@ +--TEST-- +importing function with same name but different case should fail +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use foo\BAR as BAR because the name is already in use in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index bdb0e84dcf0e2..623fe15fed4db 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2101,12 +2101,12 @@ void zend_do_begin_dynamic_function_call(znode *function_name, int ns_call TSRML } /* }}} */ -void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ +void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ { znode tmp; int len; zval **ns; - char *lcname, *compound = memchr(Z_STRVAL(element_name->u.constant), '\\', Z_STRLEN(element_name->u.constant)); + char *lookup_name, *compound = memchr(Z_STRVAL(element_name->u.constant), '\\', Z_STRLEN(element_name->u.constant)); if (Z_STRVAL(element_name->u.constant)[0] == '\\') { /* name starts with \ so it is known and unambiguos, nothing to do here but shorten it */ @@ -2121,23 +2121,31 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, if (current_import_sub) { len = Z_STRLEN(element_name->u.constant)+1; - lcname = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); + if (case_sensitive) { + lookup_name = estrndup(Z_STRVAL(element_name->u.constant), len); + } else { + lookup_name = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); + } /* Check if function/const matches imported name */ - if (zend_hash_find(current_import_sub, lcname, len, (void**)&ns) == SUCCESS) { + if (zend_hash_find(current_import_sub, lookup_name, len, (void**)&ns) == SUCCESS) { zval_dtor(&element_name->u.constant); element_name->u.constant = **ns; zval_copy_ctor(&element_name->u.constant); - efree(lcname); + efree(lookup_name); return; } - efree(lcname); + efree(lookup_name); } if (compound && CG(current_import)) { len = compound - Z_STRVAL(element_name->u.constant); - lcname = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); + if (case_sensitive) { + lookup_name = estrndup(Z_STRVAL(element_name->u.constant), len); + } else { + lookup_name = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); + } /* Check if first part of compound name is an import name */ - if (zend_hash_find(CG(current_import), lcname, len+1, (void**)&ns) == SUCCESS) { + if (zend_hash_find(CG(current_import), lookup_name, len+1, (void**)&ns) == SUCCESS) { /* Substitute import name */ tmp.op_type = IS_CONST; tmp.u.constant = **ns; @@ -2147,10 +2155,10 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, memmove(Z_STRVAL(element_name->u.constant), Z_STRVAL(element_name->u.constant)+len, Z_STRLEN(element_name->u.constant)+1); zend_do_build_namespace_name(&tmp, &tmp, element_name TSRMLS_CC); *element_name = tmp; - efree(lcname); + efree(lookup_name); return; } - efree(lcname); + efree(lookup_name); } if (CG(current_namespace)) { @@ -2168,13 +2176,13 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, void zend_resolve_function_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ { - zend_resolve_non_class_name(element_name, check_namespace, CG(current_import_function) TSRMLS_CC); + zend_resolve_non_class_name(element_name, check_namespace, 0, CG(current_import_function) TSRMLS_CC); } /* }}} */ void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ { - zend_resolve_non_class_name(element_name, check_namespace, CG(current_import_const) TSRMLS_CC); + zend_resolve_non_class_name(element_name, check_namespace, 1, CG(current_import_const) TSRMLS_CC); } /* }}} */ @@ -7152,9 +7160,9 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } /* }}} */ -void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC) /* {{{ */ +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC) /* {{{ */ { - char *lcname; + char *lookup_name; char *filename; zval *name, *ns, tmp; zend_bool warn = 0; @@ -7179,7 +7187,11 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const } } - lcname = zend_str_tolower_dup(Z_STRVAL_P(name), Z_STRLEN_P(name)); + if (case_sensitive) { + lookup_name = estrndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); + } else { + lookup_name = zend_str_tolower_dup(Z_STRVAL_P(name), Z_STRLEN_P(name)); + } if (CG(current_namespace)) { /* Prefix import name with current namespace name to avoid conflicts with functions/consts */ @@ -7187,7 +7199,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const zend_str_tolower_copy(c_ns_name, Z_STRVAL_P(CG(current_namespace)), Z_STRLEN_P(CG(current_namespace))); c_ns_name[Z_STRLEN_P(CG(current_namespace))] = '\\'; - memcpy(c_ns_name+Z_STRLEN_P(CG(current_namespace))+1, lcname, Z_STRLEN_P(name)+1); + memcpy(c_ns_name+Z_STRLEN_P(CG(current_namespace))+1, lookup_name, Z_STRLEN_P(name)+1); if (zend_hash_exists(lookup_table, c_ns_name, Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name)+1)) { char *tmp2 = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); @@ -7198,23 +7210,23 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const efree(tmp2); } efree(c_ns_name); - } else if (zend_hash_find(lookup_table, lcname, Z_STRLEN_P(name)+1, (void **)&filename) == SUCCESS && strcmp(filename, CG(compiled_filename)) == 0) { + } else if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **)&filename) == SUCCESS && strcmp(filename, CG(compiled_filename)) == 0) { char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || - memcmp(c_tmp, lcname, Z_STRLEN_P(ns))) { + memcmp(c_tmp, lookup_name, Z_STRLEN_P(ns))) { zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(c_tmp); } - if (zend_hash_add(current_import_sub, lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { + if (zend_hash_add(current_import_sub, lookup_name, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } if (warn) { zend_error(E_WARNING, "The use statement with non-compound name '%s' has no effect", Z_STRVAL_P(name)); } - efree(lcname); + efree(lookup_name); zval_dtor(name); } /* }}} */ @@ -7226,7 +7238,7 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_ zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, "function", CG(current_import_function), &CG(function_filenames) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, "function", 0, CG(current_import_function), &CG(function_filenames) TSRMLS_CC); } /* }}} */ @@ -7237,7 +7249,7 @@ void zend_do_use_const(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) zend_hash_init(CG(current_import_const), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, "const", CG(current_import_const), &CG(const_filenames) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, "const", 1, CG(current_import_const), &CG(const_filenames) TSRMLS_CC); } /* }}} */ @@ -7269,7 +7281,7 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ if (CG(current_import_const) && zend_hash_find(CG(current_import_const), Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1, (void**)&ns_name) == SUCCESS) { - char *tmp = zend_str_tolower_dup(Z_STRVAL_PP(ns_name), Z_STRLEN_PP(ns_name)); + char *tmp = estrndup(Z_STRVAL_PP(ns_name), Z_STRLEN_PP(ns_name)); if (Z_STRLEN_PP(ns_name) != Z_STRLEN(name->u.constant) || memcmp(tmp, Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant))) { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 8145b1cc9ba72..e8c0309319de4 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -437,7 +437,7 @@ ZEND_API char *zend_get_compiled_filename(TSRMLS_D); ZEND_API int zend_get_compiled_lineno(TSRMLS_D); ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D); -void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, HashTable *current_import_sub TSRMLS_DC); +void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC); void zend_resolve_function_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC); @@ -638,7 +638,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_brackets TSRMLS_D void zend_do_end_namespace(TSRMLS_D); void zend_verify_namespace(TSRMLS_D); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); -void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC); +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC); void zend_do_use_function(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_use_const(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_end_compilation(TSRMLS_D); From e14a769c56f45be26f32506483a7dff5b447fbb7 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Thu, 29 Aug 2013 17:15:36 +0200 Subject: [PATCH 0016/1256] Add test for conditional function declaration --- .../conditional_function_declaration.phpt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Zend/tests/use_function/conditional_function_declaration.phpt diff --git a/Zend/tests/use_function/conditional_function_declaration.phpt b/Zend/tests/use_function/conditional_function_declaration.phpt new file mode 100644 index 0000000000000..ccfb96103a6b6 --- /dev/null +++ b/Zend/tests/use_function/conditional_function_declaration.phpt @@ -0,0 +1,17 @@ +--TEST-- +function that is conditionally defined at runtime should not cause compiler error +--FILE-- + +--EXPECT-- +Done From d7e3aca9c96e93acfee2deeeb7b481cadd28438d Mon Sep 17 00:00:00 2001 From: Anthony Ferrara Date: Fri, 30 Aug 2013 11:53:57 -0400 Subject: [PATCH 0017/1256] Fix issue with global fallback when not in global space --- .../use_function/no_global_fallback2.phpt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Zend/tests/use_function/no_global_fallback2.phpt diff --git a/Zend/tests/use_function/no_global_fallback2.phpt b/Zend/tests/use_function/no_global_fallback2.phpt new file mode 100644 index 0000000000000..5d012c10e5912 --- /dev/null +++ b/Zend/tests/use_function/no_global_fallback2.phpt @@ -0,0 +1,18 @@ +--TEST-- +non-existent imported functions should not be looked up in the global table +--FILE-- + +--EXPECTF-- +Fatal error: Call to undefined function bar\test() in %s on line %d From 612e77e5c9aabe6c3dc991732f3ccd9d80b6efbb Mon Sep 17 00:00:00 2001 From: Anthony Ferrara Date: Fri, 30 Aug 2013 11:55:43 -0400 Subject: [PATCH 0018/1256] Fix issue with global fallback not in global space --- Zend/zend_compile.c | 16 +++++++++------- Zend/zend_compile.h | 6 +++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 623fe15fed4db..15dce18f7c272 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1962,7 +1962,7 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace char *lcname; char *is_compound = memchr(Z_STRVAL(function_name->u.constant), '\\', Z_STRLEN(function_name->u.constant)); - zend_resolve_function_name(function_name, check_namespace TSRMLS_CC); + zend_resolve_function_name(function_name, &check_namespace TSRMLS_CC); if (check_namespace && CG(current_namespace) && !is_compound) { /* We assume we call function from the current namespace @@ -2101,7 +2101,7 @@ void zend_do_begin_dynamic_function_call(znode *function_name, int ns_call TSRML } /* }}} */ -void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ +void zend_resolve_non_class_name(znode *element_name, zend_bool *check_namespace, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC) /* {{{ */ { znode tmp; int len; @@ -2115,7 +2115,7 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, return; } - if(!check_namespace) { + if(!*check_namespace) { return; } @@ -2132,6 +2132,7 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, element_name->u.constant = **ns; zval_copy_ctor(&element_name->u.constant); efree(lookup_name); + *check_namespace = 0; return; } efree(lookup_name); @@ -2156,6 +2157,7 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, zend_do_build_namespace_name(&tmp, &tmp, element_name TSRMLS_CC); *element_name = tmp; efree(lookup_name); + *check_namespace = 0; return; } efree(lookup_name); @@ -2174,13 +2176,13 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, } /* }}} */ -void zend_resolve_function_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ +void zend_resolve_function_name(znode *element_name, zend_bool *check_namespace TSRMLS_DC) /* {{{ */ { zend_resolve_non_class_name(element_name, check_namespace, 0, CG(current_import_function) TSRMLS_CC); } /* }}} */ -void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */ +void zend_resolve_const_name(znode *element_name, zend_bool *check_namespace TSRMLS_DC) /* {{{ */ { zend_resolve_non_class_name(element_name, check_namespace, 1, CG(current_import_const) TSRMLS_CC); } @@ -5688,7 +5690,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con break; } - zend_resolve_const_name(constant_name, check_namespace TSRMLS_CC); + zend_resolve_const_name(constant_name, &check_namespace TSRMLS_CC); if(!compound) { fetch_type |= IS_CONSTANT_UNQUALIFIED; @@ -5700,7 +5702,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con case ZEND_RT: compound = memchr(Z_STRVAL(constant_name->u.constant), '\\', Z_STRLEN(constant_name->u.constant)); - zend_resolve_const_name(constant_name, check_namespace TSRMLS_CC); + zend_resolve_const_name(constant_name, &check_namespace TSRMLS_CC); if(zend_constant_ct_subst(result, &constant_name->u.constant, 1 TSRMLS_CC)) { break; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index e8c0309319de4..55575f399436a 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -437,9 +437,9 @@ ZEND_API char *zend_get_compiled_filename(TSRMLS_D); ZEND_API int zend_get_compiled_lineno(TSRMLS_D); ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D); -void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC); -void zend_resolve_function_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); -void zend_resolve_const_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); +void zend_resolve_non_class_name(znode *element_name, zend_bool *check_namespace, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC); +void zend_resolve_function_name(znode *element_name, zend_bool *check_namespace TSRMLS_DC); +void zend_resolve_const_name(znode *element_name, zend_bool *check_namespace TSRMLS_DC); void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC); ZEND_API const char* zend_get_compiled_variable_name(const zend_op_array *op_array, zend_uint var, int* name_len); From 5ffaf95d3f6d8634cdc218ea6bfdb24c7887148c Mon Sep 17 00:00:00 2001 From: Tim Strehle Date: Tue, 3 Sep 2013 14:38:52 +0200 Subject: [PATCH 0019/1256] run-tests.php: Adding support for sections EXPECT_EXTERNAL, EXPECTF_EXTERNAL and EXPECTREGEX_EXTERNAL. (Issue 55736) --- run-tests.php | 22 +++++++++++++--------- tests/run-test/test011.phpt | 6 ++++++ tests/run-test/test011.txt | 1 + tests/run-test/test012.phpt | 12 ++++++++++++ tests/run-test/test012.txt | 7 +++++++ tests/run-test/test013.phpt | 6 ++++++ tests/run-test/test013.txt | 1 + 7 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 tests/run-test/test011.phpt create mode 100644 tests/run-test/test011.txt create mode 100644 tests/run-test/test012.phpt create mode 100644 tests/run-test/test012.txt create mode 100644 tests/run-test/test013.phpt create mode 100644 tests/run-test/test013.txt diff --git a/run-tests.php b/run-tests.php index 54a12a177d043..dc88ddffedf71 100755 --- a/run-tests.php +++ b/run-tests.php @@ -1289,16 +1289,20 @@ function run_test($php, $file, $env) unset($section_text['FILEEOF']); } - if (@count($section_text['FILE_EXTERNAL']) == 1) { - // don't allow tests to retrieve files from anywhere but this subdirectory - $section_text['FILE_EXTERNAL'] = dirname($file) . '/' . trim(str_replace('..', '', $section_text['FILE_EXTERNAL'])); + foreach (array( 'FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX' ) as $prefix) { + $key = $prefix . '_EXTERNAL'; - if (file_exists($section_text['FILE_EXTERNAL'])) { - $section_text['FILE'] = file_get_contents($section_text['FILE_EXTERNAL'], FILE_BINARY); - unset($section_text['FILE_EXTERNAL']); - } else { - $bork_info = "could not load --FILE_EXTERNAL-- " . dirname($file) . '/' . trim($section_text['FILE_EXTERNAL']); - $borked = true; + if (@count($section_text[$key]) == 1) { + // don't allow tests to retrieve files from anywhere but this subdirectory + $section_text[$key] = dirname($file) . '/' . trim(str_replace('..', '', $section_text[$key])); + + if (file_exists($section_text[$key])) { + $section_text[$prefix] = file_get_contents($section_text[$key], FILE_BINARY); + unset($section_text[$key]); + } else { + $bork_info = "could not load --" . $key . "-- " . dirname($file) . '/' . trim($section_text[$key]); + $borked = true; + } } } diff --git a/tests/run-test/test011.phpt b/tests/run-test/test011.phpt new file mode 100644 index 0000000000000..17f1f7aee6c9e --- /dev/null +++ b/tests/run-test/test011.phpt @@ -0,0 +1,6 @@ +--TEST-- +EXPECT_EXTERNAL +--FILE-- +abc +--EXPECT_EXTERNAL-- +test011.txt diff --git a/tests/run-test/test011.txt b/tests/run-test/test011.txt new file mode 100644 index 0000000000000..8baef1b4abc47 --- /dev/null +++ b/tests/run-test/test011.txt @@ -0,0 +1 @@ +abc diff --git a/tests/run-test/test012.phpt b/tests/run-test/test012.phpt new file mode 100644 index 0000000000000..8213aa2a5610e --- /dev/null +++ b/tests/run-test/test012.phpt @@ -0,0 +1,12 @@ +--TEST-- +EXPECTF_EXTERNAL +--FILE-- +123 +-123 ++123 ++1.1 +abc +0abc +x +--EXPECTF_EXTERNAL-- +test012.txt diff --git a/tests/run-test/test012.txt b/tests/run-test/test012.txt new file mode 100644 index 0000000000000..bb293214b1da9 --- /dev/null +++ b/tests/run-test/test012.txt @@ -0,0 +1,7 @@ +%d +%i +%i +%f +%s +%x +%c diff --git a/tests/run-test/test013.phpt b/tests/run-test/test013.phpt new file mode 100644 index 0000000000000..79ccd20de218c --- /dev/null +++ b/tests/run-test/test013.phpt @@ -0,0 +1,6 @@ +--TEST-- +EXPECTREGEX_EXTERNAL +--FILE-- +abcde12314235xyz34264768286abcde +--EXPECTREGEX_EXTERNAL-- +test013.txt diff --git a/tests/run-test/test013.txt b/tests/run-test/test013.txt new file mode 100644 index 0000000000000..6c280ece4d44f --- /dev/null +++ b/tests/run-test/test013.txt @@ -0,0 +1 @@ +[abcde]+[0-5]*xyz[2-8]+abcde From 8ca43527e8b7e076779560f1472518bd1fe4d6ca Mon Sep 17 00:00:00 2001 From: Manuel Mausz Date: Thu, 5 Sep 2013 01:04:25 +0200 Subject: [PATCH 0020/1256] Add support for CryptoPro S-box for GOST This adds a new hash identifier "gost-crypto" which uses the CryptoPro S-box tables as specified by RFC 4357, section 11.2. --- ext/hash/hash.c | 1 + ext/hash/hash_gost.c | 71 ++++++++++------ ext/hash/php_hash.h | 1 + ext/hash/php_hash_gost.h | 1 + ext/hash/php_hash_gost_tables.h | 141 +++++++++++++++++++++++++++++++- ext/hash/tests/gost.phpt | 13 +++ 6 files changed, 200 insertions(+), 28 deletions(-) diff --git a/ext/hash/hash.c b/ext/hash/hash.c index 117221484e363..87f19c5cacb1e 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -986,6 +986,7 @@ PHP_MINIT_FUNCTION(hash) php_hash_register_algo("snefru", &php_hash_snefru_ops); php_hash_register_algo("snefru256", &php_hash_snefru_ops); php_hash_register_algo("gost", &php_hash_gost_ops); + php_hash_register_algo("gost-crypto", &php_hash_gost_crypto_ops); php_hash_register_algo("adler32", &php_hash_adler32_ops); php_hash_register_algo("crc32", &php_hash_crc32_ops); php_hash_register_algo("crc32b", &php_hash_crc32b_ops); diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c index 3961c4f2d5c36..7546c8d333dd4 100644 --- a/ext/hash/hash_gost.c +++ b/ext/hash/hash_gost.c @@ -27,7 +27,7 @@ * derived from gost_compress() by Markku-Juhani Saarinen */ -#define round(k1, k2) \ +#define round(tables, k1, k2) \ t = (k1) + r; \ l ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \ tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24]; \ @@ -35,25 +35,25 @@ r ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \ tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24]; -#define R(key, h, i, t, l, r) \ +#define R(tables, key, h, i, t, l, r) \ r = h[i]; \ l = h[i + 1]; \ - round(key[0], key[1]) \ - round(key[2], key[3]) \ - round(key[4], key[5]) \ - round(key[6], key[7]) \ - round(key[0], key[1]) \ - round(key[2], key[3]) \ - round(key[4], key[5]) \ - round(key[6], key[7]) \ - round(key[0], key[1]) \ - round(key[2], key[3]) \ - round(key[4], key[5]) \ - round(key[6], key[7]) \ - round(key[7], key[6]) \ - round(key[5], key[4]) \ - round(key[3], key[2]) \ - round(key[1], key[0]) \ + round(tables, key[0], key[1]) \ + round(tables, key[2], key[3]) \ + round(tables, key[4], key[5]) \ + round(tables, key[6], key[7]) \ + round(tables, key[0], key[1]) \ + round(tables, key[2], key[3]) \ + round(tables, key[4], key[5]) \ + round(tables, key[6], key[7]) \ + round(tables, key[0], key[1]) \ + round(tables, key[2], key[3]) \ + round(tables, key[4], key[5]) \ + round(tables, key[6], key[7]) \ + round(tables, key[7], key[6]) \ + round(tables, key[5], key[4]) \ + round(tables, key[3], key[2]) \ + round(tables, key[1], key[0]) \ t = r; \ r = l; \ l = t; \ @@ -194,10 +194,10 @@ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ v[4] ^ (v[5] >> 16) ^ v[5] ^ \ (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16) ^ v[7]; -#define PASS \ +#define PASS(tables) \ X(w, u, v); \ P(key, w); \ - R(key, h, i, t, l, r); \ + R((tables), key, h, i, t, l, r); \ S(s, l, r); \ if (i != 6) { \ A(u, l, r); \ @@ -207,16 +207,16 @@ AA(v, l, r); \ } -static inline void Gost(php_hash_uint32 state[8], php_hash_uint32 data[8]) +static inline void Gost(PHP_GOST_CTX *context, php_hash_uint32 data[8]) { int i; - php_hash_uint32 l, r, t, key[8], u[8], v[8], w[8], s[8], *h = state, *m = data; + php_hash_uint32 l, r, t, key[8], u[8], v[8], w[8], s[8], *h = context->state, *m = data; - memcpy(u, state, sizeof(u)); + memcpy(u, context->state, sizeof(u)); memcpy(v, data, sizeof(v)); for (i = 0; i < 8; i += 2) { - PASS; + PASS(*context->tables); } SHIFT12(u, m, s); SHIFT16(h, v, u); @@ -237,12 +237,19 @@ static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char inpu temp = ((context->state[i + 8] < data[i]) || (context->state[i + 8] < save)) ? 1 : 0; } - Gost(context->state, data); + Gost(context, data); } PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context) { memset(context, 0, sizeof(*context)); + context->tables = &tables_test; +} + +PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context) +{ + PHP_GOSTInit(context); + context->tables = &tables_crypto; } static const php_hash_uint32 MAX32 = 0xffffffffLU; @@ -288,9 +295,9 @@ PHP_HASH_API void PHP_GOSTFinal(unsigned char digest[32], PHP_GOST_CTX *context) } memcpy(l, context->count, sizeof(context->count)); - Gost(context->state, l); + Gost(context, l); memcpy(l, &context->state[8], sizeof(l)); - Gost(context->state, l); + Gost(context, l); for (i = 0, j = 0; j < 32; i++, j += 4) { digest[j] = (unsigned char) (context->state[i] & 0xff); @@ -312,6 +319,16 @@ const php_hash_ops php_hash_gost_ops = { sizeof(PHP_GOST_CTX) }; +const php_hash_ops php_hash_gost_crypto_ops = { + (php_hash_init_func_t) PHP_GOSTInitCrypto, + (php_hash_update_func_t) PHP_GOSTUpdate, + (php_hash_final_func_t) PHP_GOSTFinal, + (php_hash_copy_func_t) php_hash_copy, + 32, + 32, + sizeof(PHP_GOST_CTX) +}; + /* * Local variables: * tab-width: 4 diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h index 3f5e7ced3a19b..e92572216aea4 100644 --- a/ext/hash/php_hash.h +++ b/ext/hash/php_hash.h @@ -80,6 +80,7 @@ extern const php_hash_ops php_hash_4tiger160_ops; extern const php_hash_ops php_hash_4tiger192_ops; extern const php_hash_ops php_hash_snefru_ops; extern const php_hash_ops php_hash_gost_ops; +extern const php_hash_ops php_hash_gost_crypto_ops; extern const php_hash_ops php_hash_adler32_ops; extern const php_hash_ops php_hash_crc32_ops; extern const php_hash_ops php_hash_crc32b_ops; diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h index 6a4af310dc64c..a9c137530c4ae 100644 --- a/ext/hash/php_hash_gost.h +++ b/ext/hash/php_hash_gost.h @@ -29,6 +29,7 @@ typedef struct { php_hash_uint32 count[2]; unsigned char length; unsigned char buffer[32]; + const php_hash_uint32 (*tables)[4][256]; } PHP_GOST_CTX; PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *); diff --git a/ext/hash/php_hash_gost_tables.h b/ext/hash/php_hash_gost_tables.h index 5d05e593cb13a..a00d8b74907d2 100644 --- a/ext/hash/php_hash_gost_tables.h +++ b/ext/hash/php_hash_gost_tables.h @@ -1,4 +1,4 @@ -static const php_hash_uint32 tables[4][256] = { +static const php_hash_uint32 tables_test[4][256] = { { /* table 1 */ 0x00072000LU, 0x00075000LU, 0x00074800LU, 0x00071000LU, 0x00076800LU, 0x00074000LU, 0x00070000LU, 0x00077000LU, 0x00073000LU, 0x00075800LU, 0x00070800LU, 0x00076000LU, 0x00073800LU, 0x00077800LU, 0x00072800LU, 0x00071800LU, @@ -136,3 +136,142 @@ static const php_hash_uint32 tables[4][256] = { 0x00000600LU, 0x00000650LU, 0x00000670LU, 0x00000638LU, 0x00000630LU, 0x00000640LU, 0x00000610LU, 0x00000660LU, }, }; + +static const php_hash_uint32 tables_crypto[4][256] = { + { /* table 1 */ + 0x0002d000LU, 0x0002a000LU, 0x0002a800LU, 0x0002b000LU, 0x0002c000LU, 0x00028800LU, 0x00029800LU, 0x0002b800LU, + 0x0002e800LU, 0x0002e000LU, 0x0002f000LU, 0x00028000LU, 0x0002c800LU, 0x00029000LU, 0x0002d800LU, 0x0002f800LU, + 0x0007d000LU, 0x0007a000LU, 0x0007a800LU, 0x0007b000LU, 0x0007c000LU, 0x00078800LU, 0x00079800LU, 0x0007b800LU, + 0x0007e800LU, 0x0007e000LU, 0x0007f000LU, 0x00078000LU, 0x0007c800LU, 0x00079000LU, 0x0007d800LU, 0x0007f800LU, + 0x00025000LU, 0x00022000LU, 0x00022800LU, 0x00023000LU, 0x00024000LU, 0x00020800LU, 0x00021800LU, 0x00023800LU, + 0x00026800LU, 0x00026000LU, 0x00027000LU, 0x00020000LU, 0x00024800LU, 0x00021000LU, 0x00025800LU, 0x00027800LU, + 0x00005000LU, 0x00002000LU, 0x00002800LU, 0x00003000LU, 0x00004000LU, 0x00000800LU, 0x00001800LU, 0x00003800LU, + 0x00006800LU, 0x00006000LU, 0x00007000LU, 0x00000000LU, 0x00004800LU, 0x00001000LU, 0x00005800LU, 0x00007800LU, + 0x00015000LU, 0x00012000LU, 0x00012800LU, 0x00013000LU, 0x00014000LU, 0x00010800LU, 0x00011800LU, 0x00013800LU, + 0x00016800LU, 0x00016000LU, 0x00017000LU, 0x00010000LU, 0x00014800LU, 0x00011000LU, 0x00015800LU, 0x00017800LU, + 0x0006d000LU, 0x0006a000LU, 0x0006a800LU, 0x0006b000LU, 0x0006c000LU, 0x00068800LU, 0x00069800LU, 0x0006b800LU, + 0x0006e800LU, 0x0006e000LU, 0x0006f000LU, 0x00068000LU, 0x0006c800LU, 0x00069000LU, 0x0006d800LU, 0x0006f800LU, + 0x0005d000LU, 0x0005a000LU, 0x0005a800LU, 0x0005b000LU, 0x0005c000LU, 0x00058800LU, 0x00059800LU, 0x0005b800LU, + 0x0005e800LU, 0x0005e000LU, 0x0005f000LU, 0x00058000LU, 0x0005c800LU, 0x00059000LU, 0x0005d800LU, 0x0005f800LU, + 0x0004d000LU, 0x0004a000LU, 0x0004a800LU, 0x0004b000LU, 0x0004c000LU, 0x00048800LU, 0x00049800LU, 0x0004b800LU, + 0x0004e800LU, 0x0004e000LU, 0x0004f000LU, 0x00048000LU, 0x0004c800LU, 0x00049000LU, 0x0004d800LU, 0x0004f800LU, + 0x0000d000LU, 0x0000a000LU, 0x0000a800LU, 0x0000b000LU, 0x0000c000LU, 0x00008800LU, 0x00009800LU, 0x0000b800LU, + 0x0000e800LU, 0x0000e000LU, 0x0000f000LU, 0x00008000LU, 0x0000c800LU, 0x00009000LU, 0x0000d800LU, 0x0000f800LU, + 0x0003d000LU, 0x0003a000LU, 0x0003a800LU, 0x0003b000LU, 0x0003c000LU, 0x00038800LU, 0x00039800LU, 0x0003b800LU, + 0x0003e800LU, 0x0003e000LU, 0x0003f000LU, 0x00038000LU, 0x0003c800LU, 0x00039000LU, 0x0003d800LU, 0x0003f800LU, + 0x00035000LU, 0x00032000LU, 0x00032800LU, 0x00033000LU, 0x00034000LU, 0x00030800LU, 0x00031800LU, 0x00033800LU, + 0x00036800LU, 0x00036000LU, 0x00037000LU, 0x00030000LU, 0x00034800LU, 0x00031000LU, 0x00035800LU, 0x00037800LU, + 0x0001d000LU, 0x0001a000LU, 0x0001a800LU, 0x0001b000LU, 0x0001c000LU, 0x00018800LU, 0x00019800LU, 0x0001b800LU, + 0x0001e800LU, 0x0001e000LU, 0x0001f000LU, 0x00018000LU, 0x0001c800LU, 0x00019000LU, 0x0001d800LU, 0x0001f800LU, + 0x00065000LU, 0x00062000LU, 0x00062800LU, 0x00063000LU, 0x00064000LU, 0x00060800LU, 0x00061800LU, 0x00063800LU, + 0x00066800LU, 0x00066000LU, 0x00067000LU, 0x00060000LU, 0x00064800LU, 0x00061000LU, 0x00065800LU, 0x00067800LU, + 0x00075000LU, 0x00072000LU, 0x00072800LU, 0x00073000LU, 0x00074000LU, 0x00070800LU, 0x00071800LU, 0x00073800LU, + 0x00076800LU, 0x00076000LU, 0x00077000LU, 0x00070000LU, 0x00074800LU, 0x00071000LU, 0x00075800LU, 0x00077800LU, + 0x00055000LU, 0x00052000LU, 0x00052800LU, 0x00053000LU, 0x00054000LU, 0x00050800LU, 0x00051800LU, 0x00053800LU, + 0x00056800LU, 0x00056000LU, 0x00057000LU, 0x00050000LU, 0x00054800LU, 0x00051000LU, 0x00055800LU, 0x00057800LU, + 0x00045000LU, 0x00042000LU, 0x00042800LU, 0x00043000LU, 0x00044000LU, 0x00040800LU, 0x00041800LU, 0x00043800LU, + 0x00046800LU, 0x00046000LU, 0x00047000LU, 0x00040000LU, 0x00044800LU, 0x00041000LU, 0x00045800LU, 0x00047800LU, + }, + { /* table 2 */ + 0x02380000LU, 0x02780000LU, 0x02600000LU, 0x02700000LU, 0x02480000LU, 0x02200000LU, 0x02080000LU, 0x02000000LU, + 0x02180000LU, 0x02580000LU, 0x02280000LU, 0x02100000LU, 0x02300000LU, 0x02500000LU, 0x02400000LU, 0x02680000LU, + 0x05380000LU, 0x05780000LU, 0x05600000LU, 0x05700000LU, 0x05480000LU, 0x05200000LU, 0x05080000LU, 0x05000000LU, + 0x05180000LU, 0x05580000LU, 0x05280000LU, 0x05100000LU, 0x05300000LU, 0x05500000LU, 0x05400000LU, 0x05680000LU, + 0x03b80000LU, 0x03f80000LU, 0x03e00000LU, 0x03f00000LU, 0x03c80000LU, 0x03a00000LU, 0x03880000LU, 0x03800000LU, + 0x03980000LU, 0x03d80000LU, 0x03a80000LU, 0x03900000LU, 0x03b00000LU, 0x03d00000LU, 0x03c00000LU, 0x03e80000LU, + 0x06380000LU, 0x06780000LU, 0x06600000LU, 0x06700000LU, 0x06480000LU, 0x06200000LU, 0x06080000LU, 0x06000000LU, + 0x06180000LU, 0x06580000LU, 0x06280000LU, 0x06100000LU, 0x06300000LU, 0x06500000LU, 0x06400000LU, 0x06680000LU, + 0x00380000LU, 0x00780000LU, 0x00600000LU, 0x00700000LU, 0x00480000LU, 0x00200000LU, 0x00080000LU, 0x00000000LU, + 0x00180000LU, 0x00580000LU, 0x00280000LU, 0x00100000LU, 0x00300000LU, 0x00500000LU, 0x00400000LU, 0x00680000LU, + 0x07b80000LU, 0x07f80000LU, 0x07e00000LU, 0x07f00000LU, 0x07c80000LU, 0x07a00000LU, 0x07880000LU, 0x07800000LU, + 0x07980000LU, 0x07d80000LU, 0x07a80000LU, 0x07900000LU, 0x07b00000LU, 0x07d00000LU, 0x07c00000LU, 0x07e80000LU, + 0x01380000LU, 0x01780000LU, 0x01600000LU, 0x01700000LU, 0x01480000LU, 0x01200000LU, 0x01080000LU, 0x01000000LU, + 0x01180000LU, 0x01580000LU, 0x01280000LU, 0x01100000LU, 0x01300000LU, 0x01500000LU, 0x01400000LU, 0x01680000LU, + 0x04380000LU, 0x04780000LU, 0x04600000LU, 0x04700000LU, 0x04480000LU, 0x04200000LU, 0x04080000LU, 0x04000000LU, + 0x04180000LU, 0x04580000LU, 0x04280000LU, 0x04100000LU, 0x04300000LU, 0x04500000LU, 0x04400000LU, 0x04680000LU, + 0x07380000LU, 0x07780000LU, 0x07600000LU, 0x07700000LU, 0x07480000LU, 0x07200000LU, 0x07080000LU, 0x07000000LU, + 0x07180000LU, 0x07580000LU, 0x07280000LU, 0x07100000LU, 0x07300000LU, 0x07500000LU, 0x07400000LU, 0x07680000LU, + 0x00b80000LU, 0x00f80000LU, 0x00e00000LU, 0x00f00000LU, 0x00c80000LU, 0x00a00000LU, 0x00880000LU, 0x00800000LU, + 0x00980000LU, 0x00d80000LU, 0x00a80000LU, 0x00900000LU, 0x00b00000LU, 0x00d00000LU, 0x00c00000LU, 0x00e80000LU, + 0x03380000LU, 0x03780000LU, 0x03600000LU, 0x03700000LU, 0x03480000LU, 0x03200000LU, 0x03080000LU, 0x03000000LU, + 0x03180000LU, 0x03580000LU, 0x03280000LU, 0x03100000LU, 0x03300000LU, 0x03500000LU, 0x03400000LU, 0x03680000LU, + 0x02b80000LU, 0x02f80000LU, 0x02e00000LU, 0x02f00000LU, 0x02c80000LU, 0x02a00000LU, 0x02880000LU, 0x02800000LU, + 0x02980000LU, 0x02d80000LU, 0x02a80000LU, 0x02900000LU, 0x02b00000LU, 0x02d00000LU, 0x02c00000LU, 0x02e80000LU, + 0x06b80000LU, 0x06f80000LU, 0x06e00000LU, 0x06f00000LU, 0x06c80000LU, 0x06a00000LU, 0x06880000LU, 0x06800000LU, + 0x06980000LU, 0x06d80000LU, 0x06a80000LU, 0x06900000LU, 0x06b00000LU, 0x06d00000LU, 0x06c00000LU, 0x06e80000LU, + 0x05b80000LU, 0x05f80000LU, 0x05e00000LU, 0x05f00000LU, 0x05c80000LU, 0x05a00000LU, 0x05880000LU, 0x05800000LU, + 0x05980000LU, 0x05d80000LU, 0x05a80000LU, 0x05900000LU, 0x05b00000LU, 0x05d00000LU, 0x05c00000LU, 0x05e80000LU, + 0x04b80000LU, 0x04f80000LU, 0x04e00000LU, 0x04f00000LU, 0x04c80000LU, 0x04a00000LU, 0x04880000LU, 0x04800000LU, + 0x04980000LU, 0x04d80000LU, 0x04a80000LU, 0x04900000LU, 0x04b00000LU, 0x04d00000LU, 0x04c00000LU, 0x04e80000LU, + 0x01b80000LU, 0x01f80000LU, 0x01e00000LU, 0x01f00000LU, 0x01c80000LU, 0x01a00000LU, 0x01880000LU, 0x01800000LU, + 0x01980000LU, 0x01d80000LU, 0x01a80000LU, 0x01900000LU, 0x01b00000LU, 0x01d00000LU, 0x01c00000LU, 0x01e80000LU, + }, + { /* table 3 */ + 0xb8000003LU, 0xb0000003LU, 0xa0000003LU, 0xd8000003LU, 0xc8000003LU, 0xe0000003LU, 0x90000003LU, 0xd0000003LU, + 0x88000003LU, 0xc0000003LU, 0x80000003LU, 0xf0000003LU, 0xf8000003LU, 0xe8000003LU, 0x98000003LU, 0xa8000003LU, + 0x38000003LU, 0x30000003LU, 0x20000003LU, 0x58000003LU, 0x48000003LU, 0x60000003LU, 0x10000003LU, 0x50000003LU, + 0x08000003LU, 0x40000003LU, 0x00000003LU, 0x70000003LU, 0x78000003LU, 0x68000003LU, 0x18000003LU, 0x28000003LU, + 0x38000001LU, 0x30000001LU, 0x20000001LU, 0x58000001LU, 0x48000001LU, 0x60000001LU, 0x10000001LU, 0x50000001LU, + 0x08000001LU, 0x40000001LU, 0x00000001LU, 0x70000001LU, 0x78000001LU, 0x68000001LU, 0x18000001LU, 0x28000001LU, + 0x38000002LU, 0x30000002LU, 0x20000002LU, 0x58000002LU, 0x48000002LU, 0x60000002LU, 0x10000002LU, 0x50000002LU, + 0x08000002LU, 0x40000002LU, 0x00000002LU, 0x70000002LU, 0x78000002LU, 0x68000002LU, 0x18000002LU, 0x28000002LU, + 0xb8000006LU, 0xb0000006LU, 0xa0000006LU, 0xd8000006LU, 0xc8000006LU, 0xe0000006LU, 0x90000006LU, 0xd0000006LU, + 0x88000006LU, 0xc0000006LU, 0x80000006LU, 0xf0000006LU, 0xf8000006LU, 0xe8000006LU, 0x98000006LU, 0xa8000006LU, + 0xb8000004LU, 0xb0000004LU, 0xa0000004LU, 0xd8000004LU, 0xc8000004LU, 0xe0000004LU, 0x90000004LU, 0xd0000004LU, + 0x88000004LU, 0xc0000004LU, 0x80000004LU, 0xf0000004LU, 0xf8000004LU, 0xe8000004LU, 0x98000004LU, 0xa8000004LU, + 0xb8000007LU, 0xb0000007LU, 0xa0000007LU, 0xd8000007LU, 0xc8000007LU, 0xe0000007LU, 0x90000007LU, 0xd0000007LU, + 0x88000007LU, 0xc0000007LU, 0x80000007LU, 0xf0000007LU, 0xf8000007LU, 0xe8000007LU, 0x98000007LU, 0xa8000007LU, + 0x38000000LU, 0x30000000LU, 0x20000000LU, 0x58000000LU, 0x48000000LU, 0x60000000LU, 0x10000000LU, 0x50000000LU, + 0x08000000LU, 0x40000000LU, 0x00000000LU, 0x70000000LU, 0x78000000LU, 0x68000000LU, 0x18000000LU, 0x28000000LU, + 0x38000005LU, 0x30000005LU, 0x20000005LU, 0x58000005LU, 0x48000005LU, 0x60000005LU, 0x10000005LU, 0x50000005LU, + 0x08000005LU, 0x40000005LU, 0x00000005LU, 0x70000005LU, 0x78000005LU, 0x68000005LU, 0x18000005LU, 0x28000005LU, + 0xb8000000LU, 0xb0000000LU, 0xa0000000LU, 0xd8000000LU, 0xc8000000LU, 0xe0000000LU, 0x90000000LU, 0xd0000000LU, + 0x88000000LU, 0xc0000000LU, 0x80000000LU, 0xf0000000LU, 0xf8000000LU, 0xe8000000LU, 0x98000000LU, 0xa8000000LU, + 0xb8000002LU, 0xb0000002LU, 0xa0000002LU, 0xd8000002LU, 0xc8000002LU, 0xe0000002LU, 0x90000002LU, 0xd0000002LU, + 0x88000002LU, 0xc0000002LU, 0x80000002LU, 0xf0000002LU, 0xf8000002LU, 0xe8000002LU, 0x98000002LU, 0xa8000002LU, + 0xb8000005LU, 0xb0000005LU, 0xa0000005LU, 0xd8000005LU, 0xc8000005LU, 0xe0000005LU, 0x90000005LU, 0xd0000005LU, + 0x88000005LU, 0xc0000005LU, 0x80000005LU, 0xf0000005LU, 0xf8000005LU, 0xe8000005LU, 0x98000005LU, 0xa8000005LU, + 0x38000004LU, 0x30000004LU, 0x20000004LU, 0x58000004LU, 0x48000004LU, 0x60000004LU, 0x10000004LU, 0x50000004LU, + 0x08000004LU, 0x40000004LU, 0x00000004LU, 0x70000004LU, 0x78000004LU, 0x68000004LU, 0x18000004LU, 0x28000004LU, + 0x38000007LU, 0x30000007LU, 0x20000007LU, 0x58000007LU, 0x48000007LU, 0x60000007LU, 0x10000007LU, 0x50000007LU, + 0x08000007LU, 0x40000007LU, 0x00000007LU, 0x70000007LU, 0x78000007LU, 0x68000007LU, 0x18000007LU, 0x28000007LU, + 0x38000006LU, 0x30000006LU, 0x20000006LU, 0x58000006LU, 0x48000006LU, 0x60000006LU, 0x10000006LU, 0x50000006LU, + 0x08000006LU, 0x40000006LU, 0x00000006LU, 0x70000006LU, 0x78000006LU, 0x68000006LU, 0x18000006LU, 0x28000006LU, + 0xb8000001LU, 0xb0000001LU, 0xa0000001LU, 0xd8000001LU, 0xc8000001LU, 0xe0000001LU, 0x90000001LU, 0xd0000001LU, + 0x88000001LU, 0xc0000001LU, 0x80000001LU, 0xf0000001LU, 0xf8000001LU, 0xe8000001LU, 0x98000001LU, 0xa8000001LU, + }, + { /* table 4 */ + 0x000000e8LU, 0x000000f0LU, 0x000000a0LU, 0x00000088LU, 0x000000b8LU, 0x00000080LU, 0x000000a8LU, 0x000000d0LU, + 0x00000098LU, 0x000000e0LU, 0x000000c0LU, 0x000000f8LU, 0x000000b0LU, 0x00000090LU, 0x000000c8LU, 0x000000d8LU, + 0x000001e8LU, 0x000001f0LU, 0x000001a0LU, 0x00000188LU, 0x000001b8LU, 0x00000180LU, 0x000001a8LU, 0x000001d0LU, + 0x00000198LU, 0x000001e0LU, 0x000001c0LU, 0x000001f8LU, 0x000001b0LU, 0x00000190LU, 0x000001c8LU, 0x000001d8LU, + 0x00000568LU, 0x00000570LU, 0x00000520LU, 0x00000508LU, 0x00000538LU, 0x00000500LU, 0x00000528LU, 0x00000550LU, + 0x00000518LU, 0x00000560LU, 0x00000540LU, 0x00000578LU, 0x00000530LU, 0x00000510LU, 0x00000548LU, 0x00000558LU, + 0x000004e8LU, 0x000004f0LU, 0x000004a0LU, 0x00000488LU, 0x000004b8LU, 0x00000480LU, 0x000004a8LU, 0x000004d0LU, + 0x00000498LU, 0x000004e0LU, 0x000004c0LU, 0x000004f8LU, 0x000004b0LU, 0x00000490LU, 0x000004c8LU, 0x000004d8LU, + 0x000002e8LU, 0x000002f0LU, 0x000002a0LU, 0x00000288LU, 0x000002b8LU, 0x00000280LU, 0x000002a8LU, 0x000002d0LU, + 0x00000298LU, 0x000002e0LU, 0x000002c0LU, 0x000002f8LU, 0x000002b0LU, 0x00000290LU, 0x000002c8LU, 0x000002d8LU, + 0x000005e8LU, 0x000005f0LU, 0x000005a0LU, 0x00000588LU, 0x000005b8LU, 0x00000580LU, 0x000005a8LU, 0x000005d0LU, + 0x00000598LU, 0x000005e0LU, 0x000005c0LU, 0x000005f8LU, 0x000005b0LU, 0x00000590LU, 0x000005c8LU, 0x000005d8LU, + 0x00000268LU, 0x00000270LU, 0x00000220LU, 0x00000208LU, 0x00000238LU, 0x00000200LU, 0x00000228LU, 0x00000250LU, + 0x00000218LU, 0x00000260LU, 0x00000240LU, 0x00000278LU, 0x00000230LU, 0x00000210LU, 0x00000248LU, 0x00000258LU, + 0x000007e8LU, 0x000007f0LU, 0x000007a0LU, 0x00000788LU, 0x000007b8LU, 0x00000780LU, 0x000007a8LU, 0x000007d0LU, + 0x00000798LU, 0x000007e0LU, 0x000007c0LU, 0x000007f8LU, 0x000007b0LU, 0x00000790LU, 0x000007c8LU, 0x000007d8LU, + 0x00000468LU, 0x00000470LU, 0x00000420LU, 0x00000408LU, 0x00000438LU, 0x00000400LU, 0x00000428LU, 0x00000450LU, + 0x00000418LU, 0x00000460LU, 0x00000440LU, 0x00000478LU, 0x00000430LU, 0x00000410LU, 0x00000448LU, 0x00000458LU, + 0x00000368LU, 0x00000370LU, 0x00000320LU, 0x00000308LU, 0x00000338LU, 0x00000300LU, 0x00000328LU, 0x00000350LU, + 0x00000318LU, 0x00000360LU, 0x00000340LU, 0x00000378LU, 0x00000330LU, 0x00000310LU, 0x00000348LU, 0x00000358LU, + 0x000003e8LU, 0x000003f0LU, 0x000003a0LU, 0x00000388LU, 0x000003b8LU, 0x00000380LU, 0x000003a8LU, 0x000003d0LU, + 0x00000398LU, 0x000003e0LU, 0x000003c0LU, 0x000003f8LU, 0x000003b0LU, 0x00000390LU, 0x000003c8LU, 0x000003d8LU, + 0x00000768LU, 0x00000770LU, 0x00000720LU, 0x00000708LU, 0x00000738LU, 0x00000700LU, 0x00000728LU, 0x00000750LU, + 0x00000718LU, 0x00000760LU, 0x00000740LU, 0x00000778LU, 0x00000730LU, 0x00000710LU, 0x00000748LU, 0x00000758LU, + 0x000006e8LU, 0x000006f0LU, 0x000006a0LU, 0x00000688LU, 0x000006b8LU, 0x00000680LU, 0x000006a8LU, 0x000006d0LU, + 0x00000698LU, 0x000006e0LU, 0x000006c0LU, 0x000006f8LU, 0x000006b0LU, 0x00000690LU, 0x000006c8LU, 0x000006d8LU, + 0x00000068LU, 0x00000070LU, 0x00000020LU, 0x00000008LU, 0x00000038LU, 0x00000000LU, 0x00000028LU, 0x00000050LU, + 0x00000018LU, 0x00000060LU, 0x00000040LU, 0x00000078LU, 0x00000030LU, 0x00000010LU, 0x00000048LU, 0x00000058LU, + 0x00000168LU, 0x00000170LU, 0x00000120LU, 0x00000108LU, 0x00000138LU, 0x00000100LU, 0x00000128LU, 0x00000150LU, + 0x00000118LU, 0x00000160LU, 0x00000140LU, 0x00000178LU, 0x00000130LU, 0x00000110LU, 0x00000148LU, 0x00000158LU, + 0x00000668LU, 0x00000670LU, 0x00000620LU, 0x00000608LU, 0x00000638LU, 0x00000600LU, 0x00000628LU, 0x00000650LU, + 0x00000618LU, 0x00000660LU, 0x00000640LU, 0x00000678LU, 0x00000630LU, 0x00000610LU, 0x00000648LU, 0x00000658LU, + }, +}; diff --git a/ext/hash/tests/gost.phpt b/ext/hash/tests/gost.phpt index b800e112e85c3..6ce00242b1a40 100644 --- a/ext/hash/tests/gost.phpt +++ b/ext/hash/tests/gost.phpt @@ -10,6 +10,13 @@ echo hash('gost', 'The quick brown fox jumps over the lazy cog'), "\n"; echo hash('gost', str_repeat('a', 31)), "\n"; echo hash('gost', str_repeat('a', 32)), "\n"; echo hash('gost', str_repeat('a', 33)), "\n"; + +echo hash('gost-crypto', ''), "\n"; +echo hash('gost-crypto', 'The quick brown fox jumps over the lazy dog'), "\n"; +echo hash('gost-crypto', 'The quick brown fox jumps over the lazy cog'), "\n"; +echo hash('gost-crypto', str_repeat('a', 31)), "\n"; +echo hash('gost-crypto', str_repeat('a', 32)), "\n"; +echo hash('gost-crypto', str_repeat('a', 33)), "\n"; ?> --EXPECT-- ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d @@ -18,3 +25,9 @@ a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445 03840d6348763f11e28e7b1ecc4da0cdf7f898fa555b928ef684c6c5b8f46d9f fd1b746d9397e78edd311baef391450434271e02816caa37680d6d7381c79d4e 715e59cdc8ebde9fdf0fe2a2e811b3bf7f48209a01505e467d2cd2aa2bbb5ecf +981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0 +9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76 +a93124f5bf2c6d83c3bbf722bc55569310245ca5957541f4dbd7dfaf8137e6f2 +8978e06b0ecf54ea81ec51ca4e02bcb4eb390b3f04cb5f65ee8de195ffae591b +e121e3740ae94ca6d289e6d653ff31695783efff3dd960417a1098a0130fa720 +d3e8f22d9762a148ddfc84a6043d97a608604dae7c05baee72b55f559d03dd74 From 0be6ecb8621e32f6bb039dd178f4db17220de6e9 Mon Sep 17 00:00:00 2001 From: Manuel Mausz Date: Thu, 5 Sep 2013 01:19:00 +0200 Subject: [PATCH 0021/1256] fix indention --- ext/hash/hash_gost.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c index 7546c8d333dd4..da65bb5903e62 100644 --- a/ext/hash/hash_gost.c +++ b/ext/hash/hash_gost.c @@ -243,13 +243,13 @@ static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char inpu PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context) { memset(context, 0, sizeof(*context)); - context->tables = &tables_test; + context->tables = &tables_test; } PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context) { - PHP_GOSTInit(context); - context->tables = &tables_crypto; + PHP_GOSTInit(context); + context->tables = &tables_crypto; } static const php_hash_uint32 MAX32 = 0xffffffffLU; From 7dbb1bba64c8a90df683e1a69df03cb2931f547a Mon Sep 17 00:00:00 2001 From: Manuel Mausz Date: Thu, 5 Sep 2013 09:32:12 +0200 Subject: [PATCH 0022/1256] fix failing tests --- ext/hash/tests/hash_algos.phpt | 6 ++++-- ext/hash/tests/hash_copy_001.phpt | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ext/hash/tests/hash_algos.phpt b/ext/hash/tests/hash_algos.phpt index 55796ecbce9aa..7773fe979a72d 100644 --- a/ext/hash/tests/hash_algos.phpt +++ b/ext/hash/tests/hash_algos.phpt @@ -18,7 +18,7 @@ var_dump(hash_algos()); ===Done=== --EXPECTF-- *** Testing hash_algos() : basic functionality *** -array(43) { +array(44) { [%d]=> string(3) "md2" [%d]=> @@ -64,6 +64,8 @@ array(43) { [%d]=> string(4) "gost" [%d]=> + string(11) "gost-crypto" + [%d]=> string(7) "adler32" [%d]=> string(5) "crc32" @@ -106,4 +108,4 @@ array(43) { [%d]=> string(10) "haval256,5" } -===Done=== \ No newline at end of file +===Done=== diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt index 638b7f5fc109a..bb4a49da89712 100644 --- a/ext/hash/tests/hash_copy_001.phpt +++ b/ext/hash/tests/hash_copy_001.phpt @@ -97,6 +97,9 @@ string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26" string(4) "gost" string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5" string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5" +string(11) "gost-crypto" +string(64) "f7c4e35548d66aabe2b106f20515d289fde90969225d3d7b83f6dd12d694f043" +string(64) "f7c4e35548d66aabe2b106f20515d289fde90969225d3d7b83f6dd12d694f043" string(7) "adler32" string(8) "6f7c0928" string(8) "6f7c0928" @@ -226,6 +229,9 @@ string(64) "614ca924864fa0e8fa309aa0944e047d5edbfd4964a35858f4d8ec66a0fb88b0" string(4) "gost" string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5" string(64) "a00961e371287c71c527a41c14564f13b6ed12ac7cd9d5f5dfb3542a25e28d3b" +string(11) "gost-crypto" +string(64) "f7c4e35548d66aabe2b106f20515d289fde90969225d3d7b83f6dd12d694f043" +string(64) "68ca9aea6729dc07d995fbe071a4b5c6490bb27fc4dc65ec0e96200d5e082996" string(7) "adler32" string(8) "6f7c0928" string(8) "d9141747" From a911fbc80a8e29aa1d58d8e8a86c4fa3f6c7bf92 Mon Sep 17 00:00:00 2001 From: Dylan Arnold Date: Mon, 9 Sep 2013 13:06:38 +1200 Subject: [PATCH 0023/1256] Call php_module_shutdown() for php-fpm child processes --- sapi/fpm/fpm/fpm_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 043e0e00a47c0..4b20e632dd361 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1982,8 +1982,9 @@ consult the installation file that came with this distribution, or visit \n\ out: SG(server_context) = NULL; + php_module_shutdown(TSRMLS_C); + if (parent) { - php_module_shutdown(TSRMLS_C); sapi_shutdown(); } From 2524428504ec9e154b01db7f6040e42c1bc89ada Mon Sep 17 00:00:00 2001 From: Andrea Faulds Date: Tue, 10 Sep 2013 21:22:06 +0000 Subject: [PATCH 0024/1256] Fixed whitespace part of bug #64874 ("json_decode handles whitespace and case-sensitivity incorrectly") --- ext/json/json.c | 30 +++++++++++++----- ext/json/tests/bug64874_part1.phpt | 51 ++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 ext/json/tests/bug64874_part1.phpt diff --git a/ext/json/json.c b/ext/json/json.c index 8c8963db8cc5b..a786fef45c744 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -684,21 +684,35 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, double d; int type, overflow_info; long p; + char *trim = str; + int trim_len = str_len; + + /* Increment trimmed string pointer to strip leading whitespace */ + /* JSON RFC says to consider as whitespace: space, tab, LF or CR */ + while (trim_len && (*trim == ' ' || *trim == '\t' || *trim == '\n' || *trim == '\r')) { + trim++; + trim_len--; + } + + /* Decrement trimmed string length to strip trailing whitespace */ + while (trim_len && (trim[trim_len - 1] == ' ' || trim[trim_len - 1] == '\t' || trim[trim_len - 1] == '\n' || trim[trim_len - 1] == '\r')) { + trim_len--; + } RETVAL_NULL(); - if (str_len == 4) { - if (!strcasecmp(str, "null")) { + if (trim_len == 4) { + if (!strncasecmp(trim, "null", trim_len)) { /* We need to explicitly clear the error because its an actual NULL and not an error */ jp->error_code = PHP_JSON_ERROR_NONE; RETVAL_NULL(); - } else if (!strcasecmp(str, "true")) { + } else if (!strncasecmp(trim, "true", trim_len)) { RETVAL_BOOL(1); } - } else if (str_len == 5 && !strcasecmp(str, "false")) { + } else if (trim_len == 5 && !strncasecmp(trim, "false", trim_len)) { RETVAL_BOOL(0); } - if ((type = is_numeric_string_ex(str, str_len, &p, &d, 0, &overflow_info)) != 0) { + if ((type = is_numeric_string_ex(trim, trim_len, &p, &d, 0, &overflow_info)) != 0) { if (type == IS_LONG) { RETVAL_LONG(p); } else if (type == IS_DOUBLE) { @@ -711,10 +725,10 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, int i; zend_bool is_float = 0; - for (i = (str[0] == '-' ? 1 : 0); i < str_len; i++) { + for (i = (trim[0] == '-' ? 1 : 0); i < trim_len; i++) { /* Not using isdigit() because it's locale specific, * but we expect JSON input to always be UTF-8. */ - if (str[i] < '0' || str[i] > '9') { + if (trim[i] < '0' || trim[i] > '9') { is_float = 1; break; } @@ -723,7 +737,7 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, if (is_float) { RETVAL_DOUBLE(d); } else { - RETVAL_STRINGL(str, str_len, 1); + RETVAL_STRINGL(trim, trim_len, 1); } } else { RETVAL_DOUBLE(d); diff --git a/ext/json/tests/bug64874_part1.phpt b/ext/json/tests/bug64874_part1.phpt new file mode 100644 index 0000000000000..4047eb895c1e5 --- /dev/null +++ b/ext/json/tests/bug64874_part1.phpt @@ -0,0 +1,51 @@ +--TEST-- +Whitespace part of bug #64874 ("json_decode handles whitespace and case-sensitivity incorrectly") +--SKIPIF-- + +--FILE-- + Date: Tue, 17 Sep 2013 11:34:30 -0400 Subject: [PATCH 0025/1256] Add ldap_escape() --- ext/ldap/ldap.c | 89 ++++++++++++++++++++++++++ ext/ldap/tests/ldap_escape_all.phpt | 14 ++++ ext/ldap/tests/ldap_escape_both.phpt | 14 ++++ ext/ldap/tests/ldap_escape_dn.phpt | 14 ++++ ext/ldap/tests/ldap_escape_filter.phpt | 14 ++++ ext/ldap/tests/ldap_escape_ignore.phpt | 15 +++++ 6 files changed, 160 insertions(+) create mode 100644 ext/ldap/tests/ldap_escape_all.phpt create mode 100644 ext/ldap/tests/ldap_escape_both.phpt create mode 100644 ext/ldap/tests/ldap_escape_dn.phpt create mode 100644 ext/ldap/tests/ldap_escape_filter.phpt create mode 100644 ext/ldap/tests/ldap_escape_ignore.phpt diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 3cfa2092e776e..734486a124a44 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -67,6 +67,9 @@ #include #endif +#define PHP_LDAP_ESCAPE_FILTER 0x01 +#define PHP_LDAP_ESCAPE_DN 0x02 + typedef struct { LDAP *link; #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) @@ -195,6 +198,9 @@ PHP_MINIT_FUNCTION(ldap) REGISTER_LONG_CONSTANT("GSLC_SSL_TWOWAY_AUTH", GSLC_SSL_TWOWAY_AUTH, CONST_PERSISTENT | CONST_CS); #endif + REGISTER_LONG_CONSTANT("LDAP_ESCAPE_FILTER", PHP_LDAP_ESCAPE_FILTER, CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("LDAP_ESCAPE_DN", PHP_LDAP_ESCAPE_DN, CONST_PERSISTENT | CONST_CS); + le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number); le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number); le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number); @@ -2136,6 +2142,81 @@ PHP_FUNCTION(ldap_set_rebind_proc) /* }}} */ #endif +static void php_ldap_do_escape(const zend_bool *map, const unsigned char *value, const int valuelen, unsigned char **result, int *resultlen) +{ + char hex[] = "0123456789abcdef"; + int i, p = 0; + size_t len = 0; + + for (i = 0; i < valuelen; i++) { + len += (map[value[i]]) ? 3 : 1; + } + len += 1; + + (*result) = (unsigned char *)emalloc(len); + (*resultlen) = (int)len; + + for (i = 0; i < valuelen; i++) { + if (map[value[i]]) { + (*result)[p++] = '\\'; + (*result)[p++] = hex[value[i] >> 4]; + (*result)[p++] = hex[value[i] & 0x0f]; + } else { + (*result)[p++] = value[i]; + } + } + + (*result)[p++] = '\0'; +} + +static void php_ldap_escape_map_set_chars(zend_bool *map, const unsigned char *chars, const int charslen, char escape) +{ + int i = 0; + while (i < charslen) { + map[chars[i++]] = escape; + } +} + +PHP_FUNCTION(ldap_escape) +{ + unsigned char *value, *ignores, *result; + int valuelen = 0, ignoreslen = 0, resultlen = 0, i; + long flags = 0; + zend_bool map[256] = {0}, havecharlist = 0; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sl", &value, &valuelen, &ignores, &ignoreslen, &flags) != SUCCESS) { + return; + } + + if (!valuelen) { + RETURN_EMPTY_STRING(); + } + + if (flags & PHP_LDAP_ESCAPE_FILTER) { + havecharlist = 1; + php_ldap_escape_map_set_chars(map, "\\*()\0", sizeof("\\*()\0") - 1, 1); + } + + if (flags & PHP_LDAP_ESCAPE_DN) { + havecharlist = 1; + php_ldap_escape_map_set_chars(map, "\\,=+<>;\"#", sizeof("\\,=+<>;\"#") - 1, 1); + } + + if (!havecharlist) { + for (i = 0; i < 256; i++) { + map[i] = 1; + } + } + + if (ignoreslen) { + php_ldap_escape_map_set_chars(map, ignores, ignoreslen, 0); + } + + php_ldap_do_escape(map, value, valuelen, &result, &resultlen); + + RETURN_STRINGL(result, resultlen - 1, 0); +} + #ifdef STR_TRANSLATION /* {{{ php_ldap_do_translate */ @@ -2625,6 +2706,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_set_rebind_proc, 0, 0, 2) ZEND_END_ARG_INFO() #endif +ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_escape, 0, 0, 1) + ZEND_ARG_INFO(0, value) + ZEND_ARG_INFO(0, ignore) + ZEND_ARG_INFO(0, flags) +ZEND_END_ARG_INFO() + #ifdef STR_TRANSLATION ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_t61_to_8859, 0, 0, 1) ZEND_ARG_INFO(0, value) @@ -2703,6 +2790,8 @@ const zend_function_entry ldap_functions[] = { PHP_FE(ldap_set_rebind_proc, arginfo_ldap_set_rebind_proc) #endif + PHP_FE(ldap_escape, arginfo_ldap_escape) + #ifdef STR_TRANSLATION PHP_FE(ldap_t61_to_8859, arginfo_ldap_t61_to_8859) PHP_FE(ldap_8859_to_t61, arginfo_ldap_8859_to_t61) diff --git a/ext/ldap/tests/ldap_escape_all.phpt b/ext/ldap/tests/ldap_escape_all.phpt new file mode 100644 index 0000000000000..a79be004ffe56 --- /dev/null +++ b/ext/ldap/tests/ldap_escape_all.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test all +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(39) "\66\6f\6f\3d\62\61\72\28\62\61\7a\29\2a" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_both.phpt b/ext/ldap/tests/ldap_escape_both.phpt new file mode 100644 index 0000000000000..2169c0ad2e75c --- /dev/null +++ b/ext/ldap/tests/ldap_escape_both.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test filter and DN +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(21) "foo\3dbar\28baz\29\2a" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_dn.phpt b/ext/ldap/tests/ldap_escape_dn.phpt new file mode 100644 index 0000000000000..fbcb0545ae4e8 --- /dev/null +++ b/ext/ldap/tests/ldap_escape_dn.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test DN +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(15) "foo\3dbar(baz)*" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_filter.phpt b/ext/ldap/tests/ldap_escape_filter.phpt new file mode 100644 index 0000000000000..e4540a452d3f6 --- /dev/null +++ b/ext/ldap/tests/ldap_escape_filter.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test filter +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(19) "foo=bar\28baz\29\2a" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_ignore.phpt b/ext/ldap/tests/ldap_escape_ignore.phpt new file mode 100644 index 0000000000000..ab56aa2d0e91f --- /dev/null +++ b/ext/ldap/tests/ldap_escape_ignore.phpt @@ -0,0 +1,15 @@ +--TEST-- +ldap_escape() test ignore +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(31) "\66oo\3d\62a\72\28\62a\7a\29\2a" \ No newline at end of file From 98e4ecb6f042feb308d27130b9b48ab90729f049 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 19 Sep 2013 10:51:57 +0200 Subject: [PATCH 0026/1256] fix Zend/tests/ns_040.phpt failing It was wrongly assumed the namespace has to be looked up in a case sensitive manner too. Fixed the lookup to use a lower case represenation of the import name. --- Zend/zend_compile.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 15dce18f7c272..b811554812d49 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2140,11 +2140,8 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool *check_namespace if (compound && CG(current_import)) { len = compound - Z_STRVAL(element_name->u.constant); - if (case_sensitive) { - lookup_name = estrndup(Z_STRVAL(element_name->u.constant), len); - } else { - lookup_name = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); - } + /* namespace is always lowercase */ + lookup_name = zend_str_tolower_dup(Z_STRVAL(element_name->u.constant), len); /* Check if first part of compound name is an import name */ if (zend_hash_find(CG(current_import), lookup_name, len+1, (void**)&ns) == SUCCESS) { /* Substitute import name */ From b8f9a20286c6d88c11e81967df42d118bdba2f02 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 15:04:52 +0800 Subject: [PATCH 0027/1256] added openssl_x509_digest(), output is binary sha1 --- ext/openssl/openssl.c | 41 +++++++++++++++++++++++++++++++++++++++ ext/openssl/php_openssl.h | 1 + 2 files changed, 42 insertions(+) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 4aac4e3137cad..c7203a74d63aa 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -129,6 +129,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export, 0, 0, 2) ZEND_ARG_INFO(0, notext) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) + ZEND_ARG_INFO(0, x509) + ZEND_ARG_INFO(1, out) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_openssl_x509_check_private_key, 0) ZEND_ARG_INFO(0, cert) ZEND_ARG_INFO(0, key) @@ -443,6 +448,7 @@ const zend_function_entry openssl_functions[] = { PHP_FE(openssl_x509_checkpurpose, arginfo_openssl_x509_checkpurpose) PHP_FE(openssl_x509_check_private_key, arginfo_openssl_x509_check_private_key) PHP_FE(openssl_x509_export, arginfo_openssl_x509_export) + PHP_FE(openssl_x509_digest, arginfo_openssl_x509_digest) PHP_FE(openssl_x509_export_to_file, arginfo_openssl_x509_export_to_file) /* PKCS12 funcs */ @@ -1665,6 +1671,41 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ +PHP_FUNCTION(openssl_x509_digest) +{ + X509 *cert; + zval **zcert, *zout; + long certresource; + + unsigned char md[EVP_MAX_MD_SIZE]; + unsigned int n; + + RETVAL_FALSE; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz", &zcert, &zout) == FAILURE) { + return; + } + + cert = php_openssl_x509_from_zval(zcert, 0, &certresource TSRMLS_CC); + if (cert == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get cert from parameter 1"); + return; + } + + if (!X509_digest(cert, EVP_sha1(), md, &n)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory"); + return; + } + + zval_dtor(zout); + ZVAL_STRINGL(zout, md, n, 1); + + if (certresource == -1 && cert) { + X509_free(cert); + } + RETVAL_TRUE; +} + /* {{{ proto bool openssl_x509_check_private_key(mixed cert, mixed key) Checks if a private key corresponds to a CERT */ PHP_FUNCTION(openssl_x509_check_private_key) diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h index 8483bbf7626dd..4f0ac14100143 100644 --- a/ext/openssl/php_openssl.h +++ b/ext/openssl/php_openssl.h @@ -66,6 +66,7 @@ PHP_FUNCTION(openssl_x509_free); PHP_FUNCTION(openssl_x509_parse); PHP_FUNCTION(openssl_x509_checkpurpose); PHP_FUNCTION(openssl_x509_export); +PHP_FUNCTION(openssl_x509_digest); PHP_FUNCTION(openssl_x509_export_to_file); PHP_FUNCTION(openssl_x509_check_private_key); From 5cff92fb12e83f4c6c81c6e8b89480def3ee5e9e Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 15:45:41 +0800 Subject: [PATCH 0028/1256] added option for raw output --- ext/openssl/openssl.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c7203a74d63aa..5dfb9b43695af 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -132,6 +132,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) ZEND_ARG_INFO(0, x509) ZEND_ARG_INFO(1, out) + ZEND_ARG_INFO(0, raw_output) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_openssl_x509_check_private_key, 0) @@ -1676,13 +1677,14 @@ PHP_FUNCTION(openssl_x509_digest) X509 *cert; zval **zcert, *zout; long certresource; + zend_bool raw_output = 0; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz", &zcert, &zout) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|b", &zcert, &zout, &raw_output) == FAILURE) { return; } @@ -1698,7 +1700,16 @@ PHP_FUNCTION(openssl_x509_digest) } zval_dtor(zout); - ZVAL_STRINGL(zout, md, n, 1); + + if (raw_output) { + ZVAL_STRINGL(zout, md, n, 1); + } else { + int digest_str_len = n * 2; + char *digest_str = emalloc(digest_str_len + 1); + + make_digest_ex(digest_str, md, n); + ZVAL_STRINGL(zout, digest_str, digest_str_len, 0); + } if (certresource == -1 && cert) { X509_free(cert); From b2881db9a98db6e92d9f6964dd83a003c39a7fbd Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 16:56:50 +0800 Subject: [PATCH 0029/1256] added option for hash function --- ext/openssl/openssl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 5dfb9b43695af..6979e35685b3a 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -132,6 +132,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) ZEND_ARG_INFO(0, x509) ZEND_ARG_INFO(1, out) + ZEND_ARG_INFO(0, method) ZEND_ARG_INFO(0, raw_output) ZEND_END_ARG_INFO() @@ -1678,13 +1679,16 @@ PHP_FUNCTION(openssl_x509_digest) zval **zcert, *zout; long certresource; zend_bool raw_output = 0; + char *method = "sha1"; + int method_len; + const EVP_MD *mdtype; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|b", &zcert, &zout, &raw_output) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|sb", &zcert, &zout, &method, &method_len, &raw_output) == FAILURE) { return; } @@ -1694,7 +1698,13 @@ PHP_FUNCTION(openssl_x509_digest) return; } - if (!X509_digest(cert, EVP_sha1(), md, &n)) { + mdtype = EVP_get_digestbyname(method); + if (!mdtype) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + RETURN_FALSE; + } + + if (!X509_digest(cert, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory"); return; } From ce13f9fa328ae4a0c7fa9ef5efdb72a43f29dde2 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 16:59:44 +0800 Subject: [PATCH 0030/1256] indentation fail --- ext/openssl/openssl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 6979e35685b3a..f0ae2b70b19d3 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1676,14 +1676,14 @@ PHP_FUNCTION(openssl_x509_export) PHP_FUNCTION(openssl_x509_digest) { X509 *cert; - zval **zcert, *zout; + zval **zcert, *zout; long certresource; zend_bool raw_output = 0; char *method = "sha1"; int method_len; const EVP_MD *mdtype; - unsigned char md[EVP_MAX_MD_SIZE]; + unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; RETVAL_FALSE; From 574fe449dc05a11cfe7e6a33b04d3f6557442600 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Fri, 20 Sep 2013 22:50:30 +0800 Subject: [PATCH 0031/1256] removed the byref result --- ext/openssl/openssl.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index f0ae2b70b19d3..e6040d5f2cbe4 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -129,9 +129,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export, 0, 0, 2) ZEND_ARG_INFO(0, notext) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 1) ZEND_ARG_INFO(0, x509) - ZEND_ARG_INFO(1, out) ZEND_ARG_INFO(0, method) ZEND_ARG_INFO(0, raw_output) ZEND_END_ARG_INFO() @@ -1676,7 +1675,7 @@ PHP_FUNCTION(openssl_x509_export) PHP_FUNCTION(openssl_x509_digest) { X509 *cert; - zval **zcert, *zout; + zval **zcert; long certresource; zend_bool raw_output = 0; char *method = "sha1"; @@ -1688,7 +1687,7 @@ PHP_FUNCTION(openssl_x509_digest) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|sb", &zcert, &zout, &method, &method_len, &raw_output) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; } @@ -1701,7 +1700,7 @@ PHP_FUNCTION(openssl_x509_digest) mdtype = EVP_get_digestbyname(method); if (!mdtype) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - RETURN_FALSE; + return; } if (!X509_digest(cert, mdtype, md, &n)) { @@ -1709,22 +1708,19 @@ PHP_FUNCTION(openssl_x509_digest) return; } - zval_dtor(zout); - if (raw_output) { - ZVAL_STRINGL(zout, md, n, 1); + RETVAL_STRINGL(md, n, 1); } else { int digest_str_len = n * 2; char *digest_str = emalloc(digest_str_len + 1); make_digest_ex(digest_str, md, n); - ZVAL_STRINGL(zout, digest_str, digest_str_len, 0); + RETVAL_STRINGL(digest_str, digest_str_len, 0); } if (certresource == -1 && cert) { X509_free(cert); } - RETVAL_TRUE; } /* {{{ proto bool openssl_x509_check_private_key(mixed cert, mixed key) From a97aec16c0320c5737b43ad1c3caf01ea1485874 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Fri, 20 Sep 2013 23:28:29 +0800 Subject: [PATCH 0032/1256] Added test case for openssl_x509_digest() --- ext/openssl/tests/openssl_x509_digest.phpt | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 ext/openssl/tests/openssl_x509_digest.phpt diff --git a/ext/openssl/tests/openssl_x509_digest.phpt b/ext/openssl/tests/openssl_x509_digest.phpt new file mode 100644 index 0000000000000..98ec0098e827e --- /dev/null +++ b/ext/openssl/tests/openssl_x509_digest.phpt @@ -0,0 +1,39 @@ +--TEST-- +Testing openssl_x509_digest() +--SKIPIF-- + +--FILE-- + Date: Sat, 21 Sep 2013 16:45:20 +0800 Subject: [PATCH 0033/1256] added better wildcard matching for CN --- ext/openssl/openssl.c | 35 +++++++++++++++++++-------- ext/openssl/tests/bug65729.pem | 28 ++++++++++++++++++++++ ext/openssl/tests/bug65729.phpt | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 ext/openssl/tests/bug65729.pem create mode 100644 ext/openssl/tests/bug65729.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 4aac4e3137cad..5460f3a6e1131 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4829,6 +4829,30 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ +static int php_openssl_match_cn(const char *subjectname, const char *certname) +{ + int match = strcmp(subjectname, certname) == 0; + + if (!match) { + char *wildcard = strchr(certname, '*'); + int prefix_len = wildcard - certname; + + /* 1) prefix, if not empty, must match */ + if (wildcard && (prefix_len == 0 || strncmp(subjectname, certname, prefix_len) == 0)) { + const char *suffix = subjectname + strlen(subjectname) - strlen(wildcard + 1); + + /* + * 2) suffix must match + * 3) no period between prefix and suffix + **/ + match = strcmp(wildcard + 1, suffix) == 0 && + memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; + } + } + + return match; +} + int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ { zval **val = NULL; @@ -4881,16 +4905,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre return FAILURE; } - match = strcmp(cnmatch, buf) == 0; - if (!match && strlen(buf) > 3 && buf[0] == '*' && buf[1] == '.') { - /* Try wildcard */ - - if (strchr(buf+2, '.')) { - char *tmp = strstr(cnmatch, buf+1); - - match = tmp && strcmp(tmp, buf+2) && tmp == strchr(cnmatch, '.'); - } - } + match = php_openssl_match_cn(cnmatch, buf); if (!match) { /* didn't match */ diff --git a/ext/openssl/tests/bug65729.pem b/ext/openssl/tests/bug65729.pem new file mode 100644 index 0000000000000..dbeed6efd3011 --- /dev/null +++ b/ext/openssl/tests/bug65729.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIICCTCCAXICCQDNMI29sowT7TANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJT +RzESMBAGA1UECBMJVGVzdHZpbGxlMREwDwYDVQQKEwhkYXRpYmJhdzETMBEGA1UE +AxQKKi50ZXN0LmNvbTAeFw0xMzA5MjEwNzUyMjRaFw0xNDA5MjEwNzUyMjRaMEkx +CzAJBgNVBAYTAlNHMRIwEAYDVQQIEwlUZXN0dmlsbGUxETAPBgNVBAoTCGRhdGli +YmF3MRMwEQYDVQQDFAoqLnRlc3QuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCdzVnic8K5W4SVbwVuqezcTjeqVLoQ91vVNZB0Jnsuz6q3DoK03oAd1jTe +Vd0k+MQDbXpHoc37lA4+8z/g5Bs0UXxNx+nkbFTE7Ba2/G24caI9/cOXZPG3UViD +rtqXKL6h5/umqRG9Dt5liF2MVP9XFAesVC7B8+Ca+PbPlQoYzwIDAQABMA0GCSqG +SIb3DQEBBQUAA4GBAAS07u/Ke+EhEHidz6CG3Qcr+zg483JKRgZFyGz+YUKyyKKy +fmLs7JieGJxYQjOmIpj/6X9Gnb2HjIPDnI6A+MV1emXDTnnmsgf2/lZGcthhpZn2 +rMbj9bI0iH6HwOVGtp4ZJA5fB7nj3J+gWNTCQzDDOxwX36d2LL9ua+UMnk/g +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCdzVnic8K5W4SVbwVuqezcTjeqVLoQ91vVNZB0Jnsuz6q3DoK0 +3oAd1jTeVd0k+MQDbXpHoc37lA4+8z/g5Bs0UXxNx+nkbFTE7Ba2/G24caI9/cOX +ZPG3UViDrtqXKL6h5/umqRG9Dt5liF2MVP9XFAesVC7B8+Ca+PbPlQoYzwIDAQAB +AoGAeyzTwKPDl5QMRejHQL57GOwlH1vLcXrjv+VzwHZZKQ0IoKM++5fCQYf29KXp +XPahaluGW2u9sWa8R/7wGcd0Q4RtquGzsgT3+AQsIc5KfIamyOyDaRVM/ymX3fWg +gHIU7OOzB+ihOU8sHyRIwfbk01/kmrBXLRj8E31sy3i3PIECQQDQQYE+aN7Acrdt +yN5CaqvbkiCGjRvASlemiTzPosgOtndyp21w1gakJwKYhYDk1N6A6Qb8REMZqM/U +wFypldV/AkEAwfq6NFuhpGL6hDA7MvlyY1KiZ0cHetPUX+PgdNqy2DA+1Sv4i7gm +Wd/uA651K7aPXuUaf9dKtPCmZwI4M6SEsQJBALW89HTqP7niYoDEEnITdPaghxHk +gptERUln6lGo1L1CLus3gSI/JHyMLo+7scgAnEwTD62GRKhX0Ubwt+ymfTECQAY5 +fHYnppU20+EgBxZIqOIFCc8UmWnYmE0Ha/Fz/x8u1SVUBuK84wYpSGL32yyu7ATY +hzQo/W229zABAzqtAdECQQCUdB7IBFpPnsfv/EUBFX7X/7zAc9JpACmu9It5ju8C +KIsMuz/02D+TQoJNjdAngBM+4AJDIaGFgTMIfaDMh5L7 +-----END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/bug65729.phpt b/ext/openssl/tests/bug65729.phpt new file mode 100644 index 0000000000000..d4645d9f5b432 --- /dev/null +++ b/ext/openssl/tests/bug65729.phpt @@ -0,0 +1,42 @@ +--TEST-- +Bug #65729: CN_match gives false positive when wildcard is used +--SKIPIF-- + array( + 'verify_peer' => true, + 'allow_self_signed' => true, + 'CN_match' => 'foo.test.com.sg', + ) + ) + ); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 1); +} +--EXPECTF-- +Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.test.com.sg' in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d + +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) + From 521a5c956800115f0be008e0581878e4303a5118 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 18:24:00 +0800 Subject: [PATCH 0034/1256] don't leak cert on errors, return null on zpp failure --- ext/openssl/openssl.c | 30 ++++++++++------------ ext/openssl/tests/openssl_x509_digest.phpt | 8 ++++++ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index e6040d5f2cbe4..9685dac87c66e 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1685,8 +1685,6 @@ PHP_FUNCTION(openssl_x509_digest) unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; - RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; } @@ -1694,28 +1692,26 @@ PHP_FUNCTION(openssl_x509_digest) cert = php_openssl_x509_from_zval(zcert, 0, &certresource TSRMLS_CC); if (cert == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get cert from parameter 1"); - return; + RETURN_FALSE; } mdtype = EVP_get_digestbyname(method); if (!mdtype) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - return; - } - - if (!X509_digest(cert, mdtype, md, &n)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory"); - return; - } - - if (raw_output) { - RETVAL_STRINGL(md, n, 1); + RETVAL_FALSE; + } else if (!X509_digest(cert, mdtype, md, &n)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Out of memory"); + RETVAL_FALSE; } else { - int digest_str_len = n * 2; - char *digest_str = emalloc(digest_str_len + 1); + if (raw_output) { + RETVAL_STRINGL(md, n, 1); + } else { + int digest_str_len = n * 2; + char *digest_str = emalloc(digest_str_len + 1); - make_digest_ex(digest_str, md, n); - RETVAL_STRINGL(digest_str, digest_str_len, 0); + make_digest_ex(digest_str, md, n); + RETVAL_STRINGL(digest_str, digest_str_len, 0); + } } if (certresource == -1 && cert) { diff --git a/ext/openssl/tests/openssl_x509_digest.phpt b/ext/openssl/tests/openssl_x509_digest.phpt index 98ec0098e827e..fde42809a18c3 100644 --- a/ext/openssl/tests/openssl_x509_digest.phpt +++ b/ext/openssl/tests/openssl_x509_digest.phpt @@ -9,8 +9,12 @@ if (!extension_loaded("openssl")) die("skip"); $cert = "file://" . dirname(__FILE__) . "/cert.crt"; +echo "** Testing with no parameters **\n"; +var_dump(openssl_x509_digest()); + echo "** Testing default functionality **\n"; var_dump(openssl_x509_digest($cert)); + echo "** Testing hash method md5 **\n"; var_dump(openssl_x509_digest($cert, 'md5')); @@ -22,6 +26,10 @@ var_dump(openssl_x509_digest('123')); echo "** Testing bad hash method **\n"; var_dump(openssl_x509_digest($cert, 'xx45')); --EXPECTF-- +** Testing with no parameters ** + +Warning: openssl_x509_digest() expects at least 1 parameter, 0 given in %s on line %d +NULL ** Testing default functionality ** string(40) "6e6fd1ea10a5a23071d61c728ee9b40df6dbc33c" ** Testing hash method md5 ** From 8e847b5845b85c080295aea60c20869973c09a15 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 19:38:09 +0800 Subject: [PATCH 0035/1256] Fixed bug that would lead to out of bounds memory access --- ext/openssl/openssl.c | 46 ++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 5460f3a6e1131..1c367df0815d0 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4831,26 +4831,36 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ static int php_openssl_match_cn(const char *subjectname, const char *certname) { - int match = strcmp(subjectname, certname) == 0; - - if (!match) { - char *wildcard = strchr(certname, '*'); - int prefix_len = wildcard - certname; - - /* 1) prefix, if not empty, must match */ - if (wildcard && (prefix_len == 0 || strncmp(subjectname, certname, prefix_len) == 0)) { - const char *suffix = subjectname + strlen(subjectname) - strlen(wildcard + 1); - - /* - * 2) suffix must match - * 3) no period between prefix and suffix - **/ - match = strcmp(wildcard + 1, suffix) == 0 && - memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; - } + char *wildcard; + int prefix_len, suffix_len, subject_len; + + if (strcmp(subjectname, certname) == 0) { + return 1; } - return match; + if (!(wildcard = strchr(certname, '*'))) { + return 0; + } + + // 1) prefix, if not empty, must match subject + prefix_len = wildcard - certname; + if (prefix_len && strncmp(subjectname, certname, prefix_len) != 0) { + return 0; + } + + suffix_len = strlen(wildcard + 1); + subject_len = strlen(subjectname); + if (suffix_len <= subject_len) { + const char *suffix = subjectname + subject_len - suffix_len; + + /* 2) suffix must match + * 3) no . between prefix and suffix + **/ + return strcmp(wildcard + 1, suffix) == 0 && + memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; + } + + return 0; } int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ From a820c3d6baac945ead4a5fe6e54d0a04b02620de Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 20:42:52 +0800 Subject: [PATCH 0036/1256] yay, reduced one variable --- ext/openssl/openssl.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 1c367df0815d0..2aa850ad1c0db 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4851,13 +4851,11 @@ static int php_openssl_match_cn(const char *subjectname, const char *certname) suffix_len = strlen(wildcard + 1); subject_len = strlen(subjectname); if (suffix_len <= subject_len) { - const char *suffix = subjectname + subject_len - suffix_len; - /* 2) suffix must match * 3) no . between prefix and suffix **/ - return strcmp(wildcard + 1, suffix) == 0 && - memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; + return strcmp(wildcard + 1, subjectname + subject_len - suffix_len) == 0 && + memchr(subjectname + prefix_len, '.', subject_len - suffix_len - prefix_len) == NULL; } return 0; From ce2789558a970057539094ca9019d98ff09e831e Mon Sep 17 00:00:00 2001 From: Martin Jansen Date: Sat, 21 Sep 2013 21:26:40 +0200 Subject: [PATCH 0037/1256] Streams for ssl:// transports can now be configured to use a specific crypto method (SSLv3, SSLv2 etc.) by calling stream_context_set_option($ctx, "ssl", "crypto_method", $crypto_method) where $crypto_method can be one of STREAM_CRYPTO_METHOD_SSLv2_CLIENT, STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT or STREAM_CRYPTO_METHOD_TLS_CLIENT. SSLv23 remains the default crypto method. This change makes it possible to fopen() SSL URLs that are only provided using SSL v3. --- ext/openssl/xp_ssl.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index d7ef42e0b1ddd..1ac8a0220e3a0 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -853,6 +853,29 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; +static int get_crypto_method(php_stream_context *ctx) { + if (ctx) { + zval **val = NULL; + long crypto_method; + + if (php_stream_context_get_option(ctx, "ssl", "crypto_method", &val) == SUCCESS) { + convert_to_long_ex(val); + crypto_method = (long)Z_LVAL_PP(val); + + switch (crypto_method) { + case STREAM_CRYPTO_METHOD_SSLv2_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: + case STREAM_CRYPTO_METHOD_TLS_CLIENT: + return crypto_method; + } + + } + } + + return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; +} + static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; @@ -939,7 +962,12 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, if (strncmp(proto, "ssl", protolen) == 0) { sslsock->enable_on_connect = 1; - sslsock->method = STREAM_CRYPTO_METHOD_SSLv23_CLIENT; + + /* General ssl:// transports can use a number + * of crypto methods. The actual methhod can be + * provided in the streams context options. + */ + sslsock->method = get_crypto_method(context); } else if (strncmp(proto, "sslv2", protolen) == 0) { #ifdef OPENSSL_NO_SSL2 php_error_docref(NULL TSRMLS_CC, E_WARNING, "SSLv2 support is not compiled into the OpenSSL library PHP is linked against"); From 2bfc5a253b4ee76f9930692f2d088371c38dd65f Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 23 Sep 2013 00:51:17 +0800 Subject: [PATCH 0038/1256] Renamed to be more descriptive of what it does --- ext/openssl/openssl.c | 6 +++--- ext/openssl/php_openssl.h | 2 +- ...est.phpt => openssl_x509_fingerprint.phpt} | 20 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) rename ext/openssl/tests/{openssl_x509_digest.phpt => openssl_x509_fingerprint.phpt} (58%) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 9685dac87c66e..9da10fc0a0153 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -129,7 +129,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export, 0, 0, 2) ZEND_ARG_INFO(0, notext) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_fingerprint, 0, 0, 1) ZEND_ARG_INFO(0, x509) ZEND_ARG_INFO(0, method) ZEND_ARG_INFO(0, raw_output) @@ -449,7 +449,7 @@ const zend_function_entry openssl_functions[] = { PHP_FE(openssl_x509_checkpurpose, arginfo_openssl_x509_checkpurpose) PHP_FE(openssl_x509_check_private_key, arginfo_openssl_x509_check_private_key) PHP_FE(openssl_x509_export, arginfo_openssl_x509_export) - PHP_FE(openssl_x509_digest, arginfo_openssl_x509_digest) + PHP_FE(openssl_x509_fingerprint, arginfo_openssl_x509_fingerprint) PHP_FE(openssl_x509_export_to_file, arginfo_openssl_x509_export_to_file) /* PKCS12 funcs */ @@ -1672,7 +1672,7 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -PHP_FUNCTION(openssl_x509_digest) +PHP_FUNCTION(openssl_x509_fingerprint) { X509 *cert; zval **zcert; diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h index 4f0ac14100143..a06e43db1ce5e 100644 --- a/ext/openssl/php_openssl.h +++ b/ext/openssl/php_openssl.h @@ -66,7 +66,7 @@ PHP_FUNCTION(openssl_x509_free); PHP_FUNCTION(openssl_x509_parse); PHP_FUNCTION(openssl_x509_checkpurpose); PHP_FUNCTION(openssl_x509_export); -PHP_FUNCTION(openssl_x509_digest); +PHP_FUNCTION(openssl_x509_fingerprint); PHP_FUNCTION(openssl_x509_export_to_file); PHP_FUNCTION(openssl_x509_check_private_key); diff --git a/ext/openssl/tests/openssl_x509_digest.phpt b/ext/openssl/tests/openssl_x509_fingerprint.phpt similarity index 58% rename from ext/openssl/tests/openssl_x509_digest.phpt rename to ext/openssl/tests/openssl_x509_fingerprint.phpt index fde42809a18c3..6cd464a894872 100644 --- a/ext/openssl/tests/openssl_x509_digest.phpt +++ b/ext/openssl/tests/openssl_x509_fingerprint.phpt @@ -1,5 +1,5 @@ --TEST-- -Testing openssl_x509_digest() +Testing openssl_x509_fingerprint() --SKIPIF-- Date: Mon, 23 Sep 2013 23:29:17 +0800 Subject: [PATCH 0039/1256] add md5 and sha1 fingerprint tests --- ext/openssl/openssl.c | 79 ++++++++++++++----- .../tests/openssl_peer_fingerprint.phpt | 44 +++++++++++ 2 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 ext/openssl/tests/openssl_peer_fingerprint.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 9da10fc0a0153..c8588e256904b 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1,4 +1,5 @@ /* + +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ @@ -1672,6 +1673,33 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ +int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) +{ + unsigned char md[EVP_MAX_MD_SIZE]; + const EVP_MD *mdtype; + int n; + + if (!(mdtype = EVP_get_digestbyname(method))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + return 0; + } else if (!X509_digest(peer, mdtype, md, &n)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); + return 0; + } + + if (raw) { + *out_len = n; + *out = estrndup(md, n); + } else { + *out_len = n * 2; + *out = emalloc(*out_len + 1); + + make_digest_ex(*out, md, n); + } + + return 1; +} + PHP_FUNCTION(openssl_x509_fingerprint) { X509 *cert; @@ -1681,9 +1709,8 @@ PHP_FUNCTION(openssl_x509_fingerprint) char *method = "sha1"; int method_len; - const EVP_MD *mdtype; - unsigned char md[EVP_MAX_MD_SIZE]; - unsigned int n; + char *fingerprint; + char *fingerprint_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; @@ -1695,23 +1722,10 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - mdtype = EVP_get_digestbyname(method); - if (!mdtype) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - RETVAL_FALSE; - } else if (!X509_digest(cert, mdtype, md, &n)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Out of memory"); - RETVAL_FALSE; + if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len)) { + RETVAL_STRINGL(fingerprint, fingerprint_len, 0); } else { - if (raw_output) { - RETVAL_STRINGL(md, n, 1); - } else { - int digest_str_len = n * 2; - char *digest_str = emalloc(digest_str_len + 1); - - make_digest_ex(digest_str, md, n); - RETVAL_STRINGL(digest_str, digest_str_len, 0); - } + RETVAL_FALSE; } if (certresource == -1 && cert) { @@ -4919,6 +4933,33 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre /* if the cert passed the usual checks, apply our own local policies now */ + if (GET_VER_OPT("peer_fingerprint") && Z_TYPE_PP(val) == IS_STRING) { + char *fingerprint; + int fingerprint_len; + const char *method = NULL; + + switch (Z_STRLEN_PP(val)) { + case 32: + method = "md5"; + break; + + case 40: + method = "sha1"; + break; + } + + if (method && php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { + int match = strcmp(Z_STRVAL_PP(val), fingerprint) == 0; + + efree(fingerprint); + + if (!match) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint `%s` not matched", Z_STRVAL_PP(val)); + return FAILURE; + } + } + } + name = X509_get_subject_name(peer); /* Does the common name match ? (used primarily for https://) */ diff --git a/ext/openssl/tests/openssl_peer_fingerprint.phpt b/ext/openssl/tests/openssl_peer_fingerprint.phpt new file mode 100644 index 0000000000000..a6be676dcb44a --- /dev/null +++ b/ext/openssl/tests/openssl_peer_fingerprint.phpt @@ -0,0 +1,44 @@ +--TEST-- +Testing peer fingerprint on connection +--SKIPIF-- + array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/bug54992-ca.pem', + 'capture_peer_cert' => true, + 'peer_fingerprint' => '81cafc260aa8d82956ebc6212a362ece', + ) + ) + ); + // should be: 81cafc260aa8d82956ebc6212a362ecc + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 1); +} +--EXPECTF-- +Warning: stream_socket_client(): Peer fingerprint `81cafc260aa8d82956ebc6212a362ece` not matched in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d + +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) From 69bdc5aca8f14515556bb6fc8f86becf55ef30bf Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 23 Sep 2013 23:42:31 +0800 Subject: [PATCH 0040/1256] who put that stupid newline there? --- ext/openssl/openssl.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c8588e256904b..a6ddd1458c98f 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1,5 +1,4 @@ /* - +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ From 8d087dc0d7c88e26539646875dc0f7bb5042187b Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Mon, 23 Sep 2013 13:30:47 -0700 Subject: [PATCH 0041/1256] =?UTF-8?q?Fix=20typo:=20HTTP=5FROW=5FPOST=5FDAT?= =?UTF-8?q?A=20=E2=86=92=20HTTP=5FRAW=5FPOST=5FDATA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes bug #65745 (Typo in commit 4a3936ef4abdeb72c7d323fe4b6a65e1ae0ef181). --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index f5e7cd0bbdbb9..581a38e2ad2ec 100755 --- a/UPGRADING +++ b/UPGRADING @@ -26,7 +26,7 @@ PHP X.Y UPGRADE NOTES From dc8705c256cd1d50cfa276e8de31558e089eab92 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 Sep 2013 11:02:39 +0400 Subject: [PATCH 0042/1256] Fixed issue #135 (segfault in interned strings if initial memory is too low) --- NEWS | 2 ++ ext/opcache/ZendAccelerator.c | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index e02d1b93083bb..cd4d3771360a6 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,8 @@ PHP NEWS . Fixed bug #65665 (Exception not properly caught when opcache enabled). (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) + . Fixed issue #135 (segfault in interned strings if initial memory is too + low). (Julien) - SPL: . Fix bug #64782 (SplFileObject constructor make $context optional / give it diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 827f047cd4f65..7fdae6fc67e37 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2407,14 +2407,14 @@ static inline int accel_find_sapi(TSRMLS_D) return FAILURE; } -static void zend_accel_init_shm(TSRMLS_D) +static int zend_accel_init_shm(TSRMLS_D) { zend_shared_alloc_lock(TSRMLS_C); accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals)); if (!accel_shared_globals) { zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!"); - return; + return FAILURE; } ZSMMG(app_shared_globals) = accel_shared_globals; @@ -2429,7 +2429,8 @@ static void zend_accel_init_shm(TSRMLS_D) ZCSG(interned_strings).arBuckets = zend_shared_alloc(ZCSG(interned_strings).nTableSize * sizeof(Bucket *)); ZCSG(interned_strings_start) = zend_shared_alloc((ZCG(accel_directives).interned_strings_buffer * 1024 * 1024)); if (!ZCSG(interned_strings).arBuckets || !ZCSG(interned_strings_start)) { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " cannot allocate buffer for interned strings"); + zend_accel_error(ACCEL_LOG_FATAL, ACCELERATOR_PRODUCT_NAME " cannot allocate buffer for interned strings"); + return FAILURE; } ZCSG(interned_strings_end) = ZCSG(interned_strings_start) + (ZCG(accel_directives).interned_strings_buffer * 1024 * 1024); ZCSG(interned_strings_top) = ZCSG(interned_strings_start); @@ -2468,6 +2469,8 @@ static void zend_accel_init_shm(TSRMLS_D) ZCSG(restart_in_progress) = 0; zend_shared_alloc_unlock(TSRMLS_C); + + return SUCCESS; } static void accel_globals_ctor(zend_accel_globals *accel_globals TSRMLS_DC) @@ -2525,7 +2528,10 @@ static int accel_startup(zend_extension *extension) /********************************************/ switch (zend_shared_alloc_startup(ZCG(accel_directives).memory_consumption)) { case ALLOC_SUCCESS: - zend_accel_init_shm(TSRMLS_C); + if (zend_accel_init_shm(TSRMLS_C) == FAILURE) { + accel_startup_ok = 0; + return FAILURE; + } break; case ALLOC_FAILURE: accel_startup_ok = 0; From 69454d9f0f765416f245acbc626b3984dcbf5e1d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 Sep 2013 12:14:06 +0400 Subject: [PATCH 0043/1256] Added function opcache_compile_file() to load PHP scripts into cache without execution. --- NEWS | 2 ++ ext/opcache/ZendAccelerator.c | 2 +- ext/opcache/ZendAccelerator.h | 1 + ext/opcache/zend_accelerator_module.c | 47 +++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index cd4d3771360a6..bdc0cd5fb6532 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,8 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: + . Added function opcache_compile_file() to load PHP scripts into cache + without execution. (Julien) . Fixed bug #65665 (Exception not properly caught when opcache enabled). (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 7fdae6fc67e37..72b5a1b9fe7e7 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1446,7 +1446,7 @@ static zend_persistent_script *compile_and_cache_file(zend_file_handle *file_han } /* zend_compile() replacement */ -static zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) +zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) { zend_persistent_script *persistent_script = NULL; char *key = NULL; diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index 361b60b08f1c4..f223f126e43a8 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -325,6 +325,7 @@ int accelerator_shm_read_lock(TSRMLS_D); void accelerator_shm_read_unlock(TSRMLS_D); char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_length, int *key_len TSRMLS_DC); +zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC); #if !defined(ZEND_DECLARE_INHERITED_CLASS_DELAYED) # define ZEND_DECLARE_INHERITED_CLASS_DELAYED 145 diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index f9ddaa98b8ba0..dedb7215c1df3 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -48,6 +48,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_opcache_get_status, 0, 0, 0) ZEND_ARG_INFO(0, fetch_scripts) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_opcache_compile_file, 0, 0, 1) + ZEND_ARG_INFO(0, file) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_opcache_invalidate, 0, 0, 1) ZEND_ARG_INFO(0, script) ZEND_ARG_INFO(0, force) @@ -59,12 +63,14 @@ static ZEND_FUNCTION(opcache_invalidate); /* Private functions */ static ZEND_FUNCTION(opcache_get_status); +static ZEND_FUNCTION(opcache_compile_file); static ZEND_FUNCTION(opcache_get_configuration); static zend_function_entry accel_functions[] = { /* User functions */ ZEND_FE(opcache_reset, arginfo_opcache_none) ZEND_FE(opcache_invalidate, arginfo_opcache_invalidate) + ZEND_FE(opcache_compile_file, arginfo_opcache_compile_file) /* Private functions */ ZEND_FE(opcache_get_configuration, arginfo_opcache_none) ZEND_FE(opcache_get_status, arginfo_opcache_get_status) @@ -709,3 +715,44 @@ static ZEND_FUNCTION(opcache_invalidate) RETURN_FALSE; } } + +static ZEND_FUNCTION(opcache_compile_file) +{ + char *script_name; + int script_name_len; + zend_file_handle handle; + zend_op_array *op_array = NULL; + zend_execute_data *orig_execute_data = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &script_name, &script_name_len) == FAILURE) { + return; + } + + if (!ZCG(enabled) || !accel_startup_ok || !ZCSG(accelerator_enabled)) { + zend_error(E_NOTICE, ACCELERATOR_PRODUCT_NAME " seems to be disabled, can't compile file"); + RETURN_FALSE; + } + + handle.filename = script_name; + handle.free_filename = 0; + handle.opened_path = NULL; + handle.type = ZEND_HANDLE_FILENAME; + + orig_execute_data = EG(current_execute_data); + + zend_try { + op_array = persistent_compile_file(&handle, ZEND_INCLUDE TSRMLS_CC); + } zend_catch { + EG(current_execute_data) = orig_execute_data; + zend_error(E_WARNING, ACCELERATOR_PRODUCT_NAME " could not compile file %s" TSRMLS_CC, handle.filename); + } zend_end_try(); + + if(op_array != NULL) { + destroy_op_array(op_array TSRMLS_CC); + efree(op_array); + RETVAL_TRUE; + } else { + RETVAL_FALSE; + } + zend_destroy_file_handle(&handle TSRMLS_CC); +} From ecbe4af0de94c629fa5ba8ab169654e00c958bad Mon Sep 17 00:00:00 2001 From: ptarjan Date: Thu, 26 Sep 2013 00:18:05 -0700 Subject: [PATCH 0044/1256] fix many parallel test issues While running these on HHVM I've run into a lot of parallelism issues. I'm backporting all the fixes I had to do in https://github.com/facebook/hiphop-php/blob/master/hphp/tools/import_zend_test.py#L650 to php core. Most of these changes were just filenames that were shared between tests, but I did more surgery on the fixed ports. I can apreciate port 31337 as much as the next nerd, but random ports are better for tests. --- ext/ftp/tests/ftp_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_get_large.phpt | 4 ++-- .../tests/SplFileObject_getflags_basic.phpt | 6 +++--- .../SplFileObject_getflags_error001.phpt | 6 +++--- .../SplFileObject_getflags_error002.phpt | 6 +++--- .../tests/SplFileObject_rewind_error001.phpt | 6 +++--- .../tests/file/fgets_socket_variation1.phpt | 12 +++++++++--- .../tests/file/fgets_socket_variation2.phpt | 12 +++++++++--- .../file/file_put_contents_variation9.phpt | 8 ++++---- .../tests/file/fread_socket_variation1.phpt | 9 ++++++++- .../tests/general_functions/bug41445_1.phpt | 2 +- .../tests/network/fsockopen_basic.phpt | 10 ++++++++-- .../tests/network/fsockopen_variation1.phpt | 10 ++++++++-- ext/standard/tests/network/shutdown.phpt | 18 +++++++++++++----- .../network/socket_get_status_basic.phpt | 14 +++++++++++--- ext/standard/tests/network/tcp4loop.phpt | 13 ++++++++++--- ext/standard/tests/network/tcp6loop.phpt | 14 +++++++++++--- ext/standard/tests/network/udp6loop.phpt | 14 +++++++++++--- .../streams/stream_set_timeout_error.phpt | 12 +++++++++--- .../tests/strings/vfprintf_basic1.phpt | 2 +- .../tests/strings/vfprintf_basic2.phpt | 2 +- .../tests/strings/vfprintf_basic3.phpt | 2 +- .../tests/strings/vfprintf_basic4.phpt | 2 +- .../tests/strings/vfprintf_basic5.phpt | 2 +- .../tests/strings/vfprintf_basic6.phpt | 2 +- .../tests/strings/vfprintf_basic7.phpt | 2 +- .../tests/strings/vfprintf_basic7_64bit.phpt | 2 +- .../tests/strings/vfprintf_basic8.phpt | 2 +- .../tests/strings/vfprintf_basic9.phpt | 2 +- .../tests/strings/vfprintf_variation10.phpt | Bin 2963 -> 2979 bytes .../tests/strings/vfprintf_variation11.phpt | 2 +- .../strings/vfprintf_variation11_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation12.phpt | 2 +- .../strings/vfprintf_variation12_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation13.phpt | 2 +- .../strings/vfprintf_variation13_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation14.phpt | 2 +- .../strings/vfprintf_variation14_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation15.phpt | 2 +- .../strings/vfprintf_variation15_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation16.phpt | 2 +- .../strings/vfprintf_variation16_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation17.phpt | 2 +- .../tests/strings/vfprintf_variation18.phpt | 2 +- .../tests/strings/vfprintf_variation19.phpt | 2 +- .../strings/vfprintf_variation19_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation20.phpt | 2 +- .../tests/strings/vfprintf_variation21.phpt | 2 +- .../tests/strings/vfprintf_variation3.phpt | 2 +- .../tests/strings/vfprintf_variation4.phpt | 2 +- .../strings/vfprintf_variation4_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation5.phpt | 2 +- .../tests/strings/vfprintf_variation6.phpt | 2 +- .../tests/strings/vfprintf_variation7.phpt | Bin 2391 -> 2406 bytes .../tests/strings/vfprintf_variation8.phpt | 2 +- .../tests/strings/vfprintf_variation9.phpt | Bin 1857 -> 1872 bytes ext/zlib/tests/gzeof_variation1.phpt | 2 +- ext/zlib/tests/gzfile_basic.phpt | 4 ++-- ext/zlib/tests/gzfile_basic2.phpt | 4 ++-- ext/zlib/tests/gzopen_basic2.phpt | 2 +- ext/zlib/tests/gzputs_basic.phpt | 2 +- ext/zlib/tests/gzread_variation1.phpt | 2 +- ext/zlib/tests/gzwrite_basic.phpt | 2 +- ext/zlib/tests/gzwrite_error.phpt | 2 +- ext/zlib/tests/gzwrite_error2.phpt | 2 +- ext/zlib/tests/readgzfile_basic.phpt | 2 +- ext/zlib/tests/readgzfile_basic2.phpt | 2 +- ext/zlib/tests/zlib_wrapper_fflush_basic.phpt | 2 +- .../tests/zlib_wrapper_ftruncate_basic.phpt | 2 +- 74 files changed, 187 insertions(+), 111 deletions(-) diff --git a/ext/ftp/tests/ftp_fget_basic1.phpt b/ext/ftp/tests/ftp_fget_basic1.phpt index 475f7183d2532..5909d35cef608 100644 --- a/ext/ftp/tests/ftp_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic2.phpt b/ext/ftp/tests/ftp_fget_basic2.phpt index 00a26752d9150..622cea3683b0d 100644 --- a/ext/ftp/tests/ftp_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic3.phpt b/ext/ftp/tests/ftp_fget_basic3.phpt index b7098701ab12e..9485473b1c6a3 100644 --- a/ext/ftp/tests/ftp_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_nb_fget_basic1.phpt b/ext/ftp/tests/ftp_nb_fget_basic1.phpt index cac4eec56bc99..5e6389ff1336a 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_nb_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic2.phpt b/ext/ftp/tests/ftp_nb_fget_basic2.phpt index dc92f4e23bc99..215b79ac4a986 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic3.phpt b/ext/ftp/tests/ftp_nb_fget_basic3.phpt index d1a87c4f3dfe3..66daf2ba0a030 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_get_large.phpt b/ext/ftp/tests/ftp_nb_get_large.phpt index 3fbf2a4831d14..0c354d7c1978f 100644 --- a/ext/ftp/tests/ftp_nb_get_large.phpt +++ b/ext/ftp/tests/ftp_nb_get_large.phpt @@ -18,7 +18,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_get_large.txt"; touch($local_file); ftp_nb_get($ftp, $local_file, 'fget_large.txt', FTP_BINARY, 5368709119); $fp = fopen($local_file, 'r'); @@ -29,7 +29,7 @@ fclose($fp); ?> --CLEAN-- --EXPECT-- string(1) "X" diff --git a/ext/spl/tests/SplFileObject_getflags_basic.phpt b/ext/spl/tests/SplFileObject_getflags_basic.phpt index 5addadf38046e..88cf6861a2921 100644 --- a/ext/spl/tests/SplFileObject_getflags_basic.phpt +++ b/ext/spl/tests/SplFileObject_getflags_basic.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::DROP_NEW_LINE); var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error001.phpt b/ext/spl/tests/SplFileObject_getflags_error001.phpt index 1602f88885e11..ca53c857e7e6b 100644 --- a/ext/spl/tests/SplFileObject_getflags_error001.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error001.phpt @@ -7,10 +7,10 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->setFlags(SplFileObject::DROP_NEW_LINE); @@ -20,7 +20,7 @@ var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error002.phpt b/ext/spl/tests/SplFileObject_getflags_error002.phpt index e2c8255f44960..00fd351db8cca 100644 --- a/ext/spl/tests/SplFileObject_getflags_error002.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error002.phpt @@ -5,9 +5,9 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->getFlags('fake'); @@ -15,7 +15,7 @@ $fo->getFlags('fake'); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::getFlags() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/spl/tests/SplFileObject_rewind_error001.phpt b/ext/spl/tests/SplFileObject_rewind_error001.phpt index ac536a0a44af5..5f2379aa13911 100644 --- a/ext/spl/tests/SplFileObject_rewind_error001.phpt +++ b/ext/spl/tests/SplFileObject_rewind_error001.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- rewind( "invalid" ); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::rewind() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/standard/tests/file/fgets_socket_variation1.phpt b/ext/standard/tests/file/fgets_socket_variation1.phpt index 57944d8b563c1..429ad67d69677 100644 --- a/ext/standard/tests/file/fgets_socket_variation1.phpt +++ b/ext/standard/tests/file/fgets_socket_variation1.phpt @@ -5,11 +5,17 @@ Dave Kelsey --FILE-- --FILE-- --EXPECTF-- diff --git a/ext/standard/tests/network/tcp4loop.phpt b/ext/standard/tests/network/tcp4loop.phpt index afd955918e8fb..a163cd9b35816 100644 --- a/ext/standard/tests/network/tcp4loop.phpt +++ b/ext/standard/tests/network/tcp4loop.phpt @@ -2,14 +2,21 @@ Streams Based IPv4 TCP Loopback test --FILE-- --FILE-- --FILE-- P%01CC;505bXoQ~&?~ diff --git a/ext/standard/tests/strings/vfprintf_variation11.phpt b/ext/standard/tests/strings/vfprintf_variation11.phpt index 45f1f61fa63f6..4bc38851d271e 100644 --- a/ext/standard/tests/strings/vfprintf_variation11.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt index d6549846b5a55..a55297999ee45 100644 --- a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12.phpt b/ext/standard/tests/strings/vfprintf_variation12.phpt index e95fd5bb7f972..f0fa354ea639a 100644 --- a/ext/standard/tests/strings/vfprintf_variation12.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt index a1e57bc42c7ab..fe786d3f495d2 100644 --- a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13.phpt b/ext/standard/tests/strings/vfprintf_variation13.phpt index 245feb5a2388a..fd3424242458b 100644 --- a/ext/standard/tests/strings/vfprintf_variation13.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt index bf6fcb5ec0005..68baed853745e 100644 --- a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14.phpt b/ext/standard/tests/strings/vfprintf_variation14.phpt index c714d89758cdb..0173a27fb7071 100644 --- a/ext/standard/tests/strings/vfprintf_variation14.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt index 930ee3d03de83..fb34befd3ccc5 100644 --- a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15.phpt b/ext/standard/tests/strings/vfprintf_variation15.phpt index 95667b5a81895..19e319a557d8b 100644 --- a/ext/standard/tests/strings/vfprintf_variation15.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt index d2e331c2d3b4a..7bb0d150e01e6 100644 --- a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16.phpt b/ext/standard/tests/strings/vfprintf_variation16.phpt index 21630521b8dc1..4995ab02a4243 100644 --- a/ext/standard/tests/strings/vfprintf_variation16.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt index 381e67c3397a9..16d0624018066 100644 --- a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation17.phpt b/ext/standard/tests/strings/vfprintf_variation17.phpt index 871ae98d857e6..6c17b801f6f23 100644 --- a/ext/standard/tests/strings/vfprintf_variation17.phpt +++ b/ext/standard/tests/strings/vfprintf_variation17.phpt @@ -34,7 +34,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation17.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation18.phpt b/ext/standard/tests/strings/vfprintf_variation18.phpt index 76168621c3a51..5467753dc0a3e 100644 --- a/ext/standard/tests/strings/vfprintf_variation18.phpt +++ b/ext/standard/tests/strings/vfprintf_variation18.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation18.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19.phpt b/ext/standard/tests/strings/vfprintf_variation19.phpt index 7ee01a97e16d0..26c21e1e3c0c3 100644 --- a/ext/standard/tests/strings/vfprintf_variation19.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt index 58810a811aa8c..a56357cfdf58d 100644 --- a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation20.phpt b/ext/standard/tests/strings/vfprintf_variation20.phpt index cd348d8350c35..48fea341edd31 100644 --- a/ext/standard/tests/strings/vfprintf_variation20.phpt +++ b/ext/standard/tests/strings/vfprintf_variation20.phpt @@ -84,7 +84,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation20.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation21.phpt b/ext/standard/tests/strings/vfprintf_variation21.phpt index 4dc9ed5666d4a..09bf703957ef1 100644 --- a/ext/standard/tests/strings/vfprintf_variation21.phpt +++ b/ext/standard/tests/strings/vfprintf_variation21.phpt @@ -81,7 +81,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation21.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation3.phpt b/ext/standard/tests/strings/vfprintf_variation3.phpt index 02535cefb659c..1ae945990cc82 100644 --- a/ext/standard/tests/strings/vfprintf_variation3.phpt +++ b/ext/standard/tests/strings/vfprintf_variation3.phpt @@ -45,7 +45,7 @@ $args_array = array( // and with int values from the above $args_array array /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation3.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4.phpt b/ext/standard/tests/strings/vfprintf_variation4.phpt index 72ca9fe3b9f0a..642f35c46a704 100644 --- a/ext/standard/tests/strings/vfprintf_variation4.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt index f7038ff76c256..6bf814003a3d6 100644 --- a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation5.phpt b/ext/standard/tests/strings/vfprintf_variation5.phpt index 4bac1ebe57a00..eb3646ca1f3af 100644 --- a/ext/standard/tests/strings/vfprintf_variation5.phpt +++ b/ext/standard/tests/strings/vfprintf_variation5.phpt @@ -42,7 +42,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation5.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation6.phpt b/ext/standard/tests/strings/vfprintf_variation6.phpt index 6b5425d5cff1e..b5b82bbc62b06 100644 --- a/ext/standard/tests/strings/vfprintf_variation6.phpt +++ b/ext/standard/tests/strings/vfprintf_variation6.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation6.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation7.phpt b/ext/standard/tests/strings/vfprintf_variation7.phpt index a206fd869113e4a6b21861ea638b51cb2b2831bc..ee836edc774c84a9cd9f83a9b3df8801d98126e8 100644 GIT binary patch delta 32 ncmcaE^h{_22b*wNT0v1}UP)SfSz=LUVo7Fxp7~}THg9GC%$p0C delta 17 YcmaDRbX{lz2OCRDX>P%0X*O?W068NCd;kCd diff --git a/ext/standard/tests/strings/vfprintf_variation8.phpt b/ext/standard/tests/strings/vfprintf_variation8.phpt index cda05c4d79842..a72e260e09bd6 100644 --- a/ext/standard/tests/strings/vfprintf_variation8.phpt +++ b/ext/standard/tests/strings/vfprintf_variation8.phpt @@ -60,7 +60,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation8.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation9.phpt b/ext/standard/tests/strings/vfprintf_variation9.phpt index d10c8aed506e5ccf781091912c459c6fdd7ae235..dd3093c8c9e981b6494d2e7e8cdd2fc534b0a494 100644 GIT binary patch delta 32 ncmX@ecY$w1FpF?mT0v1}UP)SfSz=LUVo7Fxp5^9nmRC#w(0dG) delta 17 Ycmcb>caU#GFbhjcX>P&hG?rIP06V+}cmMzZ diff --git a/ext/zlib/tests/gzeof_variation1.phpt b/ext/zlib/tests/gzeof_variation1.phpt index 6d1e0401dff1c..77a1eccb66bb3 100644 --- a/ext/zlib/tests/gzeof_variation1.phpt +++ b/ext/zlib/tests/gzeof_variation1.phpt @@ -9,7 +9,7 @@ if (!extension_loaded("zlib")) { --FILE-- string(17) "for all languages" } -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/zlib/tests/gzfile_basic2.phpt b/ext/zlib/tests/gzfile_basic2.phpt index 9f31eb0f87380..2bbf315a1ad71 100644 --- a/ext/zlib/tests/gzfile_basic2.phpt +++ b/ext/zlib/tests/gzfile_basic2.phpt @@ -12,7 +12,7 @@ is a very common test for all languages EOT; $dirname = 'gzfile_temp'; -$filename = $dirname.'/plainfile.txt'; +$filename = $dirname.'/gzfile_basic2.txt'; mkdir($dirname); $h = fopen($filename, 'w'); fwrite($h, $plaintxt); @@ -36,4 +36,4 @@ array(3) { [2]=> string(17) "for all languages" } -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/zlib/tests/gzopen_basic2.phpt b/ext/zlib/tests/gzopen_basic2.phpt index 5cc02cd182267..90766b18170cf 100644 --- a/ext/zlib/tests/gzopen_basic2.phpt +++ b/ext/zlib/tests/gzopen_basic2.phpt @@ -18,7 +18,7 @@ echo "*** Testing gzopen() : basic functionality ***\n"; // Initialise all required variables -$filename = "temp.txt.gz"; +$filename = "gzopen_basic2.txt.gz"; $modes = array('w', 'w+'); $data = "This was the information that was written"; diff --git a/ext/zlib/tests/gzputs_basic.phpt b/ext/zlib/tests/gzputs_basic.phpt index 7566e74e72393..6456e4b55f96c 100644 --- a/ext/zlib/tests/gzputs_basic.phpt +++ b/ext/zlib/tests/gzputs_basic.phpt @@ -9,7 +9,7 @@ if (!extension_loaded("zlib")) { --FILE-- --FILE-- Date: Thu, 26 Sep 2013 01:06:36 -0700 Subject: [PATCH 0045/1256] fix missing change from 'tcp_socket' to the more common 'server' --- ext/standard/tests/file/fread_socket_variation1.phpt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/standard/tests/file/fread_socket_variation1.phpt b/ext/standard/tests/file/fread_socket_variation1.phpt index f5086ced09122..d65565d3cc11a 100644 --- a/ext/standard/tests/file/fread_socket_variation1.phpt +++ b/ext/standard/tests/file/fread_socket_variation1.phpt @@ -12,11 +12,11 @@ for ($i=0; $i<100; $i++) { } } -socket_set_timeout($tcp_socket, 0, 1000); +socket_set_timeout($server, 0, 1000); -var_dump(fread($tcp_socket, 1)); +var_dump(fread($server, 1)); -fclose($tcp_socket); +fclose($server); ?> --EXPECT-- From 0d7a6388663b76ebed6585ac92dfca5ef65fa7af Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 26 Sep 2013 18:39:17 +0200 Subject: [PATCH 0046/1256] Implement variadic function syntax As per RFC: https://wiki.php.net/rfc/variadics --- NEWS | 2 + UPGRADING | 6 +- UPGRADING.INTERNALS | 42 + .../adding_additional_optional_parameter.phpt | 17 + ...g_additional_optional_parameter_error.phpt | 16 + Zend/tests/variadic/basic.phpt | 57 + Zend/tests/variadic/by_ref.phpt | 24 + Zend/tests/variadic/by_ref_error.phpt | 12 + Zend/tests/variadic/no_default_error.phpt | 10 + ...on_variadic_implements_variadic_error.phpt | 16 + Zend/tests/variadic/only_last_error.phpt | 10 + Zend/tests/variadic/optional_params.phpt | 49 + .../variadic/removing_parameter_error.phpt | 20 + Zend/tests/variadic/typehint_error.phpt | 36 + .../variadic/typehint_suppressed_error.phpt | 33 + .../variadic_changed_byref_error.phpt | 16 + .../variadic_changed_typehint_error.phpt | 16 + .../variadic_implements_non_variadic.phpt | 17 + Zend/zend_API.c | 10 +- Zend/zend_API.h | 20 +- Zend/zend_compile.c | 96 +- Zend/zend_compile.h | 29 +- Zend/zend_execute.c | 11 +- Zend/zend_language_parser.y | 25 +- Zend/zend_language_scanner.c | 4360 +++++++++-------- Zend/zend_language_scanner.l | 5 +- Zend/zend_vm_def.h | 31 + Zend/zend_vm_execute.h | 56 + Zend/zend_vm_opcodes.h | 1 + ext/mbstring/mbstring.c | 4 +- ext/mysqli/mysqli_fe.c | 15 +- ext/opcache/Optimizer/block_pass.c | 4 +- ext/pdo/pdo_dbh.c | 10 +- ext/reflection/php_reflection.c | 33 +- .../ReflectionFunction_isVariadic_basic.phpt | 18 + ...eflectionParameter_canBePassedByValue.phpt | 4 + .../ReflectionParameter_isVariadic_basic.phpt | 24 + .../ReflectionParameter_toString_basic.phpt | 3 +- ext/spl/spl_directory.c | 3 +- ext/spl/tests/bug51532.phpt | 2 +- ext/sqlite3/sqlite3.c | 2 +- ext/standard/basic_functions.c | 15 +- ext/tokenizer/tokenizer_data.c | 6 +- 43 files changed, 2908 insertions(+), 2278 deletions(-) create mode 100644 Zend/tests/variadic/adding_additional_optional_parameter.phpt create mode 100644 Zend/tests/variadic/adding_additional_optional_parameter_error.phpt create mode 100644 Zend/tests/variadic/basic.phpt create mode 100644 Zend/tests/variadic/by_ref.phpt create mode 100644 Zend/tests/variadic/by_ref_error.phpt create mode 100644 Zend/tests/variadic/no_default_error.phpt create mode 100644 Zend/tests/variadic/non_variadic_implements_variadic_error.phpt create mode 100644 Zend/tests/variadic/only_last_error.phpt create mode 100644 Zend/tests/variadic/optional_params.phpt create mode 100644 Zend/tests/variadic/removing_parameter_error.phpt create mode 100644 Zend/tests/variadic/typehint_error.phpt create mode 100644 Zend/tests/variadic/typehint_suppressed_error.phpt create mode 100644 Zend/tests/variadic/variadic_changed_byref_error.phpt create mode 100644 Zend/tests/variadic/variadic_changed_typehint_error.phpt create mode 100644 Zend/tests/variadic/variadic_implements_non_variadic.phpt create mode 100644 ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt create mode 100644 ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt diff --git a/NEWS b/NEWS index 540f896fe4c68..95acaa66692f7 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,8 @@ PHP NEWS . Reduced POST data memory usage by 200-300%. Removed INI setting always_populate_raw_post_data and the $HTTP_RAW_POST_DATA global variable. (Mike) + . Implemented dedicated syntax for variadic functions + (RFC: https://wiki.php.net/rfc/variadics). (Nikita) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir diff --git a/UPGRADING b/UPGRADING index 581a38e2ad2ec..87b9eefeedb52 100755 --- a/UPGRADING +++ b/UPGRADING @@ -34,8 +34,10 @@ PHP X.Y UPGRADE NOTES 2. New Features ======================================== -- Core: - The php://input stream is now re-usable and can be used concurrently with +- Added dedicated syntax for variadic functions. + (https://wiki.php.net/rfc/variadics) + +- The php://input stream is now re-usable and can be used concurrently with enable_post_data_reading=0. ======================================== diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 90202f00f03ca..d1aca29dc4533 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -6,6 +6,7 @@ UPGRADE NOTES - PHP X.Y a. Addition of do_operation and compare object handlers b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros c. POST data handling + d. Arginfo changes 2. Build system changes a. Unix build system changes @@ -68,6 +69,47 @@ UPGRADE NOTES - PHP X.Y The recommended way to access raw POST data is to open and use a php://input stream wrapper. It is safe to be used concurrently and more than once. + d. Arginfo changes + + The pass_rest_by_reference argument of the ZEND_BEGIN_ARG_INFO and + ZEND_BEGIN_ARG_INFO_EX() is no longer used. The value passed to it is ignored. + + Instead a variadic argument is created using ZEND_ARG_VARIADIC_INFO(): + + ZEND_ARG_VARIADIC_INFO(0, name) /* pass rest by value */ + ZEND_ARG_VARIADIC_INFO(1, name) /* pass rest by reference */ + ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, name) + /* pass rest by prefer-ref */ + + ZEND_ARG_VARIADIC_INFO() should only be used for the last argument. + + The following changes were applied to the zend_arg_info struct: + + typedef struct _zend_arg_info { + const char *class_name; + zend_uint class_name_len; + zend_uchar type_hint; + + zend_uchar pass_by_reference; + zend_bool allow_null; + - zend_bool pass_by_reference; + + zend_bool is_variadic; + } zend_arg_info; + + The following changes were applied to the zend_internal_function_info struct: + + typedef struct _zend_internal_function_info { + zend_uint required_num_args; + zend_uchar _type_hint; + zend_bool return_reference; + - zend_bool pass_rest_by_reference; + + zend_bool _allow_null; + + zend_bool _is_variadic; + } zend_internal_function_info; + + The CHECK_ARG_SEND_TYPE(), ARG_MUST_BE_SENT_BY_REF(), + ARG_SHOULD_BE_SENT_BY_REF() and ARG_MAY_BE_SENT_BY_REF() macros now assume + that the argument passed to them is a zend_function* and that it is non-NULL. + ======================== 2. Build system changes ======================== diff --git a/Zend/tests/variadic/adding_additional_optional_parameter.phpt b/Zend/tests/variadic/adding_additional_optional_parameter.phpt new file mode 100644 index 0000000000000..b4e797803dcf2 --- /dev/null +++ b/Zend/tests/variadic/adding_additional_optional_parameter.phpt @@ -0,0 +1,17 @@ +--TEST-- +It's possible to add additional optional arguments with matching signature +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt b/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt new file mode 100644 index 0000000000000..2f31d47dc6969 --- /dev/null +++ b/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Additional optional parameters must have a matching prototype +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, string ...$params) in %s on line %d diff --git a/Zend/tests/variadic/basic.phpt b/Zend/tests/variadic/basic.phpt new file mode 100644 index 0000000000000..810d4756aa087 --- /dev/null +++ b/Zend/tests/variadic/basic.phpt @@ -0,0 +1,57 @@ +--TEST-- +Basic variadic function +--FILE-- + +--EXPECT-- +array(0) { +} +array(1) { + [0]=> + int(1) +} +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +int(1) +int(2) +array(0) { +} +int(1) +int(2) +array(1) { + [0]=> + int(3) +} +int(1) +int(2) +array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/Zend/tests/variadic/by_ref.phpt b/Zend/tests/variadic/by_ref.phpt new file mode 100644 index 0000000000000..e1635f4ecf20a --- /dev/null +++ b/Zend/tests/variadic/by_ref.phpt @@ -0,0 +1,24 @@ +--TEST-- +Variadic arguments with by-reference passing +--FILE-- + +--EXPECT-- +int(0) +int(0) +int(1) +int(2) diff --git a/Zend/tests/variadic/by_ref_error.phpt b/Zend/tests/variadic/by_ref_error.phpt new file mode 100644 index 0000000000000..7f21014146406 --- /dev/null +++ b/Zend/tests/variadic/by_ref_error.phpt @@ -0,0 +1,12 @@ +--TEST-- +By-ref variadics enforce the reference +--FILE-- + +--EXPECTF-- +Fatal error: Only variables can be passed by reference in %s on line %d diff --git a/Zend/tests/variadic/no_default_error.phpt b/Zend/tests/variadic/no_default_error.phpt new file mode 100644 index 0000000000000..427ebed0289a9 --- /dev/null +++ b/Zend/tests/variadic/no_default_error.phpt @@ -0,0 +1,10 @@ +--TEST-- +Variadic argument cannot have a default value +--FILE-- + +--EXPECTF-- +Fatal error: Variadic parameter cannot have a default value in %s on line %d diff --git a/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt b/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt new file mode 100644 index 0000000000000..f447837ca4afb --- /dev/null +++ b/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +It's not possible to turn a variadic function into a non-variadic one +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, ...$params) in %s on line %d diff --git a/Zend/tests/variadic/only_last_error.phpt b/Zend/tests/variadic/only_last_error.phpt new file mode 100644 index 0000000000000..ee6ff3f777c46 --- /dev/null +++ b/Zend/tests/variadic/only_last_error.phpt @@ -0,0 +1,10 @@ +--TEST-- +Only the last argument can be variadic +--FILE-- + +--EXPECTF-- +Fatal error: Only the last parameter can be variadic in %s on line %d diff --git a/Zend/tests/variadic/optional_params.phpt b/Zend/tests/variadic/optional_params.phpt new file mode 100644 index 0000000000000..ba965e538c4f9 --- /dev/null +++ b/Zend/tests/variadic/optional_params.phpt @@ -0,0 +1,49 @@ +--TEST-- +Optional parameter before variadic parameter +--FILE-- + +--EXPECT-- +int(1) +NULL +array(0) { +} +int(1) +int(2) +array(0) { +} +int(1) +int(2) +array(1) { + [0]=> + int(3) +} +int(1) +int(2) +array(2) { + [0]=> + int(3) + [1]=> + int(4) +} +int(1) +int(2) +array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/Zend/tests/variadic/removing_parameter_error.phpt b/Zend/tests/variadic/removing_parameter_error.phpt new file mode 100644 index 0000000000000..a189e5cf094b7 --- /dev/null +++ b/Zend/tests/variadic/removing_parameter_error.phpt @@ -0,0 +1,20 @@ +--TEST-- +It's not possible to remove required parameter before a variadic parameter +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, ...$params) in %s on line %d diff --git a/Zend/tests/variadic/typehint_error.phpt b/Zend/tests/variadic/typehint_error.phpt new file mode 100644 index 0000000000000..3006b999576c6 --- /dev/null +++ b/Zend/tests/variadic/typehint_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +Variadic arguments enforce typehints +--FILE-- + +--EXPECTF-- +array(0) { +} +array(3) { + [0]=> + array(1) { + [0]=> + int(0) + } + [1]=> + array(1) { + [0]=> + int(1) + } + [2]=> + array(1) { + [0]=> + int(2) + } +} + +Catchable fatal error: Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d diff --git a/Zend/tests/variadic/typehint_suppressed_error.phpt b/Zend/tests/variadic/typehint_suppressed_error.phpt new file mode 100644 index 0000000000000..5048e1c1bb5ab --- /dev/null +++ b/Zend/tests/variadic/typehint_suppressed_error.phpt @@ -0,0 +1,33 @@ +--TEST-- +Error suppression for typehints on variadic arguments works +--FILE-- + +--EXPECTF-- +string(%d) "Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d and defined" +array(3) { + [0]=> + array(1) { + [0]=> + int(0) + } + [1]=> + array(1) { + [0]=> + int(1) + } + [2]=> + int(2) +} diff --git a/Zend/tests/variadic/variadic_changed_byref_error.phpt b/Zend/tests/variadic/variadic_changed_byref_error.phpt new file mode 100644 index 0000000000000..14fb6ae5eb0d9 --- /dev/null +++ b/Zend/tests/variadic/variadic_changed_byref_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Variadic arguments must have compatible passing modes +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, &...$params) in %s on line %d diff --git a/Zend/tests/variadic/variadic_changed_typehint_error.phpt b/Zend/tests/variadic/variadic_changed_typehint_error.phpt new file mode 100644 index 0000000000000..00df33a0424a4 --- /dev/null +++ b/Zend/tests/variadic/variadic_changed_typehint_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Typehints for variadic arguments have to be compatible +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, string ...$params) in %s on line %d diff --git a/Zend/tests/variadic/variadic_implements_non_variadic.phpt b/Zend/tests/variadic/variadic_implements_non_variadic.phpt new file mode 100644 index 0000000000000..a66ec280b8626 --- /dev/null +++ b/Zend/tests/variadic/variadic_implements_non_variadic.phpt @@ -0,0 +1,17 @@ +--TEST-- +A non-variadic function can be turned into a variadic one +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6241df1cad39b..5fa7fb908e500 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2090,16 +2090,12 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio } else { internal_function->required_num_args = info->required_num_args; } - if (info->pass_rest_by_reference) { - if (info->pass_rest_by_reference == ZEND_SEND_PREFER_REF) { - internal_function->fn_flags |= ZEND_ACC_PASS_REST_PREFER_REF; - } else { - internal_function->fn_flags |= ZEND_ACC_PASS_REST_BY_REFERENCE; - } - } if (info->return_reference) { internal_function->fn_flags |= ZEND_ACC_RETURN_REFERENCE; } + if (ptr->arg_info[ptr->num_args].is_variadic) { + internal_function->fn_flags |= ZEND_ACC_VARIADIC; + } } else { internal_function->arg_info = NULL; internal_function->num_args = 0; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 16e766d8a51ea..007d9896092be 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -98,16 +98,18 @@ typedef struct _zend_fcall_info_cache { #define ZEND_FE_END { NULL, NULL, NULL, 0, 0 } -#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref}, -#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, 0, pass_by_ref}, -#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, IS_OBJECT, allow_null, pass_by_ref}, -#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, sizeof(#name)-1, NULL, 0, IS_ARRAY, allow_null, pass_by_ref}, -#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, sizeof(#name)-1, NULL, 0, type_hint, allow_null, pass_by_ref}, -#define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \ +#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0, 0 }, +#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, pass_by_ref, 0, 0 }, +#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, IS_OBJECT, pass_by_ref, allow_null, 0 }, +#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, sizeof(#name)-1, NULL, 0, IS_ARRAY, pass_by_ref, allow_null, 0 }, +#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, sizeof(#name)-1, NULL, 0, type_hint, pass_by_ref, allow_null, 0 }, +#define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0, 1 }, + +#define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args) \ static const zend_arg_info name[] = { \ - { NULL, 0, NULL, required_num_args, 0, return_reference, pass_rest_by_reference}, -#define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \ - ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, ZEND_RETURN_VALUE, -1) + { NULL, 0, NULL, required_num_args, 0, return_reference, 0, 0 }, +#define ZEND_BEGIN_ARG_INFO(name, _unused) \ + ZEND_BEGIN_ARG_INFO_EX(name, 0, ZEND_RETURN_VALUE, -1) #define ZEND_END_ARG_INFO() }; /* Name macros */ diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 672f62b7eefa3..90ff26297ae16 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1822,7 +1822,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /* } /* }}} */ -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_uchar pass_by_reference TSRMLS_DC) /* {{{ */ +void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_uchar pass_by_reference, zend_bool is_variadic TSRMLS_DC) /* {{{ */ { zend_op *opline; zend_arg_info *cur_arg_info; @@ -1846,6 +1846,19 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con } } + if (CG(active_op_array)->fn_flags & ZEND_ACC_VARIADIC) { + zend_error(E_COMPILE_ERROR, "Only the last parameter can be variadic"); + } + + if (is_variadic) { + if (op == ZEND_RECV_INIT) { + zend_error(E_COMPILE_ERROR, "Variadic parameter cannot have a default value"); + } + + op = ZEND_RECV_VARIADIC; + CG(active_op_array)->fn_flags |= ZEND_ACC_VARIADIC; + } + opline = get_next_op(CG(active_op_array) TSRMLS_CC); CG(active_op_array)->num_args++; opline->opcode = op; @@ -1854,16 +1867,19 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con if (op == ZEND_RECV_INIT) { SET_NODE(opline->op2, initialization); } else { - CG(active_op_array)->required_num_args = CG(active_op_array)->num_args; SET_UNUSED(opline->op2); + if (!is_variadic) { + CG(active_op_array)->required_num_args = CG(active_op_array)->num_args; + } } CG(active_op_array)->arg_info = erealloc(CG(active_op_array)->arg_info, sizeof(zend_arg_info)*(CG(active_op_array)->num_args)); cur_arg_info = &CG(active_op_array)->arg_info[CG(active_op_array)->num_args-1]; cur_arg_info->name = zend_new_interned_string(estrndup(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant)), Z_STRLEN(varname->u.constant) + 1, 1 TSRMLS_CC); cur_arg_info->name_len = Z_STRLEN(varname->u.constant); cur_arg_info->type_hint = 0; - cur_arg_info->allow_null = 1; cur_arg_info->pass_by_reference = pass_by_reference; + cur_arg_info->allow_null = 1; + cur_arg_info->is_variadic = is_variadic; cur_arg_info->class_name = NULL; cur_arg_info->class_name_len = 0; @@ -3083,7 +3099,7 @@ static void do_inherit_method(zend_function *function) /* {{{ */ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, const zend_function *proto TSRMLS_DC) /* {{{ */ { - zend_uint i; + zend_uint i, num_args; /* If it's a user function then arg_info == NULL means we don't have any parameters but * we still need to do the arg number checks. We are only willing to ignore this for internal @@ -3113,48 +3129,66 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c return 0; } - if (fe->common.type != ZEND_USER_FUNCTION - && (proto->common.fn_flags & ZEND_ACC_PASS_REST_BY_REFERENCE) != 0 - && (fe->common.fn_flags & ZEND_ACC_PASS_REST_BY_REFERENCE) == 0) { - return 0; - } - /* by-ref constraints on return values are covariant */ if ((proto->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) && !(fe->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { return 0; } - for (i=0; i < proto->common.num_args; i++) { - if (ZEND_LOG_XOR(fe->common.arg_info[i].class_name, proto->common.arg_info[i].class_name)) { + if ((proto->common.fn_flags & ZEND_ACC_VARIADIC) + && !(fe->common.fn_flags & ZEND_ACC_VARIADIC)) { + return 0; + } + + /* For variadic functions any additional (optional) arguments that were added must be + * checked against the signature of the variadic argument, so in this case we have to + * go through all the parameters of the function and not just those present in the + * prototype. */ + num_args = proto->common.num_args; + if ((fe->common.fn_flags & ZEND_ACC_VARIADIC) + && fe->common.num_args > proto->common.num_args) { + num_args = fe->common.num_args; + } + + for (i = 0; i < num_args; i++) { + zend_arg_info *fe_arg_info = &fe->common.arg_info[i]; + + zend_arg_info *proto_arg_info; + if (i < proto->common.num_args) { + proto_arg_info = &proto->common.arg_info[i]; + } else { + proto_arg_info = &proto->common.arg_info[proto->common.num_args-1]; + } + + if (ZEND_LOG_XOR(fe_arg_info->class_name, proto_arg_info->class_name)) { /* Only one has a type hint and the other one doesn't */ return 0; } - if (fe->common.arg_info[i].class_name) { + if (fe_arg_info->class_name) { const char *fe_class_name, *proto_class_name; zend_uint fe_class_name_len, proto_class_name_len; - if (!strcasecmp(fe->common.arg_info[i].class_name, "parent") && proto->common.scope) { + if (!strcasecmp(fe_arg_info->class_name, "parent") && proto->common.scope) { fe_class_name = proto->common.scope->name; fe_class_name_len = proto->common.scope->name_length; - } else if (!strcasecmp(fe->common.arg_info[i].class_name, "self") && fe->common.scope) { + } else if (!strcasecmp(fe_arg_info->class_name, "self") && fe->common.scope) { fe_class_name = fe->common.scope->name; fe_class_name_len = fe->common.scope->name_length; } else { - fe_class_name = fe->common.arg_info[i].class_name; - fe_class_name_len = fe->common.arg_info[i].class_name_len; + fe_class_name = fe_arg_info->class_name; + fe_class_name_len = fe_arg_info->class_name_len; } - if (!strcasecmp(proto->common.arg_info[i].class_name, "parent") && proto->common.scope && proto->common.scope->parent) { + if (!strcasecmp(proto_arg_info->class_name, "parent") && proto->common.scope && proto->common.scope->parent) { proto_class_name = proto->common.scope->parent->name; proto_class_name_len = proto->common.scope->parent->name_length; - } else if (!strcasecmp(proto->common.arg_info[i].class_name, "self") && proto->common.scope) { + } else if (!strcasecmp(proto_arg_info->class_name, "self") && proto->common.scope) { proto_class_name = proto->common.scope->name; proto_class_name_len = proto->common.scope->name_length; } else { - proto_class_name = proto->common.arg_info[i].class_name; - proto_class_name_len = proto->common.arg_info[i].class_name_len; + proto_class_name = proto_arg_info->class_name; + proto_class_name_len = proto_arg_info->class_name_len; } if (strcasecmp(fe_class_name, proto_class_name)!=0) { @@ -3181,24 +3215,17 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c } } } - if (fe->common.arg_info[i].type_hint != proto->common.arg_info[i].type_hint) { + if (fe_arg_info->type_hint != proto_arg_info->type_hint) { /* Incompatible type hint */ return 0; } /* by-ref constraints on arguments are invariant */ - if (fe->common.arg_info[i].pass_by_reference != proto->common.arg_info[i].pass_by_reference) { + if (fe_arg_info->pass_by_reference != proto_arg_info->pass_by_reference) { return 0; } } - if (proto->common.fn_flags & ZEND_ACC_PASS_REST_BY_REFERENCE) { - for (i=proto->common.num_args; i < fe->common.num_args; i++) { - if (!fe->common.arg_info[i].pass_by_reference) { - return 0; - } - } - } return 1; } /* }}} */ @@ -3271,6 +3298,13 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{ if (arg_info->pass_by_reference) { *(offset++) = '&'; } + + if (arg_info->is_variadic) { + *(offset++) = '.'; + *(offset++) = '.'; + *(offset++) = '.'; + } + *(offset++) = '$'; if (arg_info->name) { @@ -3286,7 +3320,7 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{ idx /= 10; } while (idx > 0); } - if (i >= required) { + if (i >= required && !arg_info->is_variadic) { *(offset++) = ' '; *(offset++) = '='; *(offset++) = ' '; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 61d11427a1e49..0e070294125c8 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -207,8 +207,7 @@ typedef struct _zend_try_catch_element { /* disable inline caching */ #define ZEND_ACC_NEVER_CACHE 0x400000 -#define ZEND_ACC_PASS_REST_BY_REFERENCE 0x1000000 -#define ZEND_ACC_PASS_REST_PREFER_REF 0x2000000 +#define ZEND_ACC_VARIADIC 0x1000000 #define ZEND_ACC_RETURN_REFERENCE 0x4000000 #define ZEND_ACC_DONE_PASS_TWO 0x8000000 @@ -234,8 +233,9 @@ typedef struct _zend_arg_info { const char *class_name; zend_uint class_name_len; zend_uchar type_hint; + zend_uchar pass_by_reference; zend_bool allow_null; - zend_bool pass_by_reference; + zend_bool is_variadic; } zend_arg_info; /* the following structure repeats the layout of zend_arg_info, @@ -249,7 +249,8 @@ typedef struct _zend_internal_function_info { zend_uint required_num_args; zend_uchar _type_hint; zend_bool return_reference; - zend_bool pass_rest_by_reference; + zend_bool _allow_null; + zend_bool _is_variadic; } zend_internal_function_info; typedef struct _zend_compiled_variable { @@ -500,7 +501,7 @@ void zend_do_add_variable(znode *result, const znode *op1, const znode *op2 TSRM int zend_do_verify_access_types(const znode *current_access_type, const znode *new_modifier); void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC); void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC); -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference TSRMLS_DC); +void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference, zend_bool is_variadic TSRMLS_DC); int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace TSRMLS_DC); void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); void zend_do_clone(znode *result, const znode *expr TSRMLS_DC); @@ -817,21 +818,21 @@ int zend_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC); #define ZEND_SEND_BY_REF 1 #define ZEND_SEND_PREFER_REF 2 -#define CHECK_ARG_SEND_TYPE(zf, arg_num, m1, m2) \ - ((zf) && \ - ((((zend_function*)(zf))->common.arg_info && \ - arg_num <= ((zend_function*)(zf))->common.num_args) ? \ - (((zend_function *)(zf))->common.arg_info[arg_num-1].pass_by_reference & (m1)) : \ - (((zend_function *)(zf))->common.fn_flags & (m2)))) +#define CHECK_ARG_SEND_TYPE(zf, arg_num, m) \ + ((zf)->common.arg_info && \ + (arg_num <= (zf)->common.num_args \ + ? ((zf)->common.arg_info[arg_num-1].pass_by_reference & (m)) \ + : ((zf)->common.fn_flags & ZEND_ACC_VARIADIC) \ + ? ((zf)->common.arg_info[(zf)->common.num_args-1].pass_by_reference & (m)) : 0)) #define ARG_MUST_BE_SENT_BY_REF(zf, arg_num) \ - CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF, ZEND_ACC_PASS_REST_BY_REFERENCE) + CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF) #define ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num) \ - CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF, ZEND_ACC_PASS_REST_BY_REFERENCE|ZEND_ACC_PASS_REST_PREFER_REF) + CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF) #define ARG_MAY_BE_SENT_BY_REF(zf, arg_num) \ - CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_PREFER_REF, ZEND_ACC_PASS_REST_PREFER_REF) + CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_PREFER_REF) #define ZEND_RETURN_VAL 0 #define ZEND_RETURN_REF 1 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c79a55169c86e..9f78218d3de35 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -616,12 +616,17 @@ static inline int zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zva char *need_msg; zend_class_entry *ce; - if (!zf->common.arg_info - || arg_num>zf->common.num_args) { + if (!zf->common.arg_info) { return 1; } - cur_arg_info = &zf->common.arg_info[arg_num-1]; + if (arg_num <= zf->common.num_args) { + cur_arg_info = &zf->common.arg_info[arg_num-1]; + } else if (zf->common.fn_flags & ZEND_ACC_VARIADIC) { + cur_arg_info = &zf->common.arg_info[zf->common.num_args-1]; + } else { + return 1; + } if (cur_arg_info->class_name) { const char *class_name; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 403146e16486e..4523783dec8ce 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -212,6 +212,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token T_NS_C "__NAMESPACE__ (T_NS_C)" %token T_DIR "__DIR__ (T_DIR)" %token T_NS_SEPARATOR "\\ (T_NS_SEPARATOR)" +%token T_ELLIPSIS "... (T_ELLIPSIS)" %% /* Rules */ @@ -371,10 +372,14 @@ class_declaration_statement: ; is_reference: - /* empty */ { $$.op_type = ZEND_RETURN_VAL; } - | '&' { $$.op_type = ZEND_RETURN_REF; } + /* empty */ { $$.op_type = 0; } + | '&' { $$.op_type = 1; } ; +is_variadic: + /* empty */ { $$.op_type = 0; } + | T_ELLIPSIS { $$.op_type = 1; } +; unticked_function_declaration_statement: function is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); } @@ -523,14 +528,14 @@ parameter_list: non_empty_parameter_list: - optional_class_type T_VARIABLE { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$2, &$$, NULL, &$1, 0 TSRMLS_CC); } - | optional_class_type '&' T_VARIABLE { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$3, &$$, NULL, &$1, 1 TSRMLS_CC); } - | optional_class_type '&' T_VARIABLE '=' static_scalar { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$3, &$$, &$5, &$1, 1 TSRMLS_CC); } - | optional_class_type T_VARIABLE '=' static_scalar { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$2, &$$, &$4, &$1, 0 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type T_VARIABLE { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$4, &$$, NULL, &$3, 0 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$5, &$$, NULL, &$3, 1 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE '=' static_scalar { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$5, &$$, &$7, &$3, 1 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' static_scalar { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$3, 0 TSRMLS_CC); } + optional_class_type is_reference is_variadic T_VARIABLE + { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$4, &$$, NULL, &$1, $2.op_type, $3.op_type TSRMLS_CC); } + | optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar + { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$1, $2.op_type, $3.op_type TSRMLS_CC); } + | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE + { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$6, &$$, NULL, &$3, $4.op_type, $5.op_type TSRMLS_CC); } + | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar + { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$6, &$$, &$8, &$3, $4.op_type, $5.op_type TSRMLS_CC); } ; diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index d5768d3345569..12ee1f59c2da0 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1096,7 +1096,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1738 "Zend/zend_language_scanner.l" +#line 1741 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1174,7 +1174,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy6: YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1728 "Zend/zend_language_scanner.l" +#line 1731 "Zend/zend_language_scanner.l" { if (CG(short_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1191,7 +1191,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) if ((yych = *YYCURSOR) == '=') goto yy43; YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1709 "Zend/zend_language_scanner.l" +#line 1712 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1387,7 +1387,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(38, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1675 "Zend/zend_language_scanner.l" +#line 1678 "Zend/zend_language_scanner.l" { YYCTYPE *bracket = (YYCTYPE*)zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1)); @@ -1429,7 +1429,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1691 "Zend/zend_language_scanner.l" +#line 1694 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1445,7 +1445,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(46, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1702 "Zend/zend_language_scanner.l" +#line 1705 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); @@ -1478,7 +1478,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy51: YYDEBUG(51, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1720 "Zend/zend_language_scanner.l" +#line 1723 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINE(yytext[yyleng-1]); @@ -1556,7 +1556,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy56: YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2183 "Zend/zend_language_scanner.l" +#line 2186 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1608,7 +1608,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2127 "Zend/zend_language_scanner.l" +#line 2130 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '`'; @@ -1623,7 +1623,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(62, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2114 "Zend/zend_language_scanner.l" +#line 2117 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1646,7 +1646,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy65: YYDEBUG(65, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -1658,7 +1658,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(67, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1457 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -1677,7 +1677,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(71, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" +#line 1815 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1703,7 +1703,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(74, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1802 "Zend/zend_language_scanner.l" +#line 1805 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1779,7 +1779,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy78: YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2133 "Zend/zend_language_scanner.l" +#line 2136 "Zend/zend_language_scanner.l" { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; @@ -1839,7 +1839,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2122 "Zend/zend_language_scanner.l" +#line 2125 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '"'; @@ -1854,7 +1854,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(84, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2114 "Zend/zend_language_scanner.l" +#line 2117 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1877,7 +1877,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy87: YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -1889,7 +1889,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(89, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1457 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -1908,7 +1908,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" +#line 1815 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1934,7 +1934,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(96, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1802 "Zend/zend_language_scanner.l" +#line 1805 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1953,7 +1953,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2100 "Zend/zend_language_scanner.l" +#line 2103 "Zend/zend_language_scanner.l" { zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); @@ -2028,7 +2028,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy104: YYDEBUG(104, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2225 "Zend/zend_language_scanner.l" +#line 2228 "Zend/zend_language_scanner.l" { int newline = 0; @@ -2116,7 +2116,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(108, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2114 "Zend/zend_language_scanner.l" +#line 2117 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -2139,7 +2139,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy111: YYDEBUG(111, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -2151,7 +2151,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(113, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1457 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -2170,7 +2170,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(117, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" +#line 1815 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -2196,7 +2196,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1802 "Zend/zend_language_scanner.l" +#line 1805 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -2281,14 +2281,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) case '\n': case '\r': case ' ': goto yy140; - case '!': goto yy153; + case '!': goto yy154; case '"': goto yy180; case '#': goto yy176; case '$': goto yy165; case '%': goto yy159; case '&': goto yy160; case '\'': goto yy178; - case '(': goto yy147; + case '(': goto yy148; case ')': case ',': case ';': @@ -2296,11 +2296,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) case '[': case ']': case '~': goto yy166; - case '*': goto yy156; - case '+': goto yy152; + case '*': goto yy157; + case '+': goto yy153; case '-': goto yy138; - case '.': goto yy158; - case '/': goto yy157; + case '.': goto yy145; + case '/': goto yy158; case '0': goto yy172; case '1': case '2': @@ -2312,9 +2312,9 @@ int lex_scan(zval *zendlval TSRMLS_DC) case '8': case '9': goto yy174; case ':': goto yy142; - case '<': goto yy154; - case '=': goto yy150; - case '>': goto yy155; + case '<': goto yy155; + case '=': goto yy151; + case '>': goto yy156; case '?': goto yy167; case 'A': case 'a': goto yy133; @@ -2333,9 +2333,9 @@ int lex_scan(zval *zendlval TSRMLS_DC) case 'I': case 'i': goto yy131; case 'L': - case 'l': goto yy151; + case 'l': goto yy152; case 'N': - case 'n': goto yy145; + case 'n': goto yy146; case 'O': case 'o': goto yy163; case 'P': @@ -2347,9 +2347,9 @@ int lex_scan(zval *zendlval TSRMLS_DC) case 'T': case 't': goto yy130; case 'U': - case 'u': goto yy148; + case 'u': goto yy149; case 'V': - case 'v': goto yy146; + case 'v': goto yy147; case 'W': case 'w': goto yy132; case 'X': @@ -2358,7 +2358,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) case 'y': goto yy129; case '\\': goto yy143; case '^': goto yy162; - case '_': goto yy149; + case '_': goto yy150; case '`': goto yy182; case '{': goto yy168; case '|': goto yy161; @@ -2371,23 +2371,23 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(-1, yych); switch ((yych = *YYCURSOR)) { case 'C': - case 'c': goto yy735; + case 'c': goto yy738; case 'L': - case 'l': goto yy736; + case 'l': goto yy739; case 'M': - case 'm': goto yy737; + case 'm': goto yy740; case 'N': - case 'n': goto yy738; + case 'n': goto yy741; case 'V': - case 'v': goto yy739; + case 'v': goto yy742; case 'X': - case 'x': goto yy740; + case 'x': goto yy743; default: goto yy187; } yy124: YYDEBUG(124, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1843 "Zend/zend_language_scanner.l" +#line 1846 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; @@ -2399,20 +2399,20 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= 'H') { - if (yych == 'E') goto yy717; + if (yych == 'E') goto yy720; goto yy187; } else { - if (yych <= 'I') goto yy718; + if (yych <= 'I') goto yy721; if (yych <= 'N') goto yy187; - goto yy719; + goto yy722; } } else { if (yych <= 'h') { - if (yych == 'e') goto yy717; + if (yych == 'e') goto yy720; goto yy187; } else { - if (yych <= 'i') goto yy718; - if (yych == 'o') goto yy719; + if (yych <= 'i') goto yy721; + if (yych == 'o') goto yy722; goto yy187; } } @@ -2421,20 +2421,20 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= 'N') { - if (yych == 'I') goto yy693; + if (yych == 'I') goto yy696; goto yy187; } else { - if (yych <= 'O') goto yy694; + if (yych <= 'O') goto yy697; if (yych <= 'T') goto yy187; - goto yy695; + goto yy698; } } else { if (yych <= 'n') { - if (yych == 'i') goto yy693; + if (yych == 'i') goto yy696; goto yy187; } else { - if (yych <= 'o') goto yy694; - if (yych == 'u') goto yy695; + if (yych <= 'o') goto yy697; + if (yych == 'u') goto yy698; goto yy187; } } @@ -2443,48 +2443,48 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= 'K') { - if (yych == 'A') goto yy658; + if (yych == 'A') goto yy661; goto yy187; } else { - if (yych <= 'L') goto yy659; + if (yych <= 'L') goto yy662; if (yych <= 'N') goto yy187; - goto yy660; + goto yy663; } } else { if (yych <= 'k') { - if (yych == 'a') goto yy658; + if (yych == 'a') goto yy661; goto yy187; } else { - if (yych <= 'l') goto yy659; - if (yych == 'o') goto yy660; + if (yych <= 'l') goto yy662; + if (yych == 'o') goto yy663; goto yy187; } } yy128: YYDEBUG(128, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy640; - if (yych == 'e') goto yy640; + if (yych == 'E') goto yy643; + if (yych == 'e') goto yy643; goto yy187; yy129: YYDEBUG(129, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy635; - if (yych == 'i') goto yy635; + if (yych == 'I') goto yy638; + if (yych == 'i') goto yy638; goto yy187; yy130: YYDEBUG(130, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { - if (yych == 'H') goto yy623; + if (yych == 'H') goto yy626; if (yych <= 'Q') goto yy187; - goto yy624; + goto yy627; } else { if (yych <= 'h') { if (yych <= 'g') goto yy187; - goto yy623; + goto yy626; } else { - if (yych == 'r') goto yy624; + if (yych == 'r') goto yy627; goto yy187; } } @@ -2493,53 +2493,53 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= 'L') { - if (yych == 'F') goto yy570; + if (yych == 'F') goto yy573; goto yy187; } else { - if (yych <= 'M') goto yy572; - if (yych <= 'N') goto yy573; + if (yych <= 'M') goto yy575; + if (yych <= 'N') goto yy576; if (yych <= 'R') goto yy187; - goto yy574; + goto yy577; } } else { if (yych <= 'm') { - if (yych == 'f') goto yy570; + if (yych == 'f') goto yy573; if (yych <= 'l') goto yy187; - goto yy572; + goto yy575; } else { - if (yych <= 'n') goto yy573; - if (yych == 's') goto yy574; + if (yych <= 'n') goto yy576; + if (yych == 's') goto yy577; goto yy187; } } yy132: YYDEBUG(132, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy565; - if (yych == 'h') goto yy565; + if (yych == 'H') goto yy568; + if (yych == 'h') goto yy568; goto yy187; yy133: YYDEBUG(133, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= 'M') { - if (yych == 'B') goto yy547; + if (yych == 'B') goto yy550; goto yy187; } else { - if (yych <= 'N') goto yy548; + if (yych <= 'N') goto yy551; if (yych <= 'Q') goto yy187; - if (yych <= 'R') goto yy549; - goto yy550; + if (yych <= 'R') goto yy552; + goto yy553; } } else { if (yych <= 'n') { - if (yych == 'b') goto yy547; + if (yych == 'b') goto yy550; if (yych <= 'm') goto yy187; - goto yy548; + goto yy551; } else { if (yych <= 'q') goto yy187; - if (yych <= 'r') goto yy549; - if (yych <= 's') goto yy550; + if (yych <= 'r') goto yy552; + if (yych <= 's') goto yy553; goto yy187; } } @@ -2547,15 +2547,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(134, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'W') { - if (yych == 'T') goto yy535; + if (yych == 'T') goto yy538; if (yych <= 'V') goto yy187; - goto yy536; + goto yy539; } else { if (yych <= 't') { if (yych <= 's') goto yy187; - goto yy535; + goto yy538; } else { - if (yych == 'w') goto yy536; + if (yych == 'w') goto yy539; goto yy187; } } @@ -2566,18 +2566,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (yych <= ';') { if (yych <= '"') { if (yych <= '!') goto yy187; - goto yy527; + goto yy530; } else { - if (yych == '\'') goto yy528; + if (yych == '\'') goto yy531; goto yy187; } } else { if (yych <= 'R') { - if (yych <= '<') goto yy526; + if (yych <= '<') goto yy529; if (yych <= 'Q') goto yy187; - goto yy529; + goto yy532; } else { - if (yych == 'r') goto yy529; + if (yych == 'r') goto yy532; goto yy187; } } @@ -2585,15 +2585,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(136, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'L') goto yy516; + if (yych == 'L') goto yy519; if (yych <= 'N') goto yy187; - goto yy517; + goto yy520; } else { if (yych <= 'l') { if (yych <= 'k') goto yy187; - goto yy516; + goto yy519; } else { - if (yych == 'o') goto yy517; + if (yych == 'o') goto yy520; goto yy187; } } @@ -2601,15 +2601,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(137, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'R') goto yy492; + if (yych == 'R') goto yy495; if (yych <= 'T') goto yy187; - goto yy493; + goto yy496; } else { if (yych <= 'r') { if (yych <= 'q') goto yy187; - goto yy492; + goto yy495; } else { - if (yych == 'u') goto yy493; + if (yych == 'u') goto yy496; goto yy187; } } @@ -2617,15 +2617,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(138, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '<') { - if (yych == '-') goto yy488; + if (yych == '-') goto yy491; } else { - if (yych <= '=') goto yy486; - if (yych <= '>') goto yy490; + if (yych <= '=') goto yy489; + if (yych <= '>') goto yy493; } yy139: YYDEBUG(139, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1443 "Zend/zend_language_scanner.l" +#line 1446 "Zend/zend_language_scanner.l" { return yytext[0]; } @@ -2634,11 +2634,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(140, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy485; + goto yy488; yy141: YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1176 "Zend/zend_language_scanner.l" +#line 1175 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); @@ -2648,181 +2648,186 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy142: YYDEBUG(142, *YYCURSOR); yych = *++YYCURSOR; - if (yych == ':') goto yy482; + if (yych == ':') goto yy485; goto yy139; yy143: YYDEBUG(143, *YYCURSOR); ++YYCURSOR; YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1203 "Zend/zend_language_scanner.l" +#line 1202 "Zend/zend_language_scanner.l" { return T_NS_SEPARATOR; } #line 2663 "Zend/zend_language_scanner.c" yy145: YYDEBUG(145, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') { + if (yych == '.') goto yy482; + goto yy139; + } else { + if (yych <= '9') goto yy478; + if (yych == '=') goto yy480; + goto yy139; + } +yy146: + YYDEBUG(146, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { - if (yych == 'A') goto yy470; + if (yych == 'A') goto yy466; if (yych <= 'D') goto yy187; - goto yy471; + goto yy467; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy470; + goto yy466; } else { - if (yych == 'e') goto yy471; + if (yych == 'e') goto yy467; goto yy187; } } -yy146: - YYDEBUG(146, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy467; - if (yych == 'a') goto yy467; - goto yy187; yy147: YYDEBUG(147, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy463; + if (yych == 'a') goto yy463; + goto yy187; +yy148: + YYDEBUG(148, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { if (yych <= 'D') { if (yych <= ' ') { - if (yych == '\t') goto yy392; + if (yych == '\t') goto yy388; if (yych <= 0x1F) goto yy139; - goto yy392; + goto yy388; } else { if (yych <= '@') goto yy139; if (yych == 'C') goto yy139; - goto yy392; + goto yy388; } } else { if (yych <= 'I') { - if (yych == 'F') goto yy392; + if (yych == 'F') goto yy388; if (yych <= 'H') goto yy139; - goto yy392; + goto yy388; } else { - if (yych == 'O') goto yy392; + if (yych == 'O') goto yy388; if (yych <= 'Q') goto yy139; - goto yy392; + goto yy388; } } } else { if (yych <= 'f') { if (yych <= 'b') { - if (yych == 'U') goto yy392; + if (yych == 'U') goto yy388; if (yych <= '`') goto yy139; - goto yy392; + goto yy388; } else { - if (yych == 'd') goto yy392; + if (yych == 'd') goto yy388; if (yych <= 'e') goto yy139; - goto yy392; + goto yy388; } } else { if (yych <= 'o') { - if (yych == 'i') goto yy392; + if (yych == 'i') goto yy388; if (yych <= 'n') goto yy139; - goto yy392; + goto yy388; } else { if (yych <= 's') { if (yych <= 'q') goto yy139; - goto yy392; + goto yy388; } else { - if (yych == 'u') goto yy392; + if (yych == 'u') goto yy388; goto yy139; } } } } -yy148: - YYDEBUG(148, *YYCURSOR); +yy149: + YYDEBUG(149, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { - if (yych == 'N') goto yy383; + if (yych == 'N') goto yy379; if (yych <= 'R') goto yy187; - goto yy384; + goto yy380; } else { if (yych <= 'n') { if (yych <= 'm') goto yy187; - goto yy383; + goto yy379; } else { - if (yych == 's') goto yy384; + if (yych == 's') goto yy380; goto yy187; } } -yy149: - YYDEBUG(149, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy301; - goto yy187; yy150: YYDEBUG(150, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '<') goto yy139; - if (yych <= '=') goto yy295; - if (yych <= '>') goto yy297; - goto yy139; + if (yych == '_') goto yy297; + goto yy187; yy151: YYDEBUG(151, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy291; - if (yych == 'i') goto yy291; - goto yy187; + if (yych <= '<') goto yy139; + if (yych <= '=') goto yy291; + if (yych <= '>') goto yy293; + goto yy139; yy152: YYDEBUG(152, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '+') goto yy289; - if (yych == '=') goto yy287; - goto yy139; + if (yych == 'I') goto yy287; + if (yych == 'i') goto yy287; + goto yy187; yy153: YYDEBUG(153, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy284; + if (yych == '+') goto yy285; + if (yych == '=') goto yy283; goto yy139; yy154: YYDEBUG(154, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '=') goto yy280; + goto yy139; +yy155: + YYDEBUG(155, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ';') { - if (yych == '/') goto yy256; + if (yych == '/') goto yy252; goto yy139; } else { - if (yych <= '<') goto yy254; - if (yych <= '=') goto yy257; - if (yych <= '>') goto yy259; + if (yych <= '<') goto yy250; + if (yych <= '=') goto yy253; + if (yych <= '>') goto yy255; goto yy139; } -yy155: - YYDEBUG(155, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '<') goto yy139; - if (yych <= '=') goto yy250; - if (yych <= '>') goto yy248; - goto yy139; yy156: YYDEBUG(156, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy246; + if (yych <= '<') goto yy139; + if (yych <= '=') goto yy246; + if (yych <= '>') goto yy244; goto yy139; yy157: YYDEBUG(157, *YYCURSOR); yych = *++YYCURSOR; + if (yych == '=') goto yy242; + goto yy139; +yy158: + YYDEBUG(158, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= '.') { - if (yych == '*') goto yy238; + if (yych == '*') goto yy234; goto yy139; } else { - if (yych <= '/') goto yy240; - if (yych == '=') goto yy241; + if (yych <= '/') goto yy236; + if (yych == '=') goto yy237; goto yy139; } -yy158: - YYDEBUG(158, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '/') goto yy139; - if (yych <= '9') goto yy234; - if (yych == '=') goto yy236; - goto yy139; yy159: YYDEBUG(159, *YYCURSOR); yych = *++YYCURSOR; @@ -2887,18 +2892,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(169, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1448 "Zend/zend_language_scanner.l" +#line 1451 "Zend/zend_language_scanner.l" { yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; } -#line 2896 "Zend/zend_language_scanner.c" +#line 2901 "Zend/zend_language_scanner.c" yy170: YYDEBUG(170, *YYCURSOR); ++YYCURSOR; YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1460 "Zend/zend_language_scanner.l" +#line 1463 "Zend/zend_language_scanner.l" { RESET_DOC_COMMENT(); if (!zend_stack_is_empty(&SCNG(state_stack))) { @@ -2906,7 +2911,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return '}'; } -#line 2910 "Zend/zend_language_scanner.c" +#line 2915 "Zend/zend_language_scanner.c" yy172: YYDEBUG(172, *YYCURSOR); yyaccept = 2; @@ -2934,7 +2939,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy173: YYDEBUG(173, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1510 "Zend/zend_language_scanner.l" +#line 1513 "Zend/zend_language_scanner.l" { if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); @@ -2955,7 +2960,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_LONG; return T_LNUMBER; } -#line 2959 "Zend/zend_language_scanner.c" +#line 2964 "Zend/zend_language_scanner.c" yy174: YYDEBUG(174, *YYCURSOR); yyaccept = 2; @@ -2983,7 +2988,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy177: YYDEBUG(177, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1850 "Zend/zend_language_scanner.l" +#line 1853 "Zend/zend_language_scanner.l" { while (YYCURSOR < YYLIMIT) { switch (*YYCURSOR++) { @@ -3017,14 +3022,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3021 "Zend/zend_language_scanner.c" +#line 3026 "Zend/zend_language_scanner.c" yy178: YYDEBUG(178, *YYCURSOR); ++YYCURSOR; yy179: YYDEBUG(179, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1937 "Zend/zend_language_scanner.l" +#line 1940 "Zend/zend_language_scanner.l" { register char *s, *t; char *end; @@ -3090,14 +3095,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_CONSTANT_ENCAPSED_STRING; } -#line 3094 "Zend/zend_language_scanner.c" +#line 3099 "Zend/zend_language_scanner.c" yy180: YYDEBUG(180, *YYCURSOR); ++YYCURSOR; yy181: YYDEBUG(181, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2004 "Zend/zend_language_scanner.l" +#line 2007 "Zend/zend_language_scanner.l" { int bprefix = (yytext[0] != '"') ? 1 : 0; @@ -3138,24 +3143,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_DOUBLE_QUOTES); return '"'; } -#line 3142 "Zend/zend_language_scanner.c" +#line 3147 "Zend/zend_language_scanner.c" yy182: YYDEBUG(182, *YYCURSOR); ++YYCURSOR; YYDEBUG(183, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2094 "Zend/zend_language_scanner.l" +#line 2097 "Zend/zend_language_scanner.l" { BEGIN(ST_BACKQUOTE); return '`'; } -#line 3153 "Zend/zend_language_scanner.c" +#line 3158 "Zend/zend_language_scanner.c" yy184: YYDEBUG(184, *YYCURSOR); ++YYCURSOR; YYDEBUG(185, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2357 "Zend/zend_language_scanner.l" +#line 2360 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -3164,7 +3169,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 3168 "Zend/zend_language_scanner.c" +#line 3173 "Zend/zend_language_scanner.c" yy186: YYDEBUG(186, *YYCURSOR); ++YYCURSOR; @@ -3191,12 +3196,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy190: YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1569 "Zend/zend_language_scanner.l" +#line 1572 "Zend/zend_language_scanner.l" { ZVAL_DOUBLE(zendlval, zend_strtod(yytext, NULL)); return T_DNUMBER; } -#line 3200 "Zend/zend_language_scanner.c" +#line 3205 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); yyaccept = 2; @@ -3243,10 +3248,10 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (yyaccept <= 3) { goto yy190; } else { - goto yy239; + goto yy235; } } else { - goto yy255; + goto yy251; } } yy195: @@ -3288,7 +3293,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(202, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1486 "Zend/zend_language_scanner.l" +#line 1489 "Zend/zend_language_scanner.l" { char *bin = yytext + 2; /* Skip "0b" */ int len = yyleng - 2; @@ -3312,7 +3317,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_DNUMBER; } } -#line 3316 "Zend/zend_language_scanner.c" +#line 3321 "Zend/zend_language_scanner.c" yy203: YYDEBUG(203, *YYCURSOR); ++YYCURSOR; @@ -3324,7 +3329,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(205, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1531 "Zend/zend_language_scanner.l" +#line 1534 "Zend/zend_language_scanner.l" { char *hex = yytext + 2; /* Skip "0x" */ int len = yyleng - 2; @@ -3348,7 +3353,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_DNUMBER; } } -#line 3352 "Zend/zend_language_scanner.c" +#line 3357 "Zend/zend_language_scanner.c" yy206: YYDEBUG(206, *YYCURSOR); ++YYCURSOR; @@ -3357,13 +3362,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy207: YYDEBUG(207, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1918 "Zend/zend_language_scanner.l" +#line 1921 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(INITIAL); return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } -#line 3367 "Zend/zend_language_scanner.c" +#line 3372 "Zend/zend_language_scanner.c" yy208: YYDEBUG(208, *YYCURSOR); yych = *++YYCURSOR; @@ -3397,13 +3402,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy212: YYDEBUG(212, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 3407 "Zend/zend_language_scanner.c" +#line 3412 "Zend/zend_language_scanner.c" yy213: YYDEBUG(213, *YYCURSOR); yych = *++YYCURSOR; @@ -3417,11 +3422,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(215, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1431 "Zend/zend_language_scanner.l" +#line 1434 "Zend/zend_language_scanner.l" { return T_LOGICAL_XOR; } -#line 3425 "Zend/zend_language_scanner.c" +#line 3430 "Zend/zend_language_scanner.c" yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; @@ -3430,61 +3435,61 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(217, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1423 "Zend/zend_language_scanner.l" +#line 1426 "Zend/zend_language_scanner.l" { return T_LOGICAL_OR; } -#line 3438 "Zend/zend_language_scanner.c" +#line 3443 "Zend/zend_language_scanner.c" yy218: YYDEBUG(218, *YYCURSOR); ++YYCURSOR; YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1411 "Zend/zend_language_scanner.l" +#line 1414 "Zend/zend_language_scanner.l" { return T_XOR_EQUAL; } -#line 3448 "Zend/zend_language_scanner.c" +#line 3453 "Zend/zend_language_scanner.c" yy220: YYDEBUG(220, *YYCURSOR); ++YYCURSOR; YYDEBUG(221, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1415 "Zend/zend_language_scanner.l" +#line 1418 "Zend/zend_language_scanner.l" { return T_BOOLEAN_OR; } -#line 3458 "Zend/zend_language_scanner.c" +#line 3463 "Zend/zend_language_scanner.c" yy222: YYDEBUG(222, *YYCURSOR); ++YYCURSOR; YYDEBUG(223, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1407 "Zend/zend_language_scanner.l" +#line 1410 "Zend/zend_language_scanner.l" { return T_OR_EQUAL; } -#line 3468 "Zend/zend_language_scanner.c" +#line 3473 "Zend/zend_language_scanner.c" yy224: YYDEBUG(224, *YYCURSOR); ++YYCURSOR; YYDEBUG(225, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1419 "Zend/zend_language_scanner.l" +#line 1422 "Zend/zend_language_scanner.l" { return T_BOOLEAN_AND; } -#line 3478 "Zend/zend_language_scanner.c" +#line 3483 "Zend/zend_language_scanner.c" yy226: YYDEBUG(226, *YYCURSOR); ++YYCURSOR; YYDEBUG(227, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1403 "Zend/zend_language_scanner.l" +#line 1406 "Zend/zend_language_scanner.l" { return T_AND_EQUAL; } -#line 3488 "Zend/zend_language_scanner.c" +#line 3493 "Zend/zend_language_scanner.c" yy228: YYDEBUG(228, *YYCURSOR); ++YYCURSOR; @@ -3493,7 +3498,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy229: YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1925 "Zend/zend_language_scanner.l" +#line 1928 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { BEGIN(INITIAL); @@ -3504,17 +3509,17 @@ int lex_scan(zval *zendlval TSRMLS_DC) return yytext[0]; } } -#line 3508 "Zend/zend_language_scanner.c" +#line 3513 "Zend/zend_language_scanner.c" yy230: YYDEBUG(230, *YYCURSOR); ++YYCURSOR; YYDEBUG(231, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1391 "Zend/zend_language_scanner.l" +#line 1394 "Zend/zend_language_scanner.l" { return T_MOD_EQUAL; } -#line 3518 "Zend/zend_language_scanner.c" +#line 3523 "Zend/zend_language_scanner.c" yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; @@ -3526,39 +3531,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto yy229; yy234: YYDEBUG(234, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; - YYDEBUG(235, *YYCURSOR); - if (yych <= 'D') { - if (yych <= '/') goto yy190; - if (yych <= '9') goto yy234; - goto yy190; - } else { - if (yych <= 'E') goto yy193; - if (yych == 'e') goto yy193; - goto yy190; - } -yy236: - YYDEBUG(236, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(237, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1387 "Zend/zend_language_scanner.l" - { - return T_CONCAT_EQUAL; -} -#line 3553 "Zend/zend_language_scanner.c" -yy238: - YYDEBUG(238, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '*') goto yy243; -yy239: - YYDEBUG(239, *YYCURSOR); + if (yych == '*') goto yy239; +yy235: + YYDEBUG(235, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1884 "Zend/zend_language_scanner.l" +#line 1887 "Zend/zend_language_scanner.l" { int doc_com; @@ -3592,281 +3571,281 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3596 "Zend/zend_language_scanner.c" -yy240: - YYDEBUG(240, *YYCURSOR); +#line 3575 "Zend/zend_language_scanner.c" +yy236: + YYDEBUG(236, *YYCURSOR); yych = *++YYCURSOR; goto yy177; -yy241: - YYDEBUG(241, *YYCURSOR); +yy237: + YYDEBUG(237, *YYCURSOR); ++YYCURSOR; - YYDEBUG(242, *YYCURSOR); + YYDEBUG(238, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1383 "Zend/zend_language_scanner.l" +#line 1386 "Zend/zend_language_scanner.l" { return T_DIV_EQUAL; } -#line 3610 "Zend/zend_language_scanner.c" -yy243: - YYDEBUG(243, *YYCURSOR); +#line 3589 "Zend/zend_language_scanner.c" +yy239: + YYDEBUG(239, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy244; + goto yy240; } goto yy194; -yy244: - YYDEBUG(244, *YYCURSOR); +yy240: + YYDEBUG(240, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(245, *YYCURSOR); + YYDEBUG(241, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy244; + goto yy240; } - goto yy239; -yy246: - YYDEBUG(246, *YYCURSOR); + goto yy235; +yy242: + YYDEBUG(242, *YYCURSOR); ++YYCURSOR; - YYDEBUG(247, *YYCURSOR); + YYDEBUG(243, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1379 "Zend/zend_language_scanner.l" +#line 1382 "Zend/zend_language_scanner.l" { return T_MUL_EQUAL; } -#line 3637 "Zend/zend_language_scanner.c" -yy248: - YYDEBUG(248, *YYCURSOR); +#line 3616 "Zend/zend_language_scanner.c" +yy244: + YYDEBUG(244, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy252; - YYDEBUG(249, *YYCURSOR); + if ((yych = *YYCURSOR) == '=') goto yy248; + YYDEBUG(245, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1439 "Zend/zend_language_scanner.l" +#line 1442 "Zend/zend_language_scanner.l" { return T_SR; } -#line 3648 "Zend/zend_language_scanner.c" -yy250: - YYDEBUG(250, *YYCURSOR); +#line 3627 "Zend/zend_language_scanner.c" +yy246: + YYDEBUG(246, *YYCURSOR); ++YYCURSOR; - YYDEBUG(251, *YYCURSOR); + YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1367 "Zend/zend_language_scanner.l" +#line 1370 "Zend/zend_language_scanner.l" { return T_IS_GREATER_OR_EQUAL; } -#line 3658 "Zend/zend_language_scanner.c" -yy252: - YYDEBUG(252, *YYCURSOR); +#line 3637 "Zend/zend_language_scanner.c" +yy248: + YYDEBUG(248, *YYCURSOR); ++YYCURSOR; - YYDEBUG(253, *YYCURSOR); + YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1399 "Zend/zend_language_scanner.l" +#line 1402 "Zend/zend_language_scanner.l" { return T_SR_EQUAL; } -#line 3668 "Zend/zend_language_scanner.c" -yy254: - YYDEBUG(254, *YYCURSOR); +#line 3647 "Zend/zend_language_scanner.c" +yy250: + YYDEBUG(250, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') goto yy255; - if (yych <= '<') goto yy270; - if (yych <= '=') goto yy268; -yy255: - YYDEBUG(255, *YYCURSOR); + if (yych <= ';') goto yy251; + if (yych <= '<') goto yy266; + if (yych <= '=') goto yy264; +yy251: + YYDEBUG(251, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1435 "Zend/zend_language_scanner.l" +#line 1438 "Zend/zend_language_scanner.l" { return T_SL; } -#line 3683 "Zend/zend_language_scanner.c" -yy256: - YYDEBUG(256, *YYCURSOR); +#line 3662 "Zend/zend_language_scanner.c" +yy252: + YYDEBUG(252, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy261; - if (yych == 's') goto yy261; + if (yych == 'S') goto yy257; + if (yych == 's') goto yy257; goto yy194; -yy257: - YYDEBUG(257, *YYCURSOR); +yy253: + YYDEBUG(253, *YYCURSOR); ++YYCURSOR; - YYDEBUG(258, *YYCURSOR); + YYDEBUG(254, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1363 "Zend/zend_language_scanner.l" +#line 1366 "Zend/zend_language_scanner.l" { return T_IS_SMALLER_OR_EQUAL; } -#line 3699 "Zend/zend_language_scanner.c" -yy259: - YYDEBUG(259, *YYCURSOR); +#line 3678 "Zend/zend_language_scanner.c" +yy255: + YYDEBUG(255, *YYCURSOR); ++YYCURSOR; -yy260: - YYDEBUG(260, *YYCURSOR); +yy256: + YYDEBUG(256, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1359 "Zend/zend_language_scanner.l" +#line 1362 "Zend/zend_language_scanner.l" { return T_IS_NOT_EQUAL; } -#line 3710 "Zend/zend_language_scanner.c" -yy261: - YYDEBUG(261, *YYCURSOR); +#line 3689 "Zend/zend_language_scanner.c" +yy257: + YYDEBUG(257, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy262; + if (yych == 'C') goto yy258; if (yych != 'c') goto yy194; -yy262: - YYDEBUG(262, *YYCURSOR); +yy258: + YYDEBUG(258, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy263; + if (yych == 'R') goto yy259; if (yych != 'r') goto yy194; -yy263: - YYDEBUG(263, *YYCURSOR); +yy259: + YYDEBUG(259, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy264; + if (yych == 'I') goto yy260; if (yych != 'i') goto yy194; -yy264: - YYDEBUG(264, *YYCURSOR); +yy260: + YYDEBUG(260, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy265; + if (yych == 'P') goto yy261; if (yych != 'p') goto yy194; -yy265: - YYDEBUG(265, *YYCURSOR); +yy261: + YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy266; + if (yych == 'T') goto yy262; if (yych != 't') goto yy194; -yy266: - YYDEBUG(266, *YYCURSOR); +yy262: + YYDEBUG(262, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(267, *YYCURSOR); + YYDEBUG(263, *YYCURSOR); if (yych <= '\r') { if (yych <= 0x08) goto yy194; - if (yych <= '\n') goto yy266; + if (yych <= '\n') goto yy262; if (yych <= '\f') goto yy194; - goto yy266; + goto yy262; } else { if (yych <= ' ') { if (yych <= 0x1F) goto yy194; - goto yy266; + goto yy262; } else { if (yych == '>') goto yy206; goto yy194; } } -yy268: - YYDEBUG(268, *YYCURSOR); +yy264: + YYDEBUG(264, *YYCURSOR); ++YYCURSOR; - YYDEBUG(269, *YYCURSOR); + YYDEBUG(265, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1395 "Zend/zend_language_scanner.l" +#line 1398 "Zend/zend_language_scanner.l" { return T_SL_EQUAL; } -#line 3765 "Zend/zend_language_scanner.c" -yy270: - YYDEBUG(270, *YYCURSOR); +#line 3744 "Zend/zend_language_scanner.c" +yy266: + YYDEBUG(266, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(271, *YYCURSOR); + YYDEBUG(267, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy270; + goto yy266; } if (yych <= 'Z') { if (yych <= '&') { - if (yych == '"') goto yy275; + if (yych == '"') goto yy271; goto yy194; } else { - if (yych <= '\'') goto yy274; + if (yych <= '\'') goto yy270; if (yych <= '@') goto yy194; } } else { if (yych <= '`') { if (yych != '_') goto yy194; } else { - if (yych <= 'z') goto yy272; + if (yych <= 'z') goto yy268; if (yych <= '~') goto yy194; } } -yy272: - YYDEBUG(272, *YYCURSOR); +yy268: + YYDEBUG(268, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(273, *YYCURSOR); + YYDEBUG(269, *YYCURSOR); if (yych <= '@') { if (yych <= '\f') { - if (yych == '\n') goto yy279; + if (yych == '\n') goto yy275; goto yy194; } else { - if (yych <= '\r') goto yy281; + if (yych <= '\r') goto yy277; if (yych <= '/') goto yy194; - if (yych <= '9') goto yy272; + if (yych <= '9') goto yy268; goto yy194; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy272; + if (yych <= 'Z') goto yy268; if (yych <= '^') goto yy194; - goto yy272; + goto yy268; } else { if (yych <= '`') goto yy194; - if (yych <= 'z') goto yy272; + if (yych <= 'z') goto yy268; if (yych <= '~') goto yy194; - goto yy272; + goto yy268; } } -yy274: - YYDEBUG(274, *YYCURSOR); +yy270: + YYDEBUG(270, *YYCURSOR); yych = *++YYCURSOR; if (yych == '\'') goto yy194; - if (yych <= '/') goto yy283; + if (yych <= '/') goto yy279; if (yych <= '9') goto yy194; - goto yy283; -yy275: - YYDEBUG(275, *YYCURSOR); + goto yy279; +yy271: + YYDEBUG(271, *YYCURSOR); yych = *++YYCURSOR; if (yych == '"') goto yy194; - if (yych <= '/') goto yy277; + if (yych <= '/') goto yy273; if (yych <= '9') goto yy194; - goto yy277; -yy276: - YYDEBUG(276, *YYCURSOR); + goto yy273; +yy272: + YYDEBUG(272, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; -yy277: - YYDEBUG(277, *YYCURSOR); +yy273: + YYDEBUG(273, *YYCURSOR); if (yych <= 'Z') { if (yych <= '/') { if (yych != '"') goto yy194; } else { - if (yych <= '9') goto yy276; + if (yych <= '9') goto yy272; if (yych <= '@') goto yy194; - goto yy276; + goto yy272; } } else { if (yych <= '`') { - if (yych == '_') goto yy276; + if (yych == '_') goto yy272; goto yy194; } else { - if (yych <= 'z') goto yy276; + if (yych <= 'z') goto yy272; if (yych <= '~') goto yy194; - goto yy276; + goto yy272; } } -yy278: - YYDEBUG(278, *YYCURSOR); +yy274: + YYDEBUG(274, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy279; - if (yych == '\r') goto yy281; + if (yych == '\n') goto yy275; + if (yych == '\r') goto yy277; goto yy194; -yy279: - YYDEBUG(279, *YYCURSOR); +yy275: + YYDEBUG(275, *YYCURSOR); ++YYCURSOR; -yy280: - YYDEBUG(280, *YYCURSOR); +yy276: + YYDEBUG(276, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2046 "Zend/zend_language_scanner.l" +#line 2049 "Zend/zend_language_scanner.l" { char *s; int bprefix = (yytext[0] != '<') ? 1 : 0; @@ -3913,255 +3892,255 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_START_HEREDOC; } -#line 3917 "Zend/zend_language_scanner.c" -yy281: - YYDEBUG(281, *YYCURSOR); +#line 3896 "Zend/zend_language_scanner.c" +yy277: + YYDEBUG(277, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy279; - goto yy280; -yy282: - YYDEBUG(282, *YYCURSOR); + if (yych == '\n') goto yy275; + goto yy276; +yy278: + YYDEBUG(278, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; -yy283: - YYDEBUG(283, *YYCURSOR); +yy279: + YYDEBUG(279, *YYCURSOR); if (yych <= 'Z') { if (yych <= '/') { - if (yych == '\'') goto yy278; + if (yych == '\'') goto yy274; goto yy194; } else { - if (yych <= '9') goto yy282; + if (yych <= '9') goto yy278; if (yych <= '@') goto yy194; - goto yy282; + goto yy278; } } else { if (yych <= '`') { - if (yych == '_') goto yy282; + if (yych == '_') goto yy278; goto yy194; } else { - if (yych <= 'z') goto yy282; + if (yych <= 'z') goto yy278; if (yych <= '~') goto yy194; - goto yy282; + goto yy278; } } -yy284: - YYDEBUG(284, *YYCURSOR); +yy280: + YYDEBUG(280, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '=') goto yy260; - YYDEBUG(285, *YYCURSOR); + if (yych != '=') goto yy256; + YYDEBUG(281, *YYCURSOR); ++YYCURSOR; - YYDEBUG(286, *YYCURSOR); + YYDEBUG(282, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1351 "Zend/zend_language_scanner.l" +#line 1354 "Zend/zend_language_scanner.l" { return T_IS_NOT_IDENTICAL; } -#line 3961 "Zend/zend_language_scanner.c" -yy287: - YYDEBUG(287, *YYCURSOR); +#line 3940 "Zend/zend_language_scanner.c" +yy283: + YYDEBUG(283, *YYCURSOR); ++YYCURSOR; - YYDEBUG(288, *YYCURSOR); + YYDEBUG(284, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1371 "Zend/zend_language_scanner.l" +#line 1374 "Zend/zend_language_scanner.l" { return T_PLUS_EQUAL; } -#line 3971 "Zend/zend_language_scanner.c" -yy289: - YYDEBUG(289, *YYCURSOR); +#line 3950 "Zend/zend_language_scanner.c" +yy285: + YYDEBUG(285, *YYCURSOR); ++YYCURSOR; - YYDEBUG(290, *YYCURSOR); + YYDEBUG(286, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1339 "Zend/zend_language_scanner.l" +#line 1342 "Zend/zend_language_scanner.l" { return T_INC; } -#line 3981 "Zend/zend_language_scanner.c" -yy291: - YYDEBUG(291, *YYCURSOR); +#line 3960 "Zend/zend_language_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy292; + if (yych == 'S') goto yy288; if (yych != 's') goto yy187; -yy292: - YYDEBUG(292, *YYCURSOR); +yy288: + YYDEBUG(288, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy293; + if (yych == 'T') goto yy289; if (yych != 't') goto yy187; -yy293: - YYDEBUG(293, *YYCURSOR); +yy289: + YYDEBUG(289, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(294, *YYCURSOR); + YYDEBUG(290, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1327 "Zend/zend_language_scanner.l" +#line 1330 "Zend/zend_language_scanner.l" { return T_LIST; } -#line 4004 "Zend/zend_language_scanner.c" -yy295: - YYDEBUG(295, *YYCURSOR); +#line 3983 "Zend/zend_language_scanner.c" +yy291: + YYDEBUG(291, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy299; - YYDEBUG(296, *YYCURSOR); + if ((yych = *YYCURSOR) == '=') goto yy295; + YYDEBUG(292, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1355 "Zend/zend_language_scanner.l" +#line 1358 "Zend/zend_language_scanner.l" { return T_IS_EQUAL; } -#line 4015 "Zend/zend_language_scanner.c" -yy297: - YYDEBUG(297, *YYCURSOR); +#line 3994 "Zend/zend_language_scanner.c" +yy293: + YYDEBUG(293, *YYCURSOR); ++YYCURSOR; - YYDEBUG(298, *YYCURSOR); + YYDEBUG(294, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1323 "Zend/zend_language_scanner.l" +#line 1326 "Zend/zend_language_scanner.l" { return T_DOUBLE_ARROW; } -#line 4025 "Zend/zend_language_scanner.c" -yy299: - YYDEBUG(299, *YYCURSOR); +#line 4004 "Zend/zend_language_scanner.c" +yy295: + YYDEBUG(295, *YYCURSOR); ++YYCURSOR; - YYDEBUG(300, *YYCURSOR); + YYDEBUG(296, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1347 "Zend/zend_language_scanner.l" +#line 1350 "Zend/zend_language_scanner.l" { return T_IS_IDENTICAL; } -#line 4035 "Zend/zend_language_scanner.c" -yy301: - YYDEBUG(301, *YYCURSOR); +#line 4014 "Zend/zend_language_scanner.c" +yy297: + YYDEBUG(297, *YYCURSOR); yych = *++YYCURSOR; YYDEBUG(-1, yych); switch (yych) { case 'C': - case 'c': goto yy303; + case 'c': goto yy299; case 'D': - case 'd': goto yy308; + case 'd': goto yy304; case 'F': - case 'f': goto yy305; + case 'f': goto yy301; case 'H': - case 'h': goto yy302; + case 'h': goto yy298; case 'L': - case 'l': goto yy307; + case 'l': goto yy303; case 'M': - case 'm': goto yy306; + case 'm': goto yy302; case 'N': - case 'n': goto yy309; + case 'n': goto yy305; case 'T': - case 't': goto yy304; + case 't': goto yy300; default: goto yy187; } -yy302: - YYDEBUG(302, *YYCURSOR); +yy298: + YYDEBUG(298, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy370; - if (yych == 'a') goto yy370; + if (yych == 'A') goto yy366; + if (yych == 'a') goto yy366; goto yy187; -yy303: - YYDEBUG(303, *YYCURSOR); +yy299: + YYDEBUG(299, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy363; - if (yych == 'l') goto yy363; + if (yych == 'L') goto yy359; + if (yych == 'l') goto yy359; goto yy187; -yy304: - YYDEBUG(304, *YYCURSOR); +yy300: + YYDEBUG(300, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy356; - if (yych == 'r') goto yy356; + if (yych == 'R') goto yy352; + if (yych == 'r') goto yy352; goto yy187; -yy305: - YYDEBUG(305, *YYCURSOR); +yy301: + YYDEBUG(301, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'I') goto yy340; + if (yych == 'I') goto yy336; if (yych <= 'T') goto yy187; - goto yy341; + goto yy337; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; - goto yy340; + goto yy336; } else { - if (yych == 'u') goto yy341; + if (yych == 'u') goto yy337; goto yy187; } } +yy302: + YYDEBUG(302, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy328; + if (yych == 'e') goto yy328; + goto yy187; +yy303: + YYDEBUG(303, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy322; + if (yych == 'i') goto yy322; + goto yy187; +yy304: + YYDEBUG(304, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy317; + if (yych == 'i') goto yy317; + goto yy187; +yy305: + YYDEBUG(305, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy306; + if (yych != 'a') goto yy187; yy306: YYDEBUG(306, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy332; - if (yych == 'e') goto yy332; - goto yy187; + if (yych == 'M') goto yy307; + if (yych != 'm') goto yy187; yy307: YYDEBUG(307, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy326; - if (yych == 'i') goto yy326; - goto yy187; + if (yych == 'E') goto yy308; + if (yych != 'e') goto yy187; yy308: YYDEBUG(308, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy321; - if (yych == 'i') goto yy321; - goto yy187; + if (yych == 'S') goto yy309; + if (yych != 's') goto yy187; yy309: YYDEBUG(309, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy310; - if (yych != 'a') goto yy187; + if (yych == 'P') goto yy310; + if (yych != 'p') goto yy187; yy310: YYDEBUG(310, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy311; - if (yych != 'm') goto yy187; + if (yych == 'A') goto yy311; + if (yych != 'a') goto yy187; yy311: YYDEBUG(311, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy312; - if (yych != 'e') goto yy187; + if (yych == 'C') goto yy312; + if (yych != 'c') goto yy187; yy312: YYDEBUG(312, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy313; - if (yych != 's') goto yy187; + if (yych == 'E') goto yy313; + if (yych != 'e') goto yy187; yy313: YYDEBUG(313, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy314; - if (yych != 'p') goto yy187; -yy314: - YYDEBUG(314, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy315; - if (yych != 'a') goto yy187; -yy315: - YYDEBUG(315, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy316; - if (yych != 'c') goto yy187; -yy316: - YYDEBUG(316, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy317; - if (yych != 'e') goto yy187; -yy317: - YYDEBUG(317, *YYCURSOR); - yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(318, *YYCURSOR); + YYDEBUG(314, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(319, *YYCURSOR); + YYDEBUG(315, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(320, *YYCURSOR); + YYDEBUG(316, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1665 "Zend/zend_language_scanner.l" +#line 1668 "Zend/zend_language_scanner.l" { if (CG(current_namespace)) { *zendlval = *CG(current_namespace); @@ -4171,27 +4150,27 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NS_C; } -#line 4175 "Zend/zend_language_scanner.c" -yy321: - YYDEBUG(321, *YYCURSOR); +#line 4154 "Zend/zend_language_scanner.c" +yy317: + YYDEBUG(317, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy322; + if (yych == 'R') goto yy318; if (yych != 'r') goto yy187; -yy322: - YYDEBUG(322, *YYCURSOR); +yy318: + YYDEBUG(318, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(323, *YYCURSOR); + YYDEBUG(319, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(324, *YYCURSOR); + YYDEBUG(320, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(325, *YYCURSOR); + YYDEBUG(321, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1640 "Zend/zend_language_scanner.l" +#line 1643 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); const size_t filename_len = strlen(filename); @@ -4216,72 +4195,72 @@ int lex_scan(zval *zendlval TSRMLS_DC) ZVAL_STRING(zendlval, dirname, 0); return T_DIR; } -#line 4220 "Zend/zend_language_scanner.c" -yy326: - YYDEBUG(326, *YYCURSOR); +#line 4199 "Zend/zend_language_scanner.c" +yy322: + YYDEBUG(322, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy327; + if (yych == 'N') goto yy323; if (yych != 'n') goto yy187; -yy327: - YYDEBUG(327, *YYCURSOR); +yy323: + YYDEBUG(323, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy328; + if (yych == 'E') goto yy324; if (yych != 'e') goto yy187; -yy328: - YYDEBUG(328, *YYCURSOR); +yy324: + YYDEBUG(324, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(329, *YYCURSOR); + YYDEBUG(325, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(330, *YYCURSOR); + YYDEBUG(326, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(331, *YYCURSOR); + YYDEBUG(327, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1625 "Zend/zend_language_scanner.l" +#line 1628 "Zend/zend_language_scanner.l" { ZVAL_LONG(zendlval, CG(zend_lineno)); return T_LINE; } -#line 4250 "Zend/zend_language_scanner.c" -yy332: - YYDEBUG(332, *YYCURSOR); +#line 4229 "Zend/zend_language_scanner.c" +yy328: + YYDEBUG(328, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy333; + if (yych == 'T') goto yy329; if (yych != 't') goto yy187; -yy333: - YYDEBUG(333, *YYCURSOR); +yy329: + YYDEBUG(329, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy334; + if (yych == 'H') goto yy330; if (yych != 'h') goto yy187; -yy334: - YYDEBUG(334, *YYCURSOR); +yy330: + YYDEBUG(330, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy335; + if (yych == 'O') goto yy331; if (yych != 'o') goto yy187; -yy335: - YYDEBUG(335, *YYCURSOR); +yy331: + YYDEBUG(331, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy336; + if (yych == 'D') goto yy332; if (yych != 'd') goto yy187; -yy336: - YYDEBUG(336, *YYCURSOR); +yy332: + YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(337, *YYCURSOR); + YYDEBUG(333, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(338, *YYCURSOR); + YYDEBUG(334, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(339, *YYCURSOR); + YYDEBUG(335, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1612 "Zend/zend_language_scanner.l" +#line 1615 "Zend/zend_language_scanner.l" { const char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL; const char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; @@ -4294,58 +4273,58 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_METHOD_C; } -#line 4298 "Zend/zend_language_scanner.c" -yy340: - YYDEBUG(340, *YYCURSOR); +#line 4277 "Zend/zend_language_scanner.c" +yy336: + YYDEBUG(336, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy351; - if (yych == 'l') goto yy351; + if (yych == 'L') goto yy347; + if (yych == 'l') goto yy347; goto yy187; -yy341: - YYDEBUG(341, *YYCURSOR); +yy337: + YYDEBUG(337, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy342; + if (yych == 'N') goto yy338; if (yych != 'n') goto yy187; -yy342: - YYDEBUG(342, *YYCURSOR); +yy338: + YYDEBUG(338, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy343; + if (yych == 'C') goto yy339; if (yych != 'c') goto yy187; -yy343: - YYDEBUG(343, *YYCURSOR); +yy339: + YYDEBUG(339, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy344; + if (yych == 'T') goto yy340; if (yych != 't') goto yy187; -yy344: - YYDEBUG(344, *YYCURSOR); +yy340: + YYDEBUG(340, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy345; + if (yych == 'I') goto yy341; if (yych != 'i') goto yy187; -yy345: - YYDEBUG(345, *YYCURSOR); +yy341: + YYDEBUG(341, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy346; + if (yych == 'O') goto yy342; if (yych != 'o') goto yy187; -yy346: - YYDEBUG(346, *YYCURSOR); +yy342: + YYDEBUG(342, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy347; + if (yych == 'N') goto yy343; if (yych != 'n') goto yy187; -yy347: - YYDEBUG(347, *YYCURSOR); +yy343: + YYDEBUG(343, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(348, *YYCURSOR); + YYDEBUG(344, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(349, *YYCURSOR); + YYDEBUG(345, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(350, *YYCURSOR); + YYDEBUG(346, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1602 "Zend/zend_language_scanner.l" +#line 1605 "Zend/zend_language_scanner.l" { zend_op_array *op_array = CG(active_op_array); if (op_array && op_array->function_name) { @@ -4355,27 +4334,27 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_FUNC_C; } -#line 4359 "Zend/zend_language_scanner.c" -yy351: - YYDEBUG(351, *YYCURSOR); +#line 4338 "Zend/zend_language_scanner.c" +yy347: + YYDEBUG(347, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy352; + if (yych == 'E') goto yy348; if (yych != 'e') goto yy187; -yy352: - YYDEBUG(352, *YYCURSOR); +yy348: + YYDEBUG(348, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(353, *YYCURSOR); + YYDEBUG(349, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(354, *YYCURSOR); + YYDEBUG(350, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(355, *YYCURSOR); + YYDEBUG(351, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1630 "Zend/zend_language_scanner.l" +#line 1633 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); @@ -4385,37 +4364,37 @@ int lex_scan(zval *zendlval TSRMLS_DC) ZVAL_STRING(zendlval, filename, 1); return T_FILE; } -#line 4389 "Zend/zend_language_scanner.c" -yy356: - YYDEBUG(356, *YYCURSOR); +#line 4368 "Zend/zend_language_scanner.c" +yy352: + YYDEBUG(352, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy357; + if (yych == 'A') goto yy353; if (yych != 'a') goto yy187; -yy357: - YYDEBUG(357, *YYCURSOR); +yy353: + YYDEBUG(353, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy358; + if (yych == 'I') goto yy354; if (yych != 'i') goto yy187; -yy358: - YYDEBUG(358, *YYCURSOR); +yy354: + YYDEBUG(354, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy359; + if (yych == 'T') goto yy355; if (yych != 't') goto yy187; -yy359: - YYDEBUG(359, *YYCURSOR); +yy355: + YYDEBUG(355, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(360, *YYCURSOR); + YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(361, *YYCURSOR); + YYDEBUG(357, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(362, *YYCURSOR); + YYDEBUG(358, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1592 "Zend/zend_language_scanner.l" +#line 1595 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4425,37 +4404,37 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_TRAIT_C; } -#line 4429 "Zend/zend_language_scanner.c" -yy363: - YYDEBUG(363, *YYCURSOR); +#line 4408 "Zend/zend_language_scanner.c" +yy359: + YYDEBUG(359, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy364; + if (yych == 'A') goto yy360; if (yych != 'a') goto yy187; -yy364: - YYDEBUG(364, *YYCURSOR); +yy360: + YYDEBUG(360, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy365; + if (yych == 'S') goto yy361; if (yych != 's') goto yy187; -yy365: - YYDEBUG(365, *YYCURSOR); +yy361: + YYDEBUG(361, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy366; + if (yych == 'S') goto yy362; if (yych != 's') goto yy187; -yy366: - YYDEBUG(366, *YYCURSOR); +yy362: + YYDEBUG(362, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(367, *YYCURSOR); + YYDEBUG(363, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(368, *YYCURSOR); + YYDEBUG(364, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(369, *YYCURSOR); + YYDEBUG(365, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1574 "Zend/zend_language_scanner.l" +#line 1577 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4473,60 +4452,84 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_CLASS_C; } -#line 4477 "Zend/zend_language_scanner.c" +#line 4456 "Zend/zend_language_scanner.c" +yy366: + YYDEBUG(366, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy367; + if (yych != 'l') goto yy187; +yy367: + YYDEBUG(367, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy368; + if (yych != 't') goto yy187; +yy368: + YYDEBUG(368, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '_') goto yy187; + YYDEBUG(369, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'C') goto yy370; + if (yych != 'c') goto yy187; yy370: YYDEBUG(370, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy371; - if (yych != 'l') goto yy187; + if (yych == 'O') goto yy371; + if (yych != 'o') goto yy187; yy371: YYDEBUG(371, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy372; - if (yych != 't') goto yy187; + if (yych == 'M') goto yy372; + if (yych != 'm') goto yy187; yy372: YYDEBUG(372, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '_') goto yy187; + if (yych == 'P') goto yy373; + if (yych != 'p') goto yy187; +yy373: YYDEBUG(373, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy374; - if (yych != 'c') goto yy187; + if (yych == 'I') goto yy374; + if (yych != 'i') goto yy187; yy374: YYDEBUG(374, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy375; - if (yych != 'o') goto yy187; + if (yych == 'L') goto yy375; + if (yych != 'l') goto yy187; yy375: YYDEBUG(375, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy376; - if (yych != 'm') goto yy187; + if (yych == 'E') goto yy376; + if (yych != 'e') goto yy187; yy376: YYDEBUG(376, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy377; - if (yych != 'p') goto yy187; + if (yych == 'R') goto yy377; + if (yych != 'r') goto yy187; yy377: YYDEBUG(377, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy378; - if (yych != 'i') goto yy187; -yy378: + ++YYCURSOR; + if (yybm[0+(yych = *YYCURSOR)] & 4) { + goto yy186; + } YYDEBUG(378, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy379; - if (yych != 'l') goto yy187; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1294 "Zend/zend_language_scanner.l" + { + return T_HALT_COMPILER; +} +#line 4522 "Zend/zend_language_scanner.c" yy379: YYDEBUG(379, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy380; - if (yych != 'e') goto yy187; + if (yych == 'S') goto yy383; + if (yych == 's') goto yy383; + goto yy187; yy380: YYDEBUG(380, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy381; - if (yych != 'r') goto yy187; + if (yych == 'E') goto yy381; + if (yych != 'e') goto yy187; yy381: YYDEBUG(381, *YYCURSOR); ++YYCURSOR; @@ -4535,22 +4538,21 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(382, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1291 "Zend/zend_language_scanner.l" +#line 1274 "Zend/zend_language_scanner.l" { - return T_HALT_COMPILER; + return T_USE; } -#line 4543 "Zend/zend_language_scanner.c" +#line 4546 "Zend/zend_language_scanner.c" yy383: YYDEBUG(383, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy387; - if (yych == 's') goto yy387; - goto yy187; + if (yych == 'E') goto yy384; + if (yych != 'e') goto yy187; yy384: YYDEBUG(384, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy385; - if (yych != 'e') goto yy187; + if (yych == 'T') goto yy385; + if (yych != 't') goto yy187; yy385: YYDEBUG(385, *YYCURSOR); ++YYCURSOR; @@ -4559,742 +4561,743 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(386, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1271 "Zend/zend_language_scanner.l" +#line 1322 "Zend/zend_language_scanner.l" { - return T_USE; + return T_UNSET; } -#line 4567 "Zend/zend_language_scanner.c" +#line 4569 "Zend/zend_language_scanner.c" yy387: YYDEBUG(387, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy388; - if (yych != 'e') goto yy187; -yy388: - YYDEBUG(388, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy389; - if (yych != 't') goto yy187; -yy389: - YYDEBUG(389, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy186; - } - YYDEBUG(390, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1319 "Zend/zend_language_scanner.l" - { - return T_UNSET; -} -#line 4590 "Zend/zend_language_scanner.c" -yy391: - YYDEBUG(391, *YYCURSOR); ++YYCURSOR; YYFILL(7); yych = *YYCURSOR; -yy392: - YYDEBUG(392, *YYCURSOR); +yy388: + YYDEBUG(388, *YYCURSOR); if (yych <= 'S') { if (yych <= 'D') { if (yych <= ' ') { - if (yych == '\t') goto yy391; + if (yych == '\t') goto yy387; if (yych <= 0x1F) goto yy194; - goto yy391; + goto yy387; } else { if (yych <= 'A') { if (yych <= '@') goto yy194; - goto yy396; + goto yy392; } else { - if (yych <= 'B') goto yy394; + if (yych <= 'B') goto yy390; if (yych <= 'C') goto yy194; - goto yy399; + goto yy395; } } } else { if (yych <= 'I') { - if (yych == 'F') goto yy400; + if (yych == 'F') goto yy396; if (yych <= 'H') goto yy194; - goto yy401; + goto yy397; } else { if (yych <= 'O') { if (yych <= 'N') goto yy194; - goto yy395; + goto yy391; } else { if (yych <= 'Q') goto yy194; - if (yych <= 'R') goto yy398; - goto yy397; + if (yych <= 'R') goto yy394; + goto yy393; } } } } else { if (yych <= 'f') { if (yych <= 'a') { - if (yych == 'U') goto yy393; + if (yych == 'U') goto yy389; if (yych <= '`') goto yy194; - goto yy396; + goto yy392; } else { if (yych <= 'c') { - if (yych <= 'b') goto yy394; + if (yych <= 'b') goto yy390; goto yy194; } else { - if (yych <= 'd') goto yy399; + if (yych <= 'd') goto yy395; if (yych <= 'e') goto yy194; - goto yy400; + goto yy396; } } } else { if (yych <= 'q') { if (yych <= 'i') { if (yych <= 'h') goto yy194; - goto yy401; + goto yy397; } else { - if (yych == 'o') goto yy395; + if (yych == 'o') goto yy391; goto yy194; } } else { if (yych <= 's') { - if (yych <= 'r') goto yy398; - goto yy397; + if (yych <= 'r') goto yy394; + goto yy393; } else { if (yych != 'u') goto yy194; } } } } -yy393: - YYDEBUG(393, *YYCURSOR); +yy389: + YYDEBUG(389, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy460; - if (yych == 'n') goto yy460; + if (yych == 'N') goto yy456; + if (yych == 'n') goto yy456; goto yy194; -yy394: - YYDEBUG(394, *YYCURSOR); +yy390: + YYDEBUG(390, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'I') goto yy447; + if (yych == 'I') goto yy443; if (yych <= 'N') goto yy194; - goto yy448; + goto yy444; } else { if (yych <= 'i') { if (yych <= 'h') goto yy194; - goto yy447; + goto yy443; } else { - if (yych == 'o') goto yy448; + if (yych == 'o') goto yy444; goto yy194; } } +yy391: + YYDEBUG(391, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'B') goto yy435; + if (yych == 'b') goto yy435; + goto yy194; +yy392: + YYDEBUG(392, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy428; + if (yych == 'r') goto yy428; + goto yy194; +yy393: + YYDEBUG(393, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy420; + if (yych == 't') goto yy420; + goto yy194; +yy394: + YYDEBUG(394, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy418; + if (yych == 'e') goto yy418; + goto yy194; yy395: YYDEBUG(395, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy439; - if (yych == 'b') goto yy439; + if (yych == 'O') goto yy414; + if (yych == 'o') goto yy414; goto yy194; yy396: YYDEBUG(396, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy432; - if (yych == 'r') goto yy432; + if (yych == 'L') goto yy407; + if (yych == 'l') goto yy407; goto yy194; yy397: YYDEBUG(397, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy424; - if (yych == 't') goto yy424; - goto yy194; + if (yych == 'N') goto yy398; + if (yych != 'n') goto yy194; yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy422; - if (yych == 'e') goto yy422; - goto yy194; + if (yych == 'T') goto yy399; + if (yych != 't') goto yy194; yy399: YYDEBUG(399, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy418; - if (yych == 'o') goto yy418; - goto yy194; + if (yych == 'E') goto yy400; + if (yych != 'e') goto yy402; yy400: YYDEBUG(400, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy411; - if (yych == 'l') goto yy411; + if (yych == 'G') goto yy405; + if (yych == 'g') goto yy405; goto yy194; yy401: YYDEBUG(401, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy402; - if (yych != 'n') goto yy194; -yy402: - YYDEBUG(402, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy403; - if (yych != 't') goto yy194; -yy403: - YYDEBUG(403, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy404; - if (yych != 'e') goto yy406; -yy404: - YYDEBUG(404, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'G') goto yy409; - if (yych == 'g') goto yy409; - goto yy194; -yy405: - YYDEBUG(405, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy406: - YYDEBUG(406, *YYCURSOR); +yy402: + YYDEBUG(402, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy405; + if (yych == '\t') goto yy401; goto yy194; } else { - if (yych <= ' ') goto yy405; + if (yych <= ' ') goto yy401; if (yych != ')') goto yy194; } - YYDEBUG(407, *YYCURSOR); + YYDEBUG(403, *YYCURSOR); ++YYCURSOR; - YYDEBUG(408, *YYCURSOR); + YYDEBUG(404, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1219 "Zend/zend_language_scanner.l" +#line 1222 "Zend/zend_language_scanner.l" { return T_INT_CAST; } -#line 4766 "Zend/zend_language_scanner.c" -yy409: - YYDEBUG(409, *YYCURSOR); +#line 4745 "Zend/zend_language_scanner.c" +yy405: + YYDEBUG(405, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy410; + if (yych == 'E') goto yy406; if (yych != 'e') goto yy194; -yy410: - YYDEBUG(410, *YYCURSOR); +yy406: + YYDEBUG(406, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy405; - if (yych == 'r') goto yy405; + if (yych == 'R') goto yy401; + if (yych == 'r') goto yy401; goto yy194; -yy411: - YYDEBUG(411, *YYCURSOR); +yy407: + YYDEBUG(407, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy412; + if (yych == 'O') goto yy408; if (yych != 'o') goto yy194; -yy412: - YYDEBUG(412, *YYCURSOR); +yy408: + YYDEBUG(408, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy413; + if (yych == 'A') goto yy409; if (yych != 'a') goto yy194; -yy413: - YYDEBUG(413, *YYCURSOR); +yy409: + YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy414; + if (yych == 'T') goto yy410; if (yych != 't') goto yy194; -yy414: - YYDEBUG(414, *YYCURSOR); +yy410: + YYDEBUG(410, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(415, *YYCURSOR); + YYDEBUG(411, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy414; + if (yych == '\t') goto yy410; goto yy194; } else { - if (yych <= ' ') goto yy414; + if (yych <= ' ') goto yy410; if (yych != ')') goto yy194; } - YYDEBUG(416, *YYCURSOR); + YYDEBUG(412, *YYCURSOR); ++YYCURSOR; - YYDEBUG(417, *YYCURSOR); + YYDEBUG(413, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1223 "Zend/zend_language_scanner.l" +#line 1226 "Zend/zend_language_scanner.l" { return T_DOUBLE_CAST; } -#line 4814 "Zend/zend_language_scanner.c" -yy418: - YYDEBUG(418, *YYCURSOR); +#line 4793 "Zend/zend_language_scanner.c" +yy414: + YYDEBUG(414, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy419; + if (yych == 'U') goto yy415; if (yych != 'u') goto yy194; -yy419: - YYDEBUG(419, *YYCURSOR); +yy415: + YYDEBUG(415, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy420; + if (yych == 'B') goto yy416; if (yych != 'b') goto yy194; -yy420: - YYDEBUG(420, *YYCURSOR); +yy416: + YYDEBUG(416, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy421; + if (yych == 'L') goto yy417; if (yych != 'l') goto yy194; -yy421: - YYDEBUG(421, *YYCURSOR); +yy417: + YYDEBUG(417, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy414; - if (yych == 'e') goto yy414; + if (yych == 'E') goto yy410; + if (yych == 'e') goto yy410; goto yy194; -yy422: - YYDEBUG(422, *YYCURSOR); +yy418: + YYDEBUG(418, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy423; + if (yych == 'A') goto yy419; if (yych != 'a') goto yy194; -yy423: - YYDEBUG(423, *YYCURSOR); +yy419: + YYDEBUG(419, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy414; - if (yych == 'l') goto yy414; + if (yych == 'L') goto yy410; + if (yych == 'l') goto yy410; goto yy194; -yy424: - YYDEBUG(424, *YYCURSOR); +yy420: + YYDEBUG(420, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy425; + if (yych == 'R') goto yy421; if (yych != 'r') goto yy194; -yy425: - YYDEBUG(425, *YYCURSOR); +yy421: + YYDEBUG(421, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy426; + if (yych == 'I') goto yy422; if (yych != 'i') goto yy194; -yy426: - YYDEBUG(426, *YYCURSOR); +yy422: + YYDEBUG(422, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy427; + if (yych == 'N') goto yy423; if (yych != 'n') goto yy194; -yy427: - YYDEBUG(427, *YYCURSOR); +yy423: + YYDEBUG(423, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'G') goto yy428; + if (yych == 'G') goto yy424; if (yych != 'g') goto yy194; -yy428: - YYDEBUG(428, *YYCURSOR); +yy424: + YYDEBUG(424, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(429, *YYCURSOR); + YYDEBUG(425, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy428; + if (yych == '\t') goto yy424; goto yy194; } else { - if (yych <= ' ') goto yy428; + if (yych <= ' ') goto yy424; if (yych != ')') goto yy194; } - YYDEBUG(430, *YYCURSOR); + YYDEBUG(426, *YYCURSOR); ++YYCURSOR; - YYDEBUG(431, *YYCURSOR); + YYDEBUG(427, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1227 "Zend/zend_language_scanner.l" +#line 1230 "Zend/zend_language_scanner.l" { return T_STRING_CAST; } -#line 4888 "Zend/zend_language_scanner.c" -yy432: - YYDEBUG(432, *YYCURSOR); +#line 4867 "Zend/zend_language_scanner.c" +yy428: + YYDEBUG(428, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy433; + if (yych == 'R') goto yy429; if (yych != 'r') goto yy194; -yy433: - YYDEBUG(433, *YYCURSOR); +yy429: + YYDEBUG(429, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy434; + if (yych == 'A') goto yy430; if (yych != 'a') goto yy194; -yy434: - YYDEBUG(434, *YYCURSOR); +yy430: + YYDEBUG(430, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy435; + if (yych == 'Y') goto yy431; if (yych != 'y') goto yy194; -yy435: - YYDEBUG(435, *YYCURSOR); +yy431: + YYDEBUG(431, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(436, *YYCURSOR); + YYDEBUG(432, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy435; + if (yych == '\t') goto yy431; goto yy194; } else { - if (yych <= ' ') goto yy435; + if (yych <= ' ') goto yy431; if (yych != ')') goto yy194; } - YYDEBUG(437, *YYCURSOR); + YYDEBUG(433, *YYCURSOR); ++YYCURSOR; - YYDEBUG(438, *YYCURSOR); + YYDEBUG(434, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1231 "Zend/zend_language_scanner.l" +#line 1234 "Zend/zend_language_scanner.l" { return T_ARRAY_CAST; } -#line 4925 "Zend/zend_language_scanner.c" -yy439: - YYDEBUG(439, *YYCURSOR); +#line 4904 "Zend/zend_language_scanner.c" +yy435: + YYDEBUG(435, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'J') goto yy440; + if (yych == 'J') goto yy436; if (yych != 'j') goto yy194; -yy440: - YYDEBUG(440, *YYCURSOR); +yy436: + YYDEBUG(436, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy441; + if (yych == 'E') goto yy437; if (yych != 'e') goto yy194; -yy441: - YYDEBUG(441, *YYCURSOR); +yy437: + YYDEBUG(437, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy442; + if (yych == 'C') goto yy438; if (yych != 'c') goto yy194; -yy442: - YYDEBUG(442, *YYCURSOR); +yy438: + YYDEBUG(438, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy443; + if (yych == 'T') goto yy439; if (yych != 't') goto yy194; -yy443: - YYDEBUG(443, *YYCURSOR); +yy439: + YYDEBUG(439, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(444, *YYCURSOR); + YYDEBUG(440, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy443; + if (yych == '\t') goto yy439; goto yy194; } else { - if (yych <= ' ') goto yy443; + if (yych <= ' ') goto yy439; if (yych != ')') goto yy194; } - YYDEBUG(445, *YYCURSOR); + YYDEBUG(441, *YYCURSOR); ++YYCURSOR; - YYDEBUG(446, *YYCURSOR); + YYDEBUG(442, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1235 "Zend/zend_language_scanner.l" +#line 1238 "Zend/zend_language_scanner.l" { return T_OBJECT_CAST; } -#line 4967 "Zend/zend_language_scanner.c" -yy447: - YYDEBUG(447, *YYCURSOR); +#line 4946 "Zend/zend_language_scanner.c" +yy443: + YYDEBUG(443, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy457; - if (yych == 'n') goto yy457; + if (yych == 'N') goto yy453; + if (yych == 'n') goto yy453; goto yy194; -yy448: - YYDEBUG(448, *YYCURSOR); +yy444: + YYDEBUG(444, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy449; + if (yych == 'O') goto yy445; if (yych != 'o') goto yy194; -yy449: - YYDEBUG(449, *YYCURSOR); +yy445: + YYDEBUG(445, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy450; + if (yych == 'L') goto yy446; if (yych != 'l') goto yy194; -yy450: - YYDEBUG(450, *YYCURSOR); +yy446: + YYDEBUG(446, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy455; - if (yych == 'e') goto yy455; - goto yy452; -yy451: - YYDEBUG(451, *YYCURSOR); + if (yych == 'E') goto yy451; + if (yych == 'e') goto yy451; + goto yy448; +yy447: + YYDEBUG(447, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy452: - YYDEBUG(452, *YYCURSOR); +yy448: + YYDEBUG(448, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy451; + if (yych == '\t') goto yy447; goto yy194; } else { - if (yych <= ' ') goto yy451; + if (yych <= ' ') goto yy447; if (yych != ')') goto yy194; } - YYDEBUG(453, *YYCURSOR); + YYDEBUG(449, *YYCURSOR); ++YYCURSOR; - YYDEBUG(454, *YYCURSOR); + YYDEBUG(450, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1239 "Zend/zend_language_scanner.l" +#line 1242 "Zend/zend_language_scanner.l" { return T_BOOL_CAST; } -#line 5012 "Zend/zend_language_scanner.c" -yy455: - YYDEBUG(455, *YYCURSOR); +#line 4991 "Zend/zend_language_scanner.c" +yy451: + YYDEBUG(451, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy456; + if (yych == 'A') goto yy452; if (yych != 'a') goto yy194; -yy456: - YYDEBUG(456, *YYCURSOR); +yy452: + YYDEBUG(452, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy451; - if (yych == 'n') goto yy451; + if (yych == 'N') goto yy447; + if (yych == 'n') goto yy447; goto yy194; -yy457: - YYDEBUG(457, *YYCURSOR); +yy453: + YYDEBUG(453, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy458; + if (yych == 'A') goto yy454; if (yych != 'a') goto yy194; -yy458: - YYDEBUG(458, *YYCURSOR); +yy454: + YYDEBUG(454, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy459; + if (yych == 'R') goto yy455; if (yych != 'r') goto yy194; -yy459: - YYDEBUG(459, *YYCURSOR); +yy455: + YYDEBUG(455, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy428; - if (yych == 'y') goto yy428; + if (yych == 'Y') goto yy424; + if (yych == 'y') goto yy424; goto yy194; -yy460: - YYDEBUG(460, *YYCURSOR); +yy456: + YYDEBUG(456, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy461; + if (yych == 'S') goto yy457; if (yych != 's') goto yy194; -yy461: - YYDEBUG(461, *YYCURSOR); +yy457: + YYDEBUG(457, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy462; + if (yych == 'E') goto yy458; if (yych != 'e') goto yy194; -yy462: - YYDEBUG(462, *YYCURSOR); +yy458: + YYDEBUG(458, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy463; + if (yych == 'T') goto yy459; if (yych != 't') goto yy194; -yy463: - YYDEBUG(463, *YYCURSOR); +yy459: + YYDEBUG(459, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(464, *YYCURSOR); + YYDEBUG(460, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy463; + if (yych == '\t') goto yy459; goto yy194; } else { - if (yych <= ' ') goto yy463; + if (yych <= ' ') goto yy459; if (yych != ')') goto yy194; } - YYDEBUG(465, *YYCURSOR); + YYDEBUG(461, *YYCURSOR); ++YYCURSOR; - YYDEBUG(466, *YYCURSOR); + YYDEBUG(462, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1243 "Zend/zend_language_scanner.l" +#line 1246 "Zend/zend_language_scanner.l" { return T_UNSET_CAST; } -#line 5076 "Zend/zend_language_scanner.c" -yy467: - YYDEBUG(467, *YYCURSOR); +#line 5055 "Zend/zend_language_scanner.c" +yy463: + YYDEBUG(463, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy468; + if (yych == 'R') goto yy464; if (yych != 'r') goto yy187; -yy468: - YYDEBUG(468, *YYCURSOR); +yy464: + YYDEBUG(464, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(469, *YYCURSOR); + YYDEBUG(465, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1215 "Zend/zend_language_scanner.l" +#line 1218 "Zend/zend_language_scanner.l" { return T_VAR; } -#line 5094 "Zend/zend_language_scanner.c" -yy470: - YYDEBUG(470, *YYCURSOR); +#line 5073 "Zend/zend_language_scanner.c" +yy466: + YYDEBUG(466, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy474; - if (yych == 'm') goto yy474; + if (yych == 'M') goto yy470; + if (yych == 'm') goto yy470; goto yy187; -yy471: - YYDEBUG(471, *YYCURSOR); +yy467: + YYDEBUG(467, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy472; + if (yych == 'W') goto yy468; if (yych != 'w') goto yy187; -yy472: - YYDEBUG(472, *YYCURSOR); +yy468: + YYDEBUG(468, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(473, *YYCURSOR); + YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1207 "Zend/zend_language_scanner.l" +#line 1210 "Zend/zend_language_scanner.l" { return T_NEW; } -#line 5118 "Zend/zend_language_scanner.c" -yy474: - YYDEBUG(474, *YYCURSOR); +#line 5097 "Zend/zend_language_scanner.c" +yy470: + YYDEBUG(470, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy475; + if (yych == 'E') goto yy471; if (yych != 'e') goto yy187; -yy475: - YYDEBUG(475, *YYCURSOR); +yy471: + YYDEBUG(471, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy476; + if (yych == 'S') goto yy472; if (yych != 's') goto yy187; -yy476: - YYDEBUG(476, *YYCURSOR); +yy472: + YYDEBUG(472, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy477; + if (yych == 'P') goto yy473; if (yych != 'p') goto yy187; -yy477: - YYDEBUG(477, *YYCURSOR); +yy473: + YYDEBUG(473, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy478; + if (yych == 'A') goto yy474; if (yych != 'a') goto yy187; -yy478: - YYDEBUG(478, *YYCURSOR); +yy474: + YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy479; + if (yych == 'C') goto yy475; if (yych != 'c') goto yy187; -yy479: - YYDEBUG(479, *YYCURSOR); +yy475: + YYDEBUG(475, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy480; + if (yych == 'E') goto yy476; if (yych != 'e') goto yy187; -yy480: - YYDEBUG(480, *YYCURSOR); +yy476: + YYDEBUG(476, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(481, *YYCURSOR); + YYDEBUG(477, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1267 "Zend/zend_language_scanner.l" +#line 1270 "Zend/zend_language_scanner.l" { return T_NAMESPACE; } -#line 5161 "Zend/zend_language_scanner.c" +#line 5140 "Zend/zend_language_scanner.c" +yy478: + YYDEBUG(478, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(3); + yych = *YYCURSOR; + YYDEBUG(479, *YYCURSOR); + if (yych <= 'D') { + if (yych <= '/') goto yy190; + if (yych <= '9') goto yy478; + goto yy190; + } else { + if (yych <= 'E') goto yy193; + if (yych == 'e') goto yy193; + goto yy190; + } +yy480: + YYDEBUG(480, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(481, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1390 "Zend/zend_language_scanner.l" + { + return T_CONCAT_EQUAL; +} +#line 5166 "Zend/zend_language_scanner.c" yy482: YYDEBUG(482, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych != '.') goto yy194; YYDEBUG(483, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(484, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1206 "Zend/zend_language_scanner.l" + { + return T_ELLIPSIS; +} +#line 5179 "Zend/zend_language_scanner.c" +yy485: + YYDEBUG(485, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(486, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1199 "Zend/zend_language_scanner.l" +#line 1198 "Zend/zend_language_scanner.l" { return T_PAAMAYIM_NEKUDOTAYIM; } -#line 5171 "Zend/zend_language_scanner.c" -yy484: - YYDEBUG(484, *YYCURSOR); +#line 5189 "Zend/zend_language_scanner.c" +yy487: + YYDEBUG(487, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy485: - YYDEBUG(485, *YYCURSOR); +yy488: + YYDEBUG(488, *YYCURSOR); if (yych <= '\f') { if (yych <= 0x08) goto yy141; - if (yych <= '\n') goto yy484; + if (yych <= '\n') goto yy487; goto yy141; } else { - if (yych <= '\r') goto yy484; - if (yych == ' ') goto yy484; + if (yych <= '\r') goto yy487; + if (yych == ' ') goto yy487; goto yy141; } -yy486: - YYDEBUG(486, *YYCURSOR); +yy489: + YYDEBUG(489, *YYCURSOR); ++YYCURSOR; - YYDEBUG(487, *YYCURSOR); + YYDEBUG(490, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1375 "Zend/zend_language_scanner.l" +#line 1378 "Zend/zend_language_scanner.l" { return T_MINUS_EQUAL; } -#line 5197 "Zend/zend_language_scanner.c" -yy488: - YYDEBUG(488, *YYCURSOR); +#line 5215 "Zend/zend_language_scanner.c" +yy491: + YYDEBUG(491, *YYCURSOR); ++YYCURSOR; - YYDEBUG(489, *YYCURSOR); + YYDEBUG(492, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1343 "Zend/zend_language_scanner.l" +#line 1346 "Zend/zend_language_scanner.l" { return T_DEC; } -#line 5207 "Zend/zend_language_scanner.c" -yy490: - YYDEBUG(490, *YYCURSOR); +#line 5225 "Zend/zend_language_scanner.c" +yy493: + YYDEBUG(493, *YYCURSOR); ++YYCURSOR; - YYDEBUG(491, *YYCURSOR); + YYDEBUG(494, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1171 "Zend/zend_language_scanner.l" +#line 1170 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); return T_OBJECT_OPERATOR; } -#line 5218 "Zend/zend_language_scanner.c" -yy492: - YYDEBUG(492, *YYCURSOR); +#line 5236 "Zend/zend_language_scanner.c" +yy495: + YYDEBUG(495, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'I') goto yy499; + if (yych == 'I') goto yy502; if (yych <= 'N') goto yy187; - goto yy500; + goto yy503; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; - goto yy499; + goto yy502; } else { - if (yych == 'o') goto yy500; + if (yych == 'o') goto yy503; goto yy187; } } -yy493: - YYDEBUG(493, *YYCURSOR); +yy496: + YYDEBUG(496, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy494; + if (yych == 'B') goto yy497; if (yych != 'b') goto yy187; -yy494: - YYDEBUG(494, *YYCURSOR); +yy497: + YYDEBUG(497, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy495; + if (yych == 'L') goto yy498; if (yych != 'l') goto yy187; -yy495: - YYDEBUG(495, *YYCURSOR); +yy498: + YYDEBUG(498, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy496; + if (yych == 'I') goto yy499; if (yych != 'i') goto yy187; -yy496: - YYDEBUG(496, *YYCURSOR); +yy499: + YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy497; + if (yych == 'C') goto yy500; if (yych != 'c') goto yy187; -yy497: - YYDEBUG(497, *YYCURSOR); +yy500: + YYDEBUG(500, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(498, *YYCURSOR); + YYDEBUG(501, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1315 "Zend/zend_language_scanner.l" +#line 1318 "Zend/zend_language_scanner.l" { return T_PUBLIC; } -#line 5267 "Zend/zend_language_scanner.c" -yy499: - YYDEBUG(499, *YYCURSOR); +#line 5285 "Zend/zend_language_scanner.c" +yy502: + YYDEBUG(502, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'V') { - if (yych == 'N') goto yy508; + if (yych == 'N') goto yy511; if (yych <= 'U') goto yy187; - goto yy509; + goto yy512; } else { if (yych <= 'n') { if (yych <= 'm') goto yy187; - goto yy508; + goto yy511; } else { - if (yych == 'v') goto yy509; + if (yych == 'v') goto yy512; goto yy187; } } -yy500: - YYDEBUG(500, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy501; - if (yych != 't') goto yy187; -yy501: - YYDEBUG(501, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy502; - if (yych != 'e') goto yy187; -yy502: - YYDEBUG(502, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy503; - if (yych != 'c') goto yy187; yy503: YYDEBUG(503, *YYCURSOR); yych = *++YYCURSOR; @@ -5308,1072 +5311,1069 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy505: YYDEBUG(505, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy506; - if (yych != 'd') goto yy187; + if (yych == 'C') goto yy506; + if (yych != 'c') goto yy187; yy506: YYDEBUG(506, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy507; + if (yych != 't') goto yy187; +yy507: + YYDEBUG(507, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy508; + if (yych != 'e') goto yy187; +yy508: + YYDEBUG(508, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'D') goto yy509; + if (yych != 'd') goto yy187; +yy509: + YYDEBUG(509, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(507, *YYCURSOR); + YYDEBUG(510, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1311 "Zend/zend_language_scanner.l" +#line 1314 "Zend/zend_language_scanner.l" { return T_PROTECTED; } -#line 5326 "Zend/zend_language_scanner.c" -yy508: - YYDEBUG(508, *YYCURSOR); +#line 5344 "Zend/zend_language_scanner.c" +yy511: + YYDEBUG(511, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy514; - if (yych == 't') goto yy514; + if (yych == 'T') goto yy517; + if (yych == 't') goto yy517; goto yy187; -yy509: - YYDEBUG(509, *YYCURSOR); +yy512: + YYDEBUG(512, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy510; + if (yych == 'A') goto yy513; if (yych != 'a') goto yy187; -yy510: - YYDEBUG(510, *YYCURSOR); +yy513: + YYDEBUG(513, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy511; + if (yych == 'T') goto yy514; if (yych != 't') goto yy187; -yy511: - YYDEBUG(511, *YYCURSOR); +yy514: + YYDEBUG(514, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy512; + if (yych == 'E') goto yy515; if (yych != 'e') goto yy187; -yy512: - YYDEBUG(512, *YYCURSOR); +yy515: + YYDEBUG(515, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(513, *YYCURSOR); + YYDEBUG(516, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1307 "Zend/zend_language_scanner.l" +#line 1310 "Zend/zend_language_scanner.l" { return T_PRIVATE; } -#line 5360 "Zend/zend_language_scanner.c" -yy514: - YYDEBUG(514, *YYCURSOR); +#line 5378 "Zend/zend_language_scanner.c" +yy517: + YYDEBUG(517, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(515, *YYCURSOR); + YYDEBUG(518, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1147 "Zend/zend_language_scanner.l" +#line 1146 "Zend/zend_language_scanner.l" { return T_PRINT; } -#line 5373 "Zend/zend_language_scanner.c" -yy516: - YYDEBUG(516, *YYCURSOR); +#line 5391 "Zend/zend_language_scanner.c" +yy519: + YYDEBUG(519, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy521; - if (yych == 'o') goto yy521; + if (yych == 'O') goto yy524; + if (yych == 'o') goto yy524; goto yy187; -yy517: - YYDEBUG(517, *YYCURSOR); +yy520: + YYDEBUG(520, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy518; + if (yych == 'T') goto yy521; if (yych != 't') goto yy187; -yy518: - YYDEBUG(518, *YYCURSOR); +yy521: + YYDEBUG(521, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy519; + if (yych == 'O') goto yy522; if (yych != 'o') goto yy187; -yy519: - YYDEBUG(519, *YYCURSOR); +yy522: + YYDEBUG(522, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(520, *YYCURSOR); + YYDEBUG(523, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1139 "Zend/zend_language_scanner.l" +#line 1138 "Zend/zend_language_scanner.l" { return T_GOTO; } -#line 5402 "Zend/zend_language_scanner.c" -yy521: - YYDEBUG(521, *YYCURSOR); +#line 5420 "Zend/zend_language_scanner.c" +yy524: + YYDEBUG(524, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy522; + if (yych == 'B') goto yy525; if (yych != 'b') goto yy187; -yy522: - YYDEBUG(522, *YYCURSOR); +yy525: + YYDEBUG(525, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy523; + if (yych == 'A') goto yy526; if (yych != 'a') goto yy187; -yy523: - YYDEBUG(523, *YYCURSOR); +yy526: + YYDEBUG(526, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy524; + if (yych == 'L') goto yy527; if (yych != 'l') goto yy187; -yy524: - YYDEBUG(524, *YYCURSOR); +yy527: + YYDEBUG(527, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(525, *YYCURSOR); + YYDEBUG(528, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1279 "Zend/zend_language_scanner.l" +#line 1282 "Zend/zend_language_scanner.l" { return T_GLOBAL; } -#line 5430 "Zend/zend_language_scanner.c" -yy526: - YYDEBUG(526, *YYCURSOR); +#line 5448 "Zend/zend_language_scanner.c" +yy529: + YYDEBUG(529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy534; + if (yych == '<') goto yy537; goto yy194; -yy527: - YYDEBUG(527, *YYCURSOR); +yy530: + YYDEBUG(530, *YYCURSOR); yych = *++YYCURSOR; goto yy181; -yy528: - YYDEBUG(528, *YYCURSOR); +yy531: + YYDEBUG(531, *YYCURSOR); yych = *++YYCURSOR; goto yy179; -yy529: - YYDEBUG(529, *YYCURSOR); +yy532: + YYDEBUG(532, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy530; + if (yych == 'E') goto yy533; if (yych != 'e') goto yy187; -yy530: - YYDEBUG(530, *YYCURSOR); +yy533: + YYDEBUG(533, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy531; + if (yych == 'A') goto yy534; if (yych != 'a') goto yy187; -yy531: - YYDEBUG(531, *YYCURSOR); +yy534: + YYDEBUG(534, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'K') goto yy532; + if (yych == 'K') goto yy535; if (yych != 'k') goto yy187; -yy532: - YYDEBUG(532, *YYCURSOR); +yy535: + YYDEBUG(535, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(533, *YYCURSOR); + YYDEBUG(536, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1131 "Zend/zend_language_scanner.l" +#line 1130 "Zend/zend_language_scanner.l" { return T_BREAK; } -#line 5471 "Zend/zend_language_scanner.c" -yy534: - YYDEBUG(534, *YYCURSOR); +#line 5489 "Zend/zend_language_scanner.c" +yy537: + YYDEBUG(537, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy270; + if (yych == '<') goto yy266; goto yy194; -yy535: - YYDEBUG(535, *YYCURSOR); +yy538: + YYDEBUG(538, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy542; - if (yych == 'a') goto yy542; + if (yych == 'A') goto yy545; + if (yych == 'a') goto yy545; goto yy187; -yy536: - YYDEBUG(536, *YYCURSOR); +yy539: + YYDEBUG(539, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy537; + if (yych == 'I') goto yy540; if (yych != 'i') goto yy187; -yy537: - YYDEBUG(537, *YYCURSOR); +yy540: + YYDEBUG(540, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy538; + if (yych == 'T') goto yy541; if (yych != 't') goto yy187; -yy538: - YYDEBUG(538, *YYCURSOR); +yy541: + YYDEBUG(541, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy539; + if (yych == 'C') goto yy542; if (yych != 'c') goto yy187; -yy539: - YYDEBUG(539, *YYCURSOR); +yy542: + YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy540; + if (yych == 'H') goto yy543; if (yych != 'h') goto yy187; -yy540: - YYDEBUG(540, *YYCURSOR); +yy543: + YYDEBUG(543, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(541, *YYCURSOR); + YYDEBUG(544, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1115 "Zend/zend_language_scanner.l" +#line 1114 "Zend/zend_language_scanner.l" { return T_SWITCH; } -#line 5515 "Zend/zend_language_scanner.c" -yy542: - YYDEBUG(542, *YYCURSOR); +#line 5533 "Zend/zend_language_scanner.c" +yy545: + YYDEBUG(545, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy543; + if (yych == 'T') goto yy546; if (yych != 't') goto yy187; -yy543: - YYDEBUG(543, *YYCURSOR); +yy546: + YYDEBUG(546, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy544; + if (yych == 'I') goto yy547; if (yych != 'i') goto yy187; -yy544: - YYDEBUG(544, *YYCURSOR); +yy547: + YYDEBUG(547, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy545; + if (yych == 'C') goto yy548; if (yych != 'c') goto yy187; -yy545: - YYDEBUG(545, *YYCURSOR); +yy548: + YYDEBUG(548, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(546, *YYCURSOR); + YYDEBUG(549, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1295 "Zend/zend_language_scanner.l" +#line 1298 "Zend/zend_language_scanner.l" { return T_STATIC; } -#line 5543 "Zend/zend_language_scanner.c" -yy547: - YYDEBUG(547, *YYCURSOR); +#line 5561 "Zend/zend_language_scanner.c" +yy550: + YYDEBUG(550, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy558; - if (yych == 's') goto yy558; + if (yych == 'S') goto yy561; + if (yych == 's') goto yy561; goto yy187; -yy548: - YYDEBUG(548, *YYCURSOR); +yy551: + YYDEBUG(551, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy556; - if (yych == 'd') goto yy556; + if (yych == 'D') goto yy559; + if (yych == 'd') goto yy559; goto yy187; -yy549: - YYDEBUG(549, *YYCURSOR); +yy552: + YYDEBUG(552, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy552; - if (yych == 'r') goto yy552; + if (yych == 'R') goto yy555; + if (yych == 'r') goto yy555; goto yy187; -yy550: - YYDEBUG(550, *YYCURSOR); +yy553: + YYDEBUG(553, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(551, *YYCURSOR); + YYDEBUG(554, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1111 "Zend/zend_language_scanner.l" +#line 1110 "Zend/zend_language_scanner.l" { return T_AS; } -#line 5574 "Zend/zend_language_scanner.c" -yy552: - YYDEBUG(552, *YYCURSOR); +#line 5592 "Zend/zend_language_scanner.c" +yy555: + YYDEBUG(555, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy553; + if (yych == 'A') goto yy556; if (yych != 'a') goto yy187; -yy553: - YYDEBUG(553, *YYCURSOR); +yy556: + YYDEBUG(556, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy554; + if (yych == 'Y') goto yy557; if (yych != 'y') goto yy187; -yy554: - YYDEBUG(554, *YYCURSOR); +yy557: + YYDEBUG(557, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(555, *YYCURSOR); + YYDEBUG(558, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1331 "Zend/zend_language_scanner.l" +#line 1334 "Zend/zend_language_scanner.l" { return T_ARRAY; } -#line 5597 "Zend/zend_language_scanner.c" -yy556: - YYDEBUG(556, *YYCURSOR); +#line 5615 "Zend/zend_language_scanner.c" +yy559: + YYDEBUG(559, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(557, *YYCURSOR); + YYDEBUG(560, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1427 "Zend/zend_language_scanner.l" +#line 1430 "Zend/zend_language_scanner.l" { return T_LOGICAL_AND; } -#line 5610 "Zend/zend_language_scanner.c" -yy558: - YYDEBUG(558, *YYCURSOR); +#line 5628 "Zend/zend_language_scanner.c" +yy561: + YYDEBUG(561, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy559; + if (yych == 'T') goto yy562; if (yych != 't') goto yy187; -yy559: - YYDEBUG(559, *YYCURSOR); +yy562: + YYDEBUG(562, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy560; + if (yych == 'R') goto yy563; if (yych != 'r') goto yy187; -yy560: - YYDEBUG(560, *YYCURSOR); +yy563: + YYDEBUG(563, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy561; + if (yych == 'A') goto yy564; if (yych != 'a') goto yy187; -yy561: - YYDEBUG(561, *YYCURSOR); +yy564: + YYDEBUG(564, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy562; + if (yych == 'C') goto yy565; if (yych != 'c') goto yy187; -yy562: - YYDEBUG(562, *YYCURSOR); +yy565: + YYDEBUG(565, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy563; + if (yych == 'T') goto yy566; if (yych != 't') goto yy187; -yy563: - YYDEBUG(563, *YYCURSOR); +yy566: + YYDEBUG(566, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(564, *YYCURSOR); + YYDEBUG(567, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1299 "Zend/zend_language_scanner.l" +#line 1302 "Zend/zend_language_scanner.l" { return T_ABSTRACT; } -#line 5648 "Zend/zend_language_scanner.c" -yy565: - YYDEBUG(565, *YYCURSOR); +#line 5666 "Zend/zend_language_scanner.c" +yy568: + YYDEBUG(568, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy566; + if (yych == 'I') goto yy569; if (yych != 'i') goto yy187; -yy566: - YYDEBUG(566, *YYCURSOR); +yy569: + YYDEBUG(569, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy567; + if (yych == 'L') goto yy570; if (yych != 'l') goto yy187; -yy567: - YYDEBUG(567, *YYCURSOR); +yy570: + YYDEBUG(570, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy568; + if (yych == 'E') goto yy571; if (yych != 'e') goto yy187; -yy568: - YYDEBUG(568, *YYCURSOR); +yy571: + YYDEBUG(571, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(569, *YYCURSOR); + YYDEBUG(572, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1071 "Zend/zend_language_scanner.l" +#line 1070 "Zend/zend_language_scanner.l" { return T_WHILE; } -#line 5676 "Zend/zend_language_scanner.c" -yy570: - YYDEBUG(570, *YYCURSOR); +#line 5694 "Zend/zend_language_scanner.c" +yy573: + YYDEBUG(573, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(571, *YYCURSOR); + YYDEBUG(574, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1055 "Zend/zend_language_scanner.l" +#line 1054 "Zend/zend_language_scanner.l" { return T_IF; } -#line 5689 "Zend/zend_language_scanner.c" -yy572: - YYDEBUG(572, *YYCURSOR); +#line 5707 "Zend/zend_language_scanner.c" +yy575: + YYDEBUG(575, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy614; - if (yych == 'p') goto yy614; + if (yych == 'P') goto yy617; + if (yych == 'p') goto yy617; goto yy187; -yy573: - YYDEBUG(573, *YYCURSOR); +yy576: + YYDEBUG(576, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'C') { if (yych <= 'B') goto yy187; - goto yy581; + goto yy584; } else { if (yych <= 'R') goto yy187; - if (yych <= 'S') goto yy579; - goto yy580; + if (yych <= 'S') goto yy582; + goto yy583; } } else { if (yych <= 'r') { - if (yych == 'c') goto yy581; + if (yych == 'c') goto yy584; goto yy187; } else { - if (yych <= 's') goto yy579; - if (yych <= 't') goto yy580; + if (yych <= 's') goto yy582; + if (yych <= 't') goto yy583; goto yy187; } } -yy574: - YYDEBUG(574, *YYCURSOR); +yy577: + YYDEBUG(577, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy575; + if (yych == 'S') goto yy578; if (yych != 's') goto yy187; -yy575: - YYDEBUG(575, *YYCURSOR); +yy578: + YYDEBUG(578, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy576; + if (yych == 'E') goto yy579; if (yych != 'e') goto yy187; -yy576: - YYDEBUG(576, *YYCURSOR); +yy579: + YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy577; + if (yych == 'T') goto yy580; if (yych != 't') goto yy187; -yy577: - YYDEBUG(577, *YYCURSOR); +yy580: + YYDEBUG(580, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(578, *YYCURSOR); + YYDEBUG(581, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1283 "Zend/zend_language_scanner.l" +#line 1286 "Zend/zend_language_scanner.l" { return T_ISSET; } -#line 5745 "Zend/zend_language_scanner.c" -yy579: - YYDEBUG(579, *YYCURSOR); +#line 5763 "Zend/zend_language_scanner.c" +yy582: + YYDEBUG(582, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy600; - if (yych == 't') goto yy600; + if (yych == 'T') goto yy603; + if (yych == 't') goto yy603; goto yy187; -yy580: - YYDEBUG(580, *YYCURSOR); +yy583: + YYDEBUG(583, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy593; - if (yych == 'e') goto yy593; + if (yych == 'E') goto yy596; + if (yych == 'e') goto yy596; goto yy187; -yy581: - YYDEBUG(581, *YYCURSOR); +yy584: + YYDEBUG(584, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy582; + if (yych == 'L') goto yy585; if (yych != 'l') goto yy187; -yy582: - YYDEBUG(582, *YYCURSOR); +yy585: + YYDEBUG(585, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy583; + if (yych == 'U') goto yy586; if (yych != 'u') goto yy187; -yy583: - YYDEBUG(583, *YYCURSOR); +yy586: + YYDEBUG(586, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy584; + if (yych == 'D') goto yy587; if (yych != 'd') goto yy187; -yy584: - YYDEBUG(584, *YYCURSOR); +yy587: + YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy585; + if (yych == 'E') goto yy588; if (yych != 'e') goto yy187; -yy585: - YYDEBUG(585, *YYCURSOR); +yy588: + YYDEBUG(588, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '9') { if (yych >= '0') goto yy186; } else { - if (yych <= '@') goto yy586; + if (yych <= '@') goto yy589; if (yych <= 'Z') goto yy186; } } else { if (yych <= '`') { - if (yych <= '_') goto yy587; + if (yych <= '_') goto yy590; } else { if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy586: - YYDEBUG(586, *YYCURSOR); +yy589: + YYDEBUG(589, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1251 "Zend/zend_language_scanner.l" +#line 1254 "Zend/zend_language_scanner.l" { return T_INCLUDE; } -#line 5803 "Zend/zend_language_scanner.c" -yy587: - YYDEBUG(587, *YYCURSOR); +#line 5821 "Zend/zend_language_scanner.c" +yy590: + YYDEBUG(590, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy588; + if (yych == 'O') goto yy591; if (yych != 'o') goto yy187; -yy588: - YYDEBUG(588, *YYCURSOR); +yy591: + YYDEBUG(591, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy589; + if (yych == 'N') goto yy592; if (yych != 'n') goto yy187; -yy589: - YYDEBUG(589, *YYCURSOR); +yy592: + YYDEBUG(592, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy590; + if (yych == 'C') goto yy593; if (yych != 'c') goto yy187; -yy590: - YYDEBUG(590, *YYCURSOR); +yy593: + YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy591; + if (yych == 'E') goto yy594; if (yych != 'e') goto yy187; -yy591: - YYDEBUG(591, *YYCURSOR); +yy594: + YYDEBUG(594, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(592, *YYCURSOR); + YYDEBUG(595, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1255 "Zend/zend_language_scanner.l" +#line 1258 "Zend/zend_language_scanner.l" { return T_INCLUDE_ONCE; } -#line 5836 "Zend/zend_language_scanner.c" -yy593: - YYDEBUG(593, *YYCURSOR); +#line 5854 "Zend/zend_language_scanner.c" +yy596: + YYDEBUG(596, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy594; + if (yych == 'R') goto yy597; if (yych != 'r') goto yy187; -yy594: - YYDEBUG(594, *YYCURSOR); +yy597: + YYDEBUG(597, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy595; + if (yych == 'F') goto yy598; if (yych != 'f') goto yy187; -yy595: - YYDEBUG(595, *YYCURSOR); +yy598: + YYDEBUG(598, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy596; + if (yych == 'A') goto yy599; if (yych != 'a') goto yy187; -yy596: - YYDEBUG(596, *YYCURSOR); +yy599: + YYDEBUG(599, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy597; + if (yych == 'C') goto yy600; if (yych != 'c') goto yy187; -yy597: - YYDEBUG(597, *YYCURSOR); +yy600: + YYDEBUG(600, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy598; + if (yych == 'E') goto yy601; if (yych != 'e') goto yy187; -yy598: - YYDEBUG(598, *YYCURSOR); +yy601: + YYDEBUG(601, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(599, *YYCURSOR); + YYDEBUG(602, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1155 "Zend/zend_language_scanner.l" +#line 1154 "Zend/zend_language_scanner.l" { return T_INTERFACE; } -#line 5874 "Zend/zend_language_scanner.c" -yy600: - YYDEBUG(600, *YYCURSOR); +#line 5892 "Zend/zend_language_scanner.c" +yy603: + YYDEBUG(603, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { - if (yych == 'A') goto yy601; + if (yych == 'A') goto yy604; if (yych <= 'D') goto yy187; - goto yy602; + goto yy605; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; } else { - if (yych == 'e') goto yy602; + if (yych == 'e') goto yy605; goto yy187; } } -yy601: - YYDEBUG(601, *YYCURSOR); +yy604: + YYDEBUG(604, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy608; - if (yych == 'n') goto yy608; + if (yych == 'N') goto yy611; + if (yych == 'n') goto yy611; goto yy187; -yy602: - YYDEBUG(602, *YYCURSOR); +yy605: + YYDEBUG(605, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy603; + if (yych == 'A') goto yy606; if (yych != 'a') goto yy187; -yy603: - YYDEBUG(603, *YYCURSOR); +yy606: + YYDEBUG(606, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy604; + if (yych == 'D') goto yy607; if (yych != 'd') goto yy187; -yy604: - YYDEBUG(604, *YYCURSOR); +yy607: + YYDEBUG(607, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy605; + if (yych == 'O') goto yy608; if (yych != 'o') goto yy187; -yy605: - YYDEBUG(605, *YYCURSOR); +yy608: + YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy606; + if (yych == 'F') goto yy609; if (yych != 'f') goto yy187; -yy606: - YYDEBUG(606, *YYCURSOR); +yy609: + YYDEBUG(609, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(607, *YYCURSOR); + YYDEBUG(610, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1275 "Zend/zend_language_scanner.l" +#line 1278 "Zend/zend_language_scanner.l" { return T_INSTEADOF; } -#line 5928 "Zend/zend_language_scanner.c" -yy608: - YYDEBUG(608, *YYCURSOR); +#line 5946 "Zend/zend_language_scanner.c" +yy611: + YYDEBUG(611, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy609; + if (yych == 'C') goto yy612; if (yych != 'c') goto yy187; -yy609: - YYDEBUG(609, *YYCURSOR); +yy612: + YYDEBUG(612, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy610; + if (yych == 'E') goto yy613; if (yych != 'e') goto yy187; -yy610: - YYDEBUG(610, *YYCURSOR); +yy613: + YYDEBUG(613, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy611; + if (yych == 'O') goto yy614; if (yych != 'o') goto yy187; -yy611: - YYDEBUG(611, *YYCURSOR); +yy614: + YYDEBUG(614, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy612; + if (yych == 'F') goto yy615; if (yych != 'f') goto yy187; -yy612: - YYDEBUG(612, *YYCURSOR); +yy615: + YYDEBUG(615, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(613, *YYCURSOR); + YYDEBUG(616, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1107 "Zend/zend_language_scanner.l" +#line 1106 "Zend/zend_language_scanner.l" { return T_INSTANCEOF; } -#line 5961 "Zend/zend_language_scanner.c" -yy614: - YYDEBUG(614, *YYCURSOR); +#line 5979 "Zend/zend_language_scanner.c" +yy617: + YYDEBUG(617, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy615; + if (yych == 'L') goto yy618; if (yych != 'l') goto yy187; -yy615: - YYDEBUG(615, *YYCURSOR); +yy618: + YYDEBUG(618, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy616; + if (yych == 'E') goto yy619; if (yych != 'e') goto yy187; -yy616: - YYDEBUG(616, *YYCURSOR); +yy619: + YYDEBUG(619, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy617; + if (yych == 'M') goto yy620; if (yych != 'm') goto yy187; -yy617: - YYDEBUG(617, *YYCURSOR); +yy620: + YYDEBUG(620, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy618; + if (yych == 'E') goto yy621; if (yych != 'e') goto yy187; -yy618: - YYDEBUG(618, *YYCURSOR); +yy621: + YYDEBUG(621, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy619; + if (yych == 'N') goto yy622; if (yych != 'n') goto yy187; -yy619: - YYDEBUG(619, *YYCURSOR); +yy622: + YYDEBUG(622, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy620; + if (yych == 'T') goto yy623; if (yych != 't') goto yy187; -yy620: - YYDEBUG(620, *YYCURSOR); +yy623: + YYDEBUG(623, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy621; + if (yych == 'S') goto yy624; if (yych != 's') goto yy187; -yy621: - YYDEBUG(621, *YYCURSOR); +yy624: + YYDEBUG(624, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(622, *YYCURSOR); + YYDEBUG(625, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1167 "Zend/zend_language_scanner.l" +#line 1166 "Zend/zend_language_scanner.l" { return T_IMPLEMENTS; } -#line 6009 "Zend/zend_language_scanner.c" -yy623: - YYDEBUG(623, *YYCURSOR); +#line 6027 "Zend/zend_language_scanner.c" +yy626: + YYDEBUG(626, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy631; - if (yych == 'r') goto yy631; + if (yych == 'R') goto yy634; + if (yych == 'r') goto yy634; goto yy187; -yy624: - YYDEBUG(624, *YYCURSOR); +yy627: + YYDEBUG(627, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { - if (yych == 'A') goto yy627; + if (yych == 'A') goto yy630; if (yych <= 'X') goto yy187; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy627; + goto yy630; } else { if (yych != 'y') goto yy187; } } - YYDEBUG(625, *YYCURSOR); + YYDEBUG(628, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(626, *YYCURSOR); + YYDEBUG(629, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1039 "Zend/zend_language_scanner.l" +#line 1038 "Zend/zend_language_scanner.l" { return T_TRY; } -#line 6041 "Zend/zend_language_scanner.c" -yy627: - YYDEBUG(627, *YYCURSOR); +#line 6059 "Zend/zend_language_scanner.c" +yy630: + YYDEBUG(630, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy628; + if (yych == 'I') goto yy631; if (yych != 'i') goto yy187; -yy628: - YYDEBUG(628, *YYCURSOR); +yy631: + YYDEBUG(631, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy629; + if (yych == 'T') goto yy632; if (yych != 't') goto yy187; -yy629: - YYDEBUG(629, *YYCURSOR); +yy632: + YYDEBUG(632, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(630, *YYCURSOR); + YYDEBUG(633, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1159 "Zend/zend_language_scanner.l" +#line 1158 "Zend/zend_language_scanner.l" { return T_TRAIT; } -#line 6064 "Zend/zend_language_scanner.c" -yy631: - YYDEBUG(631, *YYCURSOR); +#line 6082 "Zend/zend_language_scanner.c" +yy634: + YYDEBUG(634, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy632; + if (yych == 'O') goto yy635; if (yych != 'o') goto yy187; -yy632: - YYDEBUG(632, *YYCURSOR); +yy635: + YYDEBUG(635, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy633; + if (yych == 'W') goto yy636; if (yych != 'w') goto yy187; -yy633: - YYDEBUG(633, *YYCURSOR); +yy636: + YYDEBUG(636, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(634, *YYCURSOR); + YYDEBUG(637, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1051 "Zend/zend_language_scanner.l" +#line 1050 "Zend/zend_language_scanner.l" { return T_THROW; } -#line 6087 "Zend/zend_language_scanner.c" -yy635: - YYDEBUG(635, *YYCURSOR); +#line 6105 "Zend/zend_language_scanner.c" +yy638: + YYDEBUG(638, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy636; + if (yych == 'E') goto yy639; if (yych != 'e') goto yy187; -yy636: - YYDEBUG(636, *YYCURSOR); +yy639: + YYDEBUG(639, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy637; + if (yych == 'L') goto yy640; if (yych != 'l') goto yy187; -yy637: - YYDEBUG(637, *YYCURSOR); +yy640: + YYDEBUG(640, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy638; + if (yych == 'D') goto yy641; if (yych != 'd') goto yy187; -yy638: - YYDEBUG(638, *YYCURSOR); +yy641: + YYDEBUG(641, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(639, *YYCURSOR); + YYDEBUG(642, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1035 "Zend/zend_language_scanner.l" +#line 1034 "Zend/zend_language_scanner.l" { return T_YIELD; } -#line 6115 "Zend/zend_language_scanner.c" -yy640: - YYDEBUG(640, *YYCURSOR); +#line 6133 "Zend/zend_language_scanner.c" +yy643: + YYDEBUG(643, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { - if (yych == 'Q') goto yy642; + if (yych == 'Q') goto yy645; if (yych <= 'S') goto yy187; } else { if (yych <= 'q') { if (yych <= 'p') goto yy187; - goto yy642; + goto yy645; } else { if (yych != 't') goto yy187; } } - YYDEBUG(641, *YYCURSOR); + YYDEBUG(644, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy654; - if (yych == 'u') goto yy654; + if (yych == 'U') goto yy657; + if (yych == 'u') goto yy657; goto yy187; -yy642: - YYDEBUG(642, *YYCURSOR); +yy645: + YYDEBUG(645, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy643; + if (yych == 'U') goto yy646; if (yych != 'u') goto yy187; -yy643: - YYDEBUG(643, *YYCURSOR); +yy646: + YYDEBUG(646, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy644; + if (yych == 'I') goto yy647; if (yych != 'i') goto yy187; -yy644: - YYDEBUG(644, *YYCURSOR); +yy647: + YYDEBUG(647, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy645; + if (yych == 'R') goto yy648; if (yych != 'r') goto yy187; -yy645: - YYDEBUG(645, *YYCURSOR); +yy648: + YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy646; + if (yych == 'E') goto yy649; if (yych != 'e') goto yy187; -yy646: - YYDEBUG(646, *YYCURSOR); +yy649: + YYDEBUG(649, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '9') { if (yych >= '0') goto yy186; } else { - if (yych <= '@') goto yy647; + if (yych <= '@') goto yy650; if (yych <= 'Z') goto yy186; } } else { if (yych <= '`') { - if (yych <= '_') goto yy648; + if (yych <= '_') goto yy651; } else { if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy647: - YYDEBUG(647, *YYCURSOR); +yy650: + YYDEBUG(650, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1259 "Zend/zend_language_scanner.l" +#line 1262 "Zend/zend_language_scanner.l" { return T_REQUIRE; } -#line 6180 "Zend/zend_language_scanner.c" -yy648: - YYDEBUG(648, *YYCURSOR); +#line 6198 "Zend/zend_language_scanner.c" +yy651: + YYDEBUG(651, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy649; + if (yych == 'O') goto yy652; if (yych != 'o') goto yy187; -yy649: - YYDEBUG(649, *YYCURSOR); +yy652: + YYDEBUG(652, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy650; + if (yych == 'N') goto yy653; if (yych != 'n') goto yy187; -yy650: - YYDEBUG(650, *YYCURSOR); +yy653: + YYDEBUG(653, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy651; + if (yych == 'C') goto yy654; if (yych != 'c') goto yy187; -yy651: - YYDEBUG(651, *YYCURSOR); +yy654: + YYDEBUG(654, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy652; + if (yych == 'E') goto yy655; if (yych != 'e') goto yy187; -yy652: - YYDEBUG(652, *YYCURSOR); +yy655: + YYDEBUG(655, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(653, *YYCURSOR); + YYDEBUG(656, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1263 "Zend/zend_language_scanner.l" +#line 1266 "Zend/zend_language_scanner.l" { return T_REQUIRE_ONCE; } -#line 6213 "Zend/zend_language_scanner.c" -yy654: - YYDEBUG(654, *YYCURSOR); +#line 6231 "Zend/zend_language_scanner.c" +yy657: + YYDEBUG(657, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy655; + if (yych == 'R') goto yy658; if (yych != 'r') goto yy187; -yy655: - YYDEBUG(655, *YYCURSOR); +yy658: + YYDEBUG(658, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy656; + if (yych == 'N') goto yy659; if (yych != 'n') goto yy187; -yy656: - YYDEBUG(656, *YYCURSOR); +yy659: + YYDEBUG(659, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(657, *YYCURSOR); + YYDEBUG(660, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1031 "Zend/zend_language_scanner.l" +#line 1030 "Zend/zend_language_scanner.l" { return T_RETURN; } -#line 6236 "Zend/zend_language_scanner.c" -yy658: - YYDEBUG(658, *YYCURSOR); +#line 6254 "Zend/zend_language_scanner.c" +yy661: + YYDEBUG(661, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'L') { if (yych <= 'K') goto yy187; - goto yy681; + goto yy684; } else { if (yych <= 'R') goto yy187; - if (yych <= 'S') goto yy680; - goto yy679; + if (yych <= 'S') goto yy683; + goto yy682; } } else { if (yych <= 'r') { - if (yych == 'l') goto yy681; + if (yych == 'l') goto yy684; goto yy187; } else { - if (yych <= 's') goto yy680; - if (yych <= 't') goto yy679; + if (yych <= 's') goto yy683; + if (yych <= 't') goto yy682; goto yy187; } } -yy659: - YYDEBUG(659, *YYCURSOR); +yy662: + YYDEBUG(662, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'A') goto yy671; + if (yych == 'A') goto yy674; if (yych <= 'N') goto yy187; - goto yy672; + goto yy675; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy671; + goto yy674; } else { - if (yych == 'o') goto yy672; + if (yych == 'o') goto yy675; goto yy187; } } -yy660: - YYDEBUG(660, *YYCURSOR); +yy663: + YYDEBUG(663, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy661; + if (yych == 'N') goto yy664; if (yych != 'n') goto yy187; -yy661: - YYDEBUG(661, *YYCURSOR); +yy664: + YYDEBUG(664, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'R') goto yy187; - if (yych >= 'T') goto yy663; + if (yych >= 'T') goto yy666; } else { if (yych <= 'r') goto yy187; - if (yych <= 's') goto yy662; - if (yych <= 't') goto yy663; + if (yych <= 's') goto yy665; + if (yych <= 't') goto yy666; goto yy187; } -yy662: - YYDEBUG(662, *YYCURSOR); +yy665: + YYDEBUG(665, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy669; - if (yych == 't') goto yy669; + if (yych == 'T') goto yy672; + if (yych == 't') goto yy672; goto yy187; -yy663: - YYDEBUG(663, *YYCURSOR); +yy666: + YYDEBUG(666, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy664; + if (yych == 'I') goto yy667; if (yych != 'i') goto yy187; -yy664: - YYDEBUG(664, *YYCURSOR); +yy667: + YYDEBUG(667, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy665; + if (yych == 'N') goto yy668; if (yych != 'n') goto yy187; -yy665: - YYDEBUG(665, *YYCURSOR); +yy668: + YYDEBUG(668, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy666; + if (yych == 'U') goto yy669; if (yych != 'u') goto yy187; -yy666: - YYDEBUG(666, *YYCURSOR); +yy669: + YYDEBUG(669, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy667; + if (yych == 'E') goto yy670; if (yych != 'e') goto yy187; -yy667: - YYDEBUG(667, *YYCURSOR); +yy670: + YYDEBUG(670, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(668, *YYCURSOR); + YYDEBUG(671, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1135 "Zend/zend_language_scanner.l" +#line 1134 "Zend/zend_language_scanner.l" { return T_CONTINUE; } -#line 6330 "Zend/zend_language_scanner.c" -yy669: - YYDEBUG(669, *YYCURSOR); +#line 6348 "Zend/zend_language_scanner.c" +yy672: + YYDEBUG(672, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(670, *YYCURSOR); + YYDEBUG(673, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1027 "Zend/zend_language_scanner.l" +#line 1026 "Zend/zend_language_scanner.l" { return T_CONST; } -#line 6343 "Zend/zend_language_scanner.c" -yy671: - YYDEBUG(671, *YYCURSOR); +#line 6361 "Zend/zend_language_scanner.c" +yy674: + YYDEBUG(674, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy676; - if (yych == 's') goto yy676; + if (yych == 'S') goto yy679; + if (yych == 's') goto yy679; goto yy187; -yy672: - YYDEBUG(672, *YYCURSOR); +yy675: + YYDEBUG(675, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy673; + if (yych == 'N') goto yy676; if (yych != 'n') goto yy187; -yy673: - YYDEBUG(673, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy674; - if (yych != 'e') goto yy187; -yy674: - YYDEBUG(674, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy186; - } - YYDEBUG(675, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1211 "Zend/zend_language_scanner.l" - { - return T_CLONE; -} -#line 6372 "Zend/zend_language_scanner.c" yy676: YYDEBUG(676, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy677; - if (yych != 's') goto yy187; + if (yych == 'E') goto yy677; + if (yych != 'e') goto yy187; yy677: YYDEBUG(677, *YYCURSOR); ++YYCURSOR; @@ -6382,38 +6382,41 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1151 "Zend/zend_language_scanner.l" +#line 1214 "Zend/zend_language_scanner.l" { - return T_CLASS; + return T_CLONE; } #line 6390 "Zend/zend_language_scanner.c" yy679: YYDEBUG(679, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy690; - if (yych == 'c') goto yy690; - goto yy187; + if (yych == 'S') goto yy680; + if (yych != 's') goto yy187; yy680: YYDEBUG(680, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy688; - if (yych == 'e') goto yy688; - goto yy187; -yy681: + ++YYCURSOR; + if (yybm[0+(yych = *YYCURSOR)] & 4) { + goto yy186; + } YYDEBUG(681, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy682; - if (yych != 'l') goto yy187; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1150 "Zend/zend_language_scanner.l" + { + return T_CLASS; +} +#line 6408 "Zend/zend_language_scanner.c" yy682: YYDEBUG(682, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy683; - if (yych != 'a') goto yy187; + if (yych == 'C') goto yy693; + if (yych == 'c') goto yy693; + goto yy187; yy683: YYDEBUG(683, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy684; - if (yych != 'b') goto yy187; + if (yych == 'E') goto yy691; + if (yych == 'e') goto yy691; + goto yy187; yy684: YYDEBUG(684, *YYCURSOR); yych = *++YYCURSOR; @@ -6422,760 +6425,775 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy685: YYDEBUG(685, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy686; - if (yych != 'e') goto yy187; + if (yych == 'A') goto yy686; + if (yych != 'a') goto yy187; yy686: YYDEBUG(686, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'B') goto yy687; + if (yych != 'b') goto yy187; +yy687: + YYDEBUG(687, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy688; + if (yych != 'l') goto yy187; +yy688: + YYDEBUG(688, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy689; + if (yych != 'e') goto yy187; +yy689: + YYDEBUG(689, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(687, *YYCURSOR); + YYDEBUG(690, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1335 "Zend/zend_language_scanner.l" +#line 1338 "Zend/zend_language_scanner.l" { return T_CALLABLE; } -#line 6440 "Zend/zend_language_scanner.c" -yy688: - YYDEBUG(688, *YYCURSOR); +#line 6458 "Zend/zend_language_scanner.c" +yy691: + YYDEBUG(691, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(689, *YYCURSOR); + YYDEBUG(692, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1123 "Zend/zend_language_scanner.l" +#line 1122 "Zend/zend_language_scanner.l" { return T_CASE; } -#line 6453 "Zend/zend_language_scanner.c" -yy690: - YYDEBUG(690, *YYCURSOR); +#line 6471 "Zend/zend_language_scanner.c" +yy693: + YYDEBUG(693, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy691; + if (yych == 'H') goto yy694; if (yych != 'h') goto yy187; -yy691: - YYDEBUG(691, *YYCURSOR); +yy694: + YYDEBUG(694, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(692, *YYCURSOR); + YYDEBUG(695, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1043 "Zend/zend_language_scanner.l" +#line 1042 "Zend/zend_language_scanner.l" { return T_CATCH; } -#line 6471 "Zend/zend_language_scanner.c" -yy693: - YYDEBUG(693, *YYCURSOR); +#line 6489 "Zend/zend_language_scanner.c" +yy696: + YYDEBUG(696, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy710; - if (yych == 'n') goto yy710; + if (yych == 'N') goto yy713; + if (yych == 'n') goto yy713; goto yy187; -yy694: - YYDEBUG(694, *YYCURSOR); +yy697: + YYDEBUG(697, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy703; - if (yych == 'r') goto yy703; + if (yych == 'R') goto yy706; + if (yych == 'r') goto yy706; goto yy187; -yy695: - YYDEBUG(695, *YYCURSOR); +yy698: + YYDEBUG(698, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy696; + if (yych == 'N') goto yy699; if (yych != 'n') goto yy187; -yy696: - YYDEBUG(696, *YYCURSOR); +yy699: + YYDEBUG(699, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy697; + if (yych == 'C') goto yy700; if (yych != 'c') goto yy187; -yy697: - YYDEBUG(697, *YYCURSOR); +yy700: + YYDEBUG(700, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy698; + if (yych == 'T') goto yy701; if (yych != 't') goto yy187; -yy698: - YYDEBUG(698, *YYCURSOR); +yy701: + YYDEBUG(701, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy699; + if (yych == 'I') goto yy702; if (yych != 'i') goto yy187; -yy699: - YYDEBUG(699, *YYCURSOR); +yy702: + YYDEBUG(702, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy700; + if (yych == 'O') goto yy703; if (yych != 'o') goto yy187; -yy700: - YYDEBUG(700, *YYCURSOR); +yy703: + YYDEBUG(703, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy701; + if (yych == 'N') goto yy704; if (yych != 'n') goto yy187; -yy701: - YYDEBUG(701, *YYCURSOR); +yy704: + YYDEBUG(704, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(702, *YYCURSOR); + YYDEBUG(705, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1023 "Zend/zend_language_scanner.l" +#line 1022 "Zend/zend_language_scanner.l" { return T_FUNCTION; } -#line 6526 "Zend/zend_language_scanner.c" -yy703: - YYDEBUG(703, *YYCURSOR); +#line 6544 "Zend/zend_language_scanner.c" +yy706: + YYDEBUG(706, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy704; + if (yych <= '/') goto yy707; if (yych <= '9') goto yy186; } else { - if (yych == 'E') goto yy705; + if (yych == 'E') goto yy708; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'd') { if (yych != '`') goto yy186; } else { - if (yych <= 'e') goto yy705; + if (yych <= 'e') goto yy708; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy704: - YYDEBUG(704, *YYCURSOR); +yy707: + YYDEBUG(707, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1083 "Zend/zend_language_scanner.l" +#line 1082 "Zend/zend_language_scanner.l" { return T_FOR; } -#line 6554 "Zend/zend_language_scanner.c" -yy705: - YYDEBUG(705, *YYCURSOR); +#line 6572 "Zend/zend_language_scanner.c" +yy708: + YYDEBUG(708, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy706; + if (yych == 'A') goto yy709; if (yych != 'a') goto yy187; -yy706: - YYDEBUG(706, *YYCURSOR); +yy709: + YYDEBUG(709, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy707; + if (yych == 'C') goto yy710; if (yych != 'c') goto yy187; -yy707: - YYDEBUG(707, *YYCURSOR); +yy710: + YYDEBUG(710, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy708; + if (yych == 'H') goto yy711; if (yych != 'h') goto yy187; -yy708: - YYDEBUG(708, *YYCURSOR); +yy711: + YYDEBUG(711, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(709, *YYCURSOR); + YYDEBUG(712, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1091 "Zend/zend_language_scanner.l" +#line 1090 "Zend/zend_language_scanner.l" { return T_FOREACH; } -#line 6582 "Zend/zend_language_scanner.c" -yy710: - YYDEBUG(710, *YYCURSOR); +#line 6600 "Zend/zend_language_scanner.c" +yy713: + YYDEBUG(713, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy711; + if (yych == 'A') goto yy714; if (yych != 'a') goto yy187; -yy711: - YYDEBUG(711, *YYCURSOR); +yy714: + YYDEBUG(714, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy712; + if (yych == 'L') goto yy715; if (yych != 'l') goto yy187; -yy712: - YYDEBUG(712, *YYCURSOR); +yy715: + YYDEBUG(715, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy713; + if (yych <= '/') goto yy716; if (yych <= '9') goto yy186; } else { - if (yych == 'L') goto yy714; + if (yych == 'L') goto yy717; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'k') { if (yych != '`') goto yy186; } else { - if (yych <= 'l') goto yy714; + if (yych <= 'l') goto yy717; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy713: - YYDEBUG(713, *YYCURSOR); +yy716: + YYDEBUG(716, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1303 "Zend/zend_language_scanner.l" +#line 1306 "Zend/zend_language_scanner.l" { return T_FINAL; } -#line 6620 "Zend/zend_language_scanner.c" -yy714: - YYDEBUG(714, *YYCURSOR); +#line 6638 "Zend/zend_language_scanner.c" +yy717: + YYDEBUG(717, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy715; + if (yych == 'Y') goto yy718; if (yych != 'y') goto yy187; -yy715: - YYDEBUG(715, *YYCURSOR); +yy718: + YYDEBUG(718, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(716, *YYCURSOR); + YYDEBUG(719, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1047 "Zend/zend_language_scanner.l" +#line 1046 "Zend/zend_language_scanner.l" { return T_FINALLY; } -#line 6638 "Zend/zend_language_scanner.c" -yy717: - YYDEBUG(717, *YYCURSOR); +#line 6656 "Zend/zend_language_scanner.c" +yy720: + YYDEBUG(720, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'F') { - if (yych == 'C') goto yy723; + if (yych == 'C') goto yy726; if (yych <= 'E') goto yy187; - goto yy724; + goto yy727; } else { if (yych <= 'c') { if (yych <= 'b') goto yy187; - goto yy723; + goto yy726; } else { - if (yych == 'f') goto yy724; + if (yych == 'f') goto yy727; goto yy187; } } -yy718: - YYDEBUG(718, *YYCURSOR); +yy721: + YYDEBUG(721, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy721; - if (yych == 'e') goto yy721; + if (yych == 'E') goto yy724; + if (yych == 'e') goto yy724; goto yy187; -yy719: - YYDEBUG(719, *YYCURSOR); +yy722: + YYDEBUG(722, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(720, *YYCURSOR); + YYDEBUG(723, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1079 "Zend/zend_language_scanner.l" +#line 1078 "Zend/zend_language_scanner.l" { return T_DO; } -#line 6673 "Zend/zend_language_scanner.c" -yy721: - YYDEBUG(721, *YYCURSOR); +#line 6691 "Zend/zend_language_scanner.c" +yy724: + YYDEBUG(724, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(722, *YYCURSOR); + YYDEBUG(725, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1019 "Zend/zend_language_scanner.l" +#line 1018 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6686 "Zend/zend_language_scanner.c" -yy723: - YYDEBUG(723, *YYCURSOR); +#line 6704 "Zend/zend_language_scanner.c" +yy726: + YYDEBUG(726, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy730; - if (yych == 'l') goto yy730; + if (yych == 'L') goto yy733; + if (yych == 'l') goto yy733; goto yy187; -yy724: - YYDEBUG(724, *YYCURSOR); +yy727: + YYDEBUG(727, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy725; + if (yych == 'A') goto yy728; if (yych != 'a') goto yy187; -yy725: - YYDEBUG(725, *YYCURSOR); +yy728: + YYDEBUG(728, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy726; + if (yych == 'U') goto yy729; if (yych != 'u') goto yy187; -yy726: - YYDEBUG(726, *YYCURSOR); +yy729: + YYDEBUG(729, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy727; + if (yych == 'L') goto yy730; if (yych != 'l') goto yy187; -yy727: - YYDEBUG(727, *YYCURSOR); +yy730: + YYDEBUG(730, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy728; + if (yych == 'T') goto yy731; if (yych != 't') goto yy187; -yy728: - YYDEBUG(728, *YYCURSOR); +yy731: + YYDEBUG(731, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(729, *YYCURSOR); + YYDEBUG(732, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1127 "Zend/zend_language_scanner.l" +#line 1126 "Zend/zend_language_scanner.l" { return T_DEFAULT; } -#line 6725 "Zend/zend_language_scanner.c" -yy730: - YYDEBUG(730, *YYCURSOR); +#line 6743 "Zend/zend_language_scanner.c" +yy733: + YYDEBUG(733, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy731; + if (yych == 'A') goto yy734; if (yych != 'a') goto yy187; -yy731: - YYDEBUG(731, *YYCURSOR); +yy734: + YYDEBUG(734, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy732; + if (yych == 'R') goto yy735; if (yych != 'r') goto yy187; -yy732: - YYDEBUG(732, *YYCURSOR); +yy735: + YYDEBUG(735, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy733; + if (yych == 'E') goto yy736; if (yych != 'e') goto yy187; -yy733: - YYDEBUG(733, *YYCURSOR); +yy736: + YYDEBUG(736, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(734, *YYCURSOR); + YYDEBUG(737, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1099 "Zend/zend_language_scanner.l" +#line 1098 "Zend/zend_language_scanner.l" { return T_DECLARE; } -#line 6753 "Zend/zend_language_scanner.c" -yy735: - YYDEBUG(735, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy797; - if (yych == 'h') goto yy797; - goto yy187; -yy736: - YYDEBUG(736, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy791; - if (yych == 's') goto yy791; - goto yy187; -yy737: - YYDEBUG(737, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'P') goto yy787; - if (yych == 'p') goto yy787; - goto yy187; +#line 6771 "Zend/zend_language_scanner.c" yy738: YYDEBUG(738, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy753; - if (yych == 'd') goto yy753; + if (yych == 'H') goto yy800; + if (yych == 'h') goto yy800; goto yy187; yy739: YYDEBUG(739, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy750; - if (yych == 'a') goto yy750; + if (yych == 'S') goto yy794; + if (yych == 's') goto yy794; goto yy187; yy740: YYDEBUG(740, *YYCURSOR); yych = *++YYCURSOR; + if (yych == 'P') goto yy790; + if (yych == 'p') goto yy790; + goto yy187; +yy741: + YYDEBUG(741, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'D') goto yy756; + if (yych == 'd') goto yy756; + goto yy187; +yy742: + YYDEBUG(742, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy753; + if (yych == 'a') goto yy753; + goto yy187; +yy743: + YYDEBUG(743, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= 'T') { - if (yych == 'I') goto yy741; + if (yych == 'I') goto yy744; if (yych <= 'S') goto yy187; - goto yy742; + goto yy745; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; } else { - if (yych == 't') goto yy742; + if (yych == 't') goto yy745; goto yy187; } } -yy741: - YYDEBUG(741, *YYCURSOR); +yy744: + YYDEBUG(744, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy748; - if (yych == 't') goto yy748; + if (yych == 'T') goto yy751; + if (yych == 't') goto yy751; goto yy187; -yy742: - YYDEBUG(742, *YYCURSOR); +yy745: + YYDEBUG(745, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy743; + if (yych == 'E') goto yy746; if (yych != 'e') goto yy187; -yy743: - YYDEBUG(743, *YYCURSOR); +yy746: + YYDEBUG(746, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy744; + if (yych == 'N') goto yy747; if (yych != 'n') goto yy187; -yy744: - YYDEBUG(744, *YYCURSOR); +yy747: + YYDEBUG(747, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy745; + if (yych == 'D') goto yy748; if (yych != 'd') goto yy187; -yy745: - YYDEBUG(745, *YYCURSOR); +yy748: + YYDEBUG(748, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy746; + if (yych == 'S') goto yy749; if (yych != 's') goto yy187; -yy746: - YYDEBUG(746, *YYCURSOR); +yy749: + YYDEBUG(749, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(747, *YYCURSOR); + YYDEBUG(750, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1163 "Zend/zend_language_scanner.l" +#line 1162 "Zend/zend_language_scanner.l" { return T_EXTENDS; } -#line 6837 "Zend/zend_language_scanner.c" -yy748: - YYDEBUG(748, *YYCURSOR); +#line 6855 "Zend/zend_language_scanner.c" +yy751: + YYDEBUG(751, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(749, *YYCURSOR); + YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1015 "Zend/zend_language_scanner.l" +#line 1014 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6850 "Zend/zend_language_scanner.c" -yy750: - YYDEBUG(750, *YYCURSOR); +#line 6868 "Zend/zend_language_scanner.c" +yy753: + YYDEBUG(753, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy751; + if (yych == 'L') goto yy754; if (yych != 'l') goto yy187; -yy751: - YYDEBUG(751, *YYCURSOR); +yy754: + YYDEBUG(754, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(752, *YYCURSOR); + YYDEBUG(755, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1247 "Zend/zend_language_scanner.l" +#line 1250 "Zend/zend_language_scanner.l" { return T_EVAL; } -#line 6868 "Zend/zend_language_scanner.c" -yy753: - YYDEBUG(753, *YYCURSOR); +#line 6886 "Zend/zend_language_scanner.c" +yy756: + YYDEBUG(756, *YYCURSOR); yych = *++YYCURSOR; YYDEBUG(-1, yych); switch (yych) { case 'D': - case 'd': goto yy754; + case 'd': goto yy757; case 'F': - case 'f': goto yy755; + case 'f': goto yy758; case 'I': - case 'i': goto yy756; + case 'i': goto yy759; case 'S': - case 's': goto yy757; + case 's': goto yy760; case 'W': - case 'w': goto yy758; + case 'w': goto yy761; default: goto yy187; } -yy754: - YYDEBUG(754, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy780; - if (yych == 'e') goto yy780; - goto yy187; -yy755: - YYDEBUG(755, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy772; - if (yych == 'o') goto yy772; - goto yy187; -yy756: - YYDEBUG(756, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy770; - if (yych == 'f') goto yy770; - goto yy187; yy757: YYDEBUG(757, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy764; - if (yych == 'w') goto yy764; + if (yych == 'E') goto yy783; + if (yych == 'e') goto yy783; goto yy187; yy758: YYDEBUG(758, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy759; - if (yych != 'h') goto yy187; + if (yych == 'O') goto yy775; + if (yych == 'o') goto yy775; + goto yy187; yy759: YYDEBUG(759, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy760; - if (yych != 'i') goto yy187; + if (yych == 'F') goto yy773; + if (yych == 'f') goto yy773; + goto yy187; yy760: YYDEBUG(760, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy761; - if (yych != 'l') goto yy187; + if (yych == 'W') goto yy767; + if (yych == 'w') goto yy767; + goto yy187; yy761: YYDEBUG(761, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy762; - if (yych != 'e') goto yy187; + if (yych == 'H') goto yy762; + if (yych != 'h') goto yy187; yy762: YYDEBUG(762, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy763; + if (yych != 'i') goto yy187; +yy763: + YYDEBUG(763, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy764; + if (yych != 'l') goto yy187; +yy764: + YYDEBUG(764, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy765; + if (yych != 'e') goto yy187; +yy765: + YYDEBUG(765, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(763, *YYCURSOR); + YYDEBUG(766, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1075 "Zend/zend_language_scanner.l" +#line 1074 "Zend/zend_language_scanner.l" { return T_ENDWHILE; } -#line 6942 "Zend/zend_language_scanner.c" -yy764: - YYDEBUG(764, *YYCURSOR); +#line 6960 "Zend/zend_language_scanner.c" +yy767: + YYDEBUG(767, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy765; + if (yych == 'I') goto yy768; if (yych != 'i') goto yy187; -yy765: - YYDEBUG(765, *YYCURSOR); +yy768: + YYDEBUG(768, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy766; + if (yych == 'T') goto yy769; if (yych != 't') goto yy187; -yy766: - YYDEBUG(766, *YYCURSOR); +yy769: + YYDEBUG(769, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy767; + if (yych == 'C') goto yy770; if (yych != 'c') goto yy187; -yy767: - YYDEBUG(767, *YYCURSOR); +yy770: + YYDEBUG(770, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy768; + if (yych == 'H') goto yy771; if (yych != 'h') goto yy187; -yy768: - YYDEBUG(768, *YYCURSOR); +yy771: + YYDEBUG(771, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(769, *YYCURSOR); + YYDEBUG(772, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1119 "Zend/zend_language_scanner.l" +#line 1118 "Zend/zend_language_scanner.l" { return T_ENDSWITCH; } -#line 6975 "Zend/zend_language_scanner.c" -yy770: - YYDEBUG(770, *YYCURSOR); +#line 6993 "Zend/zend_language_scanner.c" +yy773: + YYDEBUG(773, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(771, *YYCURSOR); + YYDEBUG(774, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1063 "Zend/zend_language_scanner.l" +#line 1062 "Zend/zend_language_scanner.l" { return T_ENDIF; } -#line 6988 "Zend/zend_language_scanner.c" -yy772: - YYDEBUG(772, *YYCURSOR); +#line 7006 "Zend/zend_language_scanner.c" +yy775: + YYDEBUG(775, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy773; + if (yych == 'R') goto yy776; if (yych != 'r') goto yy187; -yy773: - YYDEBUG(773, *YYCURSOR); +yy776: + YYDEBUG(776, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy774; + if (yych <= '/') goto yy777; if (yych <= '9') goto yy186; } else { - if (yych == 'E') goto yy775; + if (yych == 'E') goto yy778; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'd') { if (yych != '`') goto yy186; } else { - if (yych <= 'e') goto yy775; + if (yych <= 'e') goto yy778; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy774: - YYDEBUG(774, *YYCURSOR); +yy777: + YYDEBUG(777, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1087 "Zend/zend_language_scanner.l" +#line 1086 "Zend/zend_language_scanner.l" { return T_ENDFOR; } -#line 7021 "Zend/zend_language_scanner.c" -yy775: - YYDEBUG(775, *YYCURSOR); +#line 7039 "Zend/zend_language_scanner.c" +yy778: + YYDEBUG(778, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy776; + if (yych == 'A') goto yy779; if (yych != 'a') goto yy187; -yy776: - YYDEBUG(776, *YYCURSOR); +yy779: + YYDEBUG(779, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy777; + if (yych == 'C') goto yy780; if (yych != 'c') goto yy187; -yy777: - YYDEBUG(777, *YYCURSOR); +yy780: + YYDEBUG(780, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy778; + if (yych == 'H') goto yy781; if (yych != 'h') goto yy187; -yy778: - YYDEBUG(778, *YYCURSOR); +yy781: + YYDEBUG(781, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(779, *YYCURSOR); + YYDEBUG(782, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1095 "Zend/zend_language_scanner.l" +#line 1094 "Zend/zend_language_scanner.l" { return T_ENDFOREACH; } -#line 7049 "Zend/zend_language_scanner.c" -yy780: - YYDEBUG(780, *YYCURSOR); +#line 7067 "Zend/zend_language_scanner.c" +yy783: + YYDEBUG(783, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy781; + if (yych == 'C') goto yy784; if (yych != 'c') goto yy187; -yy781: - YYDEBUG(781, *YYCURSOR); +yy784: + YYDEBUG(784, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy782; + if (yych == 'L') goto yy785; if (yych != 'l') goto yy187; -yy782: - YYDEBUG(782, *YYCURSOR); +yy785: + YYDEBUG(785, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy783; + if (yych == 'A') goto yy786; if (yych != 'a') goto yy187; -yy783: - YYDEBUG(783, *YYCURSOR); +yy786: + YYDEBUG(786, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy784; + if (yych == 'R') goto yy787; if (yych != 'r') goto yy187; -yy784: - YYDEBUG(784, *YYCURSOR); +yy787: + YYDEBUG(787, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy785; + if (yych == 'E') goto yy788; if (yych != 'e') goto yy187; -yy785: - YYDEBUG(785, *YYCURSOR); +yy788: + YYDEBUG(788, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(786, *YYCURSOR); + YYDEBUG(789, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1103 "Zend/zend_language_scanner.l" +#line 1102 "Zend/zend_language_scanner.l" { return T_ENDDECLARE; } -#line 7087 "Zend/zend_language_scanner.c" -yy787: - YYDEBUG(787, *YYCURSOR); +#line 7105 "Zend/zend_language_scanner.c" +yy790: + YYDEBUG(790, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy788; + if (yych == 'T') goto yy791; if (yych != 't') goto yy187; -yy788: - YYDEBUG(788, *YYCURSOR); +yy791: + YYDEBUG(791, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy789; + if (yych == 'Y') goto yy792; if (yych != 'y') goto yy187; -yy789: - YYDEBUG(789, *YYCURSOR); +yy792: + YYDEBUG(792, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(790, *YYCURSOR); + YYDEBUG(793, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1287 "Zend/zend_language_scanner.l" +#line 1290 "Zend/zend_language_scanner.l" { return T_EMPTY; } -#line 7110 "Zend/zend_language_scanner.c" -yy791: - YYDEBUG(791, *YYCURSOR); +#line 7128 "Zend/zend_language_scanner.c" +yy794: + YYDEBUG(794, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy792; + if (yych == 'E') goto yy795; if (yych != 'e') goto yy187; -yy792: - YYDEBUG(792, *YYCURSOR); +yy795: + YYDEBUG(795, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy793; + if (yych <= '/') goto yy796; if (yych <= '9') goto yy186; } else { - if (yych == 'I') goto yy794; + if (yych == 'I') goto yy797; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'h') { if (yych != '`') goto yy186; } else { - if (yych <= 'i') goto yy794; + if (yych <= 'i') goto yy797; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy793: - YYDEBUG(793, *YYCURSOR); +yy796: + YYDEBUG(796, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1067 "Zend/zend_language_scanner.l" +#line 1066 "Zend/zend_language_scanner.l" { return T_ELSE; } -#line 7143 "Zend/zend_language_scanner.c" -yy794: - YYDEBUG(794, *YYCURSOR); +#line 7161 "Zend/zend_language_scanner.c" +yy797: + YYDEBUG(797, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy795; + if (yych == 'F') goto yy798; if (yych != 'f') goto yy187; -yy795: - YYDEBUG(795, *YYCURSOR); +yy798: + YYDEBUG(798, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(796, *YYCURSOR); + YYDEBUG(799, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1059 "Zend/zend_language_scanner.l" +#line 1058 "Zend/zend_language_scanner.l" { return T_ELSEIF; } -#line 7161 "Zend/zend_language_scanner.c" -yy797: - YYDEBUG(797, *YYCURSOR); +#line 7179 "Zend/zend_language_scanner.c" +yy800: + YYDEBUG(800, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy798; + if (yych == 'O') goto yy801; if (yych != 'o') goto yy187; -yy798: - YYDEBUG(798, *YYCURSOR); +yy801: + YYDEBUG(801, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(799, *YYCURSOR); + YYDEBUG(802, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1143 "Zend/zend_language_scanner.l" +#line 1142 "Zend/zend_language_scanner.l" { return T_ECHO; } -#line 7179 "Zend/zend_language_scanner.c" +#line 7197 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: @@ -7214,113 +7232,113 @@ int lex_scan(zval *zendlval TSRMLS_DC) 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, }; - YYDEBUG(800, *YYCURSOR); + YYDEBUG(803, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '-') { if (yych <= '\r') { - if (yych <= 0x08) goto yy808; - if (yych <= '\n') goto yy802; - if (yych <= '\f') goto yy808; + if (yych <= 0x08) goto yy811; + if (yych <= '\n') goto yy805; + if (yych <= '\f') goto yy811; } else { - if (yych == ' ') goto yy802; - if (yych <= ',') goto yy808; - goto yy804; + if (yych == ' ') goto yy805; + if (yych <= ',') goto yy811; + goto yy807; } } else { if (yych <= '_') { - if (yych <= '@') goto yy808; - if (yych <= 'Z') goto yy806; - if (yych <= '^') goto yy808; - goto yy806; + if (yych <= '@') goto yy811; + if (yych <= 'Z') goto yy809; + if (yych <= '^') goto yy811; + goto yy809; } else { - if (yych <= '`') goto yy808; - if (yych <= 'z') goto yy806; - if (yych <= '~') goto yy808; - goto yy806; + if (yych <= '`') goto yy811; + if (yych <= 'z') goto yy809; + if (yych <= '~') goto yy811; + goto yy809; } } -yy802: - YYDEBUG(802, *YYCURSOR); +yy805: + YYDEBUG(805, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy814; -yy803: - YYDEBUG(803, *YYCURSOR); + goto yy817; +yy806: + YYDEBUG(806, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1176 "Zend/zend_language_scanner.l" +#line 1175 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 7258 "Zend/zend_language_scanner.c" -yy804: - YYDEBUG(804, *YYCURSOR); +#line 7276 "Zend/zend_language_scanner.c" +yy807: + YYDEBUG(807, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '>') goto yy811; -yy805: - YYDEBUG(805, *YYCURSOR); + if ((yych = *YYCURSOR) == '>') goto yy814; +yy808: + YYDEBUG(808, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1193 "Zend/zend_language_scanner.l" +#line 1192 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); goto restart; } -#line 7272 "Zend/zend_language_scanner.c" -yy806: - YYDEBUG(806, *YYCURSOR); +#line 7290 "Zend/zend_language_scanner.c" +yy809: + YYDEBUG(809, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy810; -yy807: - YYDEBUG(807, *YYCURSOR); + goto yy813; +yy810: + YYDEBUG(810, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1186 "Zend/zend_language_scanner.l" +#line 1185 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7288 "Zend/zend_language_scanner.c" -yy808: - YYDEBUG(808, *YYCURSOR); +#line 7306 "Zend/zend_language_scanner.c" +yy811: + YYDEBUG(811, *YYCURSOR); yych = *++YYCURSOR; - goto yy805; -yy809: - YYDEBUG(809, *YYCURSOR); + goto yy808; +yy812: + YYDEBUG(812, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy810: - YYDEBUG(810, *YYCURSOR); +yy813: + YYDEBUG(813, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy809; + goto yy812; } - goto yy807; -yy811: - YYDEBUG(811, *YYCURSOR); + goto yy810; +yy814: + YYDEBUG(814, *YYCURSOR); ++YYCURSOR; - YYDEBUG(812, *YYCURSOR); + YYDEBUG(815, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1182 "Zend/zend_language_scanner.l" +#line 1181 "Zend/zend_language_scanner.l" { return T_OBJECT_OPERATOR; } -#line 7313 "Zend/zend_language_scanner.c" -yy813: - YYDEBUG(813, *YYCURSOR); +#line 7331 "Zend/zend_language_scanner.c" +yy816: + YYDEBUG(816, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy814: - YYDEBUG(814, *YYCURSOR); +yy817: + YYDEBUG(817, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy813; + goto yy816; } - goto yy803; + goto yy806; } /* *********************************** */ yyc_ST_LOOKING_FOR_VARNAME: @@ -7359,74 +7377,74 @@ int lex_scan(zval *zendlval TSRMLS_DC) 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(815, *YYCURSOR); + YYDEBUG(818, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy819; - if (yych <= 'Z') goto yy817; - if (yych <= '^') goto yy819; + if (yych <= '@') goto yy822; + if (yych <= 'Z') goto yy820; + if (yych <= '^') goto yy822; } else { - if (yych <= '`') goto yy819; - if (yych <= 'z') goto yy817; - if (yych <= '~') goto yy819; + if (yych <= '`') goto yy822; + if (yych <= 'z') goto yy820; + if (yych <= '~') goto yy822; } -yy817: - YYDEBUG(817, *YYCURSOR); +yy820: + YYDEBUG(820, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '_') { if (yych <= '@') { - if (yych <= '/') goto yy818; - if (yych <= '9') goto yy821; + if (yych <= '/') goto yy821; + if (yych <= '9') goto yy824; } else { - if (yych <= '[') goto yy821; - if (yych >= '_') goto yy821; + if (yych <= '[') goto yy824; + if (yych >= '_') goto yy824; } } else { if (yych <= '|') { - if (yych <= '`') goto yy818; - if (yych <= 'z') goto yy821; + if (yych <= '`') goto yy821; + if (yych <= 'z') goto yy824; } else { - if (yych != '~') goto yy821; + if (yych != '~') goto yy824; } } -yy818: - YYDEBUG(818, *YYCURSOR); +yy821: + YYDEBUG(821, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1479 "Zend/zend_language_scanner.l" +#line 1482 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); goto restart; } -#line 7405 "Zend/zend_language_scanner.c" -yy819: - YYDEBUG(819, *YYCURSOR); +#line 7423 "Zend/zend_language_scanner.c" +yy822: + YYDEBUG(822, *YYCURSOR); yych = *++YYCURSOR; - goto yy818; -yy820: - YYDEBUG(820, *YYCURSOR); + goto yy821; +yy823: + YYDEBUG(823, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy821: - YYDEBUG(821, *YYCURSOR); +yy824: + YYDEBUG(824, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy820; + goto yy823; } - if (yych == '[') goto yy823; - if (yych == '}') goto yy823; - YYDEBUG(822, *YYCURSOR); + if (yych == '[') goto yy826; + if (yych == '}') goto yy826; + YYDEBUG(825, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy818; -yy823: - YYDEBUG(823, *YYCURSOR); + goto yy821; +yy826: + YYDEBUG(826, *YYCURSOR); ++YYCURSOR; - YYDEBUG(824, *YYCURSOR); + YYDEBUG(827, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1469 "Zend/zend_language_scanner.l" +#line 1472 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); zend_copy_value(zendlval, yytext, yyleng); @@ -7435,18 +7453,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return T_STRING_VARNAME; } -#line 7439 "Zend/zend_language_scanner.c" +#line 7457 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_NOWDOC: - YYDEBUG(825, *YYCURSOR); + YYDEBUG(828, *YYCURSOR); YYFILL(1); yych = *YYCURSOR; - YYDEBUG(827, *YYCURSOR); + YYDEBUG(830, *YYCURSOR); ++YYCURSOR; - YYDEBUG(828, *YYCURSOR); + YYDEBUG(831, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2299 "Zend/zend_language_scanner.l" +#line 2302 "Zend/zend_language_scanner.l" { int newline = 0; @@ -7503,7 +7521,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) HANDLE_NEWLINES(yytext, yyleng - newline); return T_ENCAPSED_AND_WHITESPACE; } -#line 7507 "Zend/zend_language_scanner.c" +#line 7525 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7541,76 +7559,76 @@ int lex_scan(zval *zendlval TSRMLS_DC) 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }; - YYDEBUG(829, *YYCURSOR); + YYDEBUG(832, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '/') { if (yych <= ' ') { if (yych <= '\f') { - if (yych <= 0x08) goto yy843; - if (yych <= '\n') goto yy839; - goto yy843; + if (yych <= 0x08) goto yy846; + if (yych <= '\n') goto yy842; + goto yy846; } else { - if (yych <= '\r') goto yy839; - if (yych <= 0x1F) goto yy843; - goto yy839; + if (yych <= '\r') goto yy842; + if (yych <= 0x1F) goto yy846; + goto yy842; } } else { if (yych <= '$') { - if (yych <= '"') goto yy838; - if (yych <= '#') goto yy839; - goto yy834; + if (yych <= '"') goto yy841; + if (yych <= '#') goto yy842; + goto yy837; } else { - if (yych == '\'') goto yy839; - goto yy838; + if (yych == '\'') goto yy842; + goto yy841; } } } else { if (yych <= '\\') { if (yych <= '@') { - if (yych <= '0') goto yy831; - if (yych <= '9') goto yy833; - goto yy838; + if (yych <= '0') goto yy834; + if (yych <= '9') goto yy836; + goto yy841; } else { - if (yych <= 'Z') goto yy841; - if (yych <= '[') goto yy838; - goto yy839; + if (yych <= 'Z') goto yy844; + if (yych <= '[') goto yy841; + goto yy842; } } else { if (yych <= '_') { - if (yych <= ']') goto yy836; - if (yych <= '^') goto yy838; - goto yy841; + if (yych <= ']') goto yy839; + if (yych <= '^') goto yy841; + goto yy844; } else { - if (yych <= '`') goto yy838; - if (yych <= 'z') goto yy841; - if (yych <= '~') goto yy838; - goto yy841; + if (yych <= '`') goto yy841; + if (yych <= 'z') goto yy844; + if (yych <= '~') goto yy841; + goto yy844; } } } -yy831: - YYDEBUG(831, *YYCURSOR); +yy834: + YYDEBUG(834, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { if (yych <= '9') { - if (yych >= '0') goto yy855; + if (yych >= '0') goto yy858; } else { - if (yych == 'B') goto yy852; + if (yych == 'B') goto yy855; } } else { if (yych <= 'b') { - if (yych <= 'X') goto yy854; - if (yych >= 'b') goto yy852; + if (yych <= 'X') goto yy857; + if (yych >= 'b') goto yy855; } else { - if (yych == 'x') goto yy854; + if (yych == 'x') goto yy857; } } -yy832: - YYDEBUG(832, *YYCURSOR); +yy835: + YYDEBUG(835, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1555 "Zend/zend_language_scanner.l" +#line 1558 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { ZVAL_LONG(zendlval, strtol(yytext, NULL, 10)); @@ -7619,81 +7637,81 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NUM_STRING; } -#line 7623 "Zend/zend_language_scanner.c" -yy833: - YYDEBUG(833, *YYCURSOR); +#line 7641 "Zend/zend_language_scanner.c" +yy836: + YYDEBUG(836, *YYCURSOR); yych = *++YYCURSOR; - goto yy851; -yy834: - YYDEBUG(834, *YYCURSOR); + goto yy854; +yy837: + YYDEBUG(837, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '_') { - if (yych <= '@') goto yy835; - if (yych <= 'Z') goto yy847; - if (yych >= '_') goto yy847; + if (yych <= '@') goto yy838; + if (yych <= 'Z') goto yy850; + if (yych >= '_') goto yy850; } else { - if (yych <= '`') goto yy835; - if (yych <= 'z') goto yy847; - if (yych >= 0x7F) goto yy847; + if (yych <= '`') goto yy838; + if (yych <= 'z') goto yy850; + if (yych >= 0x7F) goto yy850; } -yy835: - YYDEBUG(835, *YYCURSOR); +yy838: + YYDEBUG(838, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1831 "Zend/zend_language_scanner.l" +#line 1834 "Zend/zend_language_scanner.l" { /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ return yytext[0]; } -#line 7648 "Zend/zend_language_scanner.c" -yy836: - YYDEBUG(836, *YYCURSOR); +#line 7666 "Zend/zend_language_scanner.c" +yy839: + YYDEBUG(839, *YYCURSOR); ++YYCURSOR; - YYDEBUG(837, *YYCURSOR); + YYDEBUG(840, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1826 "Zend/zend_language_scanner.l" +#line 1829 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); return ']'; } -#line 7659 "Zend/zend_language_scanner.c" -yy838: - YYDEBUG(838, *YYCURSOR); +#line 7677 "Zend/zend_language_scanner.c" +yy841: + YYDEBUG(841, *YYCURSOR); yych = *++YYCURSOR; - goto yy835; -yy839: - YYDEBUG(839, *YYCURSOR); + goto yy838; +yy842: + YYDEBUG(842, *YYCURSOR); ++YYCURSOR; - YYDEBUG(840, *YYCURSOR); + YYDEBUG(843, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1836 "Zend/zend_language_scanner.l" +#line 1839 "Zend/zend_language_scanner.l" { /* Invalid rule to return a more explicit parse error with proper line number */ yyless(0); yy_pop_state(TSRMLS_C); return T_ENCAPSED_AND_WHITESPACE; } -#line 7676 "Zend/zend_language_scanner.c" -yy841: - YYDEBUG(841, *YYCURSOR); +#line 7694 "Zend/zend_language_scanner.c" +yy844: + YYDEBUG(844, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy846; -yy842: - YYDEBUG(842, *YYCURSOR); + goto yy849; +yy845: + YYDEBUG(845, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1843 "Zend/zend_language_scanner.l" +#line 1846 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7691 "Zend/zend_language_scanner.c" -yy843: - YYDEBUG(843, *YYCURSOR); +#line 7709 "Zend/zend_language_scanner.c" +yy846: + YYDEBUG(846, *YYCURSOR); ++YYCURSOR; - YYDEBUG(844, *YYCURSOR); + YYDEBUG(847, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2357 "Zend/zend_language_scanner.l" +#line 2360 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -7702,116 +7720,116 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7706 "Zend/zend_language_scanner.c" -yy845: - YYDEBUG(845, *YYCURSOR); +#line 7724 "Zend/zend_language_scanner.c" +yy848: + YYDEBUG(848, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy846: - YYDEBUG(846, *YYCURSOR); +yy849: + YYDEBUG(849, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy845; + goto yy848; } - goto yy842; -yy847: - YYDEBUG(847, *YYCURSOR); + goto yy845; +yy850: + YYDEBUG(850, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(848, *YYCURSOR); + YYDEBUG(851, *YYCURSOR); if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy847; + if (yych >= '0') goto yy850; } else { - if (yych <= '@') goto yy849; - if (yych <= 'Z') goto yy847; + if (yych <= '@') goto yy852; + if (yych <= 'Z') goto yy850; } } else { if (yych <= '`') { - if (yych <= '_') goto yy847; + if (yych <= '_') goto yy850; } else { - if (yych <= 'z') goto yy847; - if (yych >= 0x7F) goto yy847; + if (yych <= 'z') goto yy850; + if (yych >= 0x7F) goto yy850; } } -yy849: - YYDEBUG(849, *YYCURSOR); +yy852: + YYDEBUG(852, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 7748 "Zend/zend_language_scanner.c" -yy850: - YYDEBUG(850, *YYCURSOR); +#line 7766 "Zend/zend_language_scanner.c" +yy853: + YYDEBUG(853, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy851: - YYDEBUG(851, *YYCURSOR); +yy854: + YYDEBUG(854, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy850; + goto yy853; } - goto yy832; -yy852: - YYDEBUG(852, *YYCURSOR); + goto yy835; +yy855: + YYDEBUG(855, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy860; + goto yy863; } -yy853: - YYDEBUG(853, *YYCURSOR); +yy856: + YYDEBUG(856, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy832; -yy854: - YYDEBUG(854, *YYCURSOR); + goto yy835; +yy857: + YYDEBUG(857, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy858; + goto yy861; } - goto yy853; -yy855: - YYDEBUG(855, *YYCURSOR); + goto yy856; +yy858: + YYDEBUG(858, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(856, *YYCURSOR); - if (yych <= '/') goto yy857; - if (yych <= '9') goto yy855; -yy857: - YYDEBUG(857, *YYCURSOR); + YYDEBUG(859, *YYCURSOR); + if (yych <= '/') goto yy860; + if (yych <= '9') goto yy858; +yy860: + YYDEBUG(860, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1564 "Zend/zend_language_scanner.l" +#line 1567 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ ZVAL_STRINGL(zendlval, yytext, yyleng, 1); return T_NUM_STRING; } -#line 7793 "Zend/zend_language_scanner.c" -yy858: - YYDEBUG(858, *YYCURSOR); +#line 7811 "Zend/zend_language_scanner.c" +yy861: + YYDEBUG(861, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(859, *YYCURSOR); + YYDEBUG(862, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy858; + goto yy861; } - goto yy857; -yy860: - YYDEBUG(860, *YYCURSOR); + goto yy860; +yy863: + YYDEBUG(863, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(861, *YYCURSOR); + YYDEBUG(864, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy860; + goto yy863; } - goto yy857; + goto yy860; } } -#line 2366 "Zend/zend_language_scanner.l" +#line 2369 "Zend/zend_language_scanner.l" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index f9c421fe8805a..f620cb8b4695b 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1011,7 +1011,6 @@ NEWLINE ("\r"|"\n"|"\r\n") /* compute yyleng before each rule */ := yyleng = YYCURSOR - SCNG(yy_text); - "exit" { return T_EXIT; } @@ -1204,6 +1203,10 @@ NEWLINE ("\r"|"\n"|"\r\n") return T_NS_SEPARATOR; } +"..." { + return T_ELLIPSIS; +} + "new" { return T_NEW; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4621b47e0e69e..3a513215b2808 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3279,6 +3279,37 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST) ZEND_VM_NEXT_OPCODE(); } +ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY) +{ + USE_OPLINE + zend_uint arg_num = opline->op1.num; + zend_uint arg_count = zend_vm_stack_get_args_count(TSRMLS_C); + zval **var_ptr, *params; + + SAVE_OPLINE(); + + var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC); + Z_DELREF_PP(var_ptr); + MAKE_STD_ZVAL(params); + *var_ptr = params; + + if (arg_num <= arg_count) { + array_init_size(params, arg_count - arg_num + 1); + } else { + array_init(params); + } + + for (; arg_num <= arg_count; ++arg_num) { + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); + zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC); + zend_hash_next_index_insert(Z_ARRVAL_P(params), param, sizeof(zval *), NULL); + Z_ADDREF_PP(param); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMP|VAR|CV, ANY) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 677cabe2a947f..7774e9654f147 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -742,6 +742,37 @@ static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_uint arg_num = opline->op1.num; + zend_uint arg_count = zend_vm_stack_get_args_count(TSRMLS_C); + zval **var_ptr, *params; + + SAVE_OPLINE(); + + var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC); + Z_DELREF_PP(var_ptr); + MAKE_STD_ZVAL(params); + *var_ptr = params; + + if (arg_num <= arg_count) { + array_init_size(params, arg_count - arg_num + 1); + } else { + array_init(params); + } + + for (; arg_num <= arg_count; ++arg_num) { + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); + zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC); + zend_hash_next_index_insert(Z_ARRVAL_P(params), param, sizeof(zval *), NULL); + Z_ADDREF_PP(param); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -44895,6 +44926,31 @@ void zend_init_opcodes_handlers(void) ZEND_FAST_RET_SPEC_HANDLER, ZEND_FAST_RET_SPEC_HANDLER, ZEND_FAST_RET_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, ZEND_NULL_HANDLER }; zend_opcode_handlers = (opcode_handler_t*)labels; diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 859258a440bef..7624ec192d7e6 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -164,3 +164,4 @@ #define ZEND_GENERATOR_RETURN 161 #define ZEND_FAST_CALL 162 #define ZEND_FAST_RET 163 +#define ZEND_RECV_VARIADIC 164 diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 4e430b6ea2364..168b133c6429f 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -402,10 +402,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_kana, 0, 0, 1) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_variables, 1, 0, 3) +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_variables, 0, 0, 3) ZEND_ARG_INFO(0, to) ZEND_ARG_INFO(0, from) - ZEND_ARG_INFO(1, ...) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_encode_numericentity, 0, 0, 2) diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c index 6f2e404087843..eb94ff65bbebf 100644 --- a/ext/mysqli/mysqli_fe.c +++ b/ext/mysqli/mysqli_fe.c @@ -43,23 +43,28 @@ #define MYSQLI_ZEND_ARG_OBJ_INFO_STMT() ZEND_ARG_INFO(0, stmt) #endif -ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_result, 1) +ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_result, 0) MYSQLI_ZEND_ARG_OBJ_INFO_STMT() + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_param, 1) +ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_param, 0) MYSQLI_ZEND_ARG_OBJ_INFO_STMT() ZEND_ARG_INFO(0, types) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_result, 1) +ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_result, 0) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_param, 1) +ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_param, 0) ZEND_ARG_INFO(0, types) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(all_args_force_by_ref, 1) +ZEND_BEGIN_ARG_INFO(all_args_force_by_ref, 0) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_poll, 0, 0, 4) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 1c34cffbf76e7..a4e661e3f897a 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -1899,7 +1899,7 @@ static void zend_jmp_optimization(zend_code_block *block, zend_op_array *op_arra #endif /* Find a set of variables which are used outside of the block where they are - * defined. We won't apply some optimization patterns for sush variables. */ + * defined. We won't apply some optimization patterns for such variables. */ static void zend_t_usage(zend_code_block *block, zend_op_array *op_array, char *used_ext) { zend_code_block *next_block = block->next; @@ -1931,6 +1931,7 @@ static void zend_t_usage(zend_code_block *block, zend_op_array *op_array, char * if (RESULT_USED(opline)) { if (!defined_here[VAR_NUM(ZEND_RESULT(opline).var)] && !used_ext[VAR_NUM(ZEND_RESULT(opline).var)] && (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT || + opline->opcode == ZEND_RECV_VARIADIC || (opline->opcode == ZEND_OP_DATA && ZEND_RESULT_TYPE(opline) == IS_TMP_VAR) || opline->opcode == ZEND_ADD_ARRAY_ELEMENT)) { /* these opcodes use the result as argument */ @@ -2015,6 +2016,7 @@ static void zend_t_usage(zend_code_block *block, zend_op_array *op_array, char * if (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT || + opline->opcode == ZEND_RECV_VARIADIC || opline->opcode == ZEND_ADD_ARRAY_ELEMENT) { if (ZEND_OP1_TYPE(opline) == IS_VAR || ZEND_OP1_TYPE(opline) == IS_TMP_VAR) { usage[VAR_NUM(ZEND_RESULT(opline).var)] = 1; diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index aec388c03f5d9..ee74e8592837e 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1328,16 +1328,12 @@ int pdo_hash_methods(pdo_dbh_t *dbh, int kind TSRMLS_DC) } else { ifunc->required_num_args = info->required_num_args; } - if (info->pass_rest_by_reference) { - if (info->pass_rest_by_reference == ZEND_SEND_PREFER_REF) { - ifunc->fn_flags |= ZEND_ACC_PASS_REST_PREFER_REF; - } else { - ifunc->fn_flags |= ZEND_ACC_PASS_REST_BY_REFERENCE; - } - } if (info->return_reference) { ifunc->fn_flags |= ZEND_ACC_RETURN_REFERENCE; } + if (funcs->arg_info[funcs->num_args].is_variadic) { + ifunc->fn_flags |= ZEND_ACC_VARIADIC; + } } else { ifunc->arg_info = NULL; ifunc->num_args = 0; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b1f7484f243ca..cc148b39c5663 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -681,8 +681,8 @@ static zend_op* _get_recv_op(zend_op_array *op_array, zend_uint offset) ++offset; while (op < end) { - if ((op->opcode == ZEND_RECV || op->opcode == ZEND_RECV_INIT) - && op->op1.num == (long)offset) + if ((op->opcode == ZEND_RECV || op->opcode == ZEND_RECV_INIT + || op->opcode == ZEND_RECV_VARIADIC) && op->op1.num == (long)offset) { return op; } @@ -715,6 +715,9 @@ static void _parameter_string(string *str, zend_function *fptr, struct _zend_arg if (arg_info->pass_by_reference) { string_write(str, "&", sizeof("&")-1); } + if (arg_info->is_variadic) { + string_write(str, "...", sizeof("...")-1); + } if (arg_info->name) { string_printf(str, "$%s", arg_info->name); } else { @@ -2652,6 +2655,22 @@ ZEND_METHOD(reflection_parameter, getDefaultValueConstantName) } /* }}} */ +/* {{{ proto public bool ReflectionParameter::isVariadic() + Returns whether this parameter is a variadic parameter */ +ZEND_METHOD(reflection_parameter, isVariadic) +{ + reflection_object *intern; + parameter_reference *param; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + GET_REFLECTION_OBJECT_PTR(param); + + RETVAL_BOOL(param->arg_info->is_variadic); +} +/* }}} */ + /* {{{ proto public static mixed ReflectionMethod::export(mixed class, string name [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_method, export) @@ -3095,6 +3114,14 @@ ZEND_METHOD(reflection_function, isGenerator) } /* }}} */ +/* {{{ proto public bool ReflectionFunction::isVariadic() + Returns whether this function is variadic */ +ZEND_METHOD(reflection_function, isVariadic) +{ + _function_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_VARIADIC); +} +/* }}} */ + /* {{{ proto public bool ReflectionFunction::inNamespace() Returns whether this function is defined in namespace */ ZEND_METHOD(reflection_function, inNamespace) @@ -5720,6 +5747,7 @@ static const zend_function_entry reflection_function_abstract_functions[] = { ZEND_ME(reflection_function, isInternal, arginfo_reflection__void, 0) ZEND_ME(reflection_function, isUserDefined, arginfo_reflection__void, 0) ZEND_ME(reflection_function, isGenerator, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, isVariadic, arginfo_reflection__void, 0) ZEND_ME(reflection_function, getClosureThis, arginfo_reflection__void, 0) ZEND_ME(reflection_function, getClosureScopeClass, arginfo_reflection__void, 0) ZEND_ME(reflection_function, getDocComment, arginfo_reflection__void, 0) @@ -6022,6 +6050,7 @@ static const zend_function_entry reflection_parameter_functions[] = { ZEND_ME(reflection_parameter, getDefaultValue, arginfo_reflection__void, 0) ZEND_ME(reflection_parameter, isDefaultValueConstant, arginfo_reflection__void, 0) ZEND_ME(reflection_parameter, getDefaultValueConstantName, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, isVariadic, arginfo_reflection__void, 0) PHP_FE_END }; diff --git a/ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt b/ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt new file mode 100644 index 0000000000000..50b6bb495e449 --- /dev/null +++ b/ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt @@ -0,0 +1,18 @@ +--TEST-- +ReflectionFunction::isVariadic() +--FILE-- +isVariadic()); +var_dump((new ReflectionFunction('test2'))->isVariadic()); +var_dump((new ReflectionFunction('test3'))->isVariadic()); + +?> +--EXPECT-- +bool(false) +bool(true) +bool(true) diff --git a/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt b/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt index 82c62001226b2..4772f6548dcae 100644 --- a/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt +++ b/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt @@ -61,6 +61,10 @@ Name: SORT_REGULAR_or_SORT_NUMERIC_or_SORT_STRING Is passed by reference: yes Can be passed by value: yes +Name: more_array_and_sort_options +Is passed by reference: yes +Can be passed by value: yes + => sort: Name: arg diff --git a/ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt b/ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt new file mode 100644 index 0000000000000..370edc388df39 --- /dev/null +++ b/ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt @@ -0,0 +1,24 @@ +--TEST-- +ReflectionParameter::isVariadic() +--FILE-- +getParameters()[0]->isVariadic()); +var_dump($r2->getParameters()[0]->isVariadic()); +var_dump($r3->getParameters()[0]->isVariadic()); +var_dump($r3->getParameters()[1]->isVariadic()); + +?> +--EXPECT-- +bool(false) +bool(true) +bool(false) +bool(true) diff --git a/ext/reflection/tests/ReflectionParameter_toString_basic.phpt b/ext/reflection/tests/ReflectionParameter_toString_basic.phpt index 268ced15eca32..d1a23c758d3a3 100644 --- a/ext/reflection/tests/ReflectionParameter_toString_basic.phpt +++ b/ext/reflection/tests/ReflectionParameter_toString_basic.phpt @@ -4,7 +4,7 @@ ReflectionParameter::__toString() Stefan Koopmanschap --FILE-- $value) { --EXPECT-- Parameter #0 [ $test ] Parameter #1 [ $test2 = NULL ] +Parameter #2 [ ...$test3 ] ==DONE== diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 3dc7b7925c949..f73e8ee9f0db4 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2938,8 +2938,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetss, 0, 0, 0) ZEND_ARG_INFO(0, allowable_tags) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 1, 0, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 0, 0, 1) ZEND_ARG_INFO(0, format) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fwrite, 0, 0, 1) diff --git a/ext/spl/tests/bug51532.phpt b/ext/spl/tests/bug51532.phpt index 3a0722b2af68d..26eaa8f82f87d 100644 --- a/ext/spl/tests/bug51532.phpt +++ b/ext/spl/tests/bug51532.phpt @@ -4,7 +4,7 @@ SPL: Allow valid extension of SplFileObject::fscanf Date: Thu, 26 Sep 2013 19:43:32 +0200 Subject: [PATCH 0047/1256] Don't track parameter number in separate znode We already track it in the op array already. --- Zend/zend_compile.c | 5 +++-- Zend/zend_compile.h | 2 +- Zend/zend_language_parser.y | 13 +++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 90ff26297ae16..25a604c4405ed 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1822,7 +1822,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /* } /* }}} */ -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_uchar pass_by_reference, zend_bool is_variadic TSRMLS_DC) /* {{{ */ +void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initialization, znode *class_type, zend_uchar pass_by_reference, zend_bool is_variadic TSRMLS_DC) /* {{{ */ { zend_op *opline; zend_arg_info *cur_arg_info; @@ -1863,7 +1863,8 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con CG(active_op_array)->num_args++; opline->opcode = op; SET_NODE(opline->result, &var); - SET_NODE(opline->op1, offset); + opline->op1_type = IS_UNUSED; + opline->op1.num = CG(active_op_array)->num_args; if (op == ZEND_RECV_INIT) { SET_NODE(opline->op2, initialization); } else { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0e070294125c8..f9520c98eacf2 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -501,7 +501,7 @@ void zend_do_add_variable(znode *result, const znode *op1, const znode *op2 TSRM int zend_do_verify_access_types(const znode *current_access_type, const znode *new_modifier); void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC); void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC); -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference, zend_bool is_variadic TSRMLS_DC); +void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initialization, znode *class_type, zend_bool pass_by_reference, zend_bool is_variadic TSRMLS_DC); int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace TSRMLS_DC); void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); void zend_do_clone(znode *result, const znode *expr TSRMLS_DC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 4523783dec8ce..d46149957ac5e 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -528,14 +528,15 @@ parameter_list: non_empty_parameter_list: + parameter + | non_empty_parameter_list ',' parameter +; + +parameter: optional_class_type is_reference is_variadic T_VARIABLE - { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$4, &$$, NULL, &$1, $2.op_type, $3.op_type TSRMLS_CC); } + { zend_do_receive_param(ZEND_RECV, &$4, NULL, &$1, $2.op_type, $3.op_type TSRMLS_CC); } | optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar - { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$1, $2.op_type, $3.op_type TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE - { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$6, &$$, NULL, &$3, $4.op_type, $5.op_type TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar - { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$6, &$$, &$8, &$3, $4.op_type, $5.op_type TSRMLS_CC); } + { zend_do_receive_param(ZEND_RECV_INIT, &$4, &$6, &$1, $2.op_type, $3.op_type TSRMLS_CC); } ; From ac05cfb49912dd87264573df930d0ead3c3e0cca Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Thu, 26 Sep 2013 19:53:47 -0700 Subject: [PATCH 0048/1256] FIX BUG #48539 - Disable TEXTLIMIT for FreeTDS driver --- ext/pdo_dblib/dblib_driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index ff425147219ae..2aaf3975db18e 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -362,8 +362,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +#if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); +#endif /* limit text/image from network */ DBSETOPT(H->link, DBTEXTSIZE, "2147483647"); From 5ac7c533a0334f384d1a74eed6172a3c8cc4ef49 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 26 Sep 2013 21:12:11 -0700 Subject: [PATCH 0049/1256] More OCI8 DTrace probe updates. Change php.ini-* doc to match an earlier change to config.w32 --- ext/oci8/config.m4 | 2 +- ext/oci8/oci8.c | 37 +++++++++++++++++++++++++------------ ext/oci8/oci8_dtrace.d | 8 ++++---- ext/oci8/oci8_interface.c | 29 +++++++++++++++++++++++++++-- ext/oci8/oci8_statement.c | 16 ++++++++-------- ext/oci8/package.xml | 31 ++++++++++++++++++++++++------- ext/oci8/php_oci8.h | 2 +- ext/oci8/php_oci8_int.h | 3 +++ php.ini-development | 3 +-- php.ini-production | 3 +-- 10 files changed, 95 insertions(+), 39 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 49998d18f08ba..3873a2205aa36 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -124,7 +124,7 @@ dnl in GNU Make which causes the .d file to be overwritten (Bug 61268) PHP_EXT_SRCDIR([oci8])/$ac_provsrc:; $ac_bdir[$]ac_hdrobj: $ac_srcdir[$]ac_provsrc - CFLAGS="\$(CFLAGS_CLEAN)" dtrace -h -C -s $ac_srcdir[$]ac_provsrc -o \$[]@.bak && \$(SED) -e 's,PHP_,DTRACE_,g' \$[]@.bak > \$[]@ + CFLAGS="\$(CFLAGS_CLEAN)" dtrace -h -C -s $ac_srcdir[$]ac_provsrc -o \$[]@.bak && \$(SED) -e 's,PHPOCI_,DTRACE_,g' \$[]@.bak > \$[]@ \$(OCI8_DTRACE_OBJS): $ac_bdir[$]ac_hdrobj diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index bccaa529b0c93..f04114d4d67cf 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -12,7 +12,7 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Authors: Stig S�ther Bakken | + | Authors: Stig Sæther Bakken | | Thies C. Arntzen | | Maxim Maletsky | | | @@ -2097,6 +2097,9 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char connection = (php_oci_connection *) ecalloc(1, sizeof(php_oci_connection)); connection->hash_key = estrndup(hashed_details.c, hashed_details.len); connection->is_persistent = 0; +#ifdef HAVE_OCI8_DTRACE + connection->client_id = NULL; +#endif } else { connection = (php_oci_connection *) calloc(1, sizeof(php_oci_connection)); if (connection == NULL) { @@ -2108,11 +2111,17 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char return NULL; } connection->is_persistent = 1; +#ifdef HAVE_OCI8_DTRACE + connection->client_id = NULL; +#endif } } else { connection = (php_oci_connection *) ecalloc(1, sizeof(php_oci_connection)); connection->hash_key = estrndup(hashed_details.c, hashed_details.len); connection->is_persistent = 0; +#ifdef HAVE_OCI8_DTRACE + connection->client_id = NULL; +#endif } /* {{{ Get the session pool that suits this connection request from the persistent list. This @@ -2366,17 +2375,15 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) php_oci_spool_close(connection->private_spool TSRMLS_CC); } - if (connection->is_persistent) { - if (connection->hash_key) { - free(connection->hash_key); - } - free(connection); - } else { - if (connection->hash_key) { - efree(connection->hash_key); - } - efree(connection); + if (connection->hash_key) { + pefree(connection->hash_key, connection->is_persistent); + } +#ifdef HAVE_OCI8_DTRACE + if (connection->client_id) { + pefree(connection->client_id, connection->is_persistent); } +#endif /* HAVE_OCI8_DTRACE */ + pefree(connection, connection->is_persistent); connection = NULL; OCI_G(in_call) = in_call_save; return result; @@ -2463,6 +2470,12 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) * the OCI session */ connection->next_pingp = NULL; +#ifdef HAVE_OCI8_DTRACE + if (connection->client_id) { + pefree(connection->client_id, connection->is_persistent); + connection->client_id = NULL; + } +#endif /* HAVE_OCI8_DTRACE */ } OCI_G(in_call) = in_call_save; @@ -3500,7 +3513,7 @@ void php_oci_dtrace_check_connection(php_oci_connection *connection, sb4 errcode { #ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_CHECK_CONNECTION_ENABLED()) { - DTRACE_OCI8_CHECK_CONNECTION(connection, connection && connection->is_open ? 1 : 0, (long)errcode, (unsigned long)serverStatus); + DTRACE_OCI8_CHECK_CONNECTION(connection, connection->client_id, connection->is_open ? 1 : 0, (long)errcode, (unsigned long)serverStatus); } #endif /* HAVE_OCI8_DTRACE */ } diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index 8ac94105c13cd..30c98de912828 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -16,14 +16,14 @@ +----------------------------------------------------------------------+ */ -provider php { - probe oci8__check__connection(void *connection, int is_open, long errcode, unsigned long server_status); +provider phpoci { + probe oci8__check__connection(void *connection, char *client_id, int is_open, long errcode, unsigned long server_status); probe oci8__connect__entry(char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive); probe oci8__connect__return(void *connection); probe oci8__connection__close(void *connection); probe oci8__error(int status, long errcode); - probe oci8__execute__mode(void *connection, unsigned int mode); - probe oci8__sqltext(void *connection, char *sql); + probe oci8__execute__mode(void *connection, char *client_id, void *statement, unsigned int mode); + probe oci8__sqltext(void *connection, char *client_id, void *statement, char *sql); probe oci8__connect__p__dtor__close(void *connection); probe oci8__connect__p__dtor__release(void *connection); diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 8d70aff9c2b42..3fad90d9c7c84 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1772,6 +1772,30 @@ PHP_FUNCTION(oci_set_client_identifier) RETURN_FALSE; } +#ifdef HAVE_OCI8_DTRACE + /* The alternatives to storing client_id like done below are + i) display it in a probe here in oci_set_client_identifier and + let the user D script correlate the connection address probe + argument and the client_id. This would likely require user D + script variables, which would use kernel memory. + ii) call OCIAttrGet for each probe definition that uses + client_id. This would be slower than storing it. + */ + + if (connection->client_id) { + pefree(connection->client_id, connection->is_persistent); + } + + if (client_id) { + /* this long winded copy allows compatibility with older PHP versions */ + connection->client_id = (char *)safe_emalloc(client_id_len+1, sizeof(char), connection->is_persistent); + memcpy(connection->client_id, client_id, client_id_len); + connection->client_id[client_id_len] = '\0'; + } else { + connection->client_id = NULL; + } +#endif /* HAVE_OCI8_DTRACE */ + RETURN_TRUE; } /* }}} */ @@ -1790,13 +1814,14 @@ PHP_FUNCTION(oci_set_edition) if (OCI_G(edition)) { efree(OCI_G(edition)); - OCI_G(edition) = NULL; } if (edition) { - OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(text), 0); + OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(char), 0); memcpy(OCI_G(edition), edition, edition_len); OCI_G(edition)[edition_len] = '\0'; + } else { + OCI_G(edition) = NULL; } RETURN_TRUE; diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 274c4e9e33b40..1e66308e53ca4 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -55,14 +55,8 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char if (!query_len) { /* do not allocate stmt handle for refcursors, we'll get it from OCIStmtPrepare2() */ PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->stmt), OCI_HTYPE_STMT, 0, NULL)); - } else { -#ifdef HAVE_OCI8_DTRACE - if (DTRACE_OCI8_SQLTEXT_ENABLED()) { - DTRACE_OCI8_SQLTEXT(connection, query); - } -#endif /* HAVE_OCI8_DTRACE */ } - + PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL)); if (query_len > 0) { @@ -79,6 +73,12 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char OCI_DEFAULT ) ); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_SQLTEXT_ENABLED()) { + DTRACE_OCI8_SQLTEXT(connection, connection->client_id, statement, query); + } +#endif /* HAVE_OCI8_DTRACE */ + if (errstatus != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); @@ -498,7 +498,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) /* only these are allowed */ #ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_EXECUTE_MODE_ENABLED()) { - DTRACE_OCI8_EXECUTE_MODE(statement->connection, mode); + DTRACE_OCI8_EXECUTE_MODE(statement->connection, statement->connection->client_id, statement, mode); } #endif /* HAVE_OCI8_DTRACE */ break; diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index fcab20cc4544b..24ba635fef6dc 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -40,12 +40,12 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-09-06 + 2013-09-27 - 2.0.2 - 2.0.2 + 2.0.3 + 2.0.3 devel @@ -53,10 +53,9 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP -Review and improve error handling code and data types. -Fix oci_set_*($connection, ...) error handling so oci_error($connection) works. -Add DTrace oci8-connection-close probe -Add the connection handle to several DTrace probes. +Add the oci_set_client_identifier() value and statement structure pointer to several DTrace probes. +Use 'phpoci' as the DTrace provider name since uniqueness is required by the Linux fasttrap module. +Update Windows builds to create only php_oci8_12c.dll. @@ -455,6 +454,24 @@ Add the connection handle to several DTrace probes. + + + 2.0.2 + 2.0.2 + + + devel + devel + + PHP + +Review and improve error handling code and data types. +Fix oci_set_*($connection, ...) error handling so oci_error($connection) works. +Add DTrace oci8-connection-close probe +Add the connection handle to several DTrace probes. + + + 2.0.1 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 8c5fba9ab0873..6d02eff6b27af 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -46,7 +46,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.2-dev" +#define PHP_OCI8_VERSION "2.0.3-dev" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 6155a883b02e1..2d4ff26947e99 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -156,6 +156,9 @@ typedef struct { time_t idle_expiry; /* time when the connection will be considered as expired */ time_t *next_pingp; /* (pointer to) time of the next ping */ char *hash_key; /* hashed details of the connection */ +#ifdef HAVE_OCI8_DTRACE + char *client_id; /* The oci_set_client_identifier() value */ +#endif } php_oci_connection; /* }}} */ diff --git a/php.ini-development b/php.ini-development index beebabbd24f07..cc1cae2986834 100644 --- a/php.ini-development +++ b/php.ini-development @@ -884,8 +884,7 @@ default_socket_timeout = 60 ;extension=php_exif.dll ; Must be after mbstring as it depends on it ;extension=php_mysql.dll ;extension=php_mysqli.dll -;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client -;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client +;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client ;extension=php_openssl.dll ;extension=php_pdo_firebird.dll ;extension=php_pdo_mysql.dll diff --git a/php.ini-production b/php.ini-production index 5a95344cb451e..8ed89c799cce7 100644 --- a/php.ini-production +++ b/php.ini-production @@ -884,8 +884,7 @@ default_socket_timeout = 60 ;extension=php_exif.dll ; Must be after mbstring as it depends on it ;extension=php_mysql.dll ;extension=php_mysqli.dll -;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client -;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client +;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client ;extension=php_openssl.dll ;extension=php_pdo_firebird.dll ;extension=php_pdo_mysql.dll From edd93f34520b550c4c42877fe9e03112cad005ba Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 27 Sep 2013 14:13:11 +0800 Subject: [PATCH 0050/1256] Support string and array for peer fingerprint matching --- ext/openssl/openssl.c | 87 ++++++++++++++----- .../tests/openssl_peer_fingerprint.phpt | 20 ++++- 2 files changed, 82 insertions(+), 25 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a6ddd1458c98f..c0d1b0bf2ddbc 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1672,7 +1672,7 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) +static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; @@ -1699,6 +1699,61 @@ int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char * return 1; } +static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected) +{ + char *fingerprint; + int fingerprint_len; + int result = -1; + + if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { + result = strcmp(expected, fingerprint); + efree(fingerprint); + } + + return result; +} + +static int php_x509_fingerprint_match(X509 *peer, zval **val) +{ + if (Z_TYPE_PP(val) == IS_STRING) { + const char *method = NULL; + + switch (Z_STRLEN_PP(val)) { + case 32: + method = "md5"; + break; + + case 40: + method = "sha1"; + break; + } + + return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_PP(val)) == 0; + } else if (Z_TYPE_PP(val) == IS_ARRAY) { + HashPosition pos; + zval **current; + char *key; + uint key_len; + ulong key_index; + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(val), &pos); + zend_hash_get_current_data_ex(Z_ARRVAL_PP(val), (void **)¤t, &pos) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL_PP(val), &pos) + ) { + int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_PP(val), &key, &key_len, &key_index, 0, &pos); + + if (key_type == HASH_KEY_IS_STRING + && Z_TYPE_PP(current) == IS_STRING + && php_x509_fingerprint_cmp(peer, key, Z_STRVAL_PP(current)) != 0 + ) { + return 0; + } + } + return 1; + } + return 0; +} + PHP_FUNCTION(openssl_x509_fingerprint) { X509 *cert; @@ -1709,7 +1764,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) int method_len; char *fingerprint; - char *fingerprint_len; + int fingerprint_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; @@ -4932,30 +4987,14 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre /* if the cert passed the usual checks, apply our own local policies now */ - if (GET_VER_OPT("peer_fingerprint") && Z_TYPE_PP(val) == IS_STRING) { - char *fingerprint; - int fingerprint_len; - const char *method = NULL; - - switch (Z_STRLEN_PP(val)) { - case 32: - method = "md5"; - break; - - case 40: - method = "sha1"; - break; - } - - if (method && php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { - int match = strcmp(Z_STRVAL_PP(val), fingerprint) == 0; - - efree(fingerprint); - - if (!match) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint `%s` not matched", Z_STRVAL_PP(val)); + if (GET_VER_OPT("peer_fingerprint")) { + if (Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) == IS_ARRAY) { + if (!php_x509_fingerprint_match(peer, val)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint doesn't match"); return FAILURE; } + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected peer fingerprint must be a string or an array"); } } diff --git a/ext/openssl/tests/openssl_peer_fingerprint.phpt b/ext/openssl/tests/openssl_peer_fingerprint.phpt index a6be676dcb44a..2960dffae506e 100644 --- a/ext/openssl/tests/openssl_peer_fingerprint.phpt +++ b/ext/openssl/tests/openssl_peer_fingerprint.phpt @@ -31,14 +31,32 @@ if ($pid == -1) { // should be: 81cafc260aa8d82956ebc6212a362ecc var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $contextC)); + + $contextC = stream_context_create( + array( + 'ssl' => array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/bug54992-ca.pem', + 'capture_peer_cert' => true, + 'peer_fingerprint' => array( + 'sha256' => '78ea579f2c3b439359dec5dac9d445108772927427c4780037e87df3799a0aa0', + ), + ) + ) + ); + + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); } else { @pcntl_wait($status); @stream_socket_accept($server, 1); + @stream_socket_accept($server, 1); } --EXPECTF-- -Warning: stream_socket_client(): Peer fingerprint `81cafc260aa8d82956ebc6212a362ece` not matched in %s on line %d +Warning: stream_socket_client(): Peer fingerprint doesn't match in %s on line %d Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) +resource(9) of type (stream) From 7a1a1aec8c90fff8a24dc53d2232e22fbca3d39f Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 27 Sep 2013 10:14:46 +0100 Subject: [PATCH 0051/1256] - Updated to version 2013.6 (2013f) --- ext/date/lib/timezonedb.h | 1578 ++++++++++++++++++------------------- 1 file changed, 784 insertions(+), 794 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 1e5706cdccd3c..8142aab565eb0 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -58,529 +58,529 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[579] = { { "America/Anguilla" , 0x002952 }, { "America/Antigua" , 0x0029A7 }, { "America/Araguaina" , 0x002A0D }, - { "America/Argentina/Buenos_Aires" , 0x002C67 }, - { "America/Argentina/Catamarca" , 0x002E15 }, - { "America/Argentina/ComodRivadavia" , 0x002FD6 }, - { "America/Argentina/Cordoba" , 0x00317C }, - { "America/Argentina/Jujuy" , 0x003351 }, - { "America/Argentina/La_Rioja" , 0x003505 }, - { "America/Argentina/Mendoza" , 0x0036BD }, - { "America/Argentina/Rio_Gallegos" , 0x00387D }, - { "America/Argentina/Salta" , 0x003A32 }, - { "America/Argentina/San_Juan" , 0x003BDE }, - { "America/Argentina/San_Luis" , 0x003D96 }, - { "America/Argentina/Tucuman" , 0x003F5C }, - { "America/Argentina/Ushuaia" , 0x004118 }, - { "America/Aruba" , 0x0042D3 }, - { "America/Asuncion" , 0x004339 }, - { "America/Atikokan" , 0x00461E }, - { "America/Atka" , 0x0046F4 }, - { "America/Bahia" , 0x004A5A }, - { "America/Bahia_Banderas" , 0x004BED }, - { "America/Barbados" , 0x004E66 }, - { "America/Belem" , 0x004F00 }, - { "America/Belize" , 0x004FFB }, - { "America/Blanc-Sablon" , 0x005177 }, - { "America/Boa_Vista" , 0x00522B }, - { "America/Bogota" , 0x005334 }, - { "America/Boise" , 0x0053A0 }, - { "America/Buenos_Aires" , 0x005737 }, - { "America/Cambridge_Bay" , 0x0058D0 }, - { "America/Campo_Grande" , 0x005BF8 }, - { "America/Cancun" , 0x005EE7 }, - { "America/Caracas" , 0x006129 }, - { "America/Catamarca" , 0x006190 }, - { "America/Cayenne" , 0x006336 }, - { "America/Cayman" , 0x006398 }, - { "America/Chicago" , 0x0063ED }, - { "America/Chihuahua" , 0x006904 }, - { "America/Coral_Harbour" , 0x006B6F }, - { "America/Cordoba" , 0x006C01 }, - { "America/Costa_Rica" , 0x006DA7 }, - { "America/Creston" , 0x006E31 }, - { "America/Cuiaba" , 0x006EBD }, - { "America/Curacao" , 0x00719B }, - { "America/Danmarkshavn" , 0x007201 }, - { "America/Dawson" , 0x007345 }, - { "America/Dawson_Creek" , 0x007662 }, - { "America/Denver" , 0x00783C }, - { "America/Detroit" , 0x007BC2 }, - { "America/Dominica" , 0x007F21 }, - { "America/Edmonton" , 0x007F76 }, - { "America/Eirunepe" , 0x00832E }, - { "America/El_Salvador" , 0x008441 }, - { "America/Ensenada" , 0x0084B6 }, - { "America/Fort_Wayne" , 0x00895D }, - { "America/Fortaleza" , 0x00881F }, - { "America/Glace_Bay" , 0x008BC7 }, - { "America/Godthab" , 0x008F3E }, - { "America/Goose_Bay" , 0x009202 }, - { "America/Grand_Turk" , 0x0096BF }, - { "America/Grenada" , 0x00996E }, - { "America/Guadeloupe" , 0x0099C3 }, - { "America/Guatemala" , 0x009A18 }, - { "America/Guayaquil" , 0x009AA1 }, - { "America/Guyana" , 0x009AFE }, - { "America/Halifax" , 0x009B7F }, - { "America/Havana" , 0x00A095 }, - { "America/Hermosillo" , 0x00A408 }, - { "America/Indiana/Indianapolis" , 0x00A4E6 }, - { "America/Indiana/Knox" , 0x00A777 }, - { "America/Indiana/Marengo" , 0x00AB0E }, - { "America/Indiana/Petersburg" , 0x00ADB4 }, - { "America/Indiana/Tell_City" , 0x00B301 }, - { "America/Indiana/Vevay" , 0x00B59A }, - { "America/Indiana/Vincennes" , 0x00B7D5 }, - { "America/Indiana/Winamac" , 0x00BA89 }, - { "America/Indianapolis" , 0x00B097 }, - { "America/Inuvik" , 0x00BD42 }, - { "America/Iqaluit" , 0x00C039 }, - { "America/Jamaica" , 0x00C35B }, - { "America/Jujuy" , 0x00C420 }, - { "America/Juneau" , 0x00C5CA }, - { "America/Kentucky/Louisville" , 0x00C948 }, - { "America/Kentucky/Monticello" , 0x00CD66 }, - { "America/Knox_IN" , 0x00D0EB }, - { "America/Kralendijk" , 0x00D45C }, - { "America/La_Paz" , 0x00D4C2 }, - { "America/Lima" , 0x00D529 }, - { "America/Los_Angeles" , 0x00D5D1 }, - { "America/Louisville" , 0x00D9E2 }, - { "America/Lower_Princes" , 0x00DDD7 }, - { "America/Maceio" , 0x00DE3D }, - { "America/Managua" , 0x00DF77 }, - { "America/Manaus" , 0x00E02A }, - { "America/Marigot" , 0x00E12C }, - { "America/Martinique" , 0x00E181 }, - { "America/Matamoros" , 0x00E1ED }, - { "America/Mazatlan" , 0x00E446 }, - { "America/Mendoza" , 0x00E6B3 }, - { "America/Menominee" , 0x00E867 }, - { "America/Merida" , 0x00EBE8 }, - { "America/Metlakatla" , 0x00EE23 }, - { "America/Mexico_City" , 0x00EF5D }, - { "America/Miquelon" , 0x00F1D8 }, - { "America/Moncton" , 0x00F44A }, - { "America/Monterrey" , 0x00F8E1 }, - { "America/Montevideo" , 0x00FB44 }, - { "America/Montreal" , 0x00FE56 }, - { "America/Montserrat" , 0x01036C }, - { "America/Nassau" , 0x0103C1 }, - { "America/New_York" , 0x010706 }, - { "America/Nipigon" , 0x010C11 }, - { "America/Nome" , 0x010F62 }, - { "America/Noronha" , 0x0112E0 }, - { "America/North_Dakota/Beulah" , 0x011410 }, - { "America/North_Dakota/Center" , 0x0117A4 }, - { "America/North_Dakota/New_Salem" , 0x011B38 }, - { "America/Ojinaga" , 0x011EE1 }, - { "America/Panama" , 0x012142 }, - { "America/Pangnirtung" , 0x012197 }, - { "America/Paramaribo" , 0x0124CD }, - { "America/Phoenix" , 0x01255F }, - { "America/Port-au-Prince" , 0x01260D }, - { "America/Port_of_Spain" , 0x01292C }, - { "America/Porto_Acre" , 0x01282D }, - { "America/Porto_Velho" , 0x012981 }, - { "America/Puerto_Rico" , 0x012A77 }, - { "America/Rainy_River" , 0x012AE2 }, - { "America/Rankin_Inlet" , 0x012E1A }, - { "America/Recife" , 0x013100 }, - { "America/Regina" , 0x01322A }, - { "America/Resolute" , 0x0133E8 }, - { "America/Rio_Branco" , 0x0136D9 }, - { "America/Rosario" , 0x0137DC }, - { "America/Santa_Isabel" , 0x013982 }, - { "America/Santarem" , 0x013D25 }, - { "America/Santiago" , 0x013E2A }, - { "America/Santo_Domingo" , 0x0141D3 }, - { "America/Sao_Paulo" , 0x014299 }, - { "America/Scoresbysund" , 0x0145A8 }, - { "America/Shiprock" , 0x014896 }, - { "America/Sitka" , 0x014C25 }, - { "America/St_Barthelemy" , 0x014FAD }, - { "America/St_Johns" , 0x015002 }, - { "America/St_Kitts" , 0x015555 }, - { "America/St_Lucia" , 0x0155AA }, - { "America/St_Thomas" , 0x0155FF }, - { "America/St_Vincent" , 0x015654 }, - { "America/Swift_Current" , 0x0156A9 }, - { "America/Tegucigalpa" , 0x0157CA }, - { "America/Thule" , 0x015849 }, - { "America/Thunder_Bay" , 0x015A90 }, - { "America/Tijuana" , 0x015DD9 }, - { "America/Toronto" , 0x016172 }, - { "America/Tortola" , 0x016689 }, - { "America/Vancouver" , 0x0166DE }, - { "America/Virgin" , 0x016B1B }, - { "America/Whitehorse" , 0x016B70 }, - { "America/Winnipeg" , 0x016E8D }, - { "America/Yakutat" , 0x0172CD }, - { "America/Yellowknife" , 0x017638 }, - { "Antarctica/Casey" , 0x017948 }, - { "Antarctica/Davis" , 0x0179E5 }, - { "Antarctica/DumontDUrville" , 0x017A86 }, - { "Antarctica/Macquarie" , 0x017B18 }, - { "Antarctica/Mawson" , 0x017D5F }, - { "Antarctica/McMurdo" , 0x017DDB }, - { "Antarctica/Palmer" , 0x0180DD }, - { "Antarctica/Rothera" , 0x0183F9 }, - { "Antarctica/South_Pole" , 0x01846F }, - { "Antarctica/Syowa" , 0x018777 }, - { "Antarctica/Vostok" , 0x0187E5 }, - { "Arctic/Longyearbyen" , 0x018856 }, - { "Asia/Aden" , 0x018B88 }, - { "Asia/Almaty" , 0x018BDD }, - { "Asia/Amman" , 0x018D5C }, - { "Asia/Anadyr" , 0x019012 }, - { "Asia/Aqtau" , 0x0191F7 }, - { "Asia/Aqtobe" , 0x0193F6 }, - { "Asia/Ashgabat" , 0x0195AE }, - { "Asia/Ashkhabad" , 0x0196CB }, - { "Asia/Baghdad" , 0x0197E8 }, - { "Asia/Bahrain" , 0x01995D }, - { "Asia/Baku" , 0x0199C3 }, - { "Asia/Bangkok" , 0x019CAB }, - { "Asia/Beirut" , 0x019D00 }, - { "Asia/Bishkek" , 0x01A00D }, - { "Asia/Brunei" , 0x01A1B9 }, - { "Asia/Calcutta" , 0x01A21B }, - { "Asia/Choibalsan" , 0x01A294 }, - { "Asia/Chongqing" , 0x01A40D }, - { "Asia/Chungking" , 0x01A4FC }, - { "Asia/Colombo" , 0x01A5AB }, - { "Asia/Dacca" , 0x01A647 }, - { "Asia/Damascus" , 0x01A6ED }, - { "Asia/Dhaka" , 0x01AA3D }, - { "Asia/Dili" , 0x01AAE3 }, - { "Asia/Dubai" , 0x01AB6C }, - { "Asia/Dushanbe" , 0x01ABC1 }, - { "Asia/Gaza" , 0x01ACC4 }, - { "Asia/Harbin" , 0x01B017 }, - { "Asia/Hebron" , 0x01B0FE }, - { "Asia/Ho_Chi_Minh" , 0x01B45A }, - { "Asia/Hong_Kong" , 0x01B4D2 }, - { "Asia/Hovd" , 0x01B694 }, - { "Asia/Irkutsk" , 0x01B80C }, - { "Asia/Istanbul" , 0x01B9F2 }, - { "Asia/Jakarta" , 0x01BDDF }, - { "Asia/Jayapura" , 0x01BE89 }, - { "Asia/Jerusalem" , 0x01BF25 }, - { "Asia/Kabul" , 0x01C254 }, - { "Asia/Kamchatka" , 0x01C2A5 }, - { "Asia/Karachi" , 0x01C481 }, - { "Asia/Kashgar" , 0x01C536 }, - { "Asia/Kathmandu" , 0x01C607 }, - { "Asia/Katmandu" , 0x01C66D }, - { "Asia/Khandyga" , 0x01C6D3 }, - { "Asia/Kolkata" , 0x01C8F8 }, - { "Asia/Krasnoyarsk" , 0x01C971 }, - { "Asia/Kuala_Lumpur" , 0x01CB59 }, - { "Asia/Kuching" , 0x01CC16 }, - { "Asia/Kuwait" , 0x01CD04 }, - { "Asia/Macao" , 0x01CD59 }, - { "Asia/Macau" , 0x01CE94 }, - { "Asia/Magadan" , 0x01CFCF }, - { "Asia/Makassar" , 0x01D1B1 }, - { "Asia/Manila" , 0x01D275 }, - { "Asia/Muscat" , 0x01D2FA }, - { "Asia/Nicosia" , 0x01D34F }, - { "Asia/Novokuznetsk" , 0x01D637 }, - { "Asia/Novosibirsk" , 0x01D839 }, - { "Asia/Omsk" , 0x01DA24 }, - { "Asia/Oral" , 0x01DC0B }, - { "Asia/Phnom_Penh" , 0x01DDDB }, - { "Asia/Pontianak" , 0x01DE53 }, - { "Asia/Pyongyang" , 0x01DF14 }, - { "Asia/Qatar" , 0x01DF81 }, - { "Asia/Qyzylorda" , 0x01DFE7 }, - { "Asia/Rangoon" , 0x01E1BD }, - { "Asia/Riyadh" , 0x01E235 }, - { "Asia/Saigon" , 0x01E28A }, - { "Asia/Sakhalin" , 0x01E302 }, - { "Asia/Samarkand" , 0x01E4F9 }, - { "Asia/Seoul" , 0x01E62F }, - { "Asia/Shanghai" , 0x01E6D3 }, - { "Asia/Singapore" , 0x01E7B3 }, - { "Asia/Taipei" , 0x01E86A }, - { "Asia/Tashkent" , 0x01E982 }, - { "Asia/Tbilisi" , 0x01EAB3 }, - { "Asia/Tehran" , 0x01EC6D }, - { "Asia/Tel_Aviv" , 0x01EEDB }, - { "Asia/Thimbu" , 0x01F20A }, - { "Asia/Thimphu" , 0x01F270 }, - { "Asia/Tokyo" , 0x01F2D6 }, - { "Asia/Ujung_Pandang" , 0x01F35F }, - { "Asia/Ulaanbaatar" , 0x01F3DB }, - { "Asia/Ulan_Bator" , 0x01F536 }, - { "Asia/Urumqi" , 0x01F683 }, - { "Asia/Ust-Nera" , 0x01F74A }, - { "Asia/Vientiane" , 0x01F94F }, - { "Asia/Vladivostok" , 0x01F9C7 }, - { "Asia/Yakutsk" , 0x01FBB3 }, - { "Asia/Yekaterinburg" , 0x01FD98 }, - { "Asia/Yerevan" , 0x01FFA3 }, - { "Atlantic/Azores" , 0x0201A3 }, - { "Atlantic/Bermuda" , 0x0206A6 }, - { "Atlantic/Canary" , 0x020987 }, - { "Atlantic/Cape_Verde" , 0x020C5D }, - { "Atlantic/Faeroe" , 0x020CD6 }, - { "Atlantic/Faroe" , 0x020F7A }, - { "Atlantic/Jan_Mayen" , 0x02121E }, - { "Atlantic/Madeira" , 0x021550 }, - { "Atlantic/Reykjavik" , 0x021A59 }, - { "Atlantic/South_Georgia" , 0x021C12 }, - { "Atlantic/St_Helena" , 0x021E24 }, - { "Atlantic/Stanley" , 0x021C56 }, - { "Australia/ACT" , 0x021E79 }, - { "Australia/Adelaide" , 0x022196 }, - { "Australia/Brisbane" , 0x0224C2 }, - { "Australia/Broken_Hill" , 0x022589 }, - { "Australia/Canberra" , 0x0228C7 }, - { "Australia/Currie" , 0x022BE4 }, - { "Australia/Darwin" , 0x022F17 }, - { "Australia/Eucla" , 0x022F9D }, - { "Australia/Hobart" , 0x023072 }, - { "Australia/LHI" , 0x0233D0 }, - { "Australia/Lindeman" , 0x02366B }, - { "Australia/Lord_Howe" , 0x02374C }, - { "Australia/Melbourne" , 0x0239F7 }, - { "Australia/North" , 0x023D1C }, - { "Australia/NSW" , 0x023D90 }, - { "Australia/Perth" , 0x0240AD }, - { "Australia/Queensland" , 0x024185 }, - { "Australia/South" , 0x024231 }, - { "Australia/Sydney" , 0x02454E }, - { "Australia/Tasmania" , 0x02488B }, - { "Australia/Victoria" , 0x024BD0 }, - { "Australia/West" , 0x024EED }, - { "Australia/Yancowinna" , 0x024FA3 }, - { "Brazil/Acre" , 0x0252C5 }, - { "Brazil/DeNoronha" , 0x0253C4 }, - { "Brazil/East" , 0x0254E4 }, - { "Brazil/West" , 0x0257C1 }, - { "Canada/Atlantic" , 0x0258B9 }, - { "Canada/Central" , 0x025DA1 }, - { "Canada/East-Saskatchewan" , 0x0266AB }, - { "Canada/Eastern" , 0x0261BB }, - { "Canada/Mountain" , 0x026834 }, - { "Canada/Newfoundland" , 0x026BAA }, - { "Canada/Pacific" , 0x0270D5 }, - { "Canada/Saskatchewan" , 0x0274EE }, - { "Canada/Yukon" , 0x027677 }, - { "CET" , 0x02797A }, - { "Chile/Continental" , 0x027C83 }, - { "Chile/EasterIsland" , 0x02801E }, - { "CST6CDT" , 0x028360 }, - { "Cuba" , 0x0286B1 }, - { "EET" , 0x028A24 }, - { "Egypt" , 0x028CD7 }, - { "Eire" , 0x028F9A }, - { "EST" , 0x0294AB }, - { "EST5EDT" , 0x0294EF }, - { "Etc/GMT" , 0x029840 }, - { "Etc/GMT+0" , 0x02990C }, - { "Etc/GMT+1" , 0x029996 }, - { "Etc/GMT+10" , 0x029A23 }, - { "Etc/GMT+11" , 0x029AB1 }, - { "Etc/GMT+12" , 0x029B3F }, - { "Etc/GMT+2" , 0x029C5A }, - { "Etc/GMT+3" , 0x029CE6 }, - { "Etc/GMT+4" , 0x029D72 }, - { "Etc/GMT+5" , 0x029DFE }, - { "Etc/GMT+6" , 0x029E8A }, - { "Etc/GMT+7" , 0x029F16 }, - { "Etc/GMT+8" , 0x029FA2 }, - { "Etc/GMT+9" , 0x02A02E }, - { "Etc/GMT-0" , 0x0298C8 }, - { "Etc/GMT-1" , 0x029950 }, - { "Etc/GMT-10" , 0x0299DC }, - { "Etc/GMT-11" , 0x029A6A }, - { "Etc/GMT-12" , 0x029AF8 }, - { "Etc/GMT-13" , 0x029B86 }, - { "Etc/GMT-14" , 0x029BCD }, - { "Etc/GMT-2" , 0x029C14 }, - { "Etc/GMT-3" , 0x029CA0 }, - { "Etc/GMT-4" , 0x029D2C }, - { "Etc/GMT-5" , 0x029DB8 }, - { "Etc/GMT-6" , 0x029E44 }, - { "Etc/GMT-7" , 0x029ED0 }, - { "Etc/GMT-8" , 0x029F5C }, - { "Etc/GMT-9" , 0x029FE8 }, - { "Etc/GMT0" , 0x029884 }, - { "Etc/Greenwich" , 0x02A074 }, - { "Etc/UCT" , 0x02A0B8 }, - { "Etc/Universal" , 0x02A0FC }, - { "Etc/UTC" , 0x02A140 }, - { "Etc/Zulu" , 0x02A184 }, - { "Europe/Amsterdam" , 0x02A1C8 }, - { "Europe/Andorra" , 0x02A606 }, - { "Europe/Athens" , 0x02A882 }, - { "Europe/Belfast" , 0x02ABC5 }, - { "Europe/Belgrade" , 0x02B0FC }, - { "Europe/Berlin" , 0x02B3C5 }, - { "Europe/Bratislava" , 0x02B729 }, - { "Europe/Brussels" , 0x02BA5B }, - { "Europe/Bucharest" , 0x02BE92 }, - { "Europe/Budapest" , 0x02C1BC }, - { "Europe/Busingen" , 0x02C52F }, - { "Europe/Chisinau" , 0x02C7E6 }, - { "Europe/Copenhagen" , 0x02CB74 }, - { "Europe/Dublin" , 0x02CE7E }, - { "Europe/Gibraltar" , 0x02D38F }, - { "Europe/Guernsey" , 0x02D7E6 }, - { "Europe/Helsinki" , 0x02DD1D }, - { "Europe/Isle_of_Man" , 0x02DFD3 }, - { "Europe/Istanbul" , 0x02E50A }, - { "Europe/Jersey" , 0x02E8F7 }, - { "Europe/Kaliningrad" , 0x02EE2E }, - { "Europe/Kiev" , 0x02F094 }, - { "Europe/Lisbon" , 0x02F3AB }, - { "Europe/Ljubljana" , 0x02F8AF }, - { "Europe/London" , 0x02FB78 }, - { "Europe/Luxembourg" , 0x0300AF }, - { "Europe/Madrid" , 0x030505 }, - { "Europe/Malta" , 0x0308CB }, - { "Europe/Mariehamn" , 0x030C84 }, - { "Europe/Minsk" , 0x030F3A }, - { "Europe/Monaco" , 0x031148 }, - { "Europe/Moscow" , 0x031583 }, - { "Europe/Nicosia" , 0x0317D4 }, - { "Europe/Oslo" , 0x031ABC }, - { "Europe/Paris" , 0x031DEE }, - { "Europe/Podgorica" , 0x032234 }, - { "Europe/Prague" , 0x0324FD }, - { "Europe/Riga" , 0x03282F }, - { "Europe/Rome" , 0x032B74 }, - { "Europe/Samara" , 0x032F37 }, - { "Europe/San_Marino" , 0x03316A }, - { "Europe/Sarajevo" , 0x03352D }, - { "Europe/Simferopol" , 0x0337F6 }, - { "Europe/Skopje" , 0x033B21 }, - { "Europe/Sofia" , 0x033DEA }, - { "Europe/Stockholm" , 0x0340F2 }, - { "Europe/Tallinn" , 0x0343A1 }, - { "Europe/Tirane" , 0x0346DB }, - { "Europe/Tiraspol" , 0x0349E1 }, - { "Europe/Uzhgorod" , 0x034D6F }, - { "Europe/Vaduz" , 0x035086 }, - { "Europe/Vatican" , 0x035319 }, - { "Europe/Vienna" , 0x0356DC }, - { "Europe/Vilnius" , 0x035A09 }, - { "Europe/Volgograd" , 0x035D48 }, - { "Europe/Warsaw" , 0x035F48 }, - { "Europe/Zagreb" , 0x036329 }, - { "Europe/Zaporozhye" , 0x0365F2 }, - { "Europe/Zurich" , 0x036933 }, - { "Factory" , 0x036BE2 }, - { "GB" , 0x036C53 }, - { "GB-Eire" , 0x03718A }, - { "GMT" , 0x0376C1 }, - { "GMT+0" , 0x03778D }, - { "GMT-0" , 0x037749 }, - { "GMT0" , 0x037705 }, - { "Greenwich" , 0x0377D1 }, - { "Hongkong" , 0x037815 }, - { "HST" , 0x0379D7 }, - { "Iceland" , 0x037A1B }, - { "Indian/Antananarivo" , 0x037BD4 }, - { "Indian/Chagos" , 0x037C48 }, - { "Indian/Christmas" , 0x037CAA }, - { "Indian/Cocos" , 0x037CEE }, - { "Indian/Comoro" , 0x037D32 }, - { "Indian/Kerguelen" , 0x037D87 }, - { "Indian/Mahe" , 0x037DDC }, - { "Indian/Maldives" , 0x037E31 }, - { "Indian/Mauritius" , 0x037E86 }, - { "Indian/Mayotte" , 0x037EFC }, - { "Indian/Reunion" , 0x037F51 }, - { "Iran" , 0x037FA6 }, - { "Israel" , 0x038214 }, - { "Jamaica" , 0x038543 }, - { "Japan" , 0x038608 }, - { "Kwajalein" , 0x038691 }, - { "Libya" , 0x0386F4 }, - { "MET" , 0x0388ED }, - { "Mexico/BajaNorte" , 0x038BF6 }, - { "Mexico/BajaSur" , 0x038F5F }, - { "Mexico/General" , 0x0391A4 }, - { "MST" , 0x039402 }, - { "MST7MDT" , 0x039446 }, - { "Navajo" , 0x039797 }, - { "NZ" , 0x039B10 }, - { "NZ-CHAT" , 0x039E8E }, - { "Pacific/Apia" , 0x03A176 }, - { "Pacific/Auckland" , 0x03A312 }, - { "Pacific/Chatham" , 0x03A69E }, - { "Pacific/Chuuk" , 0x03A995 }, - { "Pacific/Easter" , 0x03A9EE }, - { "Pacific/Efate" , 0x03AD4C }, - { "Pacific/Enderbury" , 0x03AE12 }, - { "Pacific/Fakaofo" , 0x03AE80 }, - { "Pacific/Fiji" , 0x03AED1 }, - { "Pacific/Funafuti" , 0x03B064 }, - { "Pacific/Galapagos" , 0x03B0A8 }, - { "Pacific/Gambier" , 0x03B120 }, - { "Pacific/Guadalcanal" , 0x03B185 }, - { "Pacific/Guam" , 0x03B1DA }, - { "Pacific/Honolulu" , 0x03B230 }, - { "Pacific/Johnston" , 0x03B2A7 }, - { "Pacific/Kiritimati" , 0x03B2F9 }, - { "Pacific/Kosrae" , 0x03B364 }, - { "Pacific/Kwajalein" , 0x03B3C1 }, - { "Pacific/Majuro" , 0x03B42D }, - { "Pacific/Marquesas" , 0x03B48C }, - { "Pacific/Midway" , 0x03B4F3 }, - { "Pacific/Nauru" , 0x03B57D }, - { "Pacific/Niue" , 0x03B5F5 }, - { "Pacific/Norfolk" , 0x03B653 }, - { "Pacific/Noumea" , 0x03B6A8 }, - { "Pacific/Pago_Pago" , 0x03B738 }, - { "Pacific/Palau" , 0x03B7C1 }, - { "Pacific/Pitcairn" , 0x03B805 }, - { "Pacific/Pohnpei" , 0x03B85A }, - { "Pacific/Ponape" , 0x03B8AF }, - { "Pacific/Port_Moresby" , 0x03B8F4 }, - { "Pacific/Rarotonga" , 0x03B938 }, - { "Pacific/Saipan" , 0x03BA14 }, - { "Pacific/Samoa" , 0x03BA77 }, - { "Pacific/Tahiti" , 0x03BB00 }, - { "Pacific/Tarawa" , 0x03BB65 }, - { "Pacific/Tongatapu" , 0x03BBB9 }, - { "Pacific/Truk" , 0x03BC45 }, - { "Pacific/Wake" , 0x03BC8A }, - { "Pacific/Wallis" , 0x03BCDA }, - { "Pacific/Yap" , 0x03BD1E }, - { "Poland" , 0x03BD63 }, - { "Portugal" , 0x03C144 }, - { "PRC" , 0x03C640 }, - { "PST8PDT" , 0x03C6F1 }, - { "ROC" , 0x03CA42 }, - { "ROK" , 0x03CB5A }, - { "Singapore" , 0x03CBFE }, - { "Turkey" , 0x03CCB5 }, - { "UCT" , 0x03D0A2 }, - { "Universal" , 0x03D0E6 }, - { "US/Alaska" , 0x03D12A }, - { "US/Aleutian" , 0x03D493 }, - { "US/Arizona" , 0x03D7F9 }, - { "US/Central" , 0x03D887 }, - { "US/East-Indiana" , 0x03E291 }, - { "US/Eastern" , 0x03DD92 }, - { "US/Hawaii" , 0x03E4FB }, - { "US/Indiana-Starke" , 0x03E56C }, - { "US/Michigan" , 0x03E8DD }, - { "US/Mountain" , 0x03EC14 }, - { "US/Pacific" , 0x03EF8D }, - { "US/Pacific-New" , 0x03F392 }, - { "US/Samoa" , 0x03F797 }, - { "UTC" , 0x03F820 }, - { "W-SU" , 0x03FB17 }, - { "WET" , 0x03F864 }, - { "Zulu" , 0x03FD51 }, + { "America/Argentina/Buenos_Aires" , 0x002B72 }, + { "America/Argentina/Catamarca" , 0x002D20 }, + { "America/Argentina/ComodRivadavia" , 0x002EE1 }, + { "America/Argentina/Cordoba" , 0x003087 }, + { "America/Argentina/Jujuy" , 0x00325C }, + { "America/Argentina/La_Rioja" , 0x003410 }, + { "America/Argentina/Mendoza" , 0x0035C8 }, + { "America/Argentina/Rio_Gallegos" , 0x003788 }, + { "America/Argentina/Salta" , 0x00393D }, + { "America/Argentina/San_Juan" , 0x003AE9 }, + { "America/Argentina/San_Luis" , 0x003CA1 }, + { "America/Argentina/Tucuman" , 0x003E67 }, + { "America/Argentina/Ushuaia" , 0x004023 }, + { "America/Aruba" , 0x0041DE }, + { "America/Asuncion" , 0x004244 }, + { "America/Atikokan" , 0x004529 }, + { "America/Atka" , 0x0045FF }, + { "America/Bahia" , 0x004965 }, + { "America/Bahia_Banderas" , 0x004AF8 }, + { "America/Barbados" , 0x004D71 }, + { "America/Belem" , 0x004E0B }, + { "America/Belize" , 0x004F06 }, + { "America/Blanc-Sablon" , 0x005082 }, + { "America/Boa_Vista" , 0x005136 }, + { "America/Bogota" , 0x00523F }, + { "America/Boise" , 0x0052AB }, + { "America/Buenos_Aires" , 0x005642 }, + { "America/Cambridge_Bay" , 0x0057DB }, + { "America/Campo_Grande" , 0x005B03 }, + { "America/Cancun" , 0x005DF2 }, + { "America/Caracas" , 0x006034 }, + { "America/Catamarca" , 0x00609B }, + { "America/Cayenne" , 0x006241 }, + { "America/Cayman" , 0x0062A3 }, + { "America/Chicago" , 0x0062F8 }, + { "America/Chihuahua" , 0x00680F }, + { "America/Coral_Harbour" , 0x006A7A }, + { "America/Cordoba" , 0x006B0C }, + { "America/Costa_Rica" , 0x006CB2 }, + { "America/Creston" , 0x006D3C }, + { "America/Cuiaba" , 0x006DC8 }, + { "America/Curacao" , 0x0070A6 }, + { "America/Danmarkshavn" , 0x00710C }, + { "America/Dawson" , 0x007250 }, + { "America/Dawson_Creek" , 0x00756D }, + { "America/Denver" , 0x007747 }, + { "America/Detroit" , 0x007ACD }, + { "America/Dominica" , 0x007E2C }, + { "America/Edmonton" , 0x007E81 }, + { "America/Eirunepe" , 0x008239 }, + { "America/El_Salvador" , 0x00834C }, + { "America/Ensenada" , 0x0083C1 }, + { "America/Fort_Wayne" , 0x008868 }, + { "America/Fortaleza" , 0x00872A }, + { "America/Glace_Bay" , 0x008AD2 }, + { "America/Godthab" , 0x008E49 }, + { "America/Goose_Bay" , 0x00910D }, + { "America/Grand_Turk" , 0x0095CA }, + { "America/Grenada" , 0x009879 }, + { "America/Guadeloupe" , 0x0098CE }, + { "America/Guatemala" , 0x009923 }, + { "America/Guayaquil" , 0x0099AC }, + { "America/Guyana" , 0x009A09 }, + { "America/Halifax" , 0x009A8A }, + { "America/Havana" , 0x009FA0 }, + { "America/Hermosillo" , 0x00A313 }, + { "America/Indiana/Indianapolis" , 0x00A3F1 }, + { "America/Indiana/Knox" , 0x00A682 }, + { "America/Indiana/Marengo" , 0x00AA19 }, + { "America/Indiana/Petersburg" , 0x00ACBF }, + { "America/Indiana/Tell_City" , 0x00B20C }, + { "America/Indiana/Vevay" , 0x00B4A5 }, + { "America/Indiana/Vincennes" , 0x00B6E0 }, + { "America/Indiana/Winamac" , 0x00B994 }, + { "America/Indianapolis" , 0x00AFA2 }, + { "America/Inuvik" , 0x00BC4D }, + { "America/Iqaluit" , 0x00BF44 }, + { "America/Jamaica" , 0x00C266 }, + { "America/Jujuy" , 0x00C32B }, + { "America/Juneau" , 0x00C4D5 }, + { "America/Kentucky/Louisville" , 0x00C853 }, + { "America/Kentucky/Monticello" , 0x00CC71 }, + { "America/Knox_IN" , 0x00CFF6 }, + { "America/Kralendijk" , 0x00D367 }, + { "America/La_Paz" , 0x00D3CD }, + { "America/Lima" , 0x00D434 }, + { "America/Los_Angeles" , 0x00D4DC }, + { "America/Louisville" , 0x00D8ED }, + { "America/Lower_Princes" , 0x00DCE2 }, + { "America/Maceio" , 0x00DD48 }, + { "America/Managua" , 0x00DE82 }, + { "America/Manaus" , 0x00DF35 }, + { "America/Marigot" , 0x00E037 }, + { "America/Martinique" , 0x00E08C }, + { "America/Matamoros" , 0x00E0F8 }, + { "America/Mazatlan" , 0x00E351 }, + { "America/Mendoza" , 0x00E5BE }, + { "America/Menominee" , 0x00E772 }, + { "America/Merida" , 0x00EAF3 }, + { "America/Metlakatla" , 0x00ED2E }, + { "America/Mexico_City" , 0x00EE68 }, + { "America/Miquelon" , 0x00F0E3 }, + { "America/Moncton" , 0x00F355 }, + { "America/Monterrey" , 0x00F7EC }, + { "America/Montevideo" , 0x00FA4F }, + { "America/Montreal" , 0x00FD61 }, + { "America/Montserrat" , 0x010251 }, + { "America/Nassau" , 0x0102A6 }, + { "America/New_York" , 0x0105EB }, + { "America/Nipigon" , 0x010AF6 }, + { "America/Nome" , 0x010E47 }, + { "America/Noronha" , 0x0111C5 }, + { "America/North_Dakota/Beulah" , 0x0112F5 }, + { "America/North_Dakota/Center" , 0x011689 }, + { "America/North_Dakota/New_Salem" , 0x011A1D }, + { "America/Ojinaga" , 0x011DC6 }, + { "America/Panama" , 0x012027 }, + { "America/Pangnirtung" , 0x01207C }, + { "America/Paramaribo" , 0x0123B2 }, + { "America/Phoenix" , 0x012444 }, + { "America/Port-au-Prince" , 0x012502 }, + { "America/Port_of_Spain" , 0x012821 }, + { "America/Porto_Acre" , 0x012722 }, + { "America/Porto_Velho" , 0x012876 }, + { "America/Puerto_Rico" , 0x01296C }, + { "America/Rainy_River" , 0x0129D7 }, + { "America/Rankin_Inlet" , 0x012D0F }, + { "America/Recife" , 0x012FF5 }, + { "America/Regina" , 0x01311F }, + { "America/Resolute" , 0x0132DD }, + { "America/Rio_Branco" , 0x0135CE }, + { "America/Rosario" , 0x0136D1 }, + { "America/Santa_Isabel" , 0x013877 }, + { "America/Santarem" , 0x013C1A }, + { "America/Santiago" , 0x013D1F }, + { "America/Santo_Domingo" , 0x0140C8 }, + { "America/Sao_Paulo" , 0x01418E }, + { "America/Scoresbysund" , 0x01449D }, + { "America/Shiprock" , 0x01478B }, + { "America/Sitka" , 0x014B04 }, + { "America/St_Barthelemy" , 0x014E8C }, + { "America/St_Johns" , 0x014EE1 }, + { "America/St_Kitts" , 0x015434 }, + { "America/St_Lucia" , 0x015489 }, + { "America/St_Thomas" , 0x0154DE }, + { "America/St_Vincent" , 0x015533 }, + { "America/Swift_Current" , 0x015588 }, + { "America/Tegucigalpa" , 0x0156A9 }, + { "America/Thule" , 0x015728 }, + { "America/Thunder_Bay" , 0x01596F }, + { "America/Tijuana" , 0x015CB8 }, + { "America/Toronto" , 0x016051 }, + { "America/Tortola" , 0x016571 }, + { "America/Vancouver" , 0x0165C6 }, + { "America/Virgin" , 0x016A03 }, + { "America/Whitehorse" , 0x016A58 }, + { "America/Winnipeg" , 0x016D75 }, + { "America/Yakutat" , 0x0171B5 }, + { "America/Yellowknife" , 0x017520 }, + { "Antarctica/Casey" , 0x017830 }, + { "Antarctica/Davis" , 0x0178CD }, + { "Antarctica/DumontDUrville" , 0x01796E }, + { "Antarctica/Macquarie" , 0x017A00 }, + { "Antarctica/Mawson" , 0x017C47 }, + { "Antarctica/McMurdo" , 0x017CC3 }, + { "Antarctica/Palmer" , 0x01806E }, + { "Antarctica/Rothera" , 0x01838A }, + { "Antarctica/South_Pole" , 0x018400 }, + { "Antarctica/Syowa" , 0x01877E }, + { "Antarctica/Vostok" , 0x0187EC }, + { "Arctic/Longyearbyen" , 0x01885D }, + { "Asia/Aden" , 0x018B8F }, + { "Asia/Almaty" , 0x018BE4 }, + { "Asia/Amman" , 0x018D63 }, + { "Asia/Anadyr" , 0x018F35 }, + { "Asia/Aqtau" , 0x01911A }, + { "Asia/Aqtobe" , 0x019319 }, + { "Asia/Ashgabat" , 0x0194D1 }, + { "Asia/Ashkhabad" , 0x0195EE }, + { "Asia/Baghdad" , 0x01970B }, + { "Asia/Bahrain" , 0x019880 }, + { "Asia/Baku" , 0x0198E6 }, + { "Asia/Bangkok" , 0x019BCE }, + { "Asia/Beirut" , 0x019C23 }, + { "Asia/Bishkek" , 0x019F30 }, + { "Asia/Brunei" , 0x01A0DC }, + { "Asia/Calcutta" , 0x01A13E }, + { "Asia/Choibalsan" , 0x01A1B7 }, + { "Asia/Chongqing" , 0x01A330 }, + { "Asia/Chungking" , 0x01A41F }, + { "Asia/Colombo" , 0x01A4CE }, + { "Asia/Dacca" , 0x01A56A }, + { "Asia/Damascus" , 0x01A610 }, + { "Asia/Dhaka" , 0x01A960 }, + { "Asia/Dili" , 0x01AA06 }, + { "Asia/Dubai" , 0x01AA90 }, + { "Asia/Dushanbe" , 0x01AAE5 }, + { "Asia/Gaza" , 0x01ABE8 }, + { "Asia/Harbin" , 0x01AF3B }, + { "Asia/Hebron" , 0x01B022 }, + { "Asia/Ho_Chi_Minh" , 0x01B37E }, + { "Asia/Hong_Kong" , 0x01B3F6 }, + { "Asia/Hovd" , 0x01B5B8 }, + { "Asia/Irkutsk" , 0x01B730 }, + { "Asia/Istanbul" , 0x01B916 }, + { "Asia/Jakarta" , 0x01BD03 }, + { "Asia/Jayapura" , 0x01BDAD }, + { "Asia/Jerusalem" , 0x01BE49 }, + { "Asia/Kabul" , 0x01C178 }, + { "Asia/Kamchatka" , 0x01C1C9 }, + { "Asia/Karachi" , 0x01C3A5 }, + { "Asia/Kashgar" , 0x01C45A }, + { "Asia/Kathmandu" , 0x01C52B }, + { "Asia/Katmandu" , 0x01C591 }, + { "Asia/Khandyga" , 0x01C5F7 }, + { "Asia/Kolkata" , 0x01C81C }, + { "Asia/Krasnoyarsk" , 0x01C895 }, + { "Asia/Kuala_Lumpur" , 0x01CA7D }, + { "Asia/Kuching" , 0x01CB3A }, + { "Asia/Kuwait" , 0x01CC28 }, + { "Asia/Macao" , 0x01CC7D }, + { "Asia/Macau" , 0x01CDB8 }, + { "Asia/Magadan" , 0x01CEF3 }, + { "Asia/Makassar" , 0x01D0D5 }, + { "Asia/Manila" , 0x01D19A }, + { "Asia/Muscat" , 0x01D21F }, + { "Asia/Nicosia" , 0x01D274 }, + { "Asia/Novokuznetsk" , 0x01D55C }, + { "Asia/Novosibirsk" , 0x01D75E }, + { "Asia/Omsk" , 0x01D949 }, + { "Asia/Oral" , 0x01DB30 }, + { "Asia/Phnom_Penh" , 0x01DD00 }, + { "Asia/Pontianak" , 0x01DD78 }, + { "Asia/Pyongyang" , 0x01DE3A }, + { "Asia/Qatar" , 0x01DEA7 }, + { "Asia/Qyzylorda" , 0x01DF0D }, + { "Asia/Rangoon" , 0x01E0E3 }, + { "Asia/Riyadh" , 0x01E15B }, + { "Asia/Saigon" , 0x01E1B0 }, + { "Asia/Sakhalin" , 0x01E228 }, + { "Asia/Samarkand" , 0x01E41F }, + { "Asia/Seoul" , 0x01E555 }, + { "Asia/Shanghai" , 0x01E5F9 }, + { "Asia/Singapore" , 0x01E6D9 }, + { "Asia/Taipei" , 0x01E790 }, + { "Asia/Tashkent" , 0x01E8A8 }, + { "Asia/Tbilisi" , 0x01E9D9 }, + { "Asia/Tehran" , 0x01EB93 }, + { "Asia/Tel_Aviv" , 0x01EE01 }, + { "Asia/Thimbu" , 0x01F130 }, + { "Asia/Thimphu" , 0x01F196 }, + { "Asia/Tokyo" , 0x01F1FC }, + { "Asia/Ujung_Pandang" , 0x01F285 }, + { "Asia/Ulaanbaatar" , 0x01F302 }, + { "Asia/Ulan_Bator" , 0x01F45D }, + { "Asia/Urumqi" , 0x01F5AA }, + { "Asia/Ust-Nera" , 0x01F671 }, + { "Asia/Vientiane" , 0x01F876 }, + { "Asia/Vladivostok" , 0x01F8EE }, + { "Asia/Yakutsk" , 0x01FADA }, + { "Asia/Yekaterinburg" , 0x01FCBF }, + { "Asia/Yerevan" , 0x01FECA }, + { "Atlantic/Azores" , 0x0200CA }, + { "Atlantic/Bermuda" , 0x0205CD }, + { "Atlantic/Canary" , 0x0208AE }, + { "Atlantic/Cape_Verde" , 0x020B84 }, + { "Atlantic/Faeroe" , 0x020BFD }, + { "Atlantic/Faroe" , 0x020EA1 }, + { "Atlantic/Jan_Mayen" , 0x021145 }, + { "Atlantic/Madeira" , 0x021477 }, + { "Atlantic/Reykjavik" , 0x021980 }, + { "Atlantic/South_Georgia" , 0x021B39 }, + { "Atlantic/St_Helena" , 0x021D4B }, + { "Atlantic/Stanley" , 0x021B7D }, + { "Australia/ACT" , 0x021DA0 }, + { "Australia/Adelaide" , 0x0220BD }, + { "Australia/Brisbane" , 0x0223E9 }, + { "Australia/Broken_Hill" , 0x0224B0 }, + { "Australia/Canberra" , 0x0227EE }, + { "Australia/Currie" , 0x022B0B }, + { "Australia/Darwin" , 0x022E3E }, + { "Australia/Eucla" , 0x022EC4 }, + { "Australia/Hobart" , 0x022F99 }, + { "Australia/LHI" , 0x0232F7 }, + { "Australia/Lindeman" , 0x023592 }, + { "Australia/Lord_Howe" , 0x023673 }, + { "Australia/Melbourne" , 0x02391E }, + { "Australia/North" , 0x023C43 }, + { "Australia/NSW" , 0x023CB7 }, + { "Australia/Perth" , 0x023FD4 }, + { "Australia/Queensland" , 0x0240AC }, + { "Australia/South" , 0x024158 }, + { "Australia/Sydney" , 0x024475 }, + { "Australia/Tasmania" , 0x0247B2 }, + { "Australia/Victoria" , 0x024AF7 }, + { "Australia/West" , 0x024E14 }, + { "Australia/Yancowinna" , 0x024ECA }, + { "Brazil/Acre" , 0x0251EC }, + { "Brazil/DeNoronha" , 0x0252EB }, + { "Brazil/East" , 0x02540B }, + { "Brazil/West" , 0x0256E8 }, + { "Canada/Atlantic" , 0x0257E0 }, + { "Canada/Central" , 0x025CC8 }, + { "Canada/East-Saskatchewan" , 0x0265D2 }, + { "Canada/Eastern" , 0x0260E2 }, + { "Canada/Mountain" , 0x02675B }, + { "Canada/Newfoundland" , 0x026AD1 }, + { "Canada/Pacific" , 0x026FFC }, + { "Canada/Saskatchewan" , 0x027415 }, + { "Canada/Yukon" , 0x02759E }, + { "CET" , 0x0278A1 }, + { "Chile/Continental" , 0x027BAA }, + { "Chile/EasterIsland" , 0x027F45 }, + { "CST6CDT" , 0x028287 }, + { "Cuba" , 0x0285D8 }, + { "EET" , 0x02894B }, + { "Egypt" , 0x028BFE }, + { "Eire" , 0x028EC1 }, + { "EST" , 0x0293D2 }, + { "EST5EDT" , 0x029416 }, + { "Etc/GMT" , 0x029767 }, + { "Etc/GMT+0" , 0x029833 }, + { "Etc/GMT+1" , 0x0298BD }, + { "Etc/GMT+10" , 0x02994A }, + { "Etc/GMT+11" , 0x0299D8 }, + { "Etc/GMT+12" , 0x029A66 }, + { "Etc/GMT+2" , 0x029B81 }, + { "Etc/GMT+3" , 0x029C0D }, + { "Etc/GMT+4" , 0x029C99 }, + { "Etc/GMT+5" , 0x029D25 }, + { "Etc/GMT+6" , 0x029DB1 }, + { "Etc/GMT+7" , 0x029E3D }, + { "Etc/GMT+8" , 0x029EC9 }, + { "Etc/GMT+9" , 0x029F55 }, + { "Etc/GMT-0" , 0x0297EF }, + { "Etc/GMT-1" , 0x029877 }, + { "Etc/GMT-10" , 0x029903 }, + { "Etc/GMT-11" , 0x029991 }, + { "Etc/GMT-12" , 0x029A1F }, + { "Etc/GMT-13" , 0x029AAD }, + { "Etc/GMT-14" , 0x029AF4 }, + { "Etc/GMT-2" , 0x029B3B }, + { "Etc/GMT-3" , 0x029BC7 }, + { "Etc/GMT-4" , 0x029C53 }, + { "Etc/GMT-5" , 0x029CDF }, + { "Etc/GMT-6" , 0x029D6B }, + { "Etc/GMT-7" , 0x029DF7 }, + { "Etc/GMT-8" , 0x029E83 }, + { "Etc/GMT-9" , 0x029F0F }, + { "Etc/GMT0" , 0x0297AB }, + { "Etc/Greenwich" , 0x029F9B }, + { "Etc/UCT" , 0x029FDF }, + { "Etc/Universal" , 0x02A023 }, + { "Etc/UTC" , 0x02A067 }, + { "Etc/Zulu" , 0x02A0AB }, + { "Europe/Amsterdam" , 0x02A0EF }, + { "Europe/Andorra" , 0x02A52D }, + { "Europe/Athens" , 0x02A7A9 }, + { "Europe/Belfast" , 0x02AAEC }, + { "Europe/Belgrade" , 0x02B023 }, + { "Europe/Berlin" , 0x02B2EC }, + { "Europe/Bratislava" , 0x02B650 }, + { "Europe/Brussels" , 0x02B982 }, + { "Europe/Bucharest" , 0x02BDB9 }, + { "Europe/Budapest" , 0x02C0E3 }, + { "Europe/Busingen" , 0x02C456 }, + { "Europe/Chisinau" , 0x02C70D }, + { "Europe/Copenhagen" , 0x02CA9B }, + { "Europe/Dublin" , 0x02CDA5 }, + { "Europe/Gibraltar" , 0x02D2B6 }, + { "Europe/Guernsey" , 0x02D70D }, + { "Europe/Helsinki" , 0x02DC44 }, + { "Europe/Isle_of_Man" , 0x02DEFA }, + { "Europe/Istanbul" , 0x02E431 }, + { "Europe/Jersey" , 0x02E81E }, + { "Europe/Kaliningrad" , 0x02ED55 }, + { "Europe/Kiev" , 0x02EFBB }, + { "Europe/Lisbon" , 0x02F2D2 }, + { "Europe/Ljubljana" , 0x02F7D6 }, + { "Europe/London" , 0x02FA9F }, + { "Europe/Luxembourg" , 0x02FFD6 }, + { "Europe/Madrid" , 0x03042C }, + { "Europe/Malta" , 0x0307F2 }, + { "Europe/Mariehamn" , 0x030BAB }, + { "Europe/Minsk" , 0x030E61 }, + { "Europe/Monaco" , 0x03106F }, + { "Europe/Moscow" , 0x0314AA }, + { "Europe/Nicosia" , 0x0316FB }, + { "Europe/Oslo" , 0x0319E3 }, + { "Europe/Paris" , 0x031D15 }, + { "Europe/Podgorica" , 0x03215B }, + { "Europe/Prague" , 0x032424 }, + { "Europe/Riga" , 0x032756 }, + { "Europe/Rome" , 0x032A9B }, + { "Europe/Samara" , 0x032E5E }, + { "Europe/San_Marino" , 0x033091 }, + { "Europe/Sarajevo" , 0x033454 }, + { "Europe/Simferopol" , 0x03371D }, + { "Europe/Skopje" , 0x033A48 }, + { "Europe/Sofia" , 0x033D11 }, + { "Europe/Stockholm" , 0x034019 }, + { "Europe/Tallinn" , 0x0342C8 }, + { "Europe/Tirane" , 0x034602 }, + { "Europe/Tiraspol" , 0x034908 }, + { "Europe/Uzhgorod" , 0x034C96 }, + { "Europe/Vaduz" , 0x034FAD }, + { "Europe/Vatican" , 0x03525C }, + { "Europe/Vienna" , 0x03561F }, + { "Europe/Vilnius" , 0x03594C }, + { "Europe/Volgograd" , 0x035C8B }, + { "Europe/Warsaw" , 0x035E8B }, + { "Europe/Zagreb" , 0x03626C }, + { "Europe/Zaporozhye" , 0x036535 }, + { "Europe/Zurich" , 0x036876 }, + { "Factory" , 0x036B25 }, + { "GB" , 0x036B96 }, + { "GB-Eire" , 0x0370CD }, + { "GMT" , 0x037604 }, + { "GMT+0" , 0x0376D0 }, + { "GMT-0" , 0x03768C }, + { "GMT0" , 0x037648 }, + { "Greenwich" , 0x037714 }, + { "Hongkong" , 0x037758 }, + { "HST" , 0x03791A }, + { "Iceland" , 0x03795E }, + { "Indian/Antananarivo" , 0x037B17 }, + { "Indian/Chagos" , 0x037B8B }, + { "Indian/Christmas" , 0x037BED }, + { "Indian/Cocos" , 0x037C31 }, + { "Indian/Comoro" , 0x037C75 }, + { "Indian/Kerguelen" , 0x037CCA }, + { "Indian/Mahe" , 0x037D1F }, + { "Indian/Maldives" , 0x037D74 }, + { "Indian/Mauritius" , 0x037DC9 }, + { "Indian/Mayotte" , 0x037E3F }, + { "Indian/Reunion" , 0x037E94 }, + { "Iran" , 0x037EE9 }, + { "Israel" , 0x038157 }, + { "Jamaica" , 0x038486 }, + { "Japan" , 0x03854B }, + { "Kwajalein" , 0x0385D4 }, + { "Libya" , 0x038637 }, + { "MET" , 0x038830 }, + { "Mexico/BajaNorte" , 0x038B39 }, + { "Mexico/BajaSur" , 0x038EA2 }, + { "Mexico/General" , 0x0390E7 }, + { "MST" , 0x039345 }, + { "MST7MDT" , 0x039389 }, + { "Navajo" , 0x0396DA }, + { "NZ" , 0x039A53 }, + { "NZ-CHAT" , 0x039DD1 }, + { "Pacific/Apia" , 0x03A0B9 }, + { "Pacific/Auckland" , 0x03A255 }, + { "Pacific/Chatham" , 0x03A5E1 }, + { "Pacific/Chuuk" , 0x03A8D8 }, + { "Pacific/Easter" , 0x03A931 }, + { "Pacific/Efate" , 0x03AC8F }, + { "Pacific/Enderbury" , 0x03AD55 }, + { "Pacific/Fakaofo" , 0x03ADC3 }, + { "Pacific/Fiji" , 0x03AE14 }, + { "Pacific/Funafuti" , 0x03AFA7 }, + { "Pacific/Galapagos" , 0x03AFEB }, + { "Pacific/Gambier" , 0x03B063 }, + { "Pacific/Guadalcanal" , 0x03B0C8 }, + { "Pacific/Guam" , 0x03B11D }, + { "Pacific/Honolulu" , 0x03B173 }, + { "Pacific/Johnston" , 0x03B1EA }, + { "Pacific/Kiritimati" , 0x03B269 }, + { "Pacific/Kosrae" , 0x03B2D4 }, + { "Pacific/Kwajalein" , 0x03B331 }, + { "Pacific/Majuro" , 0x03B39D }, + { "Pacific/Marquesas" , 0x03B3FC }, + { "Pacific/Midway" , 0x03B463 }, + { "Pacific/Nauru" , 0x03B4ED }, + { "Pacific/Niue" , 0x03B565 }, + { "Pacific/Norfolk" , 0x03B5C3 }, + { "Pacific/Noumea" , 0x03B618 }, + { "Pacific/Pago_Pago" , 0x03B6A8 }, + { "Pacific/Palau" , 0x03B731 }, + { "Pacific/Pitcairn" , 0x03B775 }, + { "Pacific/Pohnpei" , 0x03B7CA }, + { "Pacific/Ponape" , 0x03B81F }, + { "Pacific/Port_Moresby" , 0x03B864 }, + { "Pacific/Rarotonga" , 0x03B8A8 }, + { "Pacific/Saipan" , 0x03B984 }, + { "Pacific/Samoa" , 0x03B9E7 }, + { "Pacific/Tahiti" , 0x03BA70 }, + { "Pacific/Tarawa" , 0x03BAD5 }, + { "Pacific/Tongatapu" , 0x03BB29 }, + { "Pacific/Truk" , 0x03BBB5 }, + { "Pacific/Wake" , 0x03BBFA }, + { "Pacific/Wallis" , 0x03BC4A }, + { "Pacific/Yap" , 0x03BC8E }, + { "Poland" , 0x03BCD3 }, + { "Portugal" , 0x03C0B4 }, + { "PRC" , 0x03C5B0 }, + { "PST8PDT" , 0x03C661 }, + { "ROC" , 0x03C9B2 }, + { "ROK" , 0x03CACA }, + { "Singapore" , 0x03CB6E }, + { "Turkey" , 0x03CC25 }, + { "UCT" , 0x03D012 }, + { "Universal" , 0x03D056 }, + { "US/Alaska" , 0x03D09A }, + { "US/Aleutian" , 0x03D403 }, + { "US/Arizona" , 0x03D769 }, + { "US/Central" , 0x03D7F7 }, + { "US/East-Indiana" , 0x03E201 }, + { "US/Eastern" , 0x03DD02 }, + { "US/Hawaii" , 0x03E46B }, + { "US/Indiana-Starke" , 0x03E4DC }, + { "US/Michigan" , 0x03E84D }, + { "US/Mountain" , 0x03EB84 }, + { "US/Pacific" , 0x03EEFD }, + { "US/Pacific-New" , 0x03F302 }, + { "US/Samoa" , 0x03F707 }, + { "UTC" , 0x03F790 }, + { "W-SU" , 0x03FA87 }, + { "WET" , 0x03F7D4 }, + { "Zulu" , 0x03FCC1 }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[261525] = { +const unsigned char timelib_timezone_db_data_builtin[261381] = { /* Africa/Abidjan */ @@ -945,7 +945,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Africa/Juba */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xDA, 0xE0, +0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xDA, 0x00, 0x00, 0x9E, 0x17, 0xE0, 0x01, 0x7A, 0x34, 0x50, 0x02, 0x7D, 0xF9, 0xE0, 0x03, 0x5B, 0x67, 0xD0, 0x04, 0x60, 0x7E, 0xE0, 0x05, 0x3D, 0xEC, 0xD0, 0x06, 0x40, 0x60, 0xE0, 0x07, 0x1F, 0x20, 0x50, 0x08, 0x20, 0x42, 0xE0, 0x09, 0x00, 0x53, 0xD0, 0x0A, 0x00, 0x24, 0xE0, 0x0A, 0xE1, 0x87, 0x50, @@ -956,7 +956,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x1A, 0xF1, 0x8B, 0xE0, 0x1B, 0xD0, 0x4B, 0x50, 0x1C, 0xD1, 0x6D, 0xE0, 0x1D, 0xB1, 0x7E, 0xD0, 0x38, 0x80, 0x45, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x1D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x41, 0x53, 0x54, 0x00, 0x43, 0x41, 0x54, 0x00, 0x45, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xBA, 0xC8, 0x01, 0x42, 0xE0, 0x40, 0x00, @@ -1390,8 +1390,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Anguilla */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x35, 0x20, -0x01, 0xFF, 0xFF, 0xC4, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x19, 0xA0, 0x00, 0xB2, 0x6D, 0x15, 0x00, 0x00, 0x00, 0x00, @@ -1407,7 +1407,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Araguaina */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x96, 0xAA, 0x74, 0x30, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x96, 0xAA, 0x74, 0x30, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -1420,29 +1420,14 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x34, 0x38, 0x54, 0x30, 0x34, 0xF8, 0xC1, 0x20, 0x36, 0x20, 0x1F, 0x30, 0x36, 0xCF, 0x68, 0xA0, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x3A, 0x8F, 0x2C, 0xA0, 0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x3D, 0xC4, 0x91, 0x30, 0x3E, 0x4E, 0xF0, 0xA0, -0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x52, 0x63, 0x47, 0x30, 0x53, 0x00, 0x1B, 0xA0, -0x54, 0x43, 0x29, 0x30, 0x54, 0xE9, 0x38, 0x20, 0x56, 0x23, 0x0B, 0x30, 0x56, 0xC9, 0x1A, 0x20, -0x58, 0x02, 0xED, 0x30, 0x58, 0xA8, 0xFC, 0x20, 0x59, 0xE2, 0xCF, 0x30, 0x5A, 0x88, 0xDE, 0x20, -0x5B, 0xCB, 0xEB, 0xB0, 0x5C, 0x68, 0xC0, 0x20, 0x5D, 0xAB, 0xCD, 0xB0, 0x5E, 0x48, 0xA2, 0x20, -0x5F, 0x8B, 0xAF, 0xB0, 0x60, 0x31, 0xBE, 0xA0, 0x61, 0x6B, 0x91, 0xB0, 0x62, 0x11, 0xA0, 0xA0, -0x63, 0x4B, 0x73, 0xB0, 0x63, 0xFA, 0xBD, 0x20, 0x65, 0x2B, 0x55, 0xB0, 0x65, 0xD1, 0x64, 0xA0, -0x67, 0x14, 0x72, 0x30, 0x67, 0xB1, 0x46, 0xA0, 0x68, 0xF4, 0x54, 0x30, 0x69, 0x9A, 0x63, 0x20, -0x6A, 0xD4, 0x36, 0x30, 0x6B, 0x7A, 0x45, 0x20, 0x6C, 0xB4, 0x18, 0x30, 0x6D, 0x5A, 0x27, 0x20, -0x6E, 0x93, 0xFA, 0x30, 0x6F, 0x3A, 0x09, 0x20, 0x70, 0x7D, 0x16, 0xB0, 0x71, 0x19, 0xEB, 0x20, -0x72, 0x5C, 0xF8, 0xB0, 0x72, 0xF9, 0xCD, 0x20, 0x74, 0x3C, 0xDA, 0xB0, 0x74, 0xD9, 0xAF, 0x20, -0x76, 0x1C, 0xBC, 0xB0, 0x76, 0xC2, 0xCB, 0xA0, 0x77, 0xFC, 0x9E, 0xB0, 0x78, 0xAB, 0xE8, 0x20, -0x79, 0xDC, 0x80, 0xB0, 0x7A, 0x82, 0x8F, 0xA0, 0x7B, 0xC5, 0x9D, 0x30, 0x7C, 0x62, 0x71, 0xA0, -0x7D, 0xA5, 0x7F, 0x30, 0x7E, 0x4B, 0x8E, 0x20, 0x7F, 0x85, 0x61, 0x30, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0xFF, 0xFF, 0xD2, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x52, 0x53, 0x54, 0x00, 0x42, 0x52, 0x54, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x57, 0xC0, 0x00, 0xC9, 0x1C, 0x60, 0x00, 0x00, 0x00, -0x09, 0x54, 0x6F, 0x63, 0x61, 0x6E, 0x74, 0x69, 0x6E, 0x73, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD2, 0xD0, 0x00, +0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x09, 0x4C, 0x4D, 0x54, +0x00, 0x42, 0x52, 0x53, 0x54, 0x00, 0x42, 0x52, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7E, 0x57, 0xC0, 0x00, 0xC9, 0x1C, 0x60, 0x00, 0x00, 0x00, 0x09, 0x54, 0x6F, 0x63, 0x61, +0x6E, 0x74, 0x69, 0x6E, 0x73, /* America/Argentina/Buenos_Aires */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1767,7 +1752,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, -0x06, 0x05, 0x04, 0x06, 0x04, 0x05, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0xFF, 0xFF, 0xC3, +0x06, 0x05, 0x04, 0x06, 0x04, 0x05, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x04, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x12, 0x43, 0x4D, 0x54, 0x00, 0x41, 0x52, 0x54, 0x00, 0x41, @@ -1839,8 +1824,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Aruba */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x1E, 0x2F, 0x38, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBE, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x1E, 0x2E, 0x23, +0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x4E, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x67, 0x10, 0x00, 0xA7, 0xE5, 0xC5, 0x00, 0x00, 0x00, 0x00, @@ -2414,8 +2399,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Cayman */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x0F, 0xB5, 0x00, -0x01, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0x4B, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x0F, 0xB4, 0xFF, +0x01, 0xFF, 0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xC7, 0x50, 0x00, 0x96, 0x7A, 0x22, 0x00, 0x00, 0x00, 0x00, @@ -2889,8 +2874,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Dominica */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x44, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x34, 0x4C, -0x01, 0xFF, 0xFF, 0xC6, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xAC, 0xD0, 0x00, 0xB4, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, @@ -3292,7 +3277,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Grand_Turk */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB5, 0x00, +0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, @@ -3330,23 +3315,23 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, -0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, +0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x15, 0xAA, 0x00, 0xA6, 0x1E, 0x0A, 0x00, 0x00, 0x00, 0x00, /* America/Grenada */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x47, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x34, 0x64, -0x01, 0xFF, 0xFF, 0xC6, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0xB7, 0x48, 0x00, 0xB4, 0x6F, 0x68, 0x00, 0x00, 0x00, 0x00, /* America/Guadeloupe */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x47, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xD5, 0xE1, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x19, 0x65, 0x00, 0xB4, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, @@ -4057,17 +4042,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Jamaica */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4A, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB5, 0x00, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, -0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xCB, 0x80, 0x00, 0x9D, 0x78, -0x80, 0x00, 0x00, 0x00, 0x00, +0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xBF, 0x05, 0x00, 0x9D, 0x7B, +0x1A, 0x00, 0x00, 0x00, 0x00, /* America/Jujuy */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4573,8 +4558,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Marigot */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xD5, 0xE1, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, @@ -5071,7 +5056,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x00, /* America/Montreal */ -0x50, 0x48, 0x50, 0x31, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x9C, 0xBD, 0x01, 0xF0, 0x9C, 0xE4, 0x64, 0xC0, 0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x58, 0xF8, @@ -5149,16 +5134,14 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x01, 0x00, 0xCE, 0xC8, 0x32, 0x00, 0xA2, 0x67, 0x85, 0x00, 0x00, 0x00, 0x26, -0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x51, -0x75, 0x65, 0x62, 0x65, 0x63, 0x20, 0x2D, 0x20, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, 0x63, -0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, +0x00, 0x00, 0x00, 0x01, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, + /* America/Montserrat */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x35, 0x10, -0x01, 0xFF, 0xFF, 0xC5, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xD6, 0x32, 0x00, 0xB3, 0xB9, 0x1D, 0x00, 0x00, 0x00, 0x00, @@ -5741,9 +5724,10 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0xFB, 0xE8, 0x58, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0x4D, 0x44, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xBC, 0x5E, 0x01, 0x00, 0x67, 0xA5, 0xDA, 0x00, 0x00, 0x00, 0x20, 0x4D, 0x6F, +0x00, 0x00, 0x00, 0xBC, 0x5E, 0x01, 0x00, 0x67, 0xA5, 0xDA, 0x00, 0x00, 0x00, 0x30, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, -0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x41, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x61, +0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x41, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x61, 0x20, 0x28, +0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x4E, 0x61, 0x76, 0x61, 0x6A, 0x6F, 0x29, /* America/Port-au-Prince */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x48, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6344,7 +6328,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x74, 0x6F, 0x71, 0x71, 0x6F, 0x72, 0x74, 0x6F, 0x6F, 0x72, 0x6D, 0x69, 0x69, 0x74, /* America/Shiprock */ -0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x9E, 0xA6, 0x3A, 0x90, 0x9F, 0xBB, 0x07, 0x80, 0xA0, 0x86, 0x1C, 0x90, 0xA1, 0x9A, 0xE9, 0x80, 0xA2, 0x65, 0xFE, 0x90, @@ -6398,9 +6382,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4D, 0x44, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, 0x54, -0x00, 0x4D, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC1, 0x75, -0x9B, 0x00, 0x6C, 0xD0, 0xE1, 0x00, 0x00, 0x00, 0x16, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, -0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x4E, 0x61, 0x76, 0x61, 0x6A, 0x6F, +0x00, 0x4D, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, 0x54, +0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* America/Sitka */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6464,8 +6447,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/St_Barthelemy */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xD5, 0xE1, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, @@ -6560,32 +6543,32 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/St_Kitts */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x34, 0xCC, -0x01, 0xFF, 0xFF, 0xC5, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0xBA, 0x10, 0x00, 0xB2, 0xF5, 0xCD, 0x00, 0x00, 0x00, 0x00, /* America/St_Lucia */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0xC7, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x43, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xB7, 0x82, 0x00, 0xB5, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, /* America/St_Thomas */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x60, -0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x54, 0x38, 0x00, 0xAF, 0x93, 0xEA, 0x00, 0x00, 0x00, 0x00, /* America/St_Vincent */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0xC7, 0xE8, -0x01, 0xFF, 0xFF, 0xC6, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4B, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x64, 0xF8, 0x00, 0xB5, 0x39, 0x3A, 0x00, 0x00, 0x00, 0x00, @@ -6853,16 +6836,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x01, 0x00, 0xCB, 0xEF, 0x08, 0x00, 0x99, 0x87, 0x62, 0x00, 0x00, 0x00, 0x27, +0x00, 0x00, 0x00, 0x01, 0x00, 0xCB, 0xEF, 0x08, 0x00, 0x99, 0x87, 0x62, 0x00, 0x00, 0x00, 0x30, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x4F, -0x6E, 0x74, 0x61, 0x72, 0x69, 0x6F, 0x20, 0x2D, 0x20, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, -0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, +0x6E, 0x74, 0x61, 0x72, 0x69, 0x6F, 0x20, 0x26, 0x20, 0x51, 0x75, 0x65, 0x62, 0x65, 0x63, 0x20, +0x2D, 0x20, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, + /* America/Tortola */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x14, -0x01, 0xFF, 0xFF, 0xC3, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x7B, 0x48, 0x00, 0xB0, 0x0F, 0x9D, 0x00, 0x00, 0x00, 0x00, @@ -6939,8 +6923,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Virgin */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x60, -0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, @@ -7264,54 +7248,64 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Antarctica/McMurdo */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0xE5, 0xA9, 0xE9, 0x00, -0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, -0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, -0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, -0x14, 0x58, 0x49, 0xE0, 0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, -0x18, 0x21, 0x48, 0x60, 0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, -0x1B, 0xE1, 0x0C, 0x60, 0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, -0x1F, 0xA0, 0xD0, 0x60, 0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, -0x23, 0x69, 0xCE, 0xE0, 0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, -0x27, 0x0D, 0xE3, 0x60, 0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, -0x2A, 0xCD, 0xA7, 0x60, 0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, -0x2E, 0x8D, 0x6B, 0x60, 0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, -0x32, 0x56, 0x69, 0xE0, 0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, -0x36, 0x16, 0x2D, 0xE0, 0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, -0x39, 0xD5, 0xF1, 0xE0, 0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, -0x3D, 0x9E, 0xF0, 0x60, 0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, -0x41, 0x5E, 0xB4, 0x60, 0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, -0x45, 0x1E, 0x78, 0x60, 0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, -0x48, 0xDE, 0x3C, 0x60, 0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, -0x4C, 0x9E, 0x00, 0x60, 0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, -0x50, 0x66, 0xFE, 0xE0, 0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, -0x54, 0x26, 0xC2, 0xE0, 0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, -0x57, 0xE6, 0x86, 0xE0, 0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, -0x5B, 0xAF, 0x85, 0x60, 0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, -0x5F, 0x6F, 0x49, 0x60, 0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, -0x63, 0x2F, 0x0D, 0x60, 0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, -0x66, 0xF8, 0x0B, 0xE0, 0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, -0x6A, 0xB7, 0xCF, 0xE0, 0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, -0x6E, 0x77, 0x93, 0xE0, 0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, -0x72, 0x40, 0x92, 0x60, 0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, -0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, -0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, -0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x03, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0F, 0xB0, 0xB4, 0xB2, 0xE8, +0xB1, 0x51, 0x87, 0x58, 0xB2, 0x78, 0xE5, 0x68, 0xB3, 0x43, 0xE5, 0x60, 0xB4, 0x58, 0xC7, 0x68, +0xB5, 0x23, 0xC7, 0x60, 0xB6, 0x38, 0xA9, 0x68, 0xB7, 0x03, 0xA9, 0x60, 0xB8, 0x18, 0x8B, 0x68, +0xB8, 0xEC, 0xC5, 0xE0, 0xB9, 0xF8, 0x6D, 0x68, 0xBA, 0xCC, 0xA7, 0xE0, 0xBB, 0xD8, 0x4F, 0x68, +0xBC, 0xE3, 0xE8, 0xE0, 0xBD, 0xAE, 0xF6, 0xE8, 0xBE, 0xC3, 0xCA, 0xE0, 0xBF, 0x8E, 0xD8, 0xE8, +0xC0, 0xA3, 0xAC, 0xE0, 0xC1, 0x6E, 0xBA, 0xE8, 0xC2, 0x83, 0x8E, 0xE0, 0xC3, 0x4E, 0x9C, 0xE8, +0xC4, 0x63, 0x70, 0xE0, 0xC5, 0x2E, 0x7E, 0xE8, 0xC6, 0x4C, 0x8D, 0x60, 0xC7, 0x0E, 0x60, 0xE8, +0xC8, 0x2C, 0x6F, 0x60, 0xC8, 0xF7, 0x7D, 0x68, 0xD2, 0xDA, 0x9A, 0x40, 0x09, 0x18, 0xFD, 0xE0, +0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, +0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, +0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, 0x14, 0x58, 0x49, 0xE0, +0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, 0x18, 0x21, 0x48, 0x60, +0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, 0x1B, 0xE1, 0x0C, 0x60, +0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, 0x1F, 0xA0, 0xD0, 0x60, +0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, 0x23, 0x69, 0xCE, 0xE0, +0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, 0x27, 0x0D, 0xE3, 0x60, +0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, 0x2A, 0xCD, 0xA7, 0x60, +0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, 0x2E, 0x8D, 0x6B, 0x60, +0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, 0x32, 0x56, 0x69, 0xE0, +0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, 0x36, 0x16, 0x2D, 0xE0, +0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, 0x39, 0xD5, 0xF1, 0xE0, +0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, 0x3D, 0x9E, 0xF0, 0x60, +0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, 0x41, 0x5E, 0xB4, 0x60, +0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, 0x45, 0x1E, 0x78, 0x60, +0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, 0x48, 0xDE, 0x3C, 0x60, +0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, 0x4C, 0x9E, 0x00, 0x60, +0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, 0x50, 0x66, 0xFE, 0xE0, +0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, 0x54, 0x26, 0xC2, 0xE0, +0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, 0x57, 0xE6, 0x86, 0xE0, +0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, 0x5B, 0xAF, 0x85, 0x60, +0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, 0x5F, 0x6F, 0x49, 0x60, +0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, 0x63, 0x2F, 0x0D, 0x60, +0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, 0x66, 0xF8, 0x0B, 0xE0, +0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, 0x6A, 0xB7, 0xCF, 0xE0, +0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, 0x6E, 0x77, 0x93, 0xE0, +0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, 0x72, 0x40, 0x92, 0x60, +0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, +0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, +0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, +0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x09, 0x7A, 0x7A, 0x7A, 0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x4E, 0x5A, 0x53, -0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x90, 0x9A, 0x02, 0x10, -0xDE, 0xA0, 0x00, 0x00, 0x00, 0x1C, 0x4D, 0x63, 0x4D, 0x75, 0x72, 0x64, 0x6F, 0x20, 0x53, 0x74, -0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x52, 0x6F, 0x73, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x61, -0x6E, 0x64, +0x02, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x00, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x05, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, +0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, +0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x12, 0x90, 0x9A, 0x02, 0x10, 0xDE, 0xA0, 0x00, 0x00, 0x00, 0x2D, 0x4D, 0x63, +0x4D, 0x75, 0x72, 0x64, 0x6F, 0x2C, 0x20, 0x53, 0x6F, 0x75, 0x74, 0x68, 0x20, 0x50, 0x6F, 0x6C, +0x65, 0x2C, 0x20, 0x53, 0x63, 0x6F, 0x74, 0x74, 0x20, 0x28, 0x4E, 0x65, 0x77, 0x20, 0x5A, 0x65, +0x61, 0x6C, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x29, /* Antarctica/Palmer */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7376,55 +7370,62 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, /* Antarctica/South_Pole */ -0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0xE5, 0xA9, 0xE9, 0x00, -0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, -0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, -0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, -0x14, 0x58, 0x49, 0xE0, 0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, -0x18, 0x21, 0x48, 0x60, 0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, -0x1B, 0xE1, 0x0C, 0x60, 0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, -0x1F, 0xA0, 0xD0, 0x60, 0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, -0x23, 0x69, 0xCE, 0xE0, 0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, -0x27, 0x0D, 0xE3, 0x60, 0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, -0x2A, 0xCD, 0xA7, 0x60, 0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, -0x2E, 0x8D, 0x6B, 0x60, 0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, -0x32, 0x56, 0x69, 0xE0, 0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, -0x36, 0x16, 0x2D, 0xE0, 0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, -0x39, 0xD5, 0xF1, 0xE0, 0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, -0x3D, 0x9E, 0xF0, 0x60, 0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, -0x41, 0x5E, 0xB4, 0x60, 0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, -0x45, 0x1E, 0x78, 0x60, 0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, -0x48, 0xDE, 0x3C, 0x60, 0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, -0x4C, 0x9E, 0x00, 0x60, 0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, -0x50, 0x66, 0xFE, 0xE0, 0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, -0x54, 0x26, 0xC2, 0xE0, 0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, -0x57, 0xE6, 0x86, 0xE0, 0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, -0x5B, 0xAF, 0x85, 0x60, 0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, -0x5F, 0x6F, 0x49, 0x60, 0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, -0x63, 0x2F, 0x0D, 0x60, 0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, -0x66, 0xF8, 0x0B, 0xE0, 0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, -0x6A, 0xB7, 0xCF, 0xE0, 0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, -0x6E, 0x77, 0x93, 0xE0, 0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, -0x72, 0x40, 0x92, 0x60, 0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, -0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, -0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, -0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x03, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0F, 0xB0, 0xB4, 0xB2, 0xE8, +0xB1, 0x51, 0x87, 0x58, 0xB2, 0x78, 0xE5, 0x68, 0xB3, 0x43, 0xE5, 0x60, 0xB4, 0x58, 0xC7, 0x68, +0xB5, 0x23, 0xC7, 0x60, 0xB6, 0x38, 0xA9, 0x68, 0xB7, 0x03, 0xA9, 0x60, 0xB8, 0x18, 0x8B, 0x68, +0xB8, 0xEC, 0xC5, 0xE0, 0xB9, 0xF8, 0x6D, 0x68, 0xBA, 0xCC, 0xA7, 0xE0, 0xBB, 0xD8, 0x4F, 0x68, +0xBC, 0xE3, 0xE8, 0xE0, 0xBD, 0xAE, 0xF6, 0xE8, 0xBE, 0xC3, 0xCA, 0xE0, 0xBF, 0x8E, 0xD8, 0xE8, +0xC0, 0xA3, 0xAC, 0xE0, 0xC1, 0x6E, 0xBA, 0xE8, 0xC2, 0x83, 0x8E, 0xE0, 0xC3, 0x4E, 0x9C, 0xE8, +0xC4, 0x63, 0x70, 0xE0, 0xC5, 0x2E, 0x7E, 0xE8, 0xC6, 0x4C, 0x8D, 0x60, 0xC7, 0x0E, 0x60, 0xE8, +0xC8, 0x2C, 0x6F, 0x60, 0xC8, 0xF7, 0x7D, 0x68, 0xD2, 0xDA, 0x9A, 0x40, 0x09, 0x18, 0xFD, 0xE0, +0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, +0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, +0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, 0x14, 0x58, 0x49, 0xE0, +0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, 0x18, 0x21, 0x48, 0x60, +0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, 0x1B, 0xE1, 0x0C, 0x60, +0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, 0x1F, 0xA0, 0xD0, 0x60, +0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, 0x23, 0x69, 0xCE, 0xE0, +0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, 0x27, 0x0D, 0xE3, 0x60, +0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, 0x2A, 0xCD, 0xA7, 0x60, +0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, 0x2E, 0x8D, 0x6B, 0x60, +0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, 0x32, 0x56, 0x69, 0xE0, +0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, 0x36, 0x16, 0x2D, 0xE0, +0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, 0x39, 0xD5, 0xF1, 0xE0, +0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, 0x3D, 0x9E, 0xF0, 0x60, +0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, 0x41, 0x5E, 0xB4, 0x60, +0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, 0x45, 0x1E, 0x78, 0x60, +0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, 0x48, 0xDE, 0x3C, 0x60, +0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, 0x4C, 0x9E, 0x00, 0x60, +0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, 0x50, 0x66, 0xFE, 0xE0, +0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, 0x54, 0x26, 0xC2, 0xE0, +0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, 0x57, 0xE6, 0x86, 0xE0, +0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, 0x5B, 0xAF, 0x85, 0x60, +0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, 0x5F, 0x6F, 0x49, 0x60, +0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, 0x63, 0x2F, 0x0D, 0x60, +0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, 0x66, 0xF8, 0x0B, 0xE0, +0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, 0x6A, 0xB7, 0xCF, 0xE0, +0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, 0x6E, 0x77, 0x93, 0xE0, +0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, 0x72, 0x40, 0x92, 0x60, +0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, +0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, +0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, +0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x09, 0x7A, 0x7A, 0x7A, 0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x4E, 0x5A, 0x53, -0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x12, -0xA8, 0x80, 0x00, 0x00, 0x00, 0x22, 0x41, 0x6D, 0x75, 0x6E, 0x64, 0x73, 0x65, 0x6E, 0x2D, 0x53, -0x63, 0x6F, 0x74, 0x74, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x53, 0x6F, -0x75, 0x74, 0x68, 0x20, 0x50, 0x6F, 0x6C, 0x65, +0x02, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x00, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x05, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, +0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, +0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* Antarctica/Syowa */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7535,8 +7536,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Amman */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4A, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0D, 0xB6, 0xA3, 0xD6, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xD6, 0xD0, 0x06, 0x72, 0x79, 0xE0, 0x07, 0x0C, 0xAB, 0x50, 0x08, 0x24, 0x37, 0x60, 0x08, 0xED, 0xDE, 0xD0, 0x0A, 0x05, 0x6A, 0xE0, 0x0A, 0xCF, 0x12, 0x50, 0x0B, 0xE7, 0xEF, 0xE0, 0x0C, 0xDA, 0x75, 0xD0, 0x0D, 0xC9, 0x23, 0x60, 0x0E, 0x92, 0xCA, 0xD0, 0x0F, 0xA9, 0x05, 0x60, 0x10, 0x72, 0xAC, 0xD0, @@ -7553,31 +7554,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x42, 0x4C, 0x72, 0xE0, 0x43, 0x3C, 0x63, 0xE0, 0x44, 0x2C, 0x54, 0xE0, 0x45, 0x41, 0x2F, 0xE0, 0x46, 0x0C, 0x36, 0xE0, 0x47, 0x21, 0x11, 0xE0, 0x47, 0xEC, 0x18, 0xE0, 0x49, 0x0A, 0x2E, 0x60, 0x49, 0xCB, 0xFA, 0xE0, 0x4A, 0xEA, 0x10, 0x60, 0x4B, 0xAB, 0xDC, 0xE0, 0x4C, 0xC9, 0xF2, 0x60, -0x4D, 0x94, 0xF9, 0x60, 0x4E, 0xA9, 0xD4, 0x60, 0x4F, 0x74, 0xDB, 0x60, 0x52, 0x69, 0x98, 0x60, -0x53, 0x34, 0x9F, 0x60, 0x54, 0x52, 0xB4, 0xE0, 0x55, 0x14, 0x81, 0x60, 0x56, 0x32, 0x96, 0xE0, -0x56, 0xFD, 0x9D, 0xE0, 0x58, 0x12, 0x78, 0xE0, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xF2, 0x5A, 0xE0, -0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xD2, 0x3C, 0xE0, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB2, 0x1E, 0xE0, -0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x9B, 0x3B, 0x60, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x7B, 0x1D, 0x60, -0x62, 0x46, 0x24, 0x60, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x26, 0x06, 0x60, 0x65, 0x3A, 0xE1, 0x60, -0x66, 0x05, 0xE8, 0x60, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE5, 0xCA, 0x60, 0x69, 0x03, 0xDF, 0xE0, -0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0xC3, 0xA3, 0xE0, -0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x83, 0x67, 0xE0, -0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x4C, 0x66, 0x60, -0x75, 0x0E, 0x32, 0xE0, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xF7, 0x4F, 0x60, 0x78, 0x0C, 0x2A, 0x60, -0x78, 0xD7, 0x31, 0x60, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0xCB, 0xEE, 0x60, -0x7C, 0x96, 0xF5, 0x60, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x94, 0xEC, 0xE0, +0x4D, 0x94, 0xF9, 0x60, 0x4E, 0xA9, 0xD4, 0x60, 0x4F, 0x74, 0xDB, 0x60, 0x50, 0x89, 0xB6, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x03, 0x01, 0x03, 0x01, 0x05, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, -0x7C, 0xF5, 0x00, 0x00, 0x00, 0x00, +0x30, 0x01, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, 0x7C, 0xF5, 0x00, 0x00, +0x00, 0x00, /* Asia/Anadyr */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8060,13 +8047,13 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Dili */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x92, 0xE6, 0x18, 0xC4, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x92, 0xE6, 0x18, 0xC4, 0xCB, 0x99, 0x32, 0xF0, 0xD2, 0x56, 0xEE, 0x70, 0x0B, 0xEA, 0x30, 0x70, 0x39, 0xC3, 0x99, 0x00, 0x01, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x70, -0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4C, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x43, -0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x48, -0x68, 0x01, 0xD2, 0x48, 0x7D, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4C, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x57, +0x49, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x48, 0x68, 0x01, 0xD2, 0x48, 0x7D, 0x00, 0x00, 0x00, 0x00, /* Asia/Dubai */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8122,19 +8109,19 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x45, 0x12, 0xFD, 0x50, 0x46, 0x0E, 0xD9, 0xE0, 0x46, 0xE8, 0x6F, 0x70, 0x47, 0xEC, 0x18, 0xE0, 0x48, 0xB7, 0x11, 0xD0, 0x49, 0xCB, 0xFA, 0xE0, 0x4A, 0xA0, 0x3C, 0x60, 0x4B, 0xAD, 0x2E, 0x9C, 0x4C, 0x61, 0xBD, 0xD0, 0x4D, 0x94, 0xF9, 0x9C, 0x4E, 0x35, 0xC2, 0x50, 0x4F, 0x74, 0xDB, 0x60, -0x50, 0x5B, 0x91, 0xE0, 0x51, 0x54, 0xBD, 0x60, 0x52, 0x44, 0xAE, 0x60, 0x53, 0x34, 0x9F, 0x60, -0x54, 0x24, 0x90, 0x60, 0x55, 0x14, 0x81, 0x60, 0x56, 0x04, 0x72, 0x60, 0x56, 0xFD, 0x9D, 0xE0, -0x57, 0xE4, 0x54, 0x60, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xC4, 0x36, 0x60, 0x5A, 0xBD, 0x61, 0xE0, -0x5B, 0xA4, 0x18, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0x8D, 0x34, 0xE0, 0x5E, 0x7D, 0x25, 0xE0, -0x5F, 0x6D, 0x16, 0xE0, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x4C, 0xF8, 0xE0, 0x62, 0x46, 0x24, 0x60, -0x63, 0x2C, 0xDA, 0xE0, 0x64, 0x26, 0x06, 0x60, 0x65, 0x0C, 0xBC, 0xE0, 0x66, 0x05, 0xE8, 0x60, -0x66, 0xF5, 0xD9, 0x60, 0x67, 0xE5, 0xCA, 0x60, 0x68, 0xD5, 0xBB, 0x60, 0x69, 0xC5, 0xAC, 0x60, -0x6A, 0xB5, 0x9D, 0x60, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0x95, 0x7F, 0x60, 0x6D, 0x8E, 0xAA, 0xE0, -0x6E, 0x75, 0x61, 0x60, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x55, 0x43, 0x60, 0x71, 0x4E, 0x6E, 0xE0, -0x72, 0x3E, 0x5F, 0xE0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x1E, 0x41, 0xE0, 0x75, 0x0E, 0x32, 0xE0, -0x75, 0xFE, 0x23, 0xE0, 0x76, 0xF7, 0x4F, 0x60, 0x77, 0xDE, 0x05, 0xE0, 0x78, 0xD7, 0x31, 0x60, -0x79, 0xBD, 0xE7, 0xE0, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0x9D, 0xC9, 0xE0, 0x7C, 0x96, 0xF5, 0x60, -0x7D, 0x86, 0xE6, 0x60, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x66, 0xC8, 0x60, 0x00, 0x01, 0x00, 0x01, +0x50, 0x5B, 0x91, 0xE0, 0x51, 0x54, 0xBD, 0x60, 0x52, 0x44, 0xA0, 0x50, 0x53, 0x34, 0x9F, 0x60, +0x54, 0x24, 0x82, 0x50, 0x55, 0x14, 0x81, 0x60, 0x56, 0x04, 0x64, 0x50, 0x56, 0xFD, 0x9D, 0xE0, +0x57, 0xE4, 0x46, 0x50, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xC4, 0x28, 0x50, 0x5A, 0xBD, 0x61, 0xE0, +0x5B, 0xA4, 0x0A, 0x50, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0x8D, 0x26, 0xD0, 0x5E, 0x7D, 0x25, 0xE0, +0x5F, 0x6D, 0x08, 0xD0, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x4C, 0xEA, 0xD0, 0x62, 0x46, 0x24, 0x60, +0x63, 0x2C, 0xCC, 0xD0, 0x64, 0x26, 0x06, 0x60, 0x65, 0x0C, 0xAE, 0xD0, 0x66, 0x05, 0xE8, 0x60, +0x66, 0xF5, 0xCB, 0x50, 0x67, 0xE5, 0xCA, 0x60, 0x68, 0xD5, 0xAD, 0x50, 0x69, 0xC5, 0xAC, 0x60, +0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0x95, 0x71, 0x50, 0x6D, 0x8E, 0xAA, 0xE0, +0x6E, 0x75, 0x53, 0x50, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x55, 0x35, 0x50, 0x71, 0x4E, 0x6E, 0xE0, +0x72, 0x3E, 0x51, 0xD0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x1E, 0x33, 0xD0, 0x75, 0x0E, 0x32, 0xE0, +0x75, 0xFE, 0x15, 0xD0, 0x76, 0xF7, 0x4F, 0x60, 0x77, 0xDD, 0xF7, 0xD0, 0x78, 0xD7, 0x31, 0x60, +0x79, 0xBD, 0xD9, 0xD0, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0x9D, 0xBB, 0xD0, 0x7C, 0x96, 0xF5, 0x60, +0x7D, 0x86, 0xD8, 0x50, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x66, 0xBA, 0x50, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, @@ -8196,19 +8183,19 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x48, 0xBB, 0x06, 0x50, 0x49, 0xCB, 0xFA, 0xE0, 0x4A, 0xA0, 0x3C, 0x60, 0x4B, 0xAB, 0xDC, 0xE0, 0x4C, 0x61, 0xBD, 0xD0, 0x4D, 0x94, 0xF9, 0x9C, 0x4E, 0x35, 0xC2, 0x50, 0x4E, 0x5C, 0x0B, 0xE0, 0x4E, 0x84, 0xDC, 0x50, 0x4F, 0x74, 0xDB, 0x60, 0x50, 0x5B, 0x91, 0xE0, 0x51, 0x54, 0xBD, 0x60, -0x52, 0x44, 0xAE, 0x60, 0x53, 0x34, 0x9F, 0x60, 0x54, 0x24, 0x90, 0x60, 0x55, 0x14, 0x81, 0x60, -0x56, 0x04, 0x72, 0x60, 0x56, 0xFD, 0x9D, 0xE0, 0x57, 0xE4, 0x54, 0x60, 0x58, 0xDD, 0x7F, 0xE0, -0x59, 0xC4, 0x36, 0x60, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xA4, 0x18, 0x60, 0x5C, 0x9D, 0x43, 0xE0, -0x5D, 0x8D, 0x34, 0xE0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x6D, 0x16, 0xE0, 0x60, 0x5D, 0x07, 0xE0, -0x61, 0x4C, 0xF8, 0xE0, 0x62, 0x46, 0x24, 0x60, 0x63, 0x2C, 0xDA, 0xE0, 0x64, 0x26, 0x06, 0x60, -0x65, 0x0C, 0xBC, 0xE0, 0x66, 0x05, 0xE8, 0x60, 0x66, 0xF5, 0xD9, 0x60, 0x67, 0xE5, 0xCA, 0x60, -0x68, 0xD5, 0xBB, 0x60, 0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xB5, 0x9D, 0x60, 0x6B, 0xA5, 0x8E, 0x60, -0x6C, 0x95, 0x7F, 0x60, 0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0x75, 0x61, 0x60, 0x6F, 0x6E, 0x8C, 0xE0, -0x70, 0x55, 0x43, 0x60, 0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x3E, 0x5F, 0xE0, 0x73, 0x2E, 0x50, 0xE0, -0x74, 0x1E, 0x41, 0xE0, 0x75, 0x0E, 0x32, 0xE0, 0x75, 0xFE, 0x23, 0xE0, 0x76, 0xF7, 0x4F, 0x60, -0x77, 0xDE, 0x05, 0xE0, 0x78, 0xD7, 0x31, 0x60, 0x79, 0xBD, 0xE7, 0xE0, 0x7A, 0xB7, 0x13, 0x60, -0x7B, 0x9D, 0xC9, 0xE0, 0x7C, 0x96, 0xF5, 0x60, 0x7D, 0x86, 0xE6, 0x60, 0x7E, 0x76, 0xD7, 0x60, -0x7F, 0x66, 0xC8, 0x60, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, +0x52, 0x44, 0xA0, 0x50, 0x53, 0x34, 0x9F, 0x60, 0x54, 0x24, 0x82, 0x50, 0x55, 0x14, 0x81, 0x60, +0x56, 0x04, 0x64, 0x50, 0x56, 0xFD, 0x9D, 0xE0, 0x57, 0xE4, 0x46, 0x50, 0x58, 0xDD, 0x7F, 0xE0, +0x59, 0xC4, 0x28, 0x50, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xA4, 0x0A, 0x50, 0x5C, 0x9D, 0x43, 0xE0, +0x5D, 0x8D, 0x26, 0xD0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x6D, 0x08, 0xD0, 0x60, 0x5D, 0x07, 0xE0, +0x61, 0x4C, 0xEA, 0xD0, 0x62, 0x46, 0x24, 0x60, 0x63, 0x2C, 0xCC, 0xD0, 0x64, 0x26, 0x06, 0x60, +0x65, 0x0C, 0xAE, 0xD0, 0x66, 0x05, 0xE8, 0x60, 0x66, 0xF5, 0xCB, 0x50, 0x67, 0xE5, 0xCA, 0x60, +0x68, 0xD5, 0xAD, 0x50, 0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xA5, 0x8E, 0x60, +0x6C, 0x95, 0x71, 0x50, 0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0x75, 0x53, 0x50, 0x6F, 0x6E, 0x8C, 0xE0, +0x70, 0x55, 0x35, 0x50, 0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x3E, 0x51, 0xD0, 0x73, 0x2E, 0x50, 0xE0, +0x74, 0x1E, 0x33, 0xD0, 0x75, 0x0E, 0x32, 0xE0, 0x75, 0xFE, 0x15, 0xD0, 0x76, 0xF7, 0x4F, 0x60, +0x77, 0xDD, 0xF7, 0xD0, 0x78, 0xD7, 0x31, 0x60, 0x79, 0xBD, 0xD9, 0xD0, 0x7A, 0xB7, 0x13, 0x60, +0x7B, 0x9D, 0xBB, 0xD0, 0x7C, 0x96, 0xF5, 0x60, 0x7D, 0x86, 0xD8, 0x50, 0x7E, 0x76, 0xD7, 0x60, +0x7F, 0x66, 0xBA, 0x50, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x01, 0x02, @@ -8397,7 +8384,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0xDA, 0xFF, 0x26, 0x00, 0xF4, 0xB5, 0xBE, 0x88, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x00, 0x00, 0x64, 0x20, 0x00, 0x00, 0x00, 0x00, 0x67, 0x20, 0x00, 0x04, 0x00, 0x00, 0x69, 0x78, 0x00, 0x09, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x00, 0x00, 0x70, 0x80, 0x00, 0x09, 0x00, 0x00, 0x62, -0x70, 0x00, 0x09, 0x4A, 0x4D, 0x54, 0x00, 0x4A, 0x41, 0x56, 0x54, 0x00, 0x57, 0x49, 0x54, 0x00, +0x70, 0x00, 0x09, 0x42, 0x4D, 0x54, 0x00, 0x4A, 0x41, 0x56, 0x54, 0x00, 0x57, 0x49, 0x42, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xEB, 0x65, 0x01, 0xB5, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x0E, 0x4A, 0x61, 0x76, 0x61, 0x20, 0x26, 0x20, 0x53, 0x75, 0x6D, 0x61, 0x74, 0x72, 0x61, @@ -8408,7 +8395,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xBA, 0x16, 0xC1, 0x98, 0xD0, 0x58, 0xB9, 0xF0, 0xF4, 0xB5, 0xA2, 0x68, 0x01, 0x02, 0x01, 0x00, 0x00, 0x83, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x85, 0x98, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x45, 0x49, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x57, 0x49, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x76, 0xAA, 0x01, 0xE9, 0x59, 0x70, 0x00, 0x00, 0x00, 0x31, 0x77, 0x65, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6E, 0x65, 0x61, 0x20, 0x28, 0x49, 0x72, 0x69, 0x61, 0x6E, 0x20, 0x4A, 0x61, 0x79, 0x61, 0x29, 0x20, 0x26, 0x20, 0x4D, 0x61, 0x6C, 0x75, 0x6B, 0x75, @@ -8754,17 +8741,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Makassar */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x5D, 0x90, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0x5D, 0x90, 0xBA, 0x16, 0xD5, 0x90, 0xCB, 0x88, 0x1D, 0x80, 0xD2, 0x56, 0xEE, 0x70, 0x01, 0x02, 0x03, 0x02, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, -0x43, 0x49, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x81, 0x85, 0x8D, 0x01, 0xC8, 0xD9, 0x1F, 0x00, 0x00, 0x00, 0x48, 0x65, 0x61, 0x73, 0x74, -0x20, 0x26, 0x20, 0x73, 0x6F, 0x75, 0x74, 0x68, 0x20, 0x42, 0x6F, 0x72, 0x6E, 0x65, 0x6F, 0x2C, -0x20, 0x53, 0x75, 0x6C, 0x61, 0x77, 0x65, 0x73, 0x69, 0x20, 0x28, 0x43, 0x65, 0x6C, 0x65, 0x62, -0x65, 0x73, 0x29, 0x2C, 0x20, 0x42, 0x61, 0x6C, 0x69, 0x2C, 0x20, 0x4E, 0x75, 0x73, 0x61, 0x20, -0x54, 0x65, 0x6E, 0x67, 0x61, 0x72, 0x72, 0x61, 0x2C, 0x20, 0x77, 0x65, 0x73, 0x74, 0x20, 0x54, -0x69, 0x6D, 0x6F, 0x72, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, +0x57, 0x49, 0x54, 0x41, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x81, 0x85, 0x8D, 0x01, 0xC8, 0xD9, 0x1F, 0x00, 0x00, 0x00, 0x48, 0x65, 0x61, 0x73, +0x74, 0x20, 0x26, 0x20, 0x73, 0x6F, 0x75, 0x74, 0x68, 0x20, 0x42, 0x6F, 0x72, 0x6E, 0x65, 0x6F, +0x2C, 0x20, 0x53, 0x75, 0x6C, 0x61, 0x77, 0x65, 0x73, 0x69, 0x20, 0x28, 0x43, 0x65, 0x6C, 0x65, +0x62, 0x65, 0x73, 0x29, 0x2C, 0x20, 0x42, 0x61, 0x6C, 0x69, 0x2C, 0x20, 0x4E, 0x75, 0x73, 0x61, +0x20, 0x54, 0x65, 0x6E, 0x67, 0x61, 0x72, 0x72, 0x61, 0x2C, 0x20, 0x77, 0x65, 0x73, 0x74, 0x20, +0x54, 0x69, 0x6D, 0x6F, 0x72, /* Asia/Manila */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x50, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8980,17 +8967,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Pontianak */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x8B, 0xFF, 0x8E, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x8B, 0xFF, 0x8E, 0x00, 0xBA, 0x16, 0xDF, 0x00, 0xCB, 0x79, 0xA4, 0x08, 0xD2, 0x56, 0xEE, 0x70, 0xD7, 0x3C, 0xC6, 0x08, 0xDA, 0xFF, 0x26, 0x00, 0xF4, 0xB5, 0xBE, 0x88, 0x21, 0xDA, 0x74, 0x80, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x06, 0x00, 0x00, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x66, 0x80, 0x00, 0x04, 0x00, 0x00, 0x69, 0x78, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x57, 0x49, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x43, 0x49, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x89, 0x47, 0x3A, 0x01, 0xB9, 0x7C, 0xD5, 0x00, 0x00, 0x00, 0x15, 0x77, 0x65, 0x73, 0x74, -0x20, 0x26, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x42, 0x6F, 0x72, 0x6E, 0x65, -0x6F, +0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x57, 0x49, 0x42, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x57, 0x49, +0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x47, 0x3A, 0x01, 0xB9, 0x7C, 0xD5, 0x00, 0x00, 0x00, 0x15, 0x77, 0x65, 0x73, +0x74, 0x20, 0x26, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x42, 0x6F, 0x72, 0x6E, +0x65, 0x6F, /* Asia/Pyongyang */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9368,12 +9355,12 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Ujung_Pandang */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x5D, 0x90, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0x5D, 0x90, 0xBA, 0x16, 0xD5, 0x90, 0xCB, 0x88, 0x1D, 0x80, 0xD2, 0x56, 0xEE, 0x70, 0x01, 0x02, 0x03, 0x02, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, -0x43, 0x49, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, +0x57, 0x49, 0x54, 0x41, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* Asia/Ulaanbaatar */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -15346,8 +15333,9 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Europe/Vaduz */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x15, 0x23, 0xEB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0xCA, 0x17, 0x6A, 0x00, +0xCA, 0xE2, 0x71, 0x00, 0xCB, 0xF7, 0x4C, 0x00, 0xCC, 0xC2, 0x53, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, @@ -15376,17 +15364,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, -0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, -0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, -0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0xD1, 0x46, 0x38, 0x01, 0x21, 0x2D, 0xF2, 0x00, -0x00, 0x00, 0x00, +0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x01, 0x00, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x00, +0x00, 0x00, 0x0E, 0x10, 0x00, 0x05, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x05, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, +0x00, 0x01, 0x01, 0x00, 0xD1, 0x46, 0x38, 0x01, 0x21, 0x2D, 0xF2, 0x00, 0x00, 0x00, 0x00, /* Europe/Vatican */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -16278,14 +16266,14 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Jamaica */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB5, 0x00, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, @@ -16999,19 +16987,19 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x36, 0x3B, 0x17, 0xE0, 0x36, 0xD7, 0xFA, 0x60, 0x38, 0x24, 0x34, 0x60, 0x38, 0xB7, 0xDC, 0x60, 0x4B, 0x11, 0x2C, 0xE0, 0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xC2, 0xEA, 0x60, 0x4D, 0x72, 0x41, 0xE0, 0x4E, 0xA2, 0xCC, 0x60, 0x4F, 0x1A, 0xC4, 0xE0, 0x50, 0x82, 0xAE, 0x60, 0x50, 0xFA, 0xA6, 0xE0, -0x52, 0x62, 0x90, 0x60, 0x52, 0xDA, 0x88, 0xE0, 0x54, 0x42, 0x72, 0x60, 0x54, 0xBA, 0x6A, 0xE0, -0x56, 0x22, 0x54, 0x60, 0x56, 0xA3, 0x87, 0x60, 0x58, 0x0B, 0x70, 0xE0, 0x58, 0x83, 0x69, 0x60, +0x52, 0x6B, 0xCA, 0xE0, 0x52, 0xDA, 0x88, 0xE0, 0x54, 0x4B, 0xAC, 0xE0, 0x54, 0xBA, 0x6A, 0xE0, +0x56, 0x2B, 0x8E, 0xE0, 0x56, 0xA3, 0x87, 0x60, 0x58, 0x0B, 0x70, 0xE0, 0x58, 0x83, 0x69, 0x60, 0x59, 0xEB, 0x52, 0xE0, 0x5A, 0x63, 0x4B, 0x60, 0x5B, 0xCB, 0x34, 0xE0, 0x5C, 0x43, 0x2D, 0x60, -0x5D, 0xAB, 0x16, 0xE0, 0x5E, 0x23, 0x0F, 0x60, 0x5F, 0x8A, 0xF8, 0xE0, 0x60, 0x0C, 0x2B, 0xE0, +0x5D, 0xB4, 0x51, 0x60, 0x5E, 0x23, 0x0F, 0x60, 0x5F, 0x94, 0x33, 0x60, 0x60, 0x0C, 0x2B, 0xE0, 0x61, 0x74, 0x15, 0x60, 0x61, 0xEC, 0x0D, 0xE0, 0x63, 0x53, 0xF7, 0x60, 0x63, 0xCB, 0xEF, 0xE0, -0x65, 0x33, 0xD9, 0x60, 0x65, 0xAB, 0xD1, 0xE0, 0x67, 0x13, 0xBB, 0x60, 0x67, 0x8B, 0xB3, 0xE0, -0x68, 0xF3, 0x9D, 0x60, 0x69, 0x6B, 0x95, 0xE0, 0x6A, 0xD3, 0x7F, 0x60, 0x6B, 0x54, 0xB2, 0x60, +0x65, 0x33, 0xD9, 0x60, 0x65, 0xAB, 0xD1, 0xE0, 0x67, 0x1C, 0xF5, 0xE0, 0x67, 0x8B, 0xB3, 0xE0, +0x68, 0xFC, 0xD7, 0xE0, 0x69, 0x6B, 0x95, 0xE0, 0x6A, 0xDC, 0xB9, 0xE0, 0x6B, 0x54, 0xB2, 0x60, 0x6C, 0xBC, 0x9B, 0xE0, 0x6D, 0x34, 0x94, 0x60, 0x6E, 0x9C, 0x7D, 0xE0, 0x6F, 0x14, 0x76, 0x60, -0x70, 0x7C, 0x5F, 0xE0, 0x70, 0xF4, 0x58, 0x60, 0x72, 0x5C, 0x41, 0xE0, 0x72, 0xD4, 0x3A, 0x60, -0x74, 0x3C, 0x23, 0xE0, 0x74, 0xB4, 0x1C, 0x60, 0x76, 0x25, 0x40, 0x60, 0x76, 0x9D, 0x38, 0xE0, +0x70, 0x7C, 0x5F, 0xE0, 0x70, 0xF4, 0x58, 0x60, 0x72, 0x65, 0x7C, 0x60, 0x72, 0xD4, 0x3A, 0x60, +0x74, 0x45, 0x5E, 0x60, 0x74, 0xB4, 0x1C, 0x60, 0x76, 0x25, 0x40, 0x60, 0x76, 0x9D, 0x38, 0xE0, 0x78, 0x05, 0x22, 0x60, 0x78, 0x7D, 0x1A, 0xE0, 0x79, 0xE5, 0x04, 0x60, 0x7A, 0x5C, 0xFC, 0xE0, -0x7B, 0xC4, 0xE6, 0x60, 0x7C, 0x3C, 0xDE, 0xE0, 0x7D, 0xA4, 0xC8, 0x60, 0x7E, 0x1C, 0xC0, 0xE0, -0x7F, 0x84, 0xAA, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x7B, 0xC4, 0xE6, 0x60, 0x7C, 0x3C, 0xDE, 0xE0, 0x7D, 0xAE, 0x02, 0xE0, 0x7E, 0x1C, 0xC0, 0xE0, +0x7F, 0x8D, 0xE4, 0xE0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, @@ -17074,11 +17062,13 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Pacific/Johnston */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, -0x00, 0x00, 0x48, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xE3, 0x38, 0x00, 0x0F, 0xFF, 0x0D, -0x00, 0x00, 0x00, 0x0E, 0x4A, 0x6F, 0x68, 0x6E, 0x73, 0x74, 0x6F, 0x6E, 0x20, 0x41, 0x74, 0x6F, -0x6C, 0x6C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0xBB, 0x05, 0x43, 0x48, +0xBB, 0x21, 0x71, 0x58, 0xCB, 0x89, 0x3D, 0xC8, 0xD2, 0x61, 0x49, 0x38, 0xD5, 0x8D, 0x73, 0x48, +0x01, 0x00, 0x01, 0x00, 0x02, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x68, 0x01, +0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x00, 0x48, 0x53, 0x54, 0x00, 0x48, 0x44, 0x54, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xE3, 0x38, 0x00, 0x0F, 0xFF, 0x0D, 0x00, 0x00, 0x00, +0x0E, 0x4A, 0x6F, 0x68, 0x6E, 0x73, 0x74, 0x6F, 0x6E, 0x20, 0x41, 0x74, 0x6F, 0x6C, 0x6C, /* Pacific/Kiritimati */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18410,4 +18400,4 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2013.4", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2013.6", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From f90483001236c863abe1070d05ee2214db5a0a97 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 Sep 2013 13:43:25 +0400 Subject: [PATCH 0052/1256] Added support for GNU Hurd. (Svante Signell) --- NEWS | 1 + ext/opcache/ZendAccelerator.h | 11 +++++- ext/opcache/config.m4 | 70 ++++++++++++++++++----------------- sapi/cgi/cgi_main.c | 27 +++++++++++--- 4 files changed, 69 insertions(+), 40 deletions(-) diff --git a/NEWS b/NEWS index bdc0cd5fb6532..c03d31905676c 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,7 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: + . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) . Fixed bug #65665 (Exception not properly caught when opcache enabled). diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index f223f126e43a8..b9d7ef34704d8 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -80,6 +80,9 @@ # endif # include #else +# ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +# endif # include #endif @@ -100,7 +103,7 @@ extern int lock_file; # elif defined(__svr4__) # define FLOCK_STRUCTURE(name, type, whence, start, len) \ struct flock name = {type, whence, start, len} -# elif defined(__linux__) || defined(__hpux) +# elif defined(__linux__) || defined(__hpux) || defined(__GNU__) # define FLOCK_STRUCTURE(name, type, whence, start, len) \ struct flock name = {type, whence, start, len, 0} # elif defined(_AIX) @@ -111,6 +114,12 @@ extern int lock_file; # define FLOCK_STRUCTURE(name, type, whence, start, len) \ struct flock name = {type, whence, start, len} # endif +# elif defined(HAVE_FLOCK_BSD) +# define FLOCK_STRUCTURE(name, type, whence, start, len) \ + struct flock name = {start, len, -1, type, whence} +# elif defined(HAVE_FLOCK_LINUX) +# define FLOCK_STRUCTURE(name, type, whence, start, len) \ + struct flock name = {type, whence, start, len} # else # error "Don't know how to define struct flock" # endif diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4 index 1798fe13fa80d..60edeed966b36 100644 --- a/ext/opcache/config.m4 +++ b/ext/opcache/config.m4 @@ -326,40 +326,42 @@ int main() { msg=yes,msg=no,msg=no) AC_MSG_RESULT([$msg]) - AC_MSG_CHECKING(for known struct flock definition) - dnl Copied from ZendAccelerator.h - AC_TRY_RUN([ -#include -#include - -#ifndef ZEND_WIN32 -extern int lock_file; - -# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || (defined(__APPLE__) && defined(__MACH__)/* Darwin */) || defined(__OpenBSD__) || defined(__NetBSD__) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {start, len, -1, type, whence} -# elif defined(__svr4__) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, start, len} -# elif defined(__linux__) || defined(__hpux) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, start, len, 0} -# elif defined(_AIX) -# if defined(_LARGE_FILES) || defined(__64BIT__) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, 0, 0, 0, start, len } -# else -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, start, len} -# endif -# else -# error "Don't know how to define struct flock" -# endif -#endif -int main() { return 0; } -], -[AC_MSG_RESULT([done])], -[AC_MSG_ERROR([Don't know how to define struct flock on this system[,] set --enable-opcache=no])], []) +flock_type=unknown +AC_MSG_CHECKING("whether flock struct is linux ordered") +AC_TRY_RUN([ + #include + struct flock lock = { 1, 2, 3, 4, 5 }; + int main() { + if(lock.l_type == 1 && lock.l_whence == 2 && lock.l_start == 3 && lock.l_len == 4) { + return 0; + } + return 1; + } +], [ + flock_type=linux + AC_DEFINE([HAVE_FLOCK_LINUX], [], [Struct flock is Linux-type]) + AC_MSG_RESULT("yes") +], AC_MSG_RESULT("no") ) + +AC_MSG_CHECKING("whether flock struct is BSD ordered") +AC_TRY_RUN([ + #include + struct flock lock = { 1, 2, 3, 4, 5 }; + int main() { + if(lock.l_start == 1 && lock.l_len == 2 && lock.l_type == 4 && lock.l_whence == 5) { + return 0; + } + return 1; + } +], [ + flock_type=bsd + AC_DEFINE([HAVE_FLOCK_BSD], [], [Struct flock is BSD-type]) + AC_MSG_RESULT("yes") +], AC_MSG_RESULT("no") ) + +if test "$flock_type" == "unknown"; then + AC_MSG_ERROR([Don't know how to define struct flock on this system[,] set --enable-opcache=no]) +fi PHP_NEW_EXTENSION(opcache, ZendAccelerator.c \ diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 4c78fcafec08f..4f3d5040e1b8c 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -154,6 +154,7 @@ static const opt_struct OPTIONS[] = { {'?', 0, "usage"},/* help alias (both '?' and 'usage') */ {'v', 0, "version"}, {'z', 1, "zend-extension"}, + {'W', 1, "warmup"}, {'T', 1, "timing"}, {'-', 0, NULL} /* end of args */ }; @@ -1754,6 +1755,7 @@ int main(int argc, char *argv[]) int fcgi_fd = 0; fcgi_request *request = NULL; int repeats = 1; + int warmup_repeats = 0; int benchmark = 0; #if HAVE_GETTIMEOFDAY struct timeval start, end; @@ -2103,6 +2105,9 @@ consult the installation file that came with this distribution, or visit \n\ time(&start); #endif break; + case 'W': + warmup_repeats = atoi(php_optarg); + break; case 'h': case '?': if (request) { @@ -2516,12 +2521,24 @@ consult the installation file that came with this distribution, or visit \n\ if (!fastcgi) { if (benchmark) { - repeats--; - if (repeats > 0) { - script_file = NULL; - php_optind = orig_optind; - php_optarg = orig_optarg; + if (warmup_repeats) { + warmup_repeats--; + if (!warmup_repeats) { +#ifdef HAVE_GETTIMEOFDAY + gettimeofday(&start, NULL); +#else + time(&start); +#endif + } continue; + } else { + repeats--; + if (repeats > 0) { + script_file = NULL; + php_optind = orig_optind; + php_optarg = orig_optarg; + continue; + } } } break; From 80346690ba0a13f8a2a924671aaed55f824839c3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 Sep 2013 14:01:07 +0400 Subject: [PATCH 0053/1256] Removed references to "Zend Support" --- ext/opcache/zend_accelerator_util_funcs.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 39b4c1fc2558b..894da63aaa48e 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -478,7 +478,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class if (accel_xlat_get(new_entry->scope, new_ce) == SUCCESS) { new_entry->scope = *new_ce; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s. Please call Zend Support", ce->name, new_entry->function_name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s", ce->name, new_entry->function_name); } } @@ -487,7 +487,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class if (accel_xlat_get(new_entry->prototype, new_prototype) == SUCCESS) { new_entry->prototype = *new_prototype; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s. Please call Zend Support", ce->name, new_entry->function_name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s", ce->name, new_entry->function_name); } } @@ -589,7 +589,7 @@ static void zend_hash_clone_prop_info(HashTable *ht, HashTable *source, zend_cla } else if (accel_xlat_get(prop_info->ce, new_ce) == SUCCESS) { prop_info->ce = *new_ce; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s, property %s. Please call Zend Support", ce->name, prop_info->name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s, property %s", ce->name, prop_info->name); } p = p->pListNext; @@ -621,7 +621,7 @@ static int zend_prepare_function_for_execution(zend_op_array *op_array) if (accel_xlat_get(ce->handler, new_func) == SUCCESS) { \ ce->handler = *new_func; \ } else { \ - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s. Please call Zend Support", ce->name); \ + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s", ce->name); \ } \ } \ } @@ -710,7 +710,7 @@ static void zend_class_copy_ctor(zend_class_entry **pce) if (accel_xlat_get(ce->parent, new_ce) == SUCCESS) { ce->parent = *new_ce; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s. Please call Zend Support", ce->name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s", ce->name); } } From 0ad0a2f56ea5f9822297fec8e2816751b9a4f653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Fri, 27 Sep 2013 17:46:14 +0200 Subject: [PATCH 0054/1256] Add information about which INI file is which inside respective files --- php.ini-development | 2 ++ php.ini-production | 2 ++ 2 files changed, 4 insertions(+) diff --git a/php.ini-development b/php.ini-development index ba20bd3fb87e5..b935f22eb5aba 100644 --- a/php.ini-development +++ b/php.ini-development @@ -83,6 +83,8 @@ ; development version only in development environments as errors shown to ; application users can inadvertently leak otherwise secure information. +; This is php.ini-development INI file. + ;;;;;;;;;;;;;;;;;;; ; Quick Reference ; ;;;;;;;;;;;;;;;;;;; diff --git a/php.ini-production b/php.ini-production index db48a8fbc85f4..4ee7ac92ce0bc 100644 --- a/php.ini-production +++ b/php.ini-production @@ -83,6 +83,8 @@ ; development version only in development environments as errors shown to ; application users can inadvertently leak otherwise secure information. +; This is php.ini-production INI file. + ;;;;;;;;;;;;;;;;;;; ; Quick Reference ; ;;;;;;;;;;;;;;;;;;; From a88c7be88b57162eb0a89ff1b7c2ef60ac1de935 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Thu, 21 Feb 2013 14:42:28 +0800 Subject: [PATCH 0055/1256] added use_keys argument to array_filter() --- ext/standard/array.c | 39 +++++++++-- .../tests/array/array_filter_error.phpt | 4 +- .../tests/array/array_filter_variation10.phpt | 70 +++++++++++++++++++ 3 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 ext/standard/tests/array/array_filter_variation10.phpt diff --git a/ext/standard/array.c b/ext/standard/array.c index ae6e5d266fa29..1f98ef16f2093 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -4194,9 +4194,11 @@ PHP_FUNCTION(array_filter) { zval *array; zval **operand; - zval **args[1]; + zval **args[2]; zval *retval = NULL; + zval *key = NULL; zend_bool have_callback = 0; + zend_bool use_key = 0; char *string_key; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; @@ -4204,7 +4206,7 @@ PHP_FUNCTION(array_filter) ulong num_key; HashPosition pos; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|f", &array, &fci, &fci_cache) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|fb", &array, &fci, &fci_cache, &use_key) == FAILURE) { return; } @@ -4217,23 +4219,52 @@ PHP_FUNCTION(array_filter) have_callback = 1; fci.no_separation = 0; fci.retval_ptr_ptr = &retval; - fci.param_count = 1; + + if (use_key) { + fci.param_count = 2; + args[1] = &key; + } else { + fci.param_count = 1; + } } for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(array), &pos); zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **)&operand, &pos) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos) ) { + int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos); + if (have_callback) { + if (use_key) { + MAKE_STD_ZVAL(key); + /* Set up the key */ + switch (key_type) { + case HASH_KEY_IS_LONG: + Z_TYPE_P(key) = IS_LONG; + Z_LVAL_P(key) = num_key; + break; + + case HASH_KEY_IS_STRING: + ZVAL_STRINGL(key, string_key, string_key_len - 1, 1); + break; + } + } + args[0] = operand; fci.params = args; if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && retval) { if (!zend_is_true(retval)) { zval_ptr_dtor(&retval); + if (use_key) { + zval_ptr_dtor(&key); + } continue; } else { zval_ptr_dtor(&retval); + if (use_key) { + zval_ptr_dtor(&key); + } } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the filter callback"); @@ -4244,7 +4275,7 @@ PHP_FUNCTION(array_filter) } zval_add_ref(operand); - switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos)) { + switch (key_type) { case HASH_KEY_IS_STRING: zend_hash_update(Z_ARRVAL_P(return_value), string_key, string_key_len, operand, sizeof(zval *), NULL); break; diff --git a/ext/standard/tests/array/array_filter_error.phpt b/ext/standard/tests/array/array_filter_error.phpt index 20e89aa4b776e..3f8f51bc14a5b 100644 --- a/ext/standard/tests/array/array_filter_error.phpt +++ b/ext/standard/tests/array/array_filter_error.phpt @@ -28,7 +28,7 @@ $extra_arg = 10; // with one more than the expected number of arguments echo "-- Testing array_filter() function with more than expected no. of arguments --"; -var_dump( array_filter($input, "odd", $extra_arg) ); +var_dump( array_filter($input, "odd", $extra_arg, $extra_arg) ); // with incorrect callback function echo "-- Testing array_filter() function with incorrect callback --"; @@ -42,7 +42,7 @@ echo "Done" Warning: array_filter() expects at least 1 parameter, 0 given in %s on line %d NULL -- Testing array_filter() function with more than expected no. of arguments -- -Warning: array_filter() expects at most 2 parameters, 3 given in %s on line %d +Warning: array_filter() expects at most 3 parameters, 4 given in %s on line %d NULL -- Testing array_filter() function with incorrect callback -- Warning: array_filter() expects parameter 2 to be a valid callback, function 'even' not found or invalid function name in %s on line %d diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt new file mode 100644 index 0000000000000..9a5b2a4a302ff --- /dev/null +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -0,0 +1,70 @@ +--TEST-- +Test array_filter() function : usage variations - using the array keys inside 'callback' +--FILE-- + 4; +} + +var_dump( array_filter($input, 'dump2', true) ); + +echo "*** Testing array_filter() : usage variations - 'callback' expecting second argument ***\n"; + +var_dump( array_filter($small, 'dump', false) ); + +echo "Done" +?> +--EXPECTF-- +*** Testing array_filter() : usage variations - using array keys in 'callback' *** +0 = 0 +1 = 1 +2 = -1 +3 = 10 +4 = 100 +5 = 1000 +6 = Hello +7 = +array(0) { +} +*** Testing array_filter() : usage variations - 'callback' filters based on key value *** +array(3) { + [5]=> + int(1000) + [6]=> + string(5) "Hello" + [7]=> + NULL +} +*** Testing array_filter() : usage variations - 'callback' expecting second argument *** + +Warning: Missing argument 2 for dump() in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d + +Notice: Undefined variable: key in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d + = 123 +array(0) { +} +Done From 6442e49b22da6dfab8ebcef1a4cf568250b1ee96 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Thu, 21 Feb 2013 16:35:48 +0800 Subject: [PATCH 0056/1256] forgot introspection changes --- ext/standard/basic_functions.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 3e5084e837642..cb57d755b21af 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -595,6 +595,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_array_filter, 0, 0, 1) ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */ ZEND_ARG_INFO(0, callback) + ZEND_ARG_INFO(0, use_keys) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_array_map, 0, 0, 2) From b8653d34579409131b8dc6d92e7ac30e28fa95a6 Mon Sep 17 00:00:00 2001 From: Tjerk Anne Meesters Date: Wed, 27 Feb 2013 21:20:28 +0800 Subject: [PATCH 0057/1256] fixed test case to pass on other systems than my own --- ext/standard/tests/array/array_filter_variation10.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt index 9a5b2a4a302ff..1eec4591a1fea 100644 --- a/ext/standard/tests/array/array_filter_variation10.phpt +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -61,9 +61,9 @@ array(3) { } *** Testing array_filter() : usage variations - 'callback' expecting second argument *** -Warning: Missing argument 2 for dump() in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d +Warning: Missing argument 2 for dump() in %s on line %d -Notice: Undefined variable: key in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d +Notice: Undefined variable: key in %s on line %d = 123 array(0) { } From 0492145e58bda8fed9f64992a9b8d054d9c80758 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Thu, 26 Sep 2013 11:10:24 +0800 Subject: [PATCH 0058/1256] added bitmask variation --- ext/standard/array.c | 36 +++++++++++-------- ext/standard/php_array.h | 4 +++ .../tests/array/array_filter_variation10.phpt | 35 +++++++++++++++++- 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 1f98ef16f2093..13148ec6f0084 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -127,6 +127,10 @@ PHP_MINIT_FUNCTION(array) /* {{{ */ REGISTER_LONG_CONSTANT("COUNT_NORMAL", COUNT_NORMAL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("COUNT_RECURSIVE", COUNT_RECURSIVE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_BOTH", ARRAY_FILTER_USE_BOTH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_KEY", ARRAY_FILTER_USE_KEY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_VALUE", ARRAY_FILTER_USE_VALUE, CONST_CS | CONST_PERSISTENT); + return SUCCESS; } /* }}} */ @@ -4198,7 +4202,7 @@ PHP_FUNCTION(array_filter) zval *retval = NULL; zval *key = NULL; zend_bool have_callback = 0; - zend_bool use_key = 0; + long use_type = ARRAY_FILTER_USE_VALUE; char *string_key; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; @@ -4206,7 +4210,7 @@ PHP_FUNCTION(array_filter) ulong num_key; HashPosition pos; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|fb", &array, &fci, &fci_cache, &use_key) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|fl", &array, &fci, &fci_cache, &use_type) == FAILURE) { return; } @@ -4220,11 +4224,14 @@ PHP_FUNCTION(array_filter) fci.no_separation = 0; fci.retval_ptr_ptr = &retval; - if (use_key) { + if (use_type == ARRAY_FILTER_USE_BOTH) { fci.param_count = 2; args[1] = &key; } else { fci.param_count = 1; + if (use_type == ARRAY_FILTER_USE_KEY) { + args[0] = &key; + } } } @@ -4235,7 +4242,7 @@ PHP_FUNCTION(array_filter) int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos); if (have_callback) { - if (use_key) { + if (use_type != ARRAY_FILTER_USE_VALUE) { MAKE_STD_ZVAL(key); /* Set up the key */ switch (key_type) { @@ -4250,21 +4257,20 @@ PHP_FUNCTION(array_filter) } } - args[0] = operand; + if (use_type != ARRAY_FILTER_USE_KEY) { + args[0] = operand; + } fci.params = args; if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && retval) { - if (!zend_is_true(retval)) { - zval_ptr_dtor(&retval); - if (use_key) { - zval_ptr_dtor(&key); - } + int retval_true = zend_is_true(retval); + + zval_ptr_dtor(&retval); + if (use_type != ARRAY_FILTER_USE_VALUE) { + zval_ptr_dtor(&key); + } + if (!retval_true) { continue; - } else { - zval_ptr_dtor(&retval); - if (use_key) { - zval_ptr_dtor(&key); - } } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the filter callback"); diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 1cf27790718d7..7d9733d2964f2 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -117,6 +117,10 @@ PHPAPI int php_multisort_compare(const void *a, const void *b TSRMLS_DC); #define PHP_SORT_NATURAL 6 #define PHP_SORT_FLAG_CASE 8 +#define ARRAY_FILTER_USE_BOTH 1 +#define ARRAY_FILTER_USE_KEY 2 +#define ARRAY_FILTER_USE_VALUE 3 + ZEND_BEGIN_MODULE_GLOBALS(array) int *multisort_flags[2]; int (*compare_func)(zval *result, zval *op1, zval *op2 TSRMLS_DC); diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt index 1eec4591a1fea..25698c55c2f69 100644 --- a/ext/standard/tests/array/array_filter_variation10.phpt +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -2,7 +2,7 @@ Test array_filter() function : usage variations - using the array keys inside 'callback' --FILE-- 'a', 2 => 'b', 'a' => 1, 'b' => 2); + +var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_KEY)); + +var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_VALUE)); + +var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_BOTH)); + echo "Done" ?> --EXPECTF-- @@ -67,4 +77,27 @@ Notice: Undefined variable: key in %s on line %d = 123 array(0) { } +*** Testing array_filter() with various use types *** +array(2) { + [1]=> + string(1) "a" + [2]=> + string(1) "b" +} +array(2) { + ["a"]=> + int(1) + ["b"]=> + int(2) +} + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 +array(0) { +} Done From 75ba75e2055d670e204e6361732995ba27b05896 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Fri, 27 Sep 2013 07:42:33 +0800 Subject: [PATCH 0059/1256] Using only two constants to signal use type intent. --- ext/standard/array.c | 7 +++---- ext/standard/php_array.h | 1 - ext/standard/tests/array/array_filter_variation10.phpt | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 13148ec6f0084..5968a41dd5f55 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -129,7 +129,6 @@ PHP_MINIT_FUNCTION(array) /* {{{ */ REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_BOTH", ARRAY_FILTER_USE_BOTH, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_KEY", ARRAY_FILTER_USE_KEY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_VALUE", ARRAY_FILTER_USE_VALUE, CONST_CS | CONST_PERSISTENT); return SUCCESS; } @@ -4202,7 +4201,7 @@ PHP_FUNCTION(array_filter) zval *retval = NULL; zval *key = NULL; zend_bool have_callback = 0; - long use_type = ARRAY_FILTER_USE_VALUE; + long use_type = 0; char *string_key; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; @@ -4242,7 +4241,7 @@ PHP_FUNCTION(array_filter) int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos); if (have_callback) { - if (use_type != ARRAY_FILTER_USE_VALUE) { + if (use_type) { MAKE_STD_ZVAL(key); /* Set up the key */ switch (key_type) { @@ -4266,7 +4265,7 @@ PHP_FUNCTION(array_filter) int retval_true = zend_is_true(retval); zval_ptr_dtor(&retval); - if (use_type != ARRAY_FILTER_USE_VALUE) { + if (use_type) { zval_ptr_dtor(&key); } if (!retval_true) { diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 7d9733d2964f2..ef43cddfcc416 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -119,7 +119,6 @@ PHPAPI int php_multisort_compare(const void *a, const void *b TSRMLS_DC); #define ARRAY_FILTER_USE_BOTH 1 #define ARRAY_FILTER_USE_KEY 2 -#define ARRAY_FILTER_USE_VALUE 3 ZEND_BEGIN_MODULE_GLOBALS(array) int *multisort_flags[2]; diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt index 25698c55c2f69..f0a6115f79ccf 100644 --- a/ext/standard/tests/array/array_filter_variation10.phpt +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -42,7 +42,7 @@ $mixed = array(1 => 'a', 2 => 'b', 'a' => 1, 'b' => 2); var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_KEY)); -var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_VALUE)); +var_dump(array_filter($mixed, 'is_numeric', 0)); var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_BOTH)); From 9b9eaba0834a0f985290304187189d0e33834b30 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 27 Sep 2013 17:00:41 -0700 Subject: [PATCH 0060/1256] OCI8: Fix alloc function and DLL generation --- ext/oci8/oci8.c | 2 +- ext/oci8/oci8_interface.c | 2 +- ext/oci8/package.xml | 26 +++++++++++++++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index f04114d4d67cf..6723c22019ccf 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -151,7 +151,7 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS /* }}} */ /* {{{ dynamically loadable module stuff */ -#if defined(COMPILE_DL_OCI8) || defined(COMPILE_DL_OCI8_11G) +#if defined(COMPILE_DL_OCI8) || defined(COMPILE_DL_OCI8_11G) || defined(COMPILE_DL_OCI8_12C) ZEND_GET_MODULE(oci8) #endif /* COMPILE_DL */ /* }}} */ diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 3fad90d9c7c84..0f17f935f114b 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1788,7 +1788,7 @@ PHP_FUNCTION(oci_set_client_identifier) if (client_id) { /* this long winded copy allows compatibility with older PHP versions */ - connection->client_id = (char *)safe_emalloc(client_id_len+1, sizeof(char), connection->is_persistent); + connection->client_id = (char *)pemalloc(client_id_len+1, connection->is_persistent); memcpy(connection->client_id, client_id, client_id_len); connection->client_id[client_id_len] = '\0'; } else { diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 24ba635fef6dc..cd6bb04c0bd42 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -44,8 +44,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 2.0.3 - 2.0.3 + 2.0.4 + 2.0.4 devel @@ -53,9 +53,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP -Add the oci_set_client_identifier() value and statement structure pointer to several DTrace probes. -Use 'phpoci' as the DTrace provider name since uniqueness is required by the Linux fasttrap module. -Update Windows builds to create only php_oci8_12c.dll. +Fix persistent memory usage with --enable-dtrace +Export get_module() for Windows php_oci8_12c.dll @@ -454,6 +453,23 @@ Update Windows builds to create only php_oci8_12c.dll. + + + 2.0.3 + 2.0.3 + + + devel + devel + + PHP + +Add the oci_set_client_identifier() value and statement structure pointer to several DTrace probes. +Use 'phpoci' as the DTrace provider name since uniqueness is required by the Linux fasttrap module. +Update Windows builds to create only php_oci8_12c.dll. + + + 2.0.2 From 0a3ee7b26bfe17a6536b2dd8b16febc8b4b55d4d Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 27 Sep 2013 17:16:02 -0700 Subject: [PATCH 0061/1256] Prepare for next release --- ext/oci8/package.xml | 23 +++++++++++++++++++---- ext/oci8/php_oci8.h | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index cd6bb04c0bd42..1161b031f33a0 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -44,8 +44,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 2.0.4 - 2.0.4 + 2.0.5 + 2.0.5 devel @@ -53,8 +53,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP -Fix persistent memory usage with --enable-dtrace -Export get_module() for Windows php_oci8_12c.dll + - no notes yet @@ -453,6 +452,22 @@ Export get_module() for Windows php_oci8_12c.dll + + + 2.0.4 + 2.0.4 + + + devel + devel + + PHP + +Fix persistent memory usage with --enable-dtrace +Export get_module() for Windows php_oci8_12c.dll + + + 2.0.3 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 6d02eff6b27af..1ea0411073e2e 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -46,7 +46,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.3-dev" +#define PHP_OCI8_VERSION "2.0.5-dev" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From d143c2b60f87f5cd221bd070bfde887374b74eb4 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sat, 28 Sep 2013 18:04:44 -0700 Subject: [PATCH 0062/1256] 5.4.20 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index e17632543c442..37daabb18f852 100644 --- a/NEWS +++ b/NEWS @@ -23,7 +23,7 @@ PHP NEWS . Fixed bug #65721 (configure script broken in 5.5.4 and 5.4.20 when enabling imap). (ryotakatsuki at gmail dot com) -?? ??? 2013, PHP 5.4.20 +19 Sep 2013, PHP 5.4.20 - Core: . Fixed bug #60598 (cli/apache sapi segfault on objects manipulation). From f0c1ea1d2e2f7f697d1776f260919cec583fdb5f Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sat, 28 Sep 2013 18:06:15 -0700 Subject: [PATCH 0063/1256] 5.5.4 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index c03d31905676c..45b264746d7c6 100644 --- a/NEWS +++ b/NEWS @@ -39,7 +39,7 @@ PHP NEWS . Fix bug #64782 (SplFileObject constructor make $context optional / give it a default value). (Nikita) -?? ??? 2013, PHP 5.5.4 +19 Sep 2013, PHP 5.5.4 - Core: . Fixed bug #60598 (cli/apache sapi segfault on objects manipulation). From f0c926564c5f7de9462d9ca7bd75014b14a63f56 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 29 Sep 2013 17:58:25 +0200 Subject: [PATCH 0064/1256] Fix bug #65322: compile time errors won't trigger auto loading Also fixes duplicate bugs #54054 and #42098. Furthermore this fixes incorrect error messages thrown from code running inside an error handler when a compilation is in progress. The error file and line are now correctly associated with the file/line of the executor, rather than the compiler. --- NEWS | 3 +++ Zend/tests/bug65322.phpt | 22 ++++++++++++++++++++++ Zend/tests/errmsg_045.phpt | 18 ++++++++++++++++++ Zend/zend.c | 4 +++- 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/bug65322.phpt create mode 100644 Zend/tests/errmsg_045.phpt diff --git a/NEWS b/NEWS index 37daabb18f852..4dc7ef7c18e9d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.21 +- Core: + . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) + - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) diff --git a/Zend/tests/bug65322.phpt b/Zend/tests/bug65322.phpt new file mode 100644 index 0000000000000..aab163d915e11 --- /dev/null +++ b/Zend/tests/bug65322.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #65322: compile time errors won't trigger auto loading +--FILE-- + +--EXPECTF-- +string(50) "Redefining already defined constructor for class A" +string(%d) "%s(%d) : eval()'d code" +string(1) "B" diff --git a/Zend/tests/errmsg_045.phpt b/Zend/tests/errmsg_045.phpt new file mode 100644 index 0000000000000..b27f67ade4caa --- /dev/null +++ b/Zend/tests/errmsg_045.phpt @@ -0,0 +1,18 @@ +--TEST-- +Error message in error handler during compilation +--FILE-- + +--EXPECTF-- +string(50) "Redefining already defined constructor for class A" +string(%d) "%s(%d) : eval()'d code" + +Notice: Undefined variable: undefined in %s on line %d diff --git a/Zend/zend.c b/Zend/zend.c index 162922866b6db..0602c45042609 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1183,7 +1183,7 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ * such scripts recursivly, but some CG() variables may be * inconsistent. */ - in_compilation = zend_is_compiling(TSRMLS_C); + in_compilation = CG(in_compilation); if (in_compilation) { saved_class_entry = CG(active_class_entry); CG(active_class_entry) = NULL; @@ -1195,6 +1195,7 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ SAVE_STACK(declare_stack); SAVE_STACK(list_stack); SAVE_STACK(context_stack); + CG(in_compilation) = 0; } if (call_user_function_ex(CG(function_table), NULL, orig_user_error_handler, &retval, 5, params, 1, NULL TSRMLS_CC) == SUCCESS) { @@ -1219,6 +1220,7 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ RESTORE_STACK(declare_stack); RESTORE_STACK(list_stack); RESTORE_STACK(context_stack); + CG(in_compilation) = 1; } if (!EG(user_error_handler)) { From 6b68f44e6b46dffd7fe029eca7afc37f1fa57347 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 29 Sep 2013 20:18:12 +0200 Subject: [PATCH 0065/1256] Fix bug #64979: Wrong behavior of static variables in closure generators --- NEWS | 4 ++++ Zend/tests/bug64979.phpt | 18 ++++++++---------- Zend/zend_generators.c | 28 +++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index 45b264746d7c6..1b1f9c4bdf543 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.5.5 +- Core: + . Fixed bug #64979 (Wrong behavior of static variables in closure generators). + (Nikita) + - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) diff --git a/Zend/tests/bug64979.phpt b/Zend/tests/bug64979.phpt index 09de555546420..5bc8e5a6ab2a4 100644 --- a/Zend/tests/bug64979.phpt +++ b/Zend/tests/bug64979.phpt @@ -1,15 +1,13 @@ --TEST-- -Bug #64578 (Closures with static variables can be generators) ---XFAIL-- -Bug #64979 not fixed yet. +Bug #64979 (Wrong behavior of static variables in closure generators) --FILE-- diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 1a805bbd6d61c..0af20f4593fcb 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -226,6 +226,16 @@ static zend_object_value zend_generator_create(zend_class_entry *class_type TSRM } /* }}} */ +static void copy_closure_static_var(zval **var TSRMLS_DC, int num_args, va_list args, zend_hash_key *key) /* {{{ */ +{ + HashTable *target = va_arg(args, HashTable *); + + SEPARATE_ZVAL_TO_MAKE_IS_REF(var); + Z_ADDREF_PP(var); + zend_hash_quick_update(target, key->arKey, key->nKeyLength, key->h, var, sizeof(zval *), NULL); +} +/* }}} */ + /* Requires globals EG(scope), EG(current_scope), EG(This), * EG(active_symbol_table) and EG(current_execute_data). */ ZEND_API zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC) /* {{{ */ @@ -242,7 +252,23 @@ ZEND_API zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC) /* if (op_array->fn_flags & ZEND_ACC_CLOSURE) { zend_op_array *op_array_copy = (zend_op_array*)emalloc(sizeof(zend_op_array)); *op_array_copy = *op_array; - function_add_ref((zend_function *) op_array_copy); + + (*op_array->refcount)++; + op_array->run_time_cache = NULL; + if (op_array->static_variables) { + ALLOC_HASHTABLE(op_array_copy->static_variables); + zend_hash_init( + op_array_copy->static_variables, + zend_hash_num_elements(op_array->static_variables), + NULL, ZVAL_PTR_DTOR, 0 + ); + zend_hash_apply_with_arguments( + op_array->static_variables TSRMLS_CC, + (apply_func_args_t) copy_closure_static_var, + 1, op_array_copy->static_variables + ); + } + op_array = op_array_copy; } From e9e63f922303d852b6899cadd68d7ec73e8f6134 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 30 Sep 2013 11:23:33 +0200 Subject: [PATCH 0066/1256] fix memleak on resetting rebind_proc --- ext/ldap/ldap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 3cfa2092e776e..71d57d6d9b9ef 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2107,6 +2107,7 @@ PHP_FUNCTION(ldap_set_rebind_proc) /* unregister rebind procedure */ if (ld->rebindproc != NULL) { zval_dtor(ld->rebindproc); + FREE_ZVAL(ld->rebindproc); ld->rebindproc = NULL; ldap_set_rebind_proc(ld->link, NULL, NULL); } From 2b78edfba25afac8f34ca65e18f98d23a4b8bcce Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 30 Sep 2013 11:41:35 +0200 Subject: [PATCH 0067/1256] fix test --- ext/ldap/tests/ldap_search_variation6.phpt | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/ext/ldap/tests/ldap_search_variation6.phpt b/ext/ldap/tests/ldap_search_variation6.phpt index a29e4524df46b..5139ebb77dece 100644 --- a/ext/ldap/tests/ldap_search_variation6.phpt +++ b/ext/ldap/tests/ldap_search_variation6.phpt @@ -217,14 +217,26 @@ array(2) { [1]=> resource(%d) of type (ldap result) } -NULL -NULL +array(1) { + ["count"]=> + int(0) +} +array(1) { + ["count"]=> + int(0) +} array(2) { [0]=> resource(%d) of type (ldap result) [1]=> resource(%d) of type (ldap result) } -NULL -NULL +array(1) { + ["count"]=> + int(0) +} +array(1) { + ["count"]=> + int(0) +} ===DONE=== From e45eacd8fa4e32692697171e90f14d3c66d673de Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 30 Sep 2013 21:21:56 +0800 Subject: [PATCH 0068/1256] show method in error message --- ext/openssl/openssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c0d1b0bf2ddbc..c208d439d6232 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1679,7 +1679,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, int n; if (!(mdtype = EVP_get_digestbyname(method))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "`%s`: Unknown signature algorithm", method); return 0; } else if (!X509_digest(peer, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); From d7baf0427fb56cbde55495e5c2071b1cdacb94ce Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 30 Sep 2013 15:46:22 -0700 Subject: [PATCH 0069/1256] Make 'make distclean' remove the downloaded pear PHAR --- Makefile.global | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.global b/Makefile.global index 05c5d151b74cc..c56ef992d9b0c 100644 --- a/Makefile.global +++ b/Makefile.global @@ -125,6 +125,7 @@ distclean: clean rm -f sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html rm -f ext/iconv/php_have_bsd_iconv.h ext/iconv/php_have_glibc_iconv.h ext/iconv/php_have_ibm_iconv.h ext/iconv/php_have_iconv.h ext/iconv/php_have_libiconv.h ext/iconv/php_iconv_aliased_libiconv.h ext/iconv/php_iconv_supports_errno.h ext/iconv/php_php_iconv_h_path.h ext/iconv/php_php_iconv_impl.h rm -f ext/phar/phar.phar ext/phar/phar.php + rm -f pear/install-pear-nozlib.phar if test "$(srcdir)" != "$(builddir)"; then \ rm -f ext/phar/phar/phar.inc; \ fi From 954a0f8bf4f8779f509b8361c1bc02246bd1ea20 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 30 Sep 2013 16:51:07 -0700 Subject: [PATCH 0070/1256] OCI8 2.0: Added a new oci_set_db_operation() user space function for the "DB Operation" tracing feature of Oracle DB 12c. Currently this code is #ifdef'd out, since I can't consider the feature stable until an Oracle-side fix for Oracle bug 16695981 is available. Having the code available in PHP OCI8 facilitates testing of any fix. --- ext/oci8/oci8.c | 16 ++++++++++++++++ ext/oci8/oci8_interface.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 6723c22019ccf..eeb1ade7bb802 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -457,6 +457,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_client_info, 0, 0, 2) ZEND_ARG_INFO(0, client_information) ZEND_END_ARG_INFO() +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_db_operation, 0, 0, 2) +ZEND_ARG_INFO(0, connection_resource) +ZEND_ARG_INFO(0, action) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_password_change, 0, 0, 4) ZEND_ARG_INFO(0, connection_resource_or_connection_string) ZEND_ARG_INFO(0, username) @@ -708,6 +715,9 @@ static unsigned char arginfo_oci_bind_array_by_name[] = { 3, BYREF_NONE, BYREF_N #define arginfo_oci_set_module_name NULL #define arginfo_oci_set_action NULL #define arginfo_oci_set_client_info NULL +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +#define arginfo_oci_set_db_operation NULL +#endif #define arginfo_oci_password_change NULL #define arginfo_oci_new_cursor NULL #define arginfo_oci_result NULL @@ -799,6 +809,9 @@ PHP_FUNCTION(oci_statement_type); PHP_FUNCTION(oci_num_rows); PHP_FUNCTION(oci_set_prefetch); PHP_FUNCTION(oci_set_client_identifier); +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +PHP_FUNCTION(oci_set_db_operation); +#endif PHP_FUNCTION(oci_set_edition); PHP_FUNCTION(oci_set_module_name); PHP_FUNCTION(oci_set_action); @@ -904,6 +917,9 @@ zend_function_entry php_oci_functions[] = { PHP_FE(oci_new_descriptor, arginfo_oci_new_descriptor) PHP_FE(oci_set_prefetch, arginfo_oci_set_prefetch) PHP_FE(oci_set_client_identifier, arginfo_oci_set_client_identifier) +#ifdef WAITIING_ORACLE_BUG_16695981_FIX + PHP_FE(oci_set_db_operation, arginfo_oci_set_db_operation) +#endif PHP_FE(oci_set_edition, arginfo_oci_set_edition) PHP_FE(oci_set_module_name, arginfo_oci_set_module_name) PHP_FE(oci_set_action, arginfo_oci_set_action) diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 0f17f935f114b..a452c1a7e2902 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1928,6 +1928,38 @@ PHP_FUNCTION(oci_set_client_info) } /* }}} */ +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +/* {{{ proto bool oci_set_db_operation(resource connection, string value) + Sets the "DB operation" on the connection for Oracle end-to-end tracing */ +PHP_FUNCTION(oci_set_db_operation) +{ +#if (OCI_MAJOR_VERSION > 11) + zval *z_connection; + php_oci_connection *connection; + char *dbop_name; + int dbop_name_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &dbop_name, &dbop_name_len) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); + + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) dbop_name, (ub4) dbop_name_len, (ub4) OCI_ATTR_DBOP, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + RETURN_FALSE; + } + RETURN_TRUE; +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type"); + RETURN_FALSE; +#endif +} +/* }}} */ +#endif /* WAITIING_ORACLE_BUG_16695981_FIX */ + /* {{{ proto bool oci_password_change(resource connection, string username, string old_password, string new_password) Changes the password of an account */ PHP_FUNCTION(oci_password_change) From 51fca2b4b35c5db11a7136087fbf8cf3651200c1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 1 Oct 2013 11:32:11 +0400 Subject: [PATCH 0071/1256] Reverted patch (it was used for internal testing and was committed by accident) --- sapi/cgi/cgi_main.c | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 4f3d5040e1b8c..4c78fcafec08f 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -154,7 +154,6 @@ static const opt_struct OPTIONS[] = { {'?', 0, "usage"},/* help alias (both '?' and 'usage') */ {'v', 0, "version"}, {'z', 1, "zend-extension"}, - {'W', 1, "warmup"}, {'T', 1, "timing"}, {'-', 0, NULL} /* end of args */ }; @@ -1755,7 +1754,6 @@ int main(int argc, char *argv[]) int fcgi_fd = 0; fcgi_request *request = NULL; int repeats = 1; - int warmup_repeats = 0; int benchmark = 0; #if HAVE_GETTIMEOFDAY struct timeval start, end; @@ -2105,9 +2103,6 @@ consult the installation file that came with this distribution, or visit \n\ time(&start); #endif break; - case 'W': - warmup_repeats = atoi(php_optarg); - break; case 'h': case '?': if (request) { @@ -2521,24 +2516,12 @@ consult the installation file that came with this distribution, or visit \n\ if (!fastcgi) { if (benchmark) { - if (warmup_repeats) { - warmup_repeats--; - if (!warmup_repeats) { -#ifdef HAVE_GETTIMEOFDAY - gettimeofday(&start, NULL); -#else - time(&start); -#endif - } + repeats--; + if (repeats > 0) { + script_file = NULL; + php_optind = orig_optind; + php_optarg = orig_optarg; continue; - } else { - repeats--; - if (repeats > 0) { - script_file = NULL; - php_optind = orig_optind; - php_optarg = orig_optarg; - continue; - } } } break; From 18b04b480ebc41841b2004cc11797eda40fb3958 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 1 Oct 2013 11:07:55 +0200 Subject: [PATCH 0072/1256] Fixed bug #61548 --- NEWS | 4 + ext/standard/http_fopen_wrapper.c | 61 ++++++------- ext/standard/tests/http/bug61548.phpt | 118 ++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 30 deletions(-) create mode 100644 ext/standard/tests/http/bug61548.phpt diff --git a/NEWS b/NEWS index 4dc7ef7c18e9d..9bb60327fa9dd 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,10 @@ PHP NEWS . Fixed bug #65721 (configure script broken in 5.5.4 and 5.4.20 when enabling imap). (ryotakatsuki at gmail dot com) +- Standard: + . Fixed bug #61548 (content-type must appear at the end of headers for 201 + Location to work in http). (Mike) + 19 Sep 2013, PHP 5.4.20 - Core: diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index b8676bbba4df6..4605e7494fa3d 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -84,6 +84,30 @@ #define HTTP_WRAPPER_HEADER_INIT 1 #define HTTP_WRAPPER_REDIRECTED 2 +static inline void strip_header(char *header_bag, char *lc_header_bag, + const char *lc_header_name) +{ + char *lc_header_start = strstr(lc_header_bag, lc_header_name); + char *header_start = header_bag + (lc_header_start - lc_header_bag); + + if (lc_header_start + && (lc_header_start == lc_header_bag || *(lc_header_start-1) == '\n') + ) { + char *lc_eol = strchr(lc_header_start, '\n'); + char *eol = header_start + (lc_eol - lc_header_start); + + if (lc_eol) { + size_t eollen = strlen(lc_eol); + + memmove(lc_header_start, lc_eol+1, eollen); + memmove(header_start, eol+1, eollen); + } else { + *lc_header_start = '\0'; + *header_start = '\0'; + } + } +} + php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context, int redirect_max, int flags STREAMS_DC TSRMLS_DC) /* {{{ */ { php_stream *stream = NULL; @@ -425,40 +449,17 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, if (tmp && strlen(tmp) > 0) { char *s; - if (!header_init) { /* Remove post headers for redirects */ - int l = strlen(tmp); - char *s2, *tmp_c = estrdup(tmp); - - php_strtolower(tmp_c, l); - if ((s = strstr(tmp_c, "content-length:"))) { - if ((s2 = memchr(s, '\n', tmp_c + l - s))) { - int b = tmp_c + l - 1 - s2; - memmove(tmp, tmp + (s2 + 1 - tmp_c), b); - memmove(tmp_c, s2 + 1, b); - - } else { - tmp[s - tmp_c] = *s = '\0'; - } - l = strlen(tmp_c); - } - if ((s = strstr(tmp_c, "content-type:"))) { - if ((s2 = memchr(s, '\n', tmp_c + l - s))) { - memmove(tmp, tmp + (s2 + 1 - tmp_c), tmp_c + l - 1 - s2); - } else { - tmp[s - tmp_c] = '\0'; - } - } - - efree(tmp_c); - tmp_c = php_trim(tmp, strlen(tmp), NULL, 0, NULL, 3 TSRMLS_CC); - efree(tmp); - tmp = tmp_c; - } - user_headers = estrdup(tmp); /* Make lowercase for easy comparison against 'standard' headers */ php_strtolower(tmp, strlen(tmp)); + + if (!header_init) { + /* strip POST headers on redirect */ + strip_header(user_headers, tmp, "content-length:"); + strip_header(user_headers, tmp, "content-type:"); + } + if ((s = strstr(tmp, "user-agent:")) && (s == tmp || *(s-1) == '\r' || *(s-1) == '\n' || *(s-1) == '\t' || *(s-1) == ' ')) { diff --git a/ext/standard/tests/http/bug61548.phpt b/ext/standard/tests/http/bug61548.phpt new file mode 100644 index 0000000000000..138b15a338c06 --- /dev/null +++ b/ext/standard/tests/http/bug61548.phpt @@ -0,0 +1,118 @@ +--TEST-- +Bug #61548 (content-type must appear at the end of headers) +--INI-- +allow_url_fopen=1 +--SKIPIF-- + +--FILE-- + [ + 'method' => 'POST', + 'header' => $header, + 'follow_location' => true, + ], + ]; + + $ctx = stream_context_create($options); + + $responses = [ + "data://text/plain,HTTP/1.1 201\r\nLocation: /foo\r\n\r\n", + "data://text/plain,HTTP/1.1 200\r\nConnection: close\r\n\r\n", + ]; + $pid = http_server('tcp://127.0.0.1:12342', $responses, $output); + + $fd = fopen('http://127.0.0.1:12342/', 'rb', false, $ctx); + fseek($output, 0, SEEK_SET); + echo stream_get_contents($output); + + http_server_kill($pid); +} + +do_test("First:1\nSecond:2\nContent-type: text/plain"); +do_test("First:1\nSecond:2\nContent-type: text/plain\n"); +do_test("First:1\nSecond:2\nContent-type: text/plain\nThird:"); +do_test("First:1\nContent-type:text/plain\nSecond:2"); +do_test("First:1\nContent-type:text/plain\nSecond:2\n"); +do_test("First:1\nContent-type:text/plain\nSecond:2\nThird:"); + +?> +Done +--EXPECT-- +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Content-type: text/plain + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Content-type: text/plain + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Content-type: text/plain +Third: + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Third: + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Content-type:text/plain +Second:2 + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Content-type:text/plain +Second:2 + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Content-type:text/plain +Second:2 +Third: + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Third: + +Done + From cd1cab3f4726751a0476ac8701ce09cc37cb36df Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 1 Oct 2013 17:01:03 +0200 Subject: [PATCH 0073/1256] fix bug #62396 'make test' crashes starting with 5.3.14 (missing gzencode()) --- NEWS | 5 +++++ run-tests.php | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9bb60327fa9dd..b889e66271b14 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,11 @@ PHP NEWS . Fixed bug #61548 (content-type must appear at the end of headers for 201 Location to work in http). (Mike) +- Build system: + . Fixed bug #62396 ('make test' crashes starting with 5.3.14 (missing + gzencode())). (Mike) + + 19 Sep 2013, PHP 5.4.20 - Core: diff --git a/run-tests.php b/run-tests.php index 935f821f4e683..317f6077a3dc9 100755 --- a/run-tests.php +++ b/run-tests.php @@ -455,7 +455,7 @@ function save_or_mail_results() $compression = 0; $output_file = $CUR_DIR . '/php_test_results_' . date('Ymd_Hi') . '.txt'; -if ($compression) { +if ($compression && in_array("compress.zlib", stream_get_filters())) { $output_file = 'compress.zlib://' . $output_file . '.gz'; } @@ -1545,6 +1545,16 @@ function run_test($php, $file, $env) } } } + + if (!extension_loaded("zlib") + && ( array_key_exists("GZIP_POST", $section_text) + || array_key_exists("DEFLATE_POST", $section_text)) + ) { + $message = "ext/zlib required"; + show_result('SKIP', $tested, $tested_file, "reason: $message", $temp_filenames); + junit_mark_test_as('SKIP', $shortname, $tested, null, ""); + return 'SKIPPED'; + } if (@count($section_text['REDIRECTTEST']) == 1) { $test_files = array(); From 60e38b3243577abc80ce6bbcfb0b4125b08acb85 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 1 Oct 2013 10:33:39 -0700 Subject: [PATCH 0074/1256] Revert "Make 'make distclean' remove the downloaded pear PHAR" This reverts commit d7baf0427fb56cbde55495e5c2071b1cdacb94ce. --- Makefile.global | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile.global b/Makefile.global index c56ef992d9b0c..05c5d151b74cc 100644 --- a/Makefile.global +++ b/Makefile.global @@ -125,7 +125,6 @@ distclean: clean rm -f sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html rm -f ext/iconv/php_have_bsd_iconv.h ext/iconv/php_have_glibc_iconv.h ext/iconv/php_have_ibm_iconv.h ext/iconv/php_have_iconv.h ext/iconv/php_have_libiconv.h ext/iconv/php_iconv_aliased_libiconv.h ext/iconv/php_iconv_supports_errno.h ext/iconv/php_php_iconv_h_path.h ext/iconv/php_php_iconv_impl.h rm -f ext/phar/phar.phar ext/phar/phar.php - rm -f pear/install-pear-nozlib.phar if test "$(srcdir)" != "$(builddir)"; then \ rm -f ext/phar/phar/phar.inc; \ fi From b2f8f35a889e77c3123ade348907e73bf6d6689e Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 1 Oct 2013 22:25:56 -0700 Subject: [PATCH 0075/1256] 5.4.22-dev now --- NEWS | 2 ++ configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index b889e66271b14..9bef174d37a9e 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2013, PHP 5.4.22 + ?? ??? 2013, PHP 5.4.21 - Core: diff --git a/configure.in b/configure.in index 30de2c3aaa803..aa58df613b6c2 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=4 -PHP_RELEASE_VERSION=21 +PHP_RELEASE_VERSION=22 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index e30528ed51d00..3058fef6132f0 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 4 -#define PHP_RELEASE_VERSION 21 +#define PHP_RELEASE_VERSION 22 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.4.21-dev" -#define PHP_VERSION_ID 50421 +#define PHP_VERSION "5.4.22-dev" +#define PHP_VERSION_ID 50422 From 9209c19f8f7eef807cb457b32d3ab517ff8dc178 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 2 Oct 2013 15:19:25 +0200 Subject: [PATCH 0076/1256] fix bug #65808 the socket_connect() won't work with IPv6 address --- NEWS | 4 +++ ext/sockets/sockets.c | 59 ++++++++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/NEWS b/NEWS index 9bef174d37a9e..c2086c07910b8 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- Sockets: + . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). + (Mike) + ?? ??? 2013, PHP 5.4.21 - Core: diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index d0d02946477d7..d094b3cc1d692 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -607,6 +607,8 @@ static char *php_strerror(int error TSRMLS_DC) /* {{{ */ /* }}} */ #if HAVE_IPV6 +static int php_get_if_index_from_string(const char *val, unsigned *out TSRMLS_DC); + /* Sets addr by hostname, or by ip in string form (AF_INET6) */ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socket *php_sock TSRMLS_DC) /* {{{ */ { @@ -615,6 +617,7 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke struct addrinfo hints; struct addrinfo *addrinfo = NULL; #endif + char *scope = strchr(string, '%'); if (inet_pton(AF_INET6, string, &tmp)) { memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr)); @@ -649,6 +652,22 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke } + if (scope++) { + long lval = 0; + double dval = 0; + unsigned scope_id = 0; + + if (IS_LONG == is_numeric_string(scope, strlen(scope), &lval, &dval, 0)) { + if (lval > 0 && lval <= UINT_MAX) { + scope_id = lval; + } + } else { + php_get_if_index_from_string(scope, &scope_id TSRMLS_CC); + } + + sin6->sin6_scope_id = scope_id; + } + return 1; } /* }}} */ @@ -714,6 +733,28 @@ static int php_set_inet46_addr(php_sockaddr_storage *ss, socklen_t *ss_len, char return 0; } +static int php_get_if_index_from_string(const char *val, unsigned *out TSRMLS_DC) +{ +#if HAVE_IF_NAMETOINDEX + unsigned int ind; + + ind = if_nametoindex(val); + if (ind == 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "no interface with name \"%s\" could be found", val); + return FAILURE; + } else { + *out = ind; + return SUCCESS; + } +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "this platform does not support looking up an interface by " + "name, an integer interface index must be supplied instead"); + return FAILURE; +#endif +} + static int php_get_if_index_from_zval(zval *val, unsigned *out TSRMLS_DC) { int ret; @@ -729,26 +770,10 @@ static int php_get_if_index_from_zval(zval *val, unsigned *out TSRMLS_DC) ret = SUCCESS; } } else { -#if HAVE_IF_NAMETOINDEX - unsigned int ind; zval_add_ref(&val); convert_to_string_ex(&val); - ind = if_nametoindex(Z_STRVAL_P(val)); - if (ind == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, - "no interface with name \"%s\" could be found", Z_STRVAL_P(val)); - ret = FAILURE; - } else { - *out = ind; - ret = SUCCESS; - } + ret = php_get_if_index_from_string(Z_STRVAL_P(val), out TSRMLS_CC); zval_ptr_dtor(&val); -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, - "this platform does not support looking up an interface by " - "name, an integer interface index must be supplied instead"); - ret = FAILURE; -#endif } return ret; From 60d9175280cbab5967966e38f42fced854d10408 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 3 Oct 2013 08:45:31 +0200 Subject: [PATCH 0077/1256] Fix Bug #60633 build warning in bcmath --- ext/bcmath/libbcmath/src/recmul.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/ext/bcmath/libbcmath/src/recmul.c b/ext/bcmath/libbcmath/src/recmul.c index c31d09dc72db5..64014f3a6e8a0 100644 --- a/ext/bcmath/libbcmath/src/recmul.c +++ b/ext/bcmath/libbcmath/src/recmul.c @@ -183,7 +183,6 @@ _bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, int full_scale TSRMLS_DC) { bc_num u0, u1, v0, v1; - int u0len, v0len; bc_num m1, m2, m3, d1, d2; int n, prodlen, m1zero; int d1len, d2len; @@ -216,10 +215,8 @@ _bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, } _bc_rm_leading_zeros (u1); _bc_rm_leading_zeros (u0); - u0len = u0->n_len; _bc_rm_leading_zeros (v1); _bc_rm_leading_zeros (v0); - v0len = v0->n_len; m1zero = bc_is_zero(u1 TSRMLS_CC) || bc_is_zero(v1 TSRMLS_CC); From fc3f8a8f54d8b3c864125bf32028d4550882839c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 3 Oct 2013 13:28:41 +0200 Subject: [PATCH 0078/1256] fix bug #59613 (Crash with clone XMLReader) --- NEWS | 4 ++++ ext/xmlreader/php_xmlreader.c | 1 + ext/xmlreader/tests/bug51963.phpt | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 ext/xmlreader/tests/bug51963.phpt diff --git a/NEWS b/NEWS index c2086c07910b8..c6961bd24fc8b 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) +- XMLReader: + . Fixed bug #59613 (Crash with clone XMLReader). (Mike) + + ?? ??? 2013, PHP 5.4.21 - Core: diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index f4c2643212f27..8b803200976de 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -1320,6 +1320,7 @@ PHP_MINIT_FUNCTION(xmlreader) xmlreader_object_handlers.read_property = xmlreader_read_property; xmlreader_object_handlers.write_property = xmlreader_write_property; xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr; + xmlreader_object_handlers.clone_obj = NULL; INIT_CLASS_ENTRY(ce, "XMLReader", xmlreader_functions); ce.create_object = xmlreader_objects_new; diff --git a/ext/xmlreader/tests/bug51963.phpt b/ext/xmlreader/tests/bug51963.phpt new file mode 100644 index 0000000000000..af47f9750b2cb --- /dev/null +++ b/ext/xmlreader/tests/bug51963.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #59613 (Crash with clone XMLReader) +--SKIPIF-- + +--FILE-- +xml(""); + +$xmlreader->next(); +$xmlreader2 = clone $xmlreader; +$xmlreader2->next(); +?> +Done +--EXPECTF-- +Test + +Fatal error: Trying to clone an uncloneable object of class XMLReader in %s on line %d From dc3d360a0ff8c17cb2ce2030813d30b578249be9 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 3 Oct 2013 13:34:31 +0200 Subject: [PATCH 0079/1256] typo: really fix bug #51936 Crash with clone xmlreader --- NEWS | 2 +- ext/xmlreader/tests/{bug51963.phpt => bug51936.phpt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename ext/xmlreader/tests/{bug51963.phpt => bug51936.phpt} (90%) diff --git a/NEWS b/NEWS index c6961bd24fc8b..ffde3012f971d 100644 --- a/NEWS +++ b/NEWS @@ -7,7 +7,7 @@ PHP NEWS (Mike) - XMLReader: - . Fixed bug #59613 (Crash with clone XMLReader). (Mike) + . Fixed bug #51936 (Crash with clone XMLReader). (Mike) ?? ??? 2013, PHP 5.4.21 diff --git a/ext/xmlreader/tests/bug51963.phpt b/ext/xmlreader/tests/bug51936.phpt similarity index 90% rename from ext/xmlreader/tests/bug51963.phpt rename to ext/xmlreader/tests/bug51936.phpt index af47f9750b2cb..4b5f1012e79c0 100644 --- a/ext/xmlreader/tests/bug51963.phpt +++ b/ext/xmlreader/tests/bug51936.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #59613 (Crash with clone XMLReader) +Bug #51936 (Crash with clone XMLReader) --SKIPIF-- Date: Thu, 3 Oct 2013 15:23:05 +0200 Subject: [PATCH 0080/1256] fix bug #55285 XMLReader::getAttribute/No/Ns methods inconsistency --- NEWS | 4 ++++ UPGRADING | 4 ++++ ext/xmlreader/php_xmlreader.c | 6 ------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 95acaa66692f7..e1a191f3ddbbd 100644 --- a/NEWS +++ b/NEWS @@ -55,4 +55,8 @@ PHP NEWS . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version 1.1). (Adam) +- XMLReader: + . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). + (Mike) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index 87b9eefeedb52..f4138875004f1 100755 --- a/UPGRADING +++ b/UPGRADING @@ -61,6 +61,10 @@ PHP X.Y UPGRADE NOTES CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file do not work unless it is explicitly set to false. +- XMLReader: + XMLReader::getAttributeNs and XMLReader::getAttributeNo now return NULL if + the attribute could not be found, just like XMLReader::getAttribute. + ======================================== 5. New Functions ======================================== diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 464998ce62f20..6ef25a235cd64 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -588,9 +588,6 @@ PHP_METHOD(xmlreader, getAttributeNo) if (retchar) { RETVAL_STRING(retchar, 1); xmlFree(retchar); - return; - } else { - RETURN_EMPTY_STRING(); } } /* }}} */ @@ -622,9 +619,6 @@ PHP_METHOD(xmlreader, getAttributeNs) if (retchar) { RETVAL_STRING(retchar, 1); xmlFree(retchar); - return; - } else { - RETURN_EMPTY_STRING(); } } /* }}} */ From 099b295646b108ad56d1ec3b37dfcb5812fd378c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 3 Oct 2013 16:23:59 +0200 Subject: [PATCH 0081/1256] add NEWS and UPGRADING about gost-crypto --- NEWS | 3 +++ UPGRADING | 2 ++ 2 files changed, 5 insertions(+) diff --git a/NEWS b/NEWS index e1a191f3ddbbd..8113514420b8d 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,9 @@ PHP NEWS improvements based on this. (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) +- Hash: + . Added gost-crypto (CryptoPro S-box) GOST hash algo. (Manuel Mausz) + - mysqlnd: . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively supported by the overlying APIs. (Andrey) diff --git a/UPGRADING b/UPGRADING index f4138875004f1..fb8daab2d609c 100755 --- a/UPGRADING +++ b/UPGRADING @@ -40,6 +40,8 @@ PHP X.Y UPGRADE NOTES - The php://input stream is now re-usable and can be used concurrently with enable_post_data_reading=0. +- Added gost-crypto (CryptoPro S-box) hash algo. + ======================================== 2. Changes in SAPI modules ======================================== From f6ff3a28d60c24dea2a05344d9b7eb823f09b4e5 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 4 Oct 2013 11:22:17 +0200 Subject: [PATCH 0082/1256] Fixed bug #64230 (XMLReader does not suppress errors) --- NEWS | 1 + ext/xmlreader/php_xmlreader.c | 2 -- ext/xmlreader/tests/bug64230.phpt | 50 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 ext/xmlreader/tests/bug64230.phpt diff --git a/NEWS b/NEWS index ffde3012f971d..9963714679693 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ PHP NEWS - XMLReader: . Fixed bug #51936 (Crash with clone XMLReader). (Mike) + . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) ?? ??? 2013, PHP 5.4.21 diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 8b803200976de..adf282120e0b9 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -805,7 +805,6 @@ PHP_METHOD(xmlreader, read) if (intern != NULL && intern->ptr != NULL) { retval = xmlTextReaderRead(intern->ptr); if (retval == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occurred while reading"); RETURN_FALSE; } else { RETURN_BOOL(retval); @@ -847,7 +846,6 @@ PHP_METHOD(xmlreader, next) retval = xmlTextReaderNext(intern->ptr); } if (retval == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occurred while reading"); RETURN_FALSE; } else { RETURN_BOOL(retval); diff --git a/ext/xmlreader/tests/bug64230.phpt b/ext/xmlreader/tests/bug64230.phpt new file mode 100644 index 0000000000000..0b070925f30d3 --- /dev/null +++ b/ext/xmlreader/tests/bug64230.phpt @@ -0,0 +1,50 @@ +--TEST-- +Bug #64230 (XMLReader does not suppress errors) +--SKIPIF-- + +--FILE-- +message); + } + libxml_clear_errors(); +} + +echo "Internal errors TRUE\n"; +libxml_use_internal_errors(true); + +$x = new XMLReader; +$x->xml(""); +$x->read(); + +show_internal_errors(); + +echo "Internal errors FALSE\n"; +libxml_use_internal_errors(false); + +$x = new XMLReader; +$x->xml(""); +$x->read(); + +show_internal_errors(); + +?> +Done +--EXPECTF-- +Test +Internal errors TRUE +Internal: Specification mandate value for attribute att + +Internal errors FALSE + +Warning: XMLReader::read(): %s: parser error : Specification mandate value for attribute att in %s on line %d + +Warning: XMLReader::read(): in %s on line %d + +Warning: XMLReader::read(): ^ in %s on line %d +Done From 536260f2c52af7057a657af96d991acf27c0cc86 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Oct 2013 13:13:46 +0200 Subject: [PATCH 0083/1256] Fix bug #65821: By-ref foreach on property access of string offset segfaults This removes the now unnecessary ZEND_FETCH_ADD_LOCK on the container of a property fetch of a by-reference foreach. --- NEWS | 2 ++ Zend/zend_compile.c | 33 ++--------------------- Zend/zend_vm_def.h | 5 ---- Zend/zend_vm_execute.h | 60 ------------------------------------------ 4 files changed, 4 insertions(+), 96 deletions(-) diff --git a/NEWS b/NEWS index 1b1f9c4bdf543..796f82f207847 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). (Nikita) + . Fixed bug #65821 (By-ref foreach on property access of string offset + segfaults). (Nikita) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f250b2be20879..9008f23369d35 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1749,7 +1749,6 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n zend_op dummy_opline; dummy_opline.result_type = IS_UNUSED; - dummy_opline.op1_type = IS_UNUSED; zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, sizeof(zend_op)); } @@ -2662,7 +2661,7 @@ static int generate_free_switch_expr(const zend_switch_entry *switch_entry TSRML opline->opcode = (switch_entry->cond.op_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE; SET_NODE(opline->op1, &switch_entry->cond); SET_UNUSED(opline->op2); - opline->extended_value = 0; + return 0; } /* }}} */ @@ -2672,7 +2671,7 @@ static int generate_free_foreach_copy(const zend_op *foreach_copy TSRMLS_DC) /* zend_op *opline; /* If we reach the separator then stop applying the stack */ - if (foreach_copy->result_type == IS_UNUSED && foreach_copy->op1_type == IS_UNUSED) { + if (foreach_copy->result_type == IS_UNUSED) { return 1; } @@ -2681,16 +2680,6 @@ static int generate_free_foreach_copy(const zend_op *foreach_copy TSRMLS_DC) /* opline->opcode = (foreach_copy->result_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE; COPY_NODE(opline->op1, foreach_copy->result); SET_UNUSED(opline->op2); - opline->extended_value = 1; - - if (foreach_copy->op1_type != IS_UNUSED) { - opline = get_next_op(CG(active_op_array) TSRMLS_CC); - - opline->opcode = (foreach_copy->op1_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE; - COPY_NODE(opline->op1, foreach_copy->op1); - SET_UNUSED(opline->op2); - opline->extended_value = 0; - } return 0; } @@ -6227,7 +6216,6 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno { zend_op *opline; zend_bool is_variable; - zend_bool push_container = 0; zend_op dummy_opline; if (variable) { @@ -6239,14 +6227,6 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno /* save the location of FETCH_W instruction(s) */ open_brackets_token->u.op.opline_num = get_next_op_number(CG(active_op_array)); zend_do_end_variable_parse(array, BP_VAR_W, 0 TSRMLS_CC); - if (CG(active_op_array)->last > 0 && - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode == ZEND_FETCH_OBJ_W) { - /* Only lock the container if we are fetching from a real container and not $this */ - if (CG(active_op_array)->opcodes[CG(active_op_array)->last-1].op1_type == IS_VAR) { - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].extended_value |= ZEND_FETCH_ADD_LOCK; - push_container = 1; - } - } } else { is_variable = 0; open_brackets_token->u.op.opline_num = get_next_op_number(CG(active_op_array)); @@ -6266,11 +6246,6 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno opline->extended_value = is_variable ? ZEND_FE_RESET_VARIABLE : 0; COPY_NODE(dummy_opline.result, opline->result); - if (push_container) { - COPY_NODE(dummy_opline.op1, CG(active_op_array)->opcodes[CG(active_op_array)->last-2].op1); - } else { - dummy_opline.op1_type = IS_UNUSED; - } zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, sizeof(zend_op)); /* save the location of FE_FETCH */ @@ -6327,7 +6302,6 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token opline->extended_value |= ZEND_FE_FETCH_BYREF; CG(active_op_array)->opcodes[foreach_token->u.op.opline_num].extended_value |= ZEND_FE_RESET_REFERENCE; } else { - zend_op *foreach_copy; zend_op *fetch = &CG(active_op_array)->opcodes[foreach_token->u.op.opline_num]; zend_op *end = &CG(active_op_array)->opcodes[open_brackets_token->u.op.opline_num]; @@ -6344,9 +6318,6 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token fetch->opcode -= 3; /* FETCH_W -> FETCH_R */ } } - /* prevent double SWITCH_FREE */ - zend_stack_top(&CG(foreach_copy_stack), (void **) &foreach_copy); - foreach_copy->op1_type = IS_UNUSED; } GET_NODE(&value_node, opline->result); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ada20ca3083c1..201ae49e05a68 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1392,11 +1392,6 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMP|VAR|CV) SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (IS_OP2_TMP_FREE()) { MAKE_REAL_ZVAL_PTR(property); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2ba6bfef1d93b..74a8c12d400e4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -14997,11 +14997,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA SAVE_OPLINE(); property = opline->op2.zv; - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -17353,11 +17348,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (1) { MAKE_REAL_ZVAL_PTR(property); } @@ -19616,11 +19606,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -23081,11 +23066,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -24867,11 +24847,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE SAVE_OPLINE(); property = opline->op2.zv; - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -26285,11 +26260,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (1) { MAKE_REAL_ZVAL_PTR(property); } @@ -27606,11 +27576,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -29349,11 +29314,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HA SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -32493,11 +32453,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN SAVE_OPLINE(); property = opline->op2.zv; - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -34614,11 +34569,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (1) { MAKE_REAL_ZVAL_PTR(property); } @@ -36739,11 +36689,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -39917,11 +39862,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } From e8ae795529eff83482797dff0d1a1de7f0a84c8d Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 4 Oct 2013 16:11:49 +0200 Subject: [PATCH 0084/1256] such a weird hack probably helps in finding regressions in the future --- ext/standard/tests/serialize/bug65806.phpt | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 ext/standard/tests/serialize/bug65806.phpt diff --git a/ext/standard/tests/serialize/bug65806.phpt b/ext/standard/tests/serialize/bug65806.phpt new file mode 100644 index 0000000000000..19fab95c6430d --- /dev/null +++ b/ext/standard/tests/serialize/bug65806.phpt @@ -0,0 +1,83 @@ +--TEST-- +Bug #65806 (unserialize fails with object which is referenced multiple times) +--FILE-- +_obj = $obj; + $this->_serialized = serialize($this->_obj); + } + public function get() + { + return $this->_obj; + } + public function __sleep() + { + $this->_serialized = serialize($this->_obj); + return array( + "\0" . __CLASS__ . "\0_serialized", + ); + } + public function __wakeup() + { + $this->_obj = unserialize($this->_serialized); + } +} + +echo "SCRIPT START" . PHP_EOL; + +$objA = new myObjA(); +$objB = new myObjB(); +$objC = new myObjC(); + +$objB->attrA = new ArrayIterator(); +$objB->attrB = $objA; + +$objC->attrC = $objB; +$objC->attrD = $objA; + +$list = new myList($objC); + +echo 'check ' . check($list->get()) . PHP_EOL; + +echo "start serialize/unserialize" . PHP_EOL; +$newList = unserialize(serialize($list)); +echo "finish serialize/unserialize" . PHP_EOL; + +//after unserialize the property myObjC::attrD is null instead of expected object +echo 'check ' . check($newList->get()) . PHP_EOL; + +echo "SCRIPT END" . PHP_EOL ; + +function check(myObjC $obj) { + + if (!is_object($obj->attrC)) { + return 'failed (myObjC::attrC => ' . var_export($obj->attrC, true) . ')'; + } + if (!is_object($obj->attrD)) { + return 'failed (myObjC::attrD => ' . var_export($obj->attrD, true) . ')'; + } + return 'successful'; +} +?> +--EXPECT-- +SCRIPT START +check successful +start serialize/unserialize +finish serialize/unserialize +check successful +SCRIPT END + From 8973390541faaadfdfc0f838421f037060188e5e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 4 Oct 2013 16:16:15 +0200 Subject: [PATCH 0085/1256] fix bug #64146 (serialize incorrectly saving objects when they are cloned) --- ext/standard/tests/serialize/bug64146.phpt | 60 ++++++++++++++++++++++ ext/standard/var.c | 6 +-- 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 ext/standard/tests/serialize/bug64146.phpt diff --git a/ext/standard/tests/serialize/bug64146.phpt b/ext/standard/tests/serialize/bug64146.phpt new file mode 100644 index 0000000000000..18ae78d0cecad --- /dev/null +++ b/ext/standard/tests/serialize/bug64146.phpt @@ -0,0 +1,60 @@ +--TEST-- +Bug #64146 (serialize incorrectly saving objects when they are cloned) +--FILE-- +a[] = new B(1); + $this->a[] = new B(2); + } +} + +class B implements Serializable +{ + public $b; + + public function __construct($c) + { + $this->b = new C($c); + } + + public function serialize() + { + return serialize(clone $this->b); + } + + public function unserialize($data) + { + $this->b = unserialize($data); + } +} + +class C +{ + public $c; + + public function __construct($c) + { + $this->c = $c; + } +} + +$a = unserialize(serialize(new A())); + +print $a->a[0]->b->c . "\n"; +print $a->a[1]->b->c . "\n"; + +?> +Done +--EXPECT-- +Test +1 +2 +Done diff --git a/ext/standard/var.c b/ext/standard/var.c index f76a14cfa6641..f71c4a4fdc3e8 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -549,11 +549,9 @@ static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old char id[32], *p; register int len; - /* relies on "(long)" being a perfect hash function for data pointers, - * however the actual identity of an object has had to be determined - * by its object handle since 5.0. */ if ((Z_TYPE_P(var) == IS_OBJECT) && Z_OBJ_HT_P(var)->get_class_entry) { - p = smart_str_print_long(id + sizeof(id) - 1, (long) Z_OBJ_HANDLE_P(var)); + p = smart_str_print_long(id + sizeof(id) - 1, + (long) zend_objects_get_address(var TSRMLS_CC)); *(--p) = 'O'; len = id + sizeof(id) - 1 - p; } else { From 96cc419924c38874f9e2f2e5ccf3cd0430d90f43 Mon Sep 17 00:00:00 2001 From: Philip Hofstetter Date: Wed, 2 Oct 2013 08:35:02 +0200 Subject: [PATCH 0086/1256] Fix bug #65667: ftp_nb_continue produces segfault the idea behind ftp_nb_get is for it to be followed by multiple calls to ftp_nb_continue in order to download a file piece-by-piece. As such, it's unwise to close the stream used to write the downloaded data to when the file hasn't been completely downloaded within the first call to ftp_nb_get. This regression was added in a93a462dcefd62e07963dd2da506fbb3409c88b5 and this patch restores the behavior that was seen pre-patch. --- NEWS | 3 + ext/ftp/php_ftp.c | 4 +- ext/ftp/tests/ftp_nb_continue.phpt | 182 +++++++++++++++++++++++++++++ ext/ftp/tests/server.inc | 7 ++ 4 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 ext/ftp/tests/ftp_nb_continue.phpt diff --git a/NEWS b/NEWS index 9963714679693..7a7cecacda7f6 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- FTP: + . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index da22e0b63eb3a..21e13ea460563 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -968,7 +968,9 @@ PHP_FUNCTION(ftp_nb_get) RETURN_LONG(PHP_FTP_FAILED); } - php_stream_close(outstream); + if (ret == PHP_FTP_FINISHED){ + php_stream_close(outstream); + } RETURN_LONG(ret); } diff --git a/ext/ftp/tests/ftp_nb_continue.phpt b/ext/ftp/tests/ftp_nb_continue.phpt new file mode 100644 index 0000000000000..1f703399139bf --- /dev/null +++ b/ext/ftp/tests/ftp_nb_continue.phpt @@ -0,0 +1,182 @@ +--TEST-- +Testing whether ftp_nb_continue() fetches more data +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +This is line 0 of the test data. +This is line 1 of the test data. +This is line 2 of the test data. +This is line 3 of the test data. +This is line 4 of the test data. +This is line 5 of the test data. +This is line 6 of the test data. +This is line 7 of the test data. +This is line 8 of the test data. +This is line 9 of the test data. +This is line 10 of the test data. +This is line 11 of the test data. +This is line 12 of the test data. +This is line 13 of the test data. +This is line 14 of the test data. +This is line 15 of the test data. +This is line 16 of the test data. +This is line 17 of the test data. +This is line 18 of the test data. +This is line 19 of the test data. +This is line 20 of the test data. +This is line 21 of the test data. +This is line 22 of the test data. +This is line 23 of the test data. +This is line 24 of the test data. +This is line 25 of the test data. +This is line 26 of the test data. +This is line 27 of the test data. +This is line 28 of the test data. +This is line 29 of the test data. +This is line 30 of the test data. +This is line 31 of the test data. +This is line 32 of the test data. +This is line 33 of the test data. +This is line 34 of the test data. +This is line 35 of the test data. +This is line 36 of the test data. +This is line 37 of the test data. +This is line 38 of the test data. +This is line 39 of the test data. +This is line 40 of the test data. +This is line 41 of the test data. +This is line 42 of the test data. +This is line 43 of the test data. +This is line 44 of the test data. +This is line 45 of the test data. +This is line 46 of the test data. +This is line 47 of the test data. +This is line 48 of the test data. +This is line 49 of the test data. +This is line 50 of the test data. +This is line 51 of the test data. +This is line 52 of the test data. +This is line 53 of the test data. +This is line 54 of the test data. +This is line 55 of the test data. +This is line 56 of the test data. +This is line 57 of the test data. +This is line 58 of the test data. +This is line 59 of the test data. +This is line 60 of the test data. +This is line 61 of the test data. +This is line 62 of the test data. +This is line 63 of the test data. +This is line 64 of the test data. +This is line 65 of the test data. +This is line 66 of the test data. +This is line 67 of the test data. +This is line 68 of the test data. +This is line 69 of the test data. +This is line 70 of the test data. +This is line 71 of the test data. +This is line 72 of the test data. +This is line 73 of the test data. +This is line 74 of the test data. +This is line 75 of the test data. +This is line 76 of the test data. +This is line 77 of the test data. +This is line 78 of the test data. +This is line 79 of the test data. +This is line 80 of the test data. +This is line 81 of the test data. +This is line 82 of the test data. +This is line 83 of the test data. +This is line 84 of the test data. +This is line 85 of the test data. +This is line 86 of the test data. +This is line 87 of the test data. +This is line 88 of the test data. +This is line 89 of the test data. +This is line 90 of the test data. +This is line 91 of the test data. +This is line 92 of the test data. +This is line 93 of the test data. +This is line 94 of the test data. +This is line 95 of the test data. +This is line 96 of the test data. +This is line 97 of the test data. +This is line 98 of the test data. +This is line 99 of the test data. +This is line 100 of the test data. +This is line 101 of the test data. +This is line 102 of the test data. +This is line 103 of the test data. +This is line 104 of the test data. +This is line 105 of the test data. +This is line 106 of the test data. +This is line 107 of the test data. +This is line 108 of the test data. +This is line 109 of the test data. +This is line 110 of the test data. +This is line 111 of the test data. +This is line 112 of the test data. +This is line 113 of the test data. +This is line 114 of the test data. +This is line 115 of the test data. +This is line 116 of the test data. +This is line 117 of the test data. +This is line 118 of the test data. +This is line 119 of the test data. +This is line 120 of the test data. +This is line 121 of the test data. +This is line 122 of the test data. +This is line 123 of the test data. +This is line 124 of the test data. +This is line 125 of the test data. +This is line 126 of the test data. +This is line 127 of the test data. +This is line 128 of the test data. +This is line 129 of the test data. +This is line 130 of the test data. +This is line 131 of the test data. +This is line 132 of the test data. +This is line 133 of the test data. +This is line 134 of the test data. +This is line 135 of the test data. +This is line 136 of the test data. +This is line 137 of the test data. +This is line 138 of the test data. +This is line 139 of the test data. +This is line 140 of the test data. +This is line 141 of the test data. +This is line 142 of the test data. +This is line 143 of the test data. +This is line 144 of the test data. +This is line 145 of the test data. +This is line 146 of the test data. +This is line 147 of the test data. +This is line 148 of the test data. +This is line 149 of the test data. diff --git a/ext/ftp/tests/server.inc b/ext/ftp/tests/server.inc index 7dc8fa08d99ff..bb0c1ff10bec9 100644 --- a/ext/ftp/tests/server.inc +++ b/ext/ftp/tests/server.inc @@ -368,6 +368,13 @@ if ($pid) { } fputs($s, "226 Closing data Connection.\r\n"); break; + case "mediumfile": + fputs($s, "150 File status okay; about to open data connection.\r\n"); + for($i = 0; $i < 150; $i++){ + fputs($fs, "This is line $i of the test data.\n"); + } + fputs($s, "226 Closing data Connection.\r\n"); + default: fputs($s, "550 {$matches[1]}: No such file or directory \r\n"); break; From 047877e8106ef9cb53f6a32dc8b645693d59e4b0 Mon Sep 17 00:00:00 2001 From: Martin Jansen Date: Fri, 4 Oct 2013 21:55:29 +0200 Subject: [PATCH 0087/1256] Add unit test that covers setting the crypto method. --- ext/openssl/tests/streams_crypto_method.pem | 33 +++++++++ ext/openssl/tests/streams_crypto_method.phpt | 77 ++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 ext/openssl/tests/streams_crypto_method.pem create mode 100644 ext/openssl/tests/streams_crypto_method.phpt diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem new file mode 100644 index 0000000000000..9d754d460d57c --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET +MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx +HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN +MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu +ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB +ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy +V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 +JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S +S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R +aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E +1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY +BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy +NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho ++Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ +JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 +Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg +wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ +vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB +AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc +z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz +xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 +HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD +yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS +xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj +7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG +h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL +QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q +hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= +-----END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/streams_crypto_method.phpt b/ext/openssl/tests/streams_crypto_method.phpt new file mode 100644 index 0000000000000..7ac195bfb6ad9 --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.phpt @@ -0,0 +1,77 @@ +--TEST-- +Specific crypto method for ssl:// transports. +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Hello World! From 5bc377457e155ceaddd27a536467a4d353fdcd4f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 4 Oct 2013 15:50:16 -0700 Subject: [PATCH 0088/1256] Allow the ldap extension to be compiled with Oracle's LDAP implementation, if desired. Note the implementations differ so you will see different ldap behavior. The patch allows configuration similar to: --with-ldap=$HOME/instantclient --with-oci8=instantclient,$HOME/instantclient The patch doesn't support configuration similar to: --with-ldap --with-oci8=instantclient,$HOME/instantclient since this would try and mix the default LDAP and Oracle LDAP implementations. This patch closes out bug #61450 and the associated github PR. Regardless of this patch, my recommended way to install both OCI8 and ldap extensions is to statically configure PHP with ldap, and then add OCI8 as a shared extension from PECL. --- ext/ldap/config.m4 | 39 +++++++++++++++++++++++++++++++++++---- ext/ldap/ldap.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/ext/ldap/config.m4 b/ext/ldap/config.m4 index 3c8e23ea8e852..2804cd5968ebf 100644 --- a/ext/ldap/config.m4 +++ b/ext/ldap/config.m4 @@ -15,6 +15,28 @@ AC_DEFUN([PHP_LDAP_CHECKS], [ LDAP_DIR=$1 LDAP_INCDIR=$1/ldap/public LDAP_LIBDIR=$1/$PHP_LIBDIR + else + + dnl Find Oracle Instant Client RPM header location corresponding to the given lib path e.g. for --with-ldap=/usr/lib/oracle/12.1/client64/lib + AC_CHECK_SIZEOF(long int, 4) + if test "$ac_cv_sizeof_long_int" = "4"; then + PHP_OCI8_IC_LIBDIR_SUFFIX="" + else + PHP_OCI8_IC_LIBDIR_SUFFIX=64 + fi + OCISDKRPMINC=`echo "$1" | $SED -e 's!^/usr/lib/oracle/\(.*\)/client\('${PHP_OCI8_IC_LIBDIR_SUFFIX}'\)*/lib[/]*$!/usr/include/oracle/\1/client\2!'` + + dnl Check for Oracle Instant Client RPM install + if test -f $OCISDKRPMINC/ldap.h; then + LDAP_DIR=$1 + LDAP_INCDIR=$OCISDKRPMINC + LDAP_LIBDIR=$1 + dnl Check for Oracle Instant Client ZIP install + elif test -f $1/sdk/include/ldap.h; then + LDAP_DIR=$1 + LDAP_INCDIR=$1/sdk/include + LDAP_LIBDIR=$1 + fi fi ]) @@ -143,12 +165,21 @@ if test "$PHP_LDAP" != "no"; then PHP_ADD_LIBRARY_WITH_PATH(umich_lber, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) PHP_ADD_LIBRARY_WITH_PATH(umich_ldap, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) - elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME; then + elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME.12.1; then PHP_ADD_LIBRARY_WITH_PATH(clntsh, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) AC_DEFINE(HAVE_ORALDAP,1,[ ]) - if test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then - AC_DEFINE(HAVE_ORALDAP_10,1,[ ]) - fi + AC_DEFINE(HAVE_ORALDAP_12,1,[ ]) + + elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME.11.1; then + PHP_ADD_LIBRARY_WITH_PATH(clntsh, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) + AC_DEFINE(HAVE_ORALDAP,1,[ ]) + AC_DEFINE(HAVE_ORALDAP_11,1,[ ]) + + elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME; then + PHP_ADD_LIBRARY_WITH_PATH(clntsh, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) + AC_DEFINE(HAVE_ORALDAP,1,[ ]) + AC_DEFINE(HAVE_ORALDAP_10,1,[ ]) + else AC_MSG_ERROR(Cannot find ldap libraries in $LDAP_LIBDIR.) fi diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 71d57d6d9b9ef..e95f898c156f7 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -152,7 +152,7 @@ PHP_MINIT_FUNCTION(ldap) REGISTER_LONG_CONSTANT("LDAP_DEREF_FINDING", LDAP_DEREF_FINDING, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("LDAP_DEREF_ALWAYS", LDAP_DEREF_ALWAYS, CONST_PERSISTENT | CONST_CS); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP /* LDAP options */ REGISTER_LONG_CONSTANT("LDAP_OPT_DEREF", LDAP_OPT_DEREF, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("LDAP_OPT_SIZELIMIT", LDAP_OPT_SIZELIMIT, CONST_PERSISTENT | CONST_CS); @@ -361,7 +361,7 @@ PHP_FUNCTION(ldap_connect) static int _get_lderrno(LDAP *ldap) { #if !HAVE_NSLDAP -#if LDAP_API_VERSION > 2000 || HAVE_ORALDAP_10 +#if LDAP_API_VERSION > 2000 || HAVE_ORALDAP int lderr; /* New versions of OpenLDAP do it this way */ @@ -550,7 +550,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in { /* sizelimit */ if (sizelimit > -1) { -#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_sizelimit); ldap_set_option(ldap, LDAP_OPT_SIZELIMIT, &sizelimit); #else @@ -561,7 +561,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in /* timelimit */ if (timelimit > -1) { -#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_timelimit); ldap_set_option(ldap, LDAP_OPT_TIMELIMIT, &timelimit); #else @@ -572,7 +572,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in /* deref */ if (deref > -1) { -#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_deref); ldap_set_option(ldap, LDAP_OPT_DEREF, &deref); #else @@ -975,12 +975,12 @@ PHP_FUNCTION(ldap_get_entries) add_index_string(tmp1, num_attrib, attribute, 1); num_attrib++; -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif attribute = ldap_next_attribute(ldap, ldap_result_entry, ber); } -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS if (ber != NULL) { ber_free(ber, 0); } @@ -989,7 +989,7 @@ PHP_FUNCTION(ldap_get_entries) add_assoc_long(tmp1, "count", num_attrib); dn = ldap_get_dn(ldap, ldap_result_entry); add_assoc_string(tmp1, "dn", dn, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(dn); #else free(dn); @@ -1027,7 +1027,7 @@ PHP_FUNCTION(ldap_first_attribute) RETURN_FALSE; } else { RETVAL_STRING(attribute, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif } @@ -1057,7 +1057,7 @@ PHP_FUNCTION(ldap_next_attribute) } if ((attribute = ldap_next_attribute(ld->link, resultentry->data, resultentry->ber)) == NULL) { -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS if (resultentry->ber != NULL) { ber_free(resultentry->ber, 0); resultentry->ber = NULL; @@ -1066,7 +1066,7 @@ PHP_FUNCTION(ldap_next_attribute) RETURN_FALSE; } else { RETVAL_STRING(attribute, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif } @@ -1113,12 +1113,12 @@ PHP_FUNCTION(ldap_get_attributes) add_index_string(return_value, num_attrib, attribute, 1); num_attrib++; -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif attribute = ldap_next_attribute(ld->link, resultentry->data, ber); } -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS if (ber != NULL) { ber_free(ber, 0); } @@ -1183,7 +1183,7 @@ PHP_FUNCTION(ldap_get_dn) text = ldap_get_dn(ld->link, resultentry->data); if (text != NULL) { RETVAL_STRING(text, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(text); #else free(text); @@ -1241,7 +1241,7 @@ PHP_FUNCTION(ldap_dn2ufn) if (ufn != NULL) { RETVAL_STRING(ufn, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(ufn); #endif } else { @@ -1546,7 +1546,7 @@ PHP_FUNCTION(ldap_sort) } /* }}} */ -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP /* {{{ proto bool ldap_get_option(resource link, int option, mixed retval) Get the current value of various session-wide parameters */ PHP_FUNCTION(ldap_get_option) @@ -2003,7 +2003,7 @@ PHP_FUNCTION(ldap_rename) newparent = NULL; } -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP rc = ldap_rename_s(ld->link, dn, newrdn, newparent, deleteoldrdn, NULL, NULL); #else if (newparent_len != 0) { @@ -2047,7 +2047,7 @@ PHP_FUNCTION(ldap_start_tls) } /* }}} */ #endif -#endif /* (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 */ +#endif /* (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP */ #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) /* {{{ _ldap_rebind_proc() @@ -2567,7 +2567,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_control_paged_result_response, 0, 0, 2) ZEND_END_ARG_INFO(); #endif -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_rename, 0, 0, 5) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, dn) @@ -2683,7 +2683,7 @@ const zend_function_entry ldap_functions[] = { PHP_FE(ldap_compare, arginfo_ldap_compare) PHP_FE(ldap_sort, arginfo_ldap_sort) -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP PHP_FE(ldap_rename, arginfo_ldap_rename) PHP_FE(ldap_get_option, arginfo_ldap_get_option) PHP_FE(ldap_set_option, arginfo_ldap_set_option) From 248afd1c3c0c923c15d7544b4a588396ad0c136e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 5 Oct 2013 12:52:32 -0300 Subject: [PATCH 0089/1256] - BFN --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 7a7cecacda7f6..fcf34c3fb9ec9 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- CLI server: + . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer + encoding). (Felipe) + - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) From 3aaee86ee33af276d2e879f5a645cc6dc850de22 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 5 Oct 2013 12:52:55 -0300 Subject: [PATCH 0090/1256] - Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding) --- sapi/cli/php_cli_server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 4da55acc6c2bc..aa4b2cd622116 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1589,6 +1589,7 @@ static int php_cli_server_client_read_request_on_body(php_http_parser *parser, c } client->request.content_len = 0; } + client->request.content = perealloc(client->request.content, client->request.content_len + length, 1); memmove(client->request.content + client->request.content_len, at, length); client->request.content_len += length; return 0; From 690bbe170d9ed4597629e4e986575fbe0a2cb796 Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 09:54:45 -0700 Subject: [PATCH 0091/1256] FIX BUG #65219 - USE DB not being sent for FreeTDS version < 0.92 FreeTDS <0.92 does not support DBSETLDBNAME option and therefore will not work with SQL Azure. Fallback to dbuse command in letter versions. --- ext/pdo_dblib/dblib_driver.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 2aaf3975db18e..13444b89c3db6 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -350,9 +350,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETLAPP(H->login, vars[1].optval); +/* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { - DBSETLDBNAME(H->login, vars[3].optval); + if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif @@ -362,6 +363,16 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +/* + * FreeTDS < 0.92 does not support the DBSETLDBNAME option + * Send use database here after login (Will not work with SQL Azure) + */ +#ifndef DBSETLDBNAME + if (vars[3].optval) { + if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + } +#endif + #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); @@ -377,23 +388,6 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; -#if 0 - /* Cache the supported data types from the servers systypes table */ - if(dbcmd(H->link, "select usertype, name from systypes order by usertype") != FAIL) { - if(dbsqlexec(H->link) != FAIL) { - dbresults(H->link); - while (dbnextrow(H->link) == SUCCESS) { - val = dbdata(H->link, 1); - add_index_string(pdo_dblib_datatypes, *val, dbdata(H->link, 2), 1); - } - } - /* Throw out any remaining resultsets */ - dbcancel(H-link); - } -#endif - - - cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { From 5ce23f39d51b1fc53a731d9fd7d419714d3de9fb Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 09:54:45 -0700 Subject: [PATCH 0092/1256] FIX BUG #65219 - USE DB not being sent for FreeTDS version < 0.92 FreeTDS <0.92 does not support DBSETLDBNAME option and therefore will not work with SQL Azure. Fallback to dbuse command in letter versions. --- ext/pdo_dblib/dblib_driver.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 2aaf3975db18e..13444b89c3db6 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -350,9 +350,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETLAPP(H->login, vars[1].optval); +/* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { - DBSETLDBNAME(H->login, vars[3].optval); + if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif @@ -362,6 +363,16 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +/* + * FreeTDS < 0.92 does not support the DBSETLDBNAME option + * Send use database here after login (Will not work with SQL Azure) + */ +#ifndef DBSETLDBNAME + if (vars[3].optval) { + if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + } +#endif + #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); @@ -377,23 +388,6 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; -#if 0 - /* Cache the supported data types from the servers systypes table */ - if(dbcmd(H->link, "select usertype, name from systypes order by usertype") != FAIL) { - if(dbsqlexec(H->link) != FAIL) { - dbresults(H->link); - while (dbnextrow(H->link) == SUCCESS) { - val = dbdata(H->link, 1); - add_index_string(pdo_dblib_datatypes, *val, dbdata(H->link, 2), 1); - } - } - /* Throw out any remaining resultsets */ - dbcancel(H-link); - } -#endif - - - cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { From 9c7dbb0487f5991fde03873ea8f5e66d6688415f Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 18:26:25 -0700 Subject: [PATCH 0093/1256] Fix bug #64338 pdo_dblib can't connect to Azure SQL --- ext/pdo_dblib/dblib_driver.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 8e4cbb7a486fc..daf5494d5839f 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -350,9 +350,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETLAPP(H->login, vars[1].optval); +/* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { - DBSETLDBNAME(H->login, vars[3].optval); + if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif @@ -362,6 +363,16 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +/* + * FreeTDS < 0.92 does not support the DBSETLDBNAME option + * Send use database here after login (Will not work with SQL Azure) + */ +#ifndef DBSETLDBNAME + if (vars[3].optval) { + if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; + } +#endif + #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); @@ -371,29 +382,12 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETOPT(H->link, DBTEXTSIZE, "2147483647"); /* allow double quoted indentifiers */ - DBSETOPT(H->link, DBQUOTEDIDENT, NULL); + DBSETOPT(H->link, DBQUOTEDIDENT, "1"); ret = 1; dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; -#if 0 - /* Cache the supported data types from the servers systypes table */ - if(dbcmd(H->link, "select usertype, name from systypes order by usertype") != FAIL) { - if(dbsqlexec(H->link) != FAIL) { - dbresults(H->link); - while (dbnextrow(H->link) == SUCCESS) { - val = dbdata(H->link, 1); - add_index_string(pdo_dblib_datatypes, *val, dbdata(H->link, 2), 1); - } - } - /* Throw out any remaining resultsets */ - dbcancel(H-link); - } -#endif - - - cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { From 63f242178d33fa22346d2e976b06a76455dbd6ab Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 20:59:20 -0700 Subject: [PATCH 0094/1256] FIX BUG #65219 - Typo correction --- ext/pdo_dblib/dblib_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 13444b89c3db6..daf5494d5839f 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -369,7 +369,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ */ #ifndef DBSETLDBNAME if (vars[3].optval) { - if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; } #endif From fa40290fb76370c923e8f048daf1af144ff87604 Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 21:00:47 -0700 Subject: [PATCH 0095/1256] FIX BUG #65219 - Typo correction --- ext/pdo_dblib/dblib_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 13444b89c3db6..daf5494d5839f 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -369,7 +369,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ */ #ifndef DBSETLDBNAME if (vars[3].optval) { - if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; } #endif From b5a0f128718d93a236b450bb9b409477f0a97888 Mon Sep 17 00:00:00 2001 From: ArunSK Date: Mon, 7 Oct 2013 00:26:49 +0200 Subject: [PATCH 0096/1256] fixing a minor typo in CODING_STANDARDS document --- CODING_STANDARDS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODING_STANDARDS b/CODING_STANDARDS index 7413be453ca6b..5ceacdc4dce55 100644 --- a/CODING_STANDARDS +++ b/CODING_STANDARDS @@ -151,7 +151,7 @@ Naming Conventions 7. Classes should be given descriptive names. Avoid using abbreviations where possible. Each word in the class name should start with a capital letter, - without underscore delimiters (CampelCaps starting with a capital letter). + without underscore delimiters (CamelCaps starting with a capital letter). The class name should be prefixed with the name of the 'parent set' (e.g. the name of the extension):: From 955bc1d91bd772cbb782830220048511b657f063 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Mon, 7 Oct 2013 15:38:48 +0800 Subject: [PATCH 0097/1256] Using SUCCESS and FAILURE for return values Using zend_bool for boolean arguments and return values Reduced one level of zval indirection where possible --- ext/openssl/openssl.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c208d439d6232..d963f86af9ecb 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1672,18 +1672,18 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) +static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; int n; if (!(mdtype = EVP_get_digestbyname(method))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "`%s`: Unknown signature algorithm", method); - return 0; + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + return FAILURE; } else if (!X509_digest(peer, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); - return 0; + return FAILURE; } if (raw) { @@ -1696,7 +1696,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, make_digest_ex(*out, md, n); } - return 1; + return SUCCESS; } static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected) @@ -1705,7 +1705,7 @@ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char * int fingerprint_len; int result = -1; - if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { + if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len) == SUCCESS) { result = strcmp(expected, fingerprint); efree(fingerprint); } @@ -1713,12 +1713,12 @@ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char * return result; } -static int php_x509_fingerprint_match(X509 *peer, zval **val) +static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) { - if (Z_TYPE_PP(val) == IS_STRING) { + if (Z_TYPE_P(val) == IS_STRING) { const char *method = NULL; - switch (Z_STRLEN_PP(val)) { + switch (Z_STRLEN_P(val)) { case 32: method = "md5"; break; @@ -1728,19 +1728,19 @@ static int php_x509_fingerprint_match(X509 *peer, zval **val) break; } - return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_PP(val)) == 0; - } else if (Z_TYPE_PP(val) == IS_ARRAY) { + return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_P(val)) == 0; + } else if (Z_TYPE_P(val) == IS_ARRAY) { HashPosition pos; zval **current; char *key; uint key_len; ulong key_index; - for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(val), &pos); - zend_hash_get_current_data_ex(Z_ARRVAL_PP(val), (void **)¤t, &pos) == SUCCESS; - zend_hash_move_forward_ex(Z_ARRVAL_PP(val), &pos) + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(val), &pos); + zend_hash_get_current_data_ex(Z_ARRVAL_P(val), (void **)¤t, &pos) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL_P(val), &pos) ) { - int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_PP(val), &key, &key_len, &key_index, 0, &pos); + int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(val), &key, &key_len, &key_index, 0, &pos); if (key_type == HASH_KEY_IS_STRING && Z_TYPE_PP(current) == IS_STRING @@ -1776,7 +1776,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len)) { + if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len) == SUCCESS) { RETVAL_STRINGL(fingerprint, fingerprint_len, 0); } else { RETVAL_FALSE; @@ -4989,7 +4989,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre if (GET_VER_OPT("peer_fingerprint")) { if (Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) == IS_ARRAY) { - if (!php_x509_fingerprint_match(peer, val)) { + if (!php_x509_fingerprint_match(peer, *val)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint doesn't match"); return FAILURE; } From 4840b0a749454335218f6131892031333d66142d Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 7 Oct 2013 13:49:10 +0200 Subject: [PATCH 0098/1256] fixed failing tests for ICU >= 51.2 --- ext/intl/tests/bug58756_MessageFormatter.phpt | 5 ++++- ext/intl/tests/collator_asort.phpt | 1 + ext/intl/tests/collator_compare.phpt | 1 + ext/intl/tests/collator_get_sort_key.phpt | 4 +++- ext/intl/tests/collator_sort.phpt | 1 + ext/intl/tests/collator_sort_with_sort_keys.phpt | 1 + ext/intl/tests/dateformat_calendars.phpt | 4 ++-- ext/intl/tests/dateformat_create_cal_arg.phpt | 4 ++-- ext/intl/tests/dateformat_format.phpt | 1 + ext/intl/tests/dateformat_formatObject_calendar.phpt | 4 ++-- ext/intl/tests/dateformat_formatObject_datetime.phpt | 4 ++-- ext/intl/tests/dateformat_format_parse.phpt | 1 + ext/intl/tests/dateformat_get_set_calendar.phpt | 4 ++-- ext/intl/tests/dateformat_get_set_timezone.phpt | 4 ++-- ext/intl/tests/dateformat_set_timezone_id2.phpt | 1 + .../tests/dateformat_timezone_arg_variations.phpt | 4 ++-- ext/intl/tests/formatter_get_locale.phpt | 1 + ext/intl/tests/locale_filter_matches2.phpt | 3 ++- ext/intl/tests/locale_get_display_name2.phpt | 3 ++- ext/intl/tests/locale_get_display_region2.phpt | 3 ++- ext/intl/tests/locale_lookup.phpt | 1 + ext/intl/tests/msgfmt_format_intlcalendar.phpt | 6 +++--- .../tests/resourcebundle_null_mandatory_args.phpt | 8 +++----- .../tests/timezone_getDisplayName_variant2-49+.phpt | 12 +++++------- 24 files changed, 47 insertions(+), 34 deletions(-) diff --git a/ext/intl/tests/bug58756_MessageFormatter.phpt b/ext/intl/tests/bug58756_MessageFormatter.phpt index bbe96b7045a10..18566b666c9c4 100644 --- a/ext/intl/tests/bug58756_MessageFormatter.phpt +++ b/ext/intl/tests/bug58756_MessageFormatter.phpt @@ -4,6 +4,9 @@ Bug #58756: w.r.t MessageFormatter = 0) + die('skip for ICU < 51.2'); +?> --FILE-- format(array($time, 'date')), " ", --EXPECT-- date: Tuesday, July 7, 2009 8:41:13 PM EDT msgf: Tuesday, July 7, 2009 8:41:13 PM EDT -==DONE== \ No newline at end of file +==DONE== diff --git a/ext/intl/tests/collator_asort.phpt b/ext/intl/tests/collator_asort.phpt index a614ddc3f88e2..308f3a3ca3742 100644 --- a/ext/intl/tests/collator_asort.phpt +++ b/ext/intl/tests/collator_asort.phpt @@ -2,6 +2,7 @@ asort() --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 only'; ?> += 4.8 and < 51.2 */ +if (version_compare(INTL_ICU_VERSION, '51.2') >= 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 +locale_filter_matches.phpt() icu >= 4.8 && icu < 51.2 --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 +locale_get_display_name() icu >= 4.8 && icu < 51.2 --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 +locale_get_display_region() icu >= 4.8 && icu < 51.2 --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- format(array($time, 'date')), " ", ==DONE== --EXPECT-- Quinta-feira, 17 de Maio de 2012 5:35:36 p.m. WEST -==DONE== \ No newline at end of file +==DONE== diff --git a/ext/intl/tests/resourcebundle_null_mandatory_args.phpt b/ext/intl/tests/resourcebundle_null_mandatory_args.phpt index 17fab6d630a5e..bbbc1b1e91ce2 100644 --- a/ext/intl/tests/resourcebundle_null_mandatory_args.phpt +++ b/ext/intl/tests/resourcebundle_null_mandatory_args.phpt @@ -3,11 +3,9 @@ ResourceBundle constructor bundle accepts NULL for first two arguments --INI-- date.timezone=Atlantic/Azores --SKIPIF-- -= 4.8 only'); + += 4.8 only'); ?> += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 49) +IntlTimeZone::getDisplayName(): type parameter (ICU >= 49 && ICU < 51.2) --SKIPIF-- - + += 0) die('skip for ICU < 51.2'); ?> --FILE-- Date: Mon, 7 Oct 2013 13:49:55 +0200 Subject: [PATCH 0099/1256] added fixed tests for ICU >= 51.2 --- .../bug58756_MessageFormatter_variant2.phpt | 37 ++ ext/intl/tests/collator_asort_variant2.phpt | 243 ++++++++++ ext/intl/tests/collator_compare_variant2.phpt | 135 ++++++ .../tests/collator_get_sort_key_variant2.phpt | 98 ++++ ext/intl/tests/collator_sort_variant2.phpt | 248 ++++++++++ ...collator_sort_with_sort_keys_variant2.phpt | 190 ++++++++ .../tests/dateformat_calendars_variant2.phpt | 45 ++ .../dateformat_create_cal_arg_variant2.phpt | 53 +++ ...format_formatObject_calendar_variant2.phpt | 40 ++ ...format_formatObject_datetime_variant2.phpt | 33 ++ .../dateformat_format_parse_version2.phpt | 295 ++++++++++++ .../tests/dateformat_format_variant2.phpt | 423 ++++++++++++++++++ .../dateformat_get_set_calendar_variant2.phpt | 55 +++ .../dateformat_get_set_timezone_variant2.phpt | 62 +++ .../tests/dateformat_set_timezone_id3.phpt | 85 ++++ .../dateformat_timezone_arg_variations2.phpt | 45 ++ .../tests/formatter_get_locale_variant2.phpt | 50 +++ ext/intl/tests/locale_filter_matches3.phpt | 366 +++++++++++++++ ext/intl/tests/locale_get_display_name3.phpt | 342 ++++++++++++++ .../tests/locale_get_display_region3.phpt | 275 ++++++++++++ ext/intl/tests/locale_lookup_variant2.phpt | 100 +++++ .../msgfmt_format_intlcalendar_variant2.phpt | 30 ++ ...cebundle_null_mandatory_args_variant2.phpt | 26 ++ .../timezone_getDisplayName_variant4.phpt | 35 ++ 24 files changed, 3311 insertions(+) create mode 100644 ext/intl/tests/bug58756_MessageFormatter_variant2.phpt create mode 100644 ext/intl/tests/collator_asort_variant2.phpt create mode 100644 ext/intl/tests/collator_compare_variant2.phpt create mode 100644 ext/intl/tests/collator_get_sort_key_variant2.phpt create mode 100644 ext/intl/tests/collator_sort_variant2.phpt create mode 100644 ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt create mode 100644 ext/intl/tests/dateformat_calendars_variant2.phpt create mode 100644 ext/intl/tests/dateformat_create_cal_arg_variant2.phpt create mode 100644 ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt create mode 100644 ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt create mode 100644 ext/intl/tests/dateformat_format_parse_version2.phpt create mode 100644 ext/intl/tests/dateformat_format_variant2.phpt create mode 100644 ext/intl/tests/dateformat_get_set_calendar_variant2.phpt create mode 100644 ext/intl/tests/dateformat_get_set_timezone_variant2.phpt create mode 100644 ext/intl/tests/dateformat_set_timezone_id3.phpt create mode 100644 ext/intl/tests/dateformat_timezone_arg_variations2.phpt create mode 100644 ext/intl/tests/formatter_get_locale_variant2.phpt create mode 100644 ext/intl/tests/locale_filter_matches3.phpt create mode 100644 ext/intl/tests/locale_get_display_name3.phpt create mode 100644 ext/intl/tests/locale_get_display_region3.phpt create mode 100644 ext/intl/tests/locale_lookup_variant2.phpt create mode 100644 ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt create mode 100644 ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt create mode 100644 ext/intl/tests/timezone_getDisplayName_variant4.phpt diff --git a/ext/intl/tests/bug58756_MessageFormatter_variant2.phpt b/ext/intl/tests/bug58756_MessageFormatter_variant2.phpt new file mode 100644 index 0000000000000..4fcfdbc08c073 --- /dev/null +++ b/ext/intl/tests/bug58756_MessageFormatter_variant2.phpt @@ -0,0 +1,37 @@ +--TEST-- +Bug #58756: w.r.t MessageFormatter +--SKIPIF-- += 51.2'); +?> +--FILE-- +format(array($time)) . "\n"; + +//NOT FIXED: +/*$msgf = new MessageFormatter('en_US', +'{1, select, date {{0,date,full}} other {{0,time,h:m:s a V}}}'); + +echo "msgf2: ", $msgf->format(array($time, 'date')), " ", + $msgf->format(array($time, 'time')), "\n"; +*/ + +?> +==DONE== +--EXPECT-- +date: Tuesday, July 7, 2009 8:41:13 PM EDT +msgf: Tuesday, July 7, 2009 8:41:13 PM usnyc +==DONE== diff --git a/ext/intl/tests/collator_asort_variant2.phpt b/ext/intl/tests/collator_asort_variant2.phpt new file mode 100644 index 0000000000000..f9dff136083f7 --- /dev/null +++ b/ext/intl/tests/collator_asort_variant2.phpt @@ -0,0 +1,243 @@ +--TEST-- +asort() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 'y' , + 'c' => 'i' , + 'a' => 'k' ), + + array( 'a' => 'a' , + 'b' => 'aaa', + 'c' => 'aa' ), + + array( 'a' => 'a' , + 'aaa'=> 'a' , + 'aa' => 'a' ), + + array( '1' => 'abc', + '5' => '!' , + '2' => null , + '7' => '' ), + + array( '1' => '100', + '2' => '25' , + '3' => '36' ), + + array( '1' => 5 , + '2' => '30' , + '3' => 2 ) + ); + + $res_str .= sort_arrays( 'en_US', $test_params ); + + // Sort an array in SORT_STRING mode using en_US locale. + $test_params = array( + array( '1' => '100', + '2' => '25' , + '3' => '36' ), + + array( '1' => 5 , + '2' => '30' , + '3' => 2 ), + + array( '1' => 'd' , + '2' => '' , + '3' => ' a' ), + + array( '1' => 'y' , + '2' => 'k' , + '3' => 'i' ) + ); + + $res_str .= sort_arrays( 'en_US', $test_params, Collator::SORT_STRING ); + + // Sort a non-ASCII array using ru_RU locale. + $test_params = array( + array( 'п' => 'у', + 'б' => 'в', + 'е' => 'а' ), + + array( '1' => 'п', + '4' => '', + '7' => 'd', + '2' => 'пп' ) + ); + + $res_str .= sort_arrays( 'ru_RU', $test_params ); + + + // Sort an array using Lithuanian locale. + $test_params = array( + array( 'd' => 'y', + 'c' => 'i', + 'a' => 'k' ) + ); + + $res_str .= sort_arrays( 'lt_LT', $test_params ); + + return $res_str . "\n"; +} + +include_once( 'ut_common.inc' ); +ut_run(); +?> +--EXPECT-- +Test 1.162b81ac12878b817fc39063097e45b5: +array ( + 'c' => 'i', + 'a' => 'k', + 'd' => 'y', +) + Result: true + +Test 2.93d96e22f692d8a281b0a389f01f8d1e: +array ( + 'a' => 'a', + 'c' => 'aa', + 'b' => 'aaa', +) + Result: true + +Test 3.9f25de4482bc7b58de508e278113317c: +array ( + 'aa' => 'a', + 'aaa' => 'a', + 'a' => 'a', +) + Result: true + +Test 4.a85a41ea78e45b651080cfd98c0b431d: +array ( + 7 => '', + 2 => NULL, + 5 => '!', + 1 => 'abc', +) + Result: true + +Test 5.99dc71f405b286e03d489061b36e6900: +array ( + 2 => '25', + 3 => '36', + 1 => '100', +) + Result: true + +Test 6.bf5bba243307c9d12934e756ad4be190: +array ( + 3 => 2, + 1 => 5, + 2 => '30', +) + Result: true + +Test 7.e4ee7024c61476e9e7a6c28b5e47df6f: +array ( + 1 => '100', + 2 => '25', + 3 => '36', +) + Result: true + +Test 8.5fa7033dd43784be0db1474eb48b83c8: +array ( + 3 => 2, + 2 => '30', + 1 => 5, +) + Result: true + +Test 9.588cdf4692bc09aa92ffe7e48f9e4579: +array ( + 2 => '', + 3 => ' a', + 1 => 'd', +) + Result: true + +Test 10.be02641a47ebcccd23e4183ca3a415f7: +array ( + 3 => 'i', + 2 => 'k', + 1 => 'y', +) + Result: true + +Test 11.153d9b11d1e5936afc917a94a4e11f34: +array ( + 'е' => 'а', + 'б' => 'в', + 'п' => 'у', +) + Result: true + +Test 12.e1f5cb037b564dce39ffbd0a61562d59: +array ( + 4 => '', + 1 => 'п', + 2 => 'пп', + 7 => 'd', +) + Result: true + +Test 13.8800d48abb960a59002eef77f1d73ae0: +array ( + 'c' => 'i', + 'd' => 'y', + 'a' => 'k', +) + Result: true diff --git a/ext/intl/tests/collator_compare_variant2.phpt b/ext/intl/tests/collator_compare_variant2.phpt new file mode 100644 index 0000000000000..15c725bc4fb5f --- /dev/null +++ b/ext/intl/tests/collator_compare_variant2.phpt @@ -0,0 +1,135 @@ +--TEST-- +compare() +--SKIPIF-- + += 51.2'); ?> +--FILE-- +'; + case -1: // UCOL_LESS + return '<'; + default: + return '?'; + } +} + +/* + * Compare string pairs in the given array + * using specified locale. + */ +function compare_pairs( $locale, $test_array ) +{ + $res_str = ''; + + $coll = ut_coll_create( $locale ); + + foreach( $test_array as $test_strings ) + { + list( $str1, $str2 ) = $test_strings; + + // Compare strings. + $res_val = cmp_to_char( ut_coll_compare( $coll, $str1, $str2 ) ); + + // Concatenate result strings. + $res_str .= dump( $str1 ) . + ' ' . $res_val . ' ' . + dump( $str2 ) . "\n"; + } + + return $res_str; + +} + +function ut_main() +{ + $res_str = ''; + + // Compare strings using en_US locale. + $test_params = array( + array( 'abc', 'abc' ), + array( 'Abc', 'abc' ), + array( 'a' , 'abc' ), + array( 'a' , '' ), + array( '' , '' ), + array( 'a' , 'b' ), + array( 'ab' , 'b' ), + array( 'ab' , 'a' ), + array( 123 , 'abc' ), + array( 'ac' , null ), + array( '.' , '.' ), + // Try to compare long strings. + array( 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcde', + 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdea'), + array( null , null ) + ); + + $res_str .= compare_pairs( 'en_US', $test_params ); + + + // Compare strings using ru_RU locale. + $test_params = array( + array( 'а', 'б' ), + array( 'а', 'аа' ), + array( 'аб', 'ба' ), + array( 'а', ',' ), + array( 'а', 'b' ), + array( 'а', 'bb' ), + array( 'а', 'ab' ), + array( 'а', null ) + ); + + $res_str .= compare_pairs( 'ru_RU', $test_params ); + + + // Compare strings using lt_LT locale. + $test_params = array( + array( 'y', 'k' ) + ); + + $res_str .= compare_pairs( 'lt_LT', $test_params ); + + return $res_str; +} + +include_once( 'ut_common.inc' ); +ut_run(); +?> +--EXPECT-- +'abc' = 'abc' +'Abc' > 'abc' +'a' < 'abc' +'a' > '' +'' = '' +'a' < 'b' +'ab' < 'b' +'ab' > 'a' +123 < 'abc' +'ac' > NULL +'.' = '.' +'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcde' < 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdea' +NULL = NULL +'а' < 'б' +'а' < 'аа' +'аб' < 'ба' +'а' > ',' +'а' < 'b' +'а' < 'bb' +'а' < 'ab' +'а' > NULL +'y' < 'k' diff --git a/ext/intl/tests/collator_get_sort_key_variant2.phpt b/ext/intl/tests/collator_get_sort_key_variant2.phpt new file mode 100644 index 0000000000000..bb09256d6bdae --- /dev/null +++ b/ext/intl/tests/collator_get_sort_key_variant2.phpt @@ -0,0 +1,98 @@ +--TEST-- +collator_get_sort_key() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +source: abc +key: 27292b01070107 +source: abd +key: 27292d01070107 +source: aaa +key: 27272701070107 +source: аа +key: 5c0a0a01060106 +source: а +key: 5c0a01050105 +source: z +key: 5901050105 +source: +key: 0101 +source: +key: 0101 +source: 3 +key: 1801050105 +source: y +key: 5701050105 +source: i +key: 3701050105 +source: k +key: 3b01050105 +source: абг +key: 260a161a01070107 +source: абв +key: 260a161801070107 +source: жжж +key: 263a3a3a01070107 +source: эюя +key: 273b3f4501070107 +source: абг +key: 5c0a161a01070107 +source: абв +key: 5c0a161801070107 +source: жжж +key: 5c3a3a3a01070107 +source: эюя +key: 5d3b3f4501070107 diff --git a/ext/intl/tests/collator_sort_variant2.phpt b/ext/intl/tests/collator_sort_variant2.phpt new file mode 100644 index 0000000000000..29a5082fda409 --- /dev/null +++ b/ext/intl/tests/collator_sort_variant2.phpt @@ -0,0 +1,248 @@ +--TEST-- +sort() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +Test 1.e8f1cd28133d79ecd660002f1c660d0e: +array ( + 0 => 'aaa', + 1 => 'abc', + 2 => 'abd', +) + Result: true + +Test 2.c2ded12173dd2996927378cae37eb275: +array ( + 0 => '_', + 1 => '1', + 2 => 'm', +) + Result: true + +Test 3.54071c968d71cb98c5d379145f8d7d38: +array ( + 0 => 'a', + 1 => 'aa', + 2 => 'aaa', +) + Result: true + +Test 4.19abe63d6f6dfef65b0e3c9ab4826b07: +array ( + 0 => 'ab', + 1 => 'b', + 2 => 'ba', +) + Result: true + +Test 5.9a8dc0a9bc771368c2f1fc3d02754610: +array ( + 0 => 'a', + 1 => 'c', + 2 => 'e', +) + Result: true + +Test 6.ab530b060e5e54a65bfb8b9f8fc61870: +array ( + 0 => '25', + 1 => '36', + 2 => '100', +) + Result: true + +Test 7.0718dd838509017bded2ed307a6e785f: +array ( + 0 => 2, + 1 => 5, + 2 => '30', +) + Result: true + +Test 8.923d65739c5219c634616ffd100a50e4: +array ( + 0 => '', + 1 => ' a', + 2 => 'd', +) + Result: true + +Test 9.289bc2f28e87d3201ec9d7e8477ae1b0: +array ( + 0 => ' a', + 1 => 'd ', + 2 => 'f ', +) + Result: true + +Test 10.de0fd958484f2377a645835d7fbcf124: +array ( + 0 => NULL, + 1 => '3', + 2 => 'a', +) + Result: true + +Test 11.dd2b8f0adb37c45d528cad1a0cc0f361: +array ( + 0 => 'i', + 1 => 'k', + 2 => 'y', +) + Result: true + +Test 12.1e6b4d6f7df9d4580317634ea46d8208: +array ( + 0 => '100', + 1 => '25', + 2 => '36', +) + Result: true + +Test 13.cec115dc9850b98dfbdf102efa09e61b: +array ( + 0 => 2, + 1 => '30', + 2 => 5, +) + Result: true + +Test 14.923d65739c5219c634616ffd100a50e4: +array ( + 0 => '', + 1 => ' a', + 2 => 'd', +) + Result: true + +Test 15.dd2b8f0adb37c45d528cad1a0cc0f361: +array ( + 0 => 'i', + 1 => 'k', + 2 => 'y', +) + Result: true + +Test 16.49056308afb2b800363c5baa735ed247: +array ( + 0 => 'ааа', + 1 => 'абв', + 2 => 'абг', + 3 => 'abc', +) + Result: true + +Test 17.91480b10473a0c96a4cd6d88c23c577a: +array ( + 0 => 'а', + 1 => 'аа', + 2 => 'ааа', +) + Result: true + +Test 18.fdd3fe3981476039164aa000bf9177f2: +array ( + 0 => 'i', + 1 => 'y', + 2 => 'k', +) + Result: true diff --git a/ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt b/ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt new file mode 100644 index 0000000000000..5257f8a6ffa07 --- /dev/null +++ b/ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt @@ -0,0 +1,190 @@ +--TEST-- +sort_with_sort_keys() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +Test 1.e8f1cd28133d79ecd660002f1c660d0e: +array ( + 0 => 'aaa', + 1 => 'abc', + 2 => 'abd', +) + Result: true + +Test 2.c2ded12173dd2996927378cae37eb275: +array ( + 0 => '_', + 1 => '1', + 2 => 'm', +) + Result: true + +Test 3.54071c968d71cb98c5d379145f8d7d38: +array ( + 0 => 'a', + 1 => 'aa', + 2 => 'aaa', +) + Result: true + +Test 4.19abe63d6f6dfef65b0e3c9ab4826b07: +array ( + 0 => 'ab', + 1 => 'b', + 2 => 'ba', +) + Result: true + +Test 5.9a8dc0a9bc771368c2f1fc3d02754610: +array ( + 0 => 'a', + 1 => 'c', + 2 => 'e', +) + Result: true + +Test 6.923d65739c5219c634616ffd100a50e4: +array ( + 0 => '', + 1 => ' a', + 2 => 'd', +) + Result: true + +Test 7.289bc2f28e87d3201ec9d7e8477ae1b0: +array ( + 0 => ' a', + 1 => 'd ', + 2 => 'f ', +) + Result: true + +Test 8.de0fd958484f2377a645835d7fbcf124: +array ( + 0 => NULL, + 1 => '3', + 2 => 'a', +) + Result: true + +Test 9.dd2b8f0adb37c45d528cad1a0cc0f361: +array ( + 0 => 'i', + 1 => 'k', + 2 => 'y', +) + Result: true + +Test 10.49056308afb2b800363c5baa735ed247: +array ( + 0 => 'ааа', + 1 => 'абв', + 2 => 'абг', + 3 => 'abc', +) + Result: true + +Test 11.91480b10473a0c96a4cd6d88c23c577a: +array ( + 0 => 'а', + 1 => 'аа', + 2 => 'ааа', +) + Result: true + +Test 12.fdd3fe3981476039164aa000bf9177f2: +array ( + 0 => 'i', + 1 => 'y', + 2 => 'k', +) + Result: true diff --git a/ext/intl/tests/dateformat_calendars_variant2.phpt b/ext/intl/tests/dateformat_calendars_variant2.phpt new file mode 100644 index 0000000000000..61cdea840836c --- /dev/null +++ b/ext/intl/tests/dateformat_calendars_variant2.phpt @@ -0,0 +1,45 @@ +--TEST-- +IntlDateFormatter, calendars and time zone +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format(strtotime('2012-01-01 00:00:00 +0000'))); +var_dump($fmt2->format(strtotime('2012-01-01 00:00:00 +0000'))); +var_dump($fmt3->format(strtotime('2012-01-01 00:00:00 +0000'))); + +new IntlDateFormatter('en_US@calendar=hebrew', + IntlDateFormatter::FULL, + IntlDateFormatter::FULL, + 'GMT+05:12', + -1); +?> +==DONE== +--EXPECTF-- +string(47) "Sunday, January 1, 2012 at 5:12:00 AM GMT+05:12" +string(47) "Sunday, January 1, 2012 at 5:12:00 AM GMT+05:12" +string(48) "Sunday, Tevet 6, 5772 AM at 5:12:00 AM GMT+05:12" + +Warning: IntlDateFormatter::__construct(): datefmt_create: invalid value for calendar type; it must be one of IntlDateFormatter::TRADITIONAL (locale's default calendar) or IntlDateFormatter::GREGORIAN. Alternatively, it can be an IntlCalendar object in %sdateformat_calendars_variant2.php on line %d +==DONE== diff --git a/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt b/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt new file mode 100644 index 0000000000000..70b862017bbbf --- /dev/null +++ b/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt @@ -0,0 +1,53 @@ +--TEST-- +IntlDateFormatter: several forms of the calendar arg +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; + +$cal = IntlCalendar::createInstance('UTC', 'en@calendar=islamic'); +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, $cal); +echo $df->format($ts), "\n"; + +//override calendar's timezone +$cal = new IntlGregorianCalendar('UTC', NULL); +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Madrid', $cal); +echo $df->format($ts), "\n"; + +//default calendar is gregorian +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0); +echo $df->format($ts), "\n"; + +//try now with traditional +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0, NULL, IntlDateFormatter::TRADITIONAL); +echo $df->format($ts), "\n"; + +//the timezone can be overridden when not specifying a calendar +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0, 'UTC', IntlDateFormatter::TRADITIONAL); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'UTC', 0); +echo $df->format($ts), "\n"; + +?> +==DONE== +--EXPECTF-- +domingo%S 1 de enero de 2012 00:00:00 GMT +domingo%S 8 de Safar de 1433 00:00:00 GMT +domingo%S 1 de enero de 2012 01:00:00 Hora estándar de Europa central +sábado%S 31 de diciembre de 2011 d.C. 23:00:00 Hora %Sde las Azores +sábado%S 7 de Safar de 1433 AH 23:00:00 Hora %Sde las Azores +domingo%S 8 de Safar de 1433 AH 00:00:00 GMT +domingo%S 1 de enero de 2012 00:00:00 GMT +==DONE== diff --git a/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt b/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt new file mode 100644 index 0000000000000..1ec1fa669a1a0 --- /dev/null +++ b/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt @@ -0,0 +1,40 @@ +--TEST-- +IntlDateFormatter::formatObject(): IntlCalendar tests +--SKIPIF-- + += 51.2'); ?> +--FILE-- +setTime(strtotime('2012-01-01 00:00:00')*1000.); +echo IntlDateFormatter::formatObject($cal), "\n"; +echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL, "en-US"), "\n"; + +?> +==DONE== + +--EXPECTF-- +01/01/2012, 00:00:00 +Domingo, 1 de Janeiro de 2012 às 00:00:00 Hora %Sda Europa Ocidental +Jan 1, 2012, 12:00:00 AM +1/1/12, 12:00:00 AM Western European Standard %STime +Sun 2012-01-1 00,00,00.000 Portugal Time +Domingo, 1 de Janeiro de 2012 às 05:00:00 GMT+03:00 +06/02/1433, 00:00:00 +Sunday, Safar 6, 1433 at 12:00:00 AM Western European Standard Time +==DONE== diff --git a/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt b/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt new file mode 100644 index 0000000000000..2ca9ffd7e8e41 --- /dev/null +++ b/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt @@ -0,0 +1,33 @@ +--TEST-- +IntlDateFormatter::formatObject(): DateTime tests +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +==DONE== + +--EXPECTF-- +01/01/2012, 00:00:00 +Domingo, 1 de Janeiro de 2012 às 00:00:00 Hora %Sda Europa Ocidental +Jan 1, 2012, 12:00:00 AM +1/1/12, 12:00:00 AM Western European Standard %STime +Sun 2012-01-1 00,00,00.000 Portugal Time +Domingo, 1 de Janeiro de 2012 às 05:00:00 GMT+03:00 +==DONE== diff --git a/ext/intl/tests/dateformat_format_parse_version2.phpt b/ext/intl/tests/dateformat_format_parse_version2.phpt new file mode 100644 index 0000000000000..8c6f00ef54e93 --- /dev/null +++ b/ext/intl/tests/dateformat_format_parse_version2.phpt @@ -0,0 +1,295 @@ +--TEST-- +datefmt_format_code() and datefmt_parse_code() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 24 , + 'tm_min' => 3, + 'tm_hour' => 19, + 'tm_mday' => 3, + 'tm_mon' => 3, + 'tm_year' => 105, + ); + $localtime_arr2 = array ( + 'tm_sec' => 21, + 'tm_min' => 5, + 'tm_hour' => 7, + 'tm_mday' => 13, + 'tm_mon' => 7, + 'tm_year' => 205, + ); + $localtime_arr3 = array ( + 'tm_sec' => 11, + 'tm_min' => 13, + 'tm_hour' => 0, + 'tm_mday' => 17, + 'tm_mon' => 11, + 'tm_year' => -5 + ); + + $localtime_arr = array ( + $localtime_arr1, + $localtime_arr2, + $localtime_arr3 + ); + + //Test format and parse with a timestamp : long + foreach( $time_arr as $timestamp_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput timestamp is : $timestamp_entry"; + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry,$timezone); + $formatted = ut_datefmt_format( $fmt , $timestamp_entry); + $res_str .= "\nFormatted timestamp is : $formatted"; + $parsed = ut_datefmt_parse( $fmt , $formatted); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nParsed timestamp is : $parsed"; + }else{ + $res_str .= "\nError while parsing as: '".intl_get_error_message()."'"; + } + } + } + } + + //Test format and parse with a localtime :array + foreach( $localtime_arr as $localtime_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput localtime is : "; + foreach( $localtime_entry as $key => $value){ + $res_str .= "$key : '$value' , "; + } + + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry,$timezone); + $formatted1 = ut_datefmt_format( $fmt , $localtime_entry); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nFormatted localtime_array is : $formatted1"; + }else{ + $res_str .= "\nError while formatting as: '".intl_get_error_message()."'"; + } + //Parsing + $parsed_arr = ut_datefmt_localtime( $fmt, $formatted1 ); + + if( $parsed_arr){ + $res_str .= "\nParsed array is: "; + foreach( $parsed_arr as $key => $value){ + $res_str .= "$key : '$value' , "; + } + } +/* + else{ + //$res_str .= "No values found from LocaleTime parsing."; + $res_str .= "\tError : '".intl_get_error_message()."'"; + } +*/ + } + } + } + + return $res_str; + +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); +?> +--EXPECT-- +------------ + +Input timestamp is : 0 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 1, 1970 at 5:00:00 AM GMT+05:00 +Parsed timestamp is : 0 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 1, 1970 at 5:00:00 AM GMT+5 +Parsed timestamp is : 0 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 1, 1970, 5:00:00 AM +Parsed timestamp is : 0 +------------ + +Input timestamp is : -1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, December 18, 1969 at 7:40:00 AM GMT+05:00 +Parsed timestamp is : -1200000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 18, 1969 at 7:40:00 AM GMT+5 +Parsed timestamp is : -1200000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 18, 1969, 7:40:00 AM +Parsed timestamp is : -1200000 +------------ + +Input timestamp is : 1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 15, 1970 at 2:20:00 AM GMT+05:00 +Parsed timestamp is : 1200000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 15, 1970 at 2:20:00 AM GMT+5 +Parsed timestamp is : 1200000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 15, 1970, 2:20:00 AM +Parsed timestamp is : 1200000 +------------ + +Input timestamp is : 2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Monday, September 19, 2039 at 4:06:40 AM GMT+05:00 +Parsed timestamp is : 2200000000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : September 19, 2039 at 4:06:40 AM GMT+5 +Parsed timestamp is : 2200000000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Sep 19, 2039, 4:06:40 AM +Parsed timestamp is : 2200000000 +------------ + +Input timestamp is : -2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Sunday, April 15, 1900 at 5:53:20 AM GMT+05:00 +Parsed timestamp is : -2200000000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : April 15, 1900 at 5:53:20 AM GMT+5 +Parsed timestamp is : -2200000000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Apr 15, 1900, 5:53:20 AM +Parsed timestamp is : -2200000000 +------------ + +Input timestamp is : 90099999 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, November 9, 1972 at 12:46:39 AM GMT+05:00 +Parsed timestamp is : 90099999 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : November 9, 1972 at 12:46:39 AM GMT+5 +Parsed timestamp is : 90099999 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Nov 9, 1972, 12:46:39 AM +Parsed timestamp is : 90099999 +------------ + +Input timestamp is : 3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 1, 1970 at 6:00:00 AM GMT+05:00 +Parsed timestamp is : 3600 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 1, 1970 at 6:00:00 AM GMT+5 +Parsed timestamp is : 3600 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 1, 1970, 6:00:00 AM +Parsed timestamp is : 3600 +------------ + +Input timestamp is : -3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 1, 1970 at 4:00:00 AM GMT+05:00 +Parsed timestamp is : -3600 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 1, 1970 at 4:00:00 AM GMT+5 +Parsed timestamp is : -3600 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 1, 1970, 4:00:00 AM +Parsed timestamp is : -3600 +------------ + +Input localtime is : tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_mday : '3' , tm_mon : '3' , tm_year : '105' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Sunday, April 3, 2005 at 7:03:24 PM GMT+05:00 +Parsed array is: tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_year : '105' , tm_mday : '3' , tm_wday : '0' , tm_yday : '93' , tm_mon : '3' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : April 3, 2005 at 7:03:24 PM GMT+5 +Parsed array is: tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_year : '105' , tm_mday : '3' , tm_wday : '0' , tm_yday : '93' , tm_mon : '3' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Apr 3, 2005, 7:03:24 PM +Parsed array is: tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_year : '105' , tm_mday : '3' , tm_wday : '0' , tm_yday : '93' , tm_mon : '3' , tm_isdst : '0' , +------------ + +Input localtime is : tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_mday : '13' , tm_mon : '7' , tm_year : '205' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Thursday, August 13, 2105 at 7:05:21 AM GMT+05:00 +Parsed array is: tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_year : '205' , tm_mday : '13' , tm_wday : '4' , tm_yday : '225' , tm_mon : '7' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : August 13, 2105 at 7:05:21 AM GMT+5 +Parsed array is: tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_year : '205' , tm_mday : '13' , tm_wday : '4' , tm_yday : '225' , tm_mon : '7' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Aug 13, 2105, 7:05:21 AM +Parsed array is: tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_year : '205' , tm_mday : '13' , tm_wday : '4' , tm_yday : '225' , tm_mon : '7' , tm_isdst : '0' , +------------ + +Input localtime is : tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_mday : '17' , tm_mon : '11' , tm_year : '-5' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Tuesday, December 17, 1895 at 12:13:11 AM GMT+05:00 +Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : December 17, 1895 at 12:13:11 AM GMT+5 +Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Dec 17, 1895, 12:13:11 AM +Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , diff --git a/ext/intl/tests/dateformat_format_variant2.phpt b/ext/intl/tests/dateformat_format_variant2.phpt new file mode 100644 index 0000000000000..7c5bcfcfd43f5 --- /dev/null +++ b/ext/intl/tests/dateformat_format_variant2.phpt @@ -0,0 +1,423 @@ +--TEST-- +datefmt_format_code() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 24 , + 'tm_min' => 3, + 'tm_hour' => 19, + 'tm_mday' => 3, + 'tm_mon' => 3, + 'tm_year' => 105, + ); + $localtime_arr2 = array ( + 'tm_sec' => 21, + 'tm_min' => 5, + 'tm_hour' => 7, + 'tm_mday' => 13, + 'tm_mon' => 4, + 'tm_year' => 205, + ); + $localtime_arr3 = array ( + 'tm_sec' => 11, + 'tm_min' => 13, + 'tm_hour' => 0, + 'tm_mday' => 17, + 'tm_mon' => 11, + 'tm_year' => -5 + ); + + $localtime_arr = array ( + $localtime_arr1, + $localtime_arr2, + $localtime_arr3 + ); + + $d1 = new DateTime("2010-01-01 01:02:03", new DateTimeZone("UTC")); + $d2 = new DateTime("2000-12-31 03:04:05", new DateTimeZone("UTC")); + $d2->setTimezone(new DateTimeZone("PDT")); + $dates = array( + $d1, + $d2, + new StdClass(), + ); + + //Test format with input as a timestamp : integer + foreach( $time_arr as $timestamp_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput timestamp is : $timestamp_entry"; + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) + { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry, $timezone, IntlDateFormatter::GREGORIAN); + $formatted = ut_datefmt_format( $fmt , $timestamp_entry); + $res_str .= "\nFormatted timestamp is : $formatted"; + } + } + } + + //Test format with input as a localtime :array + foreach( $localtime_arr as $localtime_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput localtime is : "; + foreach( $localtime_entry as $key => $value){ + $res_str .= "$key : '$value' , "; + } + + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) + { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry, $timezone, IntlDateFormatter::GREGORIAN ); + $formatted1 = ut_datefmt_format( $fmt , $localtime_entry); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nFormatted localtime_array is : $formatted1"; + }else{ + $res_str .= "\nError while formatting as: '".intl_get_error_message()."'"; + } + } + } + } + + foreach($dates as $date_entry) { + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) { + $res_str .= "\n------------"; + $res_str .= "\nDate is: ".var_export($date_entry, true); + $res_str .= "\n------------"; + + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry, $timezone, IntlDateFormatter::GREGORIAN ); + $formatted1 = ut_datefmt_format( $fmt , $date_entry); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nFormatted DateTime is : $formatted1"; + }else{ + $res_str .= "\nError while formatting as: '".intl_get_error_message()."'"; + } + } + } + } + + return $res_str; + +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); +?> +--EXPECT-- +------------ + +Input timestamp is : 0 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 31, 1969 at 2:00:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 31, 1969 at 2:00:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 31, 1969, 2:00:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/31/69, 2:00 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691231 02:00 PM +------------ + +Input timestamp is : -1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 17, 1969 at 4:40:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 17, 1969 at 4:40:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 17, 1969, 4:40:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/17/69, 4:40 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691217 04:40 PM +------------ + +Input timestamp is : 1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, January 14, 1970 at 11:20:00 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 14, 1970 at 11:20:00 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 14, 1970, 11:20:00 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 1/14/70, 11:20 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19700114 11:20 AM +------------ + +Input timestamp is : 2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Sunday, September 18, 2039 at 1:06:40 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : September 18, 2039 at 1:06:40 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Sep 18, 2039, 1:06:40 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 9/18/39, 1:06 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 20390918 01:06 PM +------------ + +Input timestamp is : -2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Saturday, April 14, 1900 at 2:53:20 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : April 14, 1900 at 2:53:20 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Apr 14, 1900, 2:53:20 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 4/14/00, 2:53 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19000414 02:53 PM +------------ + +Input timestamp is : 90099999 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, November 8, 1972 at 9:46:39 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : November 8, 1972 at 9:46:39 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Nov 8, 1972, 9:46:39 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 11/8/72, 9:46 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19721108 09:46 AM +------------ + +Input timestamp is : 3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 31, 1969 at 3:00:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 31, 1969 at 3:00:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 31, 1969, 3:00:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/31/69, 3:00 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691231 03:00 PM +------------ + +Input timestamp is : -3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 31, 1969 at 1:00:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 31, 1969 at 1:00:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 31, 1969, 1:00:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/31/69, 1:00 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691231 01:00 PM +------------ + +Input localtime is : tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_mday : '3' , tm_mon : '3' , tm_year : '105' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Sunday, April 3, 2005 at 7:03:24 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : April 3, 2005 at 7:03:24 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Apr 3, 2005, 7:03:24 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted localtime_array is : 4/3/05, 7:03 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted localtime_array is : 20050403 07:03 PM +------------ + +Input localtime is : tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_mday : '13' , tm_mon : '4' , tm_year : '205' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Wednesday, May 13, 2105 at 7:05:21 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : May 13, 2105 at 7:05:21 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : May 13, 2105, 7:05:21 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted localtime_array is : 5/13/05, 7:05 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted localtime_array is : 21050513 07:05 AM +------------ + +Input localtime is : tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_mday : '17' , tm_mon : '11' , tm_year : '-5' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Tuesday, December 17, 1895 at 12:13:11 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : December 17, 1895 at 12:13:11 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Dec 17, 1895, 12:13:11 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted localtime_array is : 12/17/95, 12:13 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted localtime_array is : 18951217 12:13 AM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : Thursday, December 31, 2009 at 3:02:03 PM GMT-10:00 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : December 31, 2009 at 3:02:03 PM GMT-10 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : Dec 31, 2009, 3:02:03 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : 12/31/09, 3:02 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : 20091231 03:02 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : Saturday, December 30, 2000 at 5:04:05 PM GMT-10:00 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : December 30, 2000 at 5:04:05 PM GMT-10 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : Dec 30, 2000, 5:04:05 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : 12/30/00, 5:04 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : 20001230 05:04 PM +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' diff --git a/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt b/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt new file mode 100644 index 0000000000000..1c5169e65dddd --- /dev/null +++ b/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt @@ -0,0 +1,55 @@ +--TEST-- +IntlDateFormatter: setCalendar()/getCalendar()/getCalendarObject() +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; +var_dump($df->getCalendar(), +$df->getCalendarObject()->getType(), +$df->getCalendarObject()->getTimeZone()->getId()); +echo "\n"; +} + +$df = new IntlDateFormatter('fr@calendar=islamic', 0, 0, 'Europe/Minsk'); +d($df); + + +//changing the calendar with a cal type should not change tz +$df->setCalendar(IntlDateFormatter::TRADITIONAL); +d($df); + +//but changing with an actual calendar should +$cal = IntlCalendar::createInstance("UTC"); +$df->setCalendar($cal); +d($df); + +?> +==DONE== +--EXPECT-- +dimanche 1 janvier 2012 ap. J.-C. 03:00:00 UTC+03:00 +int(1) +string(9) "gregorian" +string(12) "Europe/Minsk" + +dimanche 8 safar 1433 AH 03:00:00 UTC+03:00 +int(0) +string(7) "islamic" +string(12) "Europe/Minsk" + +dimanche 1 janvier 2012 ap. J.-C. 00:00:00 UTC +bool(false) +string(9) "gregorian" +string(3) "UTC" + +==DONE== diff --git a/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt b/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt new file mode 100644 index 0000000000000..af9ddf29a46f6 --- /dev/null +++ b/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt @@ -0,0 +1,62 @@ +--TEST-- +IntlDateFormatter: get/setTimeZone() +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; +var_dump( +$df->getTimeZoneID(), +$df->getTimeZone()->getID()); +echo "\n"; +} + +$df = new IntlDateFormatter('pt_PT', 0, 0, 'Europe/Minsk'); +d($df); + +$df->setTimeZone(NULL); +d($df); + +$df->setTimeZone('Europe/Madrid'); +d($df); + +$df->setTimeZone(IntlTimeZone::createTimeZone('Europe/Paris')); +d($df); + +$df->setTimeZone(new DateTimeZone('Europe/Amsterdam')); +d($df); + +?> +==DONE== +--EXPECTF-- +Domingo, 1 de Janeiro de 2012 às 03:00:00 GMT+03:00 +string(12) "Europe/Minsk" +string(12) "Europe/Minsk" + +Sábado, 31 de Dezembro de 2011 às 23:00:00 Hor%s %Sdos Açores +string(15) "Atlantic/Azores" +string(15) "Atlantic/Azores" + +Domingo, 1 de Janeiro de 2012 às 01:00:00 Hor%s %Sda Europa Central +string(13) "Europe/Madrid" +string(13) "Europe/Madrid" + +Domingo, 1 de Janeiro de 2012 às 01:00:00 Hor%s %Sda Europa Central +string(12) "Europe/Paris" +string(12) "Europe/Paris" + +Domingo, 1 de Janeiro de 2012 às 01:00:00 Hor%s %Sda Europa Central +string(16) "Europe/Amsterdam" +string(16) "Europe/Amsterdam" + +==DONE== diff --git a/ext/intl/tests/dateformat_set_timezone_id3.phpt b/ext/intl/tests/dateformat_set_timezone_id3.phpt new file mode 100644 index 0000000000000..b3968f9ac01cc --- /dev/null +++ b/ext/intl/tests/dateformat_set_timezone_id3.phpt @@ -0,0 +1,85 @@ +--TEST-- +datefmt_set_timezone_id_code() icu >= 4.8 +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECTF-- +Warning: IntlDateFormatter::setTimeZoneId(): datefmt_set_timezone: no such time zone: 'CN' in %sut_common.inc on line %d + +Warning: datefmt_set_timezone_id(): datefmt_set_timezone: no such time zone: 'CN' in %sut_common.inc on line %d + +After creation of the dateformatter : timezone_id= US/Pacific +----------- +Trying to set timezone_id= America/New_York +After call to set_timezone_id : timezone_id= America/New_York +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 7:00:00 PM Eastern Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 8:00:00 PM Eastern Standard Time +----------- +Trying to set timezone_id= America/Los_Angeles +After call to set_timezone_id : timezone_id= America/Los_Angeles +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 4:00:00 PM Pacific Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 5:00:00 PM Pacific Standard Time +----------- +Trying to set timezone_id= America/Chicago +After call to set_timezone_id : timezone_id= America/Chicago +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 6:00:00 PM Central Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 7:00:00 PM Central Standard Time +----------- +Trying to set timezone_id= CN +After call to set_timezone_id : timezone_id= America/Chicago +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 6:00:00 PM Central Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 7:00:00 PM Central Standard Time diff --git a/ext/intl/tests/dateformat_timezone_arg_variations2.phpt b/ext/intl/tests/dateformat_timezone_arg_variations2.phpt new file mode 100644 index 0000000000000..a957963a440e6 --- /dev/null +++ b/ext/intl/tests/dateformat_timezone_arg_variations2.phpt @@ -0,0 +1,45 @@ +--TEST-- +IntlDateFormatter: several forms of the timezone arg +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam'); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, new DateTimeZone('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, IntlTimeZone::createTimeZone('America/New_York')); +echo $df->format($ts), "\n"; + +//time zone has priority +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam', new IntlGregorianCalendar('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +//calendar has priority +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, new IntlGregorianCalendar('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam', 0); +echo $df->format($ts), "\n"; + +--EXPECTF-- +sábado%S, 31 de diciembre de 2011 23:00:00 Hora estándar de las Azores +domingo%S, 1 de enero de 2012 01:00:00 Hora estándar de Europa central +domingo%S, 1 de enero de 2012 00:00:00 Hora%S de Europa occidental +sábado%S, 31 de diciembre de 2011 19:00:00 Hora estándar oriental +domingo%S, 1 de enero de 2012 01:00:00 Hora estándar de Europa central +domingo%S, 1 de enero de 2012 00:00:00 Hora%S de Europa occidental +domingo%S, 1 de enero de 2012 01:00:00 Hora estándar de Europa central diff --git a/ext/intl/tests/formatter_get_locale_variant2.phpt b/ext/intl/tests/formatter_get_locale_variant2.phpt new file mode 100644 index 0000000000000..9d25d1cf902de --- /dev/null +++ b/ext/intl/tests/formatter_get_locale_variant2.phpt @@ -0,0 +1,50 @@ +--TEST-- +numfmt_get_locale() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 'actual', + Locale::VALID_LOCALE => 'valid', + ); + + $res_str = ''; + + foreach( $locales as $locale ) + { + $fmt = ut_nfmt_create( $locale, NumberFormatter::DECIMAL ); + $res_str .= "$locale: "; + foreach( $loc_types as $loc_type => $loc_type_name ) + $res_str .= sprintf( " %s=%s", + $loc_type_name, + dump( ut_nfmt_get_locale( $fmt, $loc_type ) ) ); + $res_str .= "\n"; + } + + return $res_str; +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); +?> +--EXPECT-- +en_UK: actual='en' valid='en' +en_US@California: actual='en' valid='en' +fr_CA: actual='fr' valid='fr_CA' diff --git a/ext/intl/tests/locale_filter_matches3.phpt b/ext/intl/tests/locale_filter_matches3.phpt new file mode 100644 index 0000000000000..4c1d4d3898ec9 --- /dev/null +++ b/ext/intl/tests/locale_filter_matches3.phpt @@ -0,0 +1,366 @@ +--TEST-- +locale_filter_matches.phpt() ICU >= 51.2 +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +-------------- +loc_range:de-de matches lang_tag de-DEVA ? NO +loc_range:de_DE canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:de-de matches lang_tag de-DE-1996 ? YES +loc_range:de_DE canonically matches lang_tag de_DE_1996 ? YES +-------------- +loc_range:de-de matches lang_tag de-DE ? YES +loc_range:de_DE canonically matches lang_tag de_DE ? YES +-------------- +loc_range:de-de matches lang_tag zh_Hans ? NO +loc_range:de_DE canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:de-de matches lang_tag de-CH-1996 ? NO +loc_range:de_DE canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT ? NO +loc_range:de_DE canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO +loc_range:de_DE canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT_rozaj ? NO +loc_range:de_DE canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +loc_range:de_DE canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +-------------- +loc_range:de-de matches lang_tag i-enochian ? NO +loc_range:de_DE canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:de-de matches lang_tag sgn-CH-de ? NO +loc_range:de_DE canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:de-de matches lang_tag art-lojban ? NO +loc_range:de_DE canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:de-de matches lang_tag i-lux ? NO +loc_range:de_DE canonically matches lang_tag lb ? NO +-------------- +loc_range:de-de matches lang_tag art-lojban ? NO +loc_range:de_DE canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:de-de matches lang_tag jbo ? NO +loc_range:de_DE canonically matches lang_tag jbo ? NO +-------------- +loc_range:de-de matches lang_tag en_sl_IT ? NO +loc_range:de_DE canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DEVA ? NO +loc_range:sl_IT canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE ? NO +loc_range:sl_IT canonically matches lang_tag de_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag zh_Hans ? NO +loc_range:sl_IT canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:sl_IT matches lang_tag de-CH-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag sl_IT ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_rozaj ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_ROZAJ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +-------------- +loc_range:sl_IT matches lang_tag i-enochian ? NO +loc_range:sl_IT canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:sl_IT matches lang_tag sgn-CH-de ? NO +loc_range:sl_IT canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag i-lux ? NO +loc_range:sl_IT canonically matches lang_tag lb ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag jbo ? NO +loc_range:sl_IT canonically matches lang_tag jbo ? NO +-------------- +loc_range:sl_IT matches lang_tag en_sl_IT ? NO +loc_range:sl_IT canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-DEVA ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-DE-1996 ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-DE ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_DE ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag zh_Hans ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-CH-1996 ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT_rozaj ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +-------------- +loc_range:sl_IT_Nedis matches lang_tag i-enochian ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sgn-CH-de ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag art-lojban ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag i-lux ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag lb ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag art-lojban ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag jbo ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag jbo ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag en_sl_IT ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:jbo matches lang_tag de-DEVA ? NO +loc_range:jbo canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:jbo matches lang_tag de-DE-1996 ? NO +loc_range:jbo canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:jbo matches lang_tag de-DE ? NO +loc_range:jbo canonically matches lang_tag de_DE ? NO +-------------- +loc_range:jbo matches lang_tag zh_Hans ? NO +loc_range:jbo canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:jbo matches lang_tag de-CH-1996 ? NO +loc_range:jbo canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT ? NO +loc_range:jbo canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO +loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT_rozaj ? NO +loc_range:jbo canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +-------------- +loc_range:jbo matches lang_tag i-enochian ? NO +loc_range:jbo canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:jbo matches lang_tag sgn-CH-de ? NO +loc_range:jbo canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:jbo matches lang_tag art-lojban ? NO +loc_range:jbo canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:jbo matches lang_tag i-lux ? NO +loc_range:jbo canonically matches lang_tag lb ? NO +-------------- +loc_range:jbo matches lang_tag art-lojban ? NO +loc_range:jbo canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:jbo matches lang_tag jbo ? YES +loc_range:jbo canonically matches lang_tag jbo ? YES +-------------- +loc_range:jbo matches lang_tag en_sl_IT ? NO +loc_range:jbo canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:art-lojban matches lang_tag de-DEVA ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:art-lojban matches lang_tag de-DE-1996 ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:art-lojban matches lang_tag de-DE ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_DE ? NO +-------------- +loc_range:art-lojban matches lang_tag zh_Hans ? NO +loc_range:art__LOJBAN canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:art-lojban matches lang_tag de-CH-1996 ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT_rozaj ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +-------------- +loc_range:art-lojban matches lang_tag i-enochian ? NO +loc_range:art__LOJBAN canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:art-lojban matches lang_tag sgn-CH-de ? NO +loc_range:art__LOJBAN canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:art-lojban matches lang_tag art-lojban ? YES +loc_range:art__LOJBAN canonically matches lang_tag art__LOJBAN ? YES +-------------- +loc_range:art-lojban matches lang_tag i-lux ? NO +loc_range:art__LOJBAN canonically matches lang_tag lb ? NO +-------------- +loc_range:art-lojban matches lang_tag art-lojban ? YES +loc_range:art__LOJBAN canonically matches lang_tag art__LOJBAN ? YES +-------------- +loc_range:art-lojban matches lang_tag jbo ? NO +loc_range:art__LOJBAN canonically matches lang_tag jbo ? NO +-------------- +loc_range:art-lojban matches lang_tag en_sl_IT ? NO +loc_range:art__LOJBAN canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DEVA ? NO +loc_range:sl_IT canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE ? NO +loc_range:sl_IT canonically matches lang_tag de_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag zh_Hans ? NO +loc_range:sl_IT canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:sl_IT matches lang_tag de-CH-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag sl_IT ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_rozaj ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_ROZAJ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +-------------- +loc_range:sl_IT matches lang_tag i-enochian ? NO +loc_range:sl_IT canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:sl_IT matches lang_tag sgn-CH-de ? NO +loc_range:sl_IT canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag i-lux ? NO +loc_range:sl_IT canonically matches lang_tag lb ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag jbo ? NO +loc_range:sl_IT canonically matches lang_tag jbo ? NO +-------------- +loc_range:sl_IT matches lang_tag en_sl_IT ? NO +loc_range:sl_IT canonically matches lang_tag en_SL_IT ? NO diff --git a/ext/intl/tests/locale_get_display_name3.phpt b/ext/intl/tests/locale_get_display_name3.phpt new file mode 100644 index 0000000000000..3f3d26fcfa1bb --- /dev/null +++ b/ext/intl/tests/locale_get_display_name3.phpt @@ -0,0 +1,342 @@ +--TEST-- +locale_get_display_name() icu >= 51.2 +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECTREGEX-- +locale='sl_IT_nedis_KIRTI' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_KIRTI# +disp_locale=fr : display_name=slovène #Italie, NEDIS_KIRTI# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_KIRTI# +----------------- +locale='sl_IT_nedis-a-kirti-x-xyz' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_A_KIRTI_X_XYZ# +disp_locale=fr : display_name=slovène #Italie, NEDIS_A_KIRTI_X_XYZ# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_A_KIRTI_X_XYZ# +----------------- +locale='sl_IT_rozaj' +disp_locale=en : display_name=Slovenian #Italy, Resian# +disp_locale=fr : display_name=slovène #Italie, dialecte de Resia# +disp_locale=de : display_name=Slowenisch #Italien, (ROZAJ|Resianisch)# +----------------- +locale='sl_IT_NEDIS_ROJAZ_1901' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_ROJAZ_1901# +disp_locale=fr : display_name=slovène #Italie, NEDIS_ROJAZ_1901# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_ROJAZ_1901# +----------------- +locale='i-enochian' +disp_locale=en : display_name=i-enochian #Private-Use=i-enochian# +disp_locale=fr : display_name=i-enochian #Usage privé=i-enochian# +disp_locale=de : display_name=i-enochian #Privatnutzung=i-enochian# +----------------- +locale='zh-hakka' +disp_locale=en : display_name=Chinese( #HAKKA#)? +disp_locale=fr : display_name=chinois( #HAKKA#)? +disp_locale=de : display_name=Chinesisch( #HAKKA#)? +----------------- +locale='zh-wuu' +disp_locale=en : display_name=Chinese #WUU# +disp_locale=fr : display_name=chinois #WUU# +disp_locale=de : display_name=Chinesisch #WUU# +----------------- +locale='i-tay' +disp_locale=en : display_name=i-tay +disp_locale=fr : display_name=i-tay +disp_locale=de : display_name=i-tay +----------------- +locale='sgn-BE-nl' +disp_locale=en : display_name=Sign Languages? #Belgium, NL# +disp_locale=fr : display_name=langues? des signes #Belgique, NL# +disp_locale=de : display_name=Gebärdensprache #Belgien, NL# +----------------- +locale='sgn-CH-de' +disp_locale=en : display_name=Sign Languages? #Switzerland, DE# +disp_locale=fr : display_name=langues? des signes #Suisse, DE# +disp_locale=de : display_name=Gebärdensprache #Schweiz, DE# +----------------- +locale='sl_IT_rozaj@currency=EUR' +disp_locale=en : display_name=Slovenian #Italy, Resian, [Cc]urrency=Euro# +disp_locale=fr : display_name=slovène #Italie, dialecte de Resia, [Dd]evise=euro# +disp_locale=de : display_name=Slowenisch #Italien, (ROZAJ|Resianisch), Währung=Euro# +----------------- +locale='uk-ua_CALIFORNIA@currency=;currency=GRN' +disp_locale=en : display_name=Ukrainian #Ukraine, CALIFORNIA, [Cc]urrency# +disp_locale=fr : display_name=ukrainien #Ukraine, CALIFORNIA, [Dd]evise# +disp_locale=de : display_name=Ukrainisch #Ukraine, CALIFORNIA, Währung# +----------------- +locale='root' +disp_locale=en : display_name=Root +disp_locale=fr : display_name=racine +disp_locale=de : display_name=[Rr]oot +----------------- +locale='uk@currency=EURO' +disp_locale=en : display_name=Ukrainian #[Cc]urrency=EURO# +disp_locale=fr : display_name=ukrainien #[Dd]evise=EURO# +disp_locale=de : display_name=Ukrainisch #Währung=EURO# +----------------- +locale='Hindi' +disp_locale=en : display_name=hindi +disp_locale=fr : display_name=hindi +disp_locale=de : display_name=hindi +----------------- +locale='de' +disp_locale=en : display_name=German +disp_locale=fr : display_name=allemand +disp_locale=de : display_name=Deutsch +----------------- +locale='fr' +disp_locale=en : display_name=French +disp_locale=fr : display_name=français +disp_locale=de : display_name=Französisch +----------------- +locale='ja' +disp_locale=en : display_name=Japanese +disp_locale=fr : display_name=japonais +disp_locale=de : display_name=Japanisch +----------------- +locale='i-enochian' +disp_locale=en : display_name=i-enochian #Private-Use=i-enochian# +disp_locale=fr : display_name=i-enochian #Usage privé=i-enochian# +disp_locale=de : display_name=i-enochian #Privatnutzung=i-enochian# +----------------- +locale='zh-Hant' +disp_locale=en : display_name=Chinese #Traditional# +disp_locale=fr : display_name=chinois #traditionnel# +disp_locale=de : display_name=Chinesisch #Traditionell# +----------------- +locale='zh-Hans' +disp_locale=en : display_name=Chinese #Simplified# +disp_locale=fr : display_name=chinois #simplifié# +disp_locale=de : display_name=Chinesisch #Vereinfacht# +----------------- +locale='sr-Cyrl' +disp_locale=en : display_name=Serbian #Cyrillic# +disp_locale=fr : display_name=serbe #cyrillique# +disp_locale=de : display_name=Serbisch #Kyrillisch# +----------------- +locale='sr-Latn' +disp_locale=en : display_name=Serbian #Latin# +disp_locale=fr : display_name=serbe #latin# +disp_locale=de : display_name=Serbisch #Lateinisch# +----------------- +locale='zh-Hans-CN' +disp_locale=en : display_name=Chinese #Simplified, China# +disp_locale=fr : display_name=chinois #simplifié, Chine# +disp_locale=de : display_name=Chinesisch #Vereinfacht, China# +----------------- +locale='sr-Latn-CS' +disp_locale=en : display_name=Serbian #Latin, Serbia# +disp_locale=fr : display_name=serbe #latin, Serbie# +disp_locale=de : display_name=Serbisch #Lateinisch, Serbien# +----------------- +locale='sl-rozaj' +disp_locale=en : display_name=Slovenian #Resian# +disp_locale=fr : display_name=slovène #dialecte de Resia# +disp_locale=de : display_name=Slowenisch( #(ROZAJ|Resianisch)#)? +----------------- +locale='sl-nedis' +disp_locale=en : display_name=Slovenian #Natisone dialect# +disp_locale=fr : display_name=slovène #dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Natisone-Dialekt# +----------------- +locale='de-CH-1901' +disp_locale=en : display_name=German #Switzerland, Traditional German orthography# +disp_locale=fr : display_name=allemand #Suisse, orthographe allemande traditionnelle# +disp_locale=de : display_name=Deutsch #Schweiz, (1901|[aA]lte deutsche Rechtschreibung)# +----------------- +locale='sl-IT-nedis' +disp_locale=en : display_name=Slovenian #Italy, Natisone dialect# +disp_locale=fr : display_name=slovène #Italie, dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Italien, (NEDIS|Natisone-Dialekt)# +----------------- +locale='sl-Latn-IT-nedis' +disp_locale=en : display_name=Slovenian #Latin, Italy, Natisone dialect# +disp_locale=fr : display_name=slovène #latin, Italie, dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Lateinisch, Italien, (NEDIS|Natisone-Dialekt)# +----------------- +locale='de-DE' +disp_locale=en : display_name=German #Germany# +disp_locale=fr : display_name=allemand #Allemagne# +disp_locale=de : display_name=Deutsch #Deutschland# +----------------- +locale='en-US' +disp_locale=en : display_name=English #United States# +disp_locale=fr : display_name=anglais #États-Unis# +disp_locale=de : display_name=Englisch #Vereinigte Staaten# +----------------- +locale='es-419' +disp_locale=en : display_name=Spanish #Latin America# +disp_locale=fr : display_name=espagnol #Amérique latine# +disp_locale=de : display_name=Spanisch #Lateinamerika# +----------------- +locale='de-CH-x-phonebk' +disp_locale=en : display_name=German #Switzerland, Private-Use=phonebk# +disp_locale=fr : display_name=allemand #Suisse, Usage privé=phonebk# +disp_locale=de : display_name=Deutsch #Schweiz, Privatnutzung=phonebk# +----------------- +locale='az-Arab-x-AZE-derbend' +disp_locale=en : display_name=Azerbaijani #Arabic, Private-Use=aze-derbend# +disp_locale=fr : display_name=azéri #arabe, Usage privé=aze-derbend# +disp_locale=de : display_name=Aserbaidschanisch #Arabisch, Privatnutzung=aze-derbend# +----------------- +locale='zh-min' +disp_locale=en : display_name=Chinese #MIN# +disp_locale=fr : display_name=chinois #MIN# +disp_locale=de : display_name=Chinesisch #MIN# +----------------- +locale='zh-min-nan-Hant-CN' +disp_locale=en : display_name=Chinese #MIN, NAN_HANT_CN# +disp_locale=fr : display_name=chinois #MIN, NAN_HANT_CN# +disp_locale=de : display_name=Chinesisch #MIN, NAN_HANT_CN# +----------------- +locale='x-whatever' +disp_locale=en : display_name=x-whatever #Private-Use=whatever# +disp_locale=fr : display_name=x-whatever #Usage privé=whatever# +disp_locale=de : display_name=x-whatever #Privatnutzung=whatever# +----------------- +locale='qaa-Qaaa-QM-x-southern' +disp_locale=en : display_name=qaa #Qaaa, QM, Private-Use=southern# +disp_locale=fr : display_name=qaa #Qaaa, QM, Usage privé=southern# +disp_locale=de : display_name=qaa #Qaaa, QM, Privatnutzung=southern# +----------------- +locale='sr-Latn-QM' +disp_locale=en : display_name=Serbian #Latin, QM# +disp_locale=fr : display_name=serbe #latin, QM# +disp_locale=de : display_name=Serbisch #Lateinisch, QM# +----------------- +locale='sr-Qaaa-CS' +disp_locale=en : display_name=Serbian #Qaaa, Serbia# +disp_locale=fr : display_name=serbe #Qaaa, Serbie# +disp_locale=de : display_name=Serbisch #Qaaa, Serbien# +----------------- +locale='en-US-u-islamCal' +disp_locale=en : display_name=English #United States, attribute=islamcal# +disp_locale=fr : display_name=anglais #États-Unis, attribute=islamcal# +disp_locale=de : display_name=Englisch #Vereinigte Staaten, attribute=islamcal# +----------------- +locale='zh-CN-a-myExt-x-private' +disp_locale=en : display_name=Chinese #China, a=myext, Private-Use=private# +disp_locale=fr : display_name=chinois #Chine, a=myext, Usage privé=private# +disp_locale=de : display_name=Chinesisch #China, a=myext, Privatnutzung=private# +----------------- +locale='en-a-myExt-b-another' +disp_locale=en : display_name=English #a=myext, b=another# +disp_locale=fr : display_name=anglais #a=myext, b=another# +disp_locale=de : display_name=Englisch #a=myext, b=another# +----------------- +locale='de-419-DE' +disp_locale=en : display_name=German #Latin America, DE# +disp_locale=fr : display_name=allemand #Amérique latine, DE# +disp_locale=de : display_name=Deutsch #Lateinamerika, DE# +----------------- +locale='a-DE' +disp_locale=en : display_name=a #Germany# +disp_locale=fr : display_name=a #Allemagne# +disp_locale=de : display_name=a #Deutschland# +----------------- +locale='ar-a-aaa-b-bbb-a-ccc' +disp_locale=en : display_name=Arabic #a=aaa, b=bbb# +disp_locale=fr : display_name=arabe #a=aaa, b=bbb# +disp_locale=de : display_name=Arabisch #a=aaa, b=bbb# +----------------- diff --git a/ext/intl/tests/locale_get_display_region3.phpt b/ext/intl/tests/locale_get_display_region3.phpt new file mode 100644 index 0000000000000..ec287a64462aa --- /dev/null +++ b/ext/intl/tests/locale_get_display_region3.phpt @@ -0,0 +1,275 @@ +--TEST-- +locale_get_display_region() icu >= 51.2 +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECTREGEX-- +locale='uk-ua_CALIFORNIA@currency=;currency=GRN' +disp_locale=en : display_region=Ukraine +disp_locale=fr : display_region=Ukraine +disp_locale=de : display_region=Ukraine +----------------- +locale='root' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='uk@currency=EURO' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='Hindi' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='de' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='fr' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='ja' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='i-enochian' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-Hant' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-Hans' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='sr-Cyrl' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='sr-Latn' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-Hans-CN' +disp_locale=en : display_region=China +disp_locale=fr : display_region=Chine +disp_locale=de : display_region=China +----------------- +locale='sr-Latn-CS' +disp_locale=en : display_region=Serbia +disp_locale=fr : display_region=Serbie +disp_locale=de : display_region=Serbien +----------------- +locale='sl-rozaj' +disp_locale=en : display_region=(ROZAJ)? +disp_locale=fr : display_region=(ROZAJ)? +disp_locale=de : display_region=(ROZAJ)? +----------------- +locale='sl-nedis' +disp_locale=en : display_region=(NEDIS)? +disp_locale=fr : display_region=(NEDIS)? +disp_locale=de : display_region=(NEDIS)? +----------------- +locale='de-CH-1901' +disp_locale=en : display_region=Switzerland +disp_locale=fr : display_region=Suisse +disp_locale=de : display_region=Schweiz +----------------- +locale='sl-IT-nedis' +disp_locale=en : display_region=Italy +disp_locale=fr : display_region=Italie +disp_locale=de : display_region=Italien +----------------- +locale='sl-Latn-IT-nedis' +disp_locale=en : display_region=Italy +disp_locale=fr : display_region=Italie +disp_locale=de : display_region=Italien +----------------- +locale='de-DE' +disp_locale=en : display_region=Germany +disp_locale=fr : display_region=Allemagne +disp_locale=de : display_region=Deutschland +----------------- +locale='en-US' +disp_locale=en : display_region=United States +disp_locale=fr : display_region=États-Unis +disp_locale=de : display_region=Vereinigte Staaten +----------------- +locale='es-419' +disp_locale=en : display_region=Latin America +disp_locale=fr : display_region=Amérique latine +disp_locale=de : display_region=Lateinamerika +----------------- +locale='de-CH-x-phonebk' +disp_locale=en : display_region=Switzerland +disp_locale=fr : display_region=Suisse +disp_locale=de : display_region=Schweiz +----------------- +locale='az-Arab-x-AZE-derbend' +disp_locale=en : display_region=X? +disp_locale=fr : display_region=X? +disp_locale=de : display_region=X? +----------------- +locale='zh-min' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-min-nan-Hant-CN' +disp_locale=en : display_region=MIN +disp_locale=fr : display_region=MIN +disp_locale=de : display_region=MIN +----------------- +locale='x-whatever' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='qaa-Qaaa-QM-x-southern' +disp_locale=en : display_region=QM +disp_locale=fr : display_region=QM +disp_locale=de : display_region=QM +----------------- +locale='sr-Latn-QM' +disp_locale=en : display_region=QM +disp_locale=fr : display_region=QM +disp_locale=de : display_region=QM +----------------- +locale='sr-Qaaa-CS' +disp_locale=en : display_region=Serbia +disp_locale=fr : display_region=Serbie +disp_locale=de : display_region=Serbien +----------------- +locale='en-US-u-islamCal' +disp_locale=en : display_region=United States +disp_locale=fr : display_region=États-Unis +disp_locale=de : display_region=Vereinigte Staaten +----------------- +locale='zh-CN-a-myExt-x-private' +disp_locale=en : display_region=China +disp_locale=fr : display_region=Chine +disp_locale=de : display_region=China +----------------- +locale='en-a-myExt-b-another' +disp_locale=en : display_region=A? +disp_locale=fr : display_region=A? +disp_locale=de : display_region=A? +----------------- +locale='de-419-DE' +disp_locale=en : display_region=Latin America +disp_locale=fr : display_region=Amérique latine +disp_locale=de : display_region=Lateinamerika +----------------- +locale='a-DE' +disp_locale=en : display_region=Germany +disp_locale=fr : display_region=Allemagne +disp_locale=de : display_region=Deutschland +----------------- +locale='ar-a-aaa-b-bbb-a-ccc' +disp_locale=en : display_region=A? +disp_locale=fr : display_region=A? +disp_locale=de : display_region=A? +----------------- diff --git a/ext/intl/tests/locale_lookup_variant2.phpt b/ext/intl/tests/locale_lookup_variant2.phpt new file mode 100644 index 0000000000000..4715951e9abb0 --- /dev/null +++ b/ext/intl/tests/locale_lookup_variant2.phpt @@ -0,0 +1,100 @@ +--TEST-- +locale_lookup.phpt() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +-------------- +loc_range:de-de +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:de-DE +Canonical lookup result:de_de +-------------- +loc_range:sl_IT +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:sl_IT +Canonical lookup result:sl_it +-------------- +loc_range:sl_IT_Nedis +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:sl_IT +Canonical lookup result:sl_it +-------------- +loc_range:jbo +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:jbo +Canonical lookup result:jbo +-------------- +loc_range:art-lojban +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:art-lojban +Canonical lookup result:art__lojban diff --git a/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt b/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt new file mode 100644 index 0000000000000..f2d16b899dcdf --- /dev/null +++ b/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt @@ -0,0 +1,30 @@ +--TEST-- +MessageFormat accepts IntlCalendar args +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format(array($cal)), "\n"; + +//NOT FIXED: +/*$msgf = new MessageFormatter('en_US', +'{1, select, date {{0,date,full}} other {{0,time,h:m:s a V}}}'); + +echo "msgf2: ", $msgf->format(array($time, 'date')), " ", + $msgf->format(array($time, 'time')), "\n"; +*/ + +?> +==DONE== +--EXPECT-- +Quinta-feira, 17 de Maio de 2012 5:35:36 PM ptlis +==DONE== diff --git a/ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt b/ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt new file mode 100644 index 0000000000000..cf721c8ef2538 --- /dev/null +++ b/ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt @@ -0,0 +1,26 @@ +--TEST-- +ResourceBundle constructor bundle accepts NULL for first two arguments +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- + += 51.2'); ?> +--FILE-- +get('calendar')->get('gregorian')->get('DateTimePatterns')->get(0); +var_dump($c); + +ini_set('intl.default_locale', 'pt_PT'); +$r = new ResourceBundle(NULL, NULL); +$c = $r->get('calendar')->get('gregorian')->get('DateTimePatterns')->get(0); +var_dump($c); +?> +==DONE== +--EXPECT-- +string(14) "h:mm:ss a zzzz" +string(13) "HH:mm:ss zzzz" +==DONE== diff --git a/ext/intl/tests/timezone_getDisplayName_variant4.phpt b/ext/intl/tests/timezone_getDisplayName_variant4.phpt new file mode 100644 index 0000000000000..39e28892a448d --- /dev/null +++ b/ext/intl/tests/timezone_getDisplayName_variant4.phpt @@ -0,0 +1,35 @@ +--TEST-- +IntlTimeZone::getDisplayName(): type parameter (ICU >= 51.2) +--SKIPIF-- + += 51.2'); ?> +--FILE-- +getDisplayName(false, IntlTimeZone::DISPLAY_SHORT)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_LONG)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_SHORT_GENERIC)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GENERIC)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_SHORT_GMT)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GMT)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_SHORT_COMMONLY_USED)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_GENERIC_LOCATION)); + +?> +==DONE== +--EXPECT-- +string(3) "GMT" +string(30) "Western European Standard Time" +string(13) "Portugal Time" +string(21) "Western European Time" +string(5) "+0000" +string(3) "GMT" +string(3) "GMT" +string(13) "Portugal Time" +==DONE== From 674dd73f8c34b9faf1e777a301e5302348b48b9d Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 7 Oct 2013 22:10:05 +0800 Subject: [PATCH 0100/1256] Added two more test cases for CN matching. --- ext/openssl/tests/bug65729.phpt | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/ext/openssl/tests/bug65729.phpt b/ext/openssl/tests/bug65729.phpt index d4645d9f5b432..7008f3c7b56c4 100644 --- a/ext/openssl/tests/bug65729.phpt +++ b/ext/openssl/tests/bug65729.phpt @@ -13,24 +13,28 @@ stream_context_set_option($context, 'ssl', 'allow_self_signed', true); $server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); +$expected_names = array('foo.test.com.sg', 'foo.test.com', 'foo.bar.test.com'); + $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); } else if ($pid) { - $contextC = stream_context_create( - array( + foreach ($expected_names as $expected_name) { + $contextC = stream_context_create(array( 'ssl' => array( 'verify_peer' => true, 'allow_self_signed' => true, - 'CN_match' => 'foo.test.com.sg', + 'CN_match' => $expected_name, ) - ) - ); - var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + )); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $contextC)); + } } else { @pcntl_wait($status); - @stream_socket_accept($server, 1); + foreach ($expected_names as $name) { + @stream_socket_accept($server, 1); + } } --EXPECTF-- Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.test.com.sg' in %s on line %d @@ -39,4 +43,11 @@ Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) +resource(%d) of type (stream) + +Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.bar.test.com' in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) From 39c0daeb71f76ce22dc604bda8a063319fd55e59 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 7 Oct 2013 23:04:24 +0800 Subject: [PATCH 0101/1256] Use zend_bool as return value for _match() --- ext/openssl/openssl.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 2aa850ad1c0db..2b345700ff853 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4829,7 +4829,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ -static int php_openssl_match_cn(const char *subjectname, const char *certname) +static zend_bool php_openssl_match_cn(const char *subjectname, const char *certname) { char *wildcard; int prefix_len, suffix_len, subject_len; @@ -4902,7 +4902,6 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre /* Does the common name match ? (used primarily for https://) */ GET_VER_OPT_STRING("CN_match", cnmatch); if (cnmatch) { - int match = 0; int name_len = X509_NAME_get_text_by_NID(name, NID_commonName, buf, sizeof(buf)); if (name_len == -1) { @@ -4913,9 +4912,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre return FAILURE; } - match = php_openssl_match_cn(cnmatch, buf); - - if (!match) { + if (!php_openssl_match_cn(cnmatch, buf)) { /* didn't match */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", name_len, buf, cnmatch); return FAILURE; From 12f9939b790a02ca3f22b91813029e78208f2c24 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 7 Oct 2013 17:23:11 -0700 Subject: [PATCH 0102/1256] Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle client library 10.2 (Note this will connect to Oracle Database 8.1.7 onwards). Use the older OCI8 1.4 from PECL if using an earlier PHP version or older Oracle client library support is necessary. --- ext/oci8/config.m4 | 25 ++++-------------------- ext/oci8/config.w32 | 2 -- ext/oci8/oci8.c | 40 +++----------------------------------- ext/oci8/oci8_collection.c | 12 ------------ ext/oci8/oci8_interface.c | 12 ------------ ext/oci8/oci8_lob.c | 38 ------------------------------------ ext/oci8/package.xml | 25 ++++++++++++++---------- ext/oci8/php_oci8_int.h | 4 ---- 8 files changed, 22 insertions(+), 136 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 3873a2205aa36..0d08d21c29e61 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -208,8 +208,8 @@ if test "$PHP_OCI8" != "no"; then IFS=$ac_IFS oci8_php_version=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3` - if test "$oci8_php_version" -lt "4003009"; then - AC_MSG_ERROR([You need at least PHP 4.3.9 to be able to use this version of OCI8. PHP $php_version found]) + if test "$oci8_php_version" -lt "5002000"; then + AC_MSG_ERROR([You need at least PHP 5.2.0 to be able to use this version of OCI8. PHP $php_version found]) else AC_MSG_RESULT([$php_version, ok]) fi @@ -332,24 +332,8 @@ if test "$PHP_OCI8" != "no"; then AC_OCI8_ORACLE_VERSION($OCI8_DIR) case $OCI8_ORACLE_VERSION in - 7.3|8.0|8.1) - AC_MSG_ERROR([Oracle client libraries < 9.2 are not supported]) - ;; - - 9.0) - PHP_CHECK_LIBRARY(clntsh, OCIEnvNlsCreate, - [ - OCI8_ORACLE_VERSION=9.2 - ], - [ - AC_MSG_ERROR([Oracle client libraries < 9.2 are not supported]) - ], [ - -L$OCI8_DIR/$OCI8_LIB_DIR $OCI8_SHARED_LIBADD - ]) - ;; - - *) - AC_DEFINE(HAVE_OCI_LOB_READ2,1,[Defined to 1 if OCI8 configuration located Oracle's OCILobRead2 function]) + 7.3|8.0|8.1|9.0) + AC_MSG_ERROR([Oracle client libraries < 10 are not supported]) ;; esac @@ -425,7 +409,6 @@ if test "$PHP_OCI8" != "no"; then PHP_ADD_LIBPATH($PHP_OCI8_INSTANT_CLIENT, OCI8_SHARED_LIBADD) AC_DEFINE(HAVE_OCI_INSTANT_CLIENT,1,[Defined to 1 if OCI8 configuration located Oracle's Instant Client libraries]) - AC_DEFINE(HAVE_OCI_LOB_READ2,1,[Defined to 1 if OCI8 configuration located Oracle's OCILobRead2 function]) PHP_NEW_EXTENSION(oci8, oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c, $ext_shared) AC_DEFINE(HAVE_OCI8,1,[Defined to 1 if the PHP OCI8 extension for Oracle Database is configured]) diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index ac573a8af39a1..750f163950cc9 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -29,8 +29,6 @@ if (PHP_OCI8_12C != "no") { AC_DEFINE('HAVE_OCI8', 1); AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); - AC_DEFINE('HAVE_OCI_LOB_READ2', 1); - } else { WARNING("oci8-12c not enabled: Oracle Database client libraries or Oracle Database 12c Instant Client not found"); PHP_OCI8_12C = "no" diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index eeb1ade7bb802..f8abacf3e6c6a 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -39,12 +39,9 @@ #if HAVE_OCI8 -#if PHP_MAJOR_VERSION > 5 -#error This version of the PHP OCI8 extension is not compatible with PHP 6 or later -#elif PHP_MAJOR_VERSION < 5 -#ifdef ZTS -#error The PHP OCI8 extension does not support ZTS mode in PHP 4 -#endif +/* PHP 5.2 is the minimum supported version for OCI8 2.0 */ +#if PHP_MAJOR_VERSION < 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION <= 1) +#error Use PHP OCI8 1.4 for your version of PHP #endif #include "php_oci8.h" @@ -66,11 +63,8 @@ #endif ZEND_DECLARE_MODULE_GLOBALS(oci) -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) -/* This "if" allows PECL builds from this file to be portable to older PHP releases */ static PHP_GINIT_FUNCTION(oci); static PHP_GSHUTDOWN_FUNCTION(oci); -#endif /* Allow PHP 5.3 branch to be used in PECL for 5.x compatible builds */ #ifndef Z_ADDREF_P @@ -1055,16 +1049,11 @@ zend_module_entry oci8_module_entry = { PHP_RSHUTDOWN(oci), /* per-request shutdown function */ PHP_MINFO(oci), /* information function */ PHP_OCI8_VERSION, -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* This check allows PECL builds from this file to be portable to older PHP releases */ PHP_MODULE_GLOBALS(oci), /* globals descriptor */ PHP_GINIT(oci), /* globals ctor */ PHP_GSHUTDOWN(oci), /* globals dtor */ NULL, /* post deactivate */ STANDARD_MODULE_PROPERTIES_EX -#else - STANDARD_MODULE_PROPERTIES -#endif }; /* }}} */ @@ -1183,12 +1172,7 @@ static void php_oci_cleanup_global_handles(TSRMLS_D) * * Zerofill globals during module init */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) -/* This check allows PECL builds from this file to be portable to older PHP releases */ static PHP_GINIT_FUNCTION(oci) -#else -static void php_oci_init_globals(zend_oci_globals *oci_globals TSRMLS_DC) -#endif { memset(oci_globals, 0, sizeof(zend_oci_globals)); } @@ -1198,12 +1182,7 @@ static void php_oci_init_globals(zend_oci_globals *oci_globals TSRMLS_DC) * * Called for thread shutdown in ZTS, after module shutdown for non-ZTS */ -/* This check allows PECL builds from this file to be portable to older PHP releases */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) static PHP_GSHUTDOWN_FUNCTION(oci) -#else -static void php_oci_shutdown_globals(zend_oci_globals *oci_globals TSRMLS_DC) -#endif { php_oci_cleanup_global_handles(TSRMLS_C); } @@ -1214,12 +1193,6 @@ PHP_MINIT_FUNCTION(oci) zend_class_entry oci_lob_class_entry; zend_class_entry oci_coll_class_entry; -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* This check allows PECL builds from this file to be portable to older PHP releases */ - /* this is handled by new globals management code */ -#else - ZEND_INIT_MODULE_GLOBALS(oci, php_oci_init_globals, php_oci_shutdown_globals); -#endif REGISTER_INI_ENTRIES(); le_statement = zend_register_list_destructors_ex(php_oci_statement_list_dtor, NULL, "oci8 statement", module_number); @@ -1331,13 +1304,6 @@ PHP_RINIT_FUNCTION(oci) PHP_MSHUTDOWN_FUNCTION(oci) { -/* Work around PHP_GSHUTDOWN_FUNCTION not being called in older versions of PHP */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 2) || (PHP_MAJOR_VERSION < 5) -#ifndef ZTS - php_oci_cleanup_global_handles(TSRMLS_C); -#endif -#endif - OCI_G(shutdown) = 1; UNREGISTER_INI_ENTRIES(); diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 320e90a5b8999..35b70fa7af73f 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -361,13 +361,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe php_oci_connection *connection = collection->connection; sword errstatus; -#if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10) - /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ - element_double = strtod(number, NULL); -#else - /* zend_strtod was introduced in PHP 4.3.10 */ element_double = zend_strtod(number, NULL); -#endif PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); @@ -666,13 +660,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i php_oci_connection *connection = collection->connection; sword errstatus; -#if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10) - /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ - element_double = strtod(number, NULL); -#else - /* zend_strtod was introduced in PHP 4.3.10 */ element_double = zend_strtod(number, NULL); -#endif PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index a452c1a7e2902..ccaed797429f1 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1429,13 +1429,7 @@ PHP_FUNCTION(oci_fetch_all) if (flags & PHP_OCI_NUM) { zend_hash_next_index_insert(Z_ARRVAL_P(row), &element, sizeof(zval*), NULL); } else { /* default to ASSOC */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* zend_symtable_update is only available in 5.2+ */ zend_symtable_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL); -#else - /* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */ - zend_hash_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL); -#endif } } @@ -1467,13 +1461,7 @@ PHP_FUNCTION(oci_fetch_all) MAKE_STD_ZVAL(tmp); array_init(tmp); -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* zend_symtable_update is only available in 5.2+ */ zend_symtable_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ])); -#else - /* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */ - zend_hash_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ])); -#endif } } diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index 8d14dc3f503aa..4f58c65737f97 100644 --- a/ext/oci8/oci8_lob.c +++ b/ext/oci8/oci8_lob.c @@ -165,11 +165,7 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D /* {{{ php_oci_lob_callback() Append LOB portion to a memory buffer */ -#if defined(HAVE_OCI_LOB_READ2) sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, oraub8 len, ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp) -#else -sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece) -#endif { ub4 lenp = (ub4) len; php_oci_lob_ctx *ctx = (php_oci_lob_ctx *)ctxp; @@ -251,14 +247,9 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini int buffer_size = PHP_OCI_LOB_BUFFER_SIZE; php_oci_lob_ctx ctx; ub1 *bufp; -#if defined(HAVE_OCI_LOB_READ2) oraub8 bytes_read, offset = 0; oraub8 requested_len = read_length; /* this is by default */ oraub8 chars_read = 0; -#else - int bytes_read, offset = 0; - int requested_len = read_length; /* this is by default */ -#endif int is_clob = 0; sb4 bytes_per_char = 1; sword errstatus; @@ -336,7 +327,6 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini ctx.alloc_len = (requested_len + 1) * bytes_per_char; *data = ecalloc(bytes_per_char, requested_len + 1); -#ifdef HAVE_OCI_LOB_READ2 if (is_clob) { chars_read = requested_len; bytes_read = 0; @@ -374,34 +364,6 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini } else { offset = descriptor->lob_current_position + bytes_read; } - -#else - - bytes_read = requested_len; - buffer_size = (requested_len < buffer_size ) ? requested_len : buffer_size; /* optimize buffer size */ - buffer_size = php_oci_lob_calculate_buffer(descriptor, buffer_size TSRMLS_CC); /* use chunk size */ - - bufp = (ub1 *) ecalloc(1, buffer_size); - PHP_OCI_CALL_RETURN(errstatus, OCILobRead, - ( - connection->svc, - connection->err, - descriptor->descriptor, - &bytes_read, /* IN/OUT bytes toread/read */ - offset + 1, /* offset (starts with 1) */ - (dvoid *) bufp, - (ub4) buffer_size, /* size of buffer */ - (dvoid *)&ctx, - (OCICallbackLobRead) php_oci_lob_callback, /* callback... */ - (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ - (ub1) descriptor->charset_form /* The character set form of the buffer data. */ - ) - ); - - efree(bufp); - offset = descriptor->lob_current_position + bytes_read; - -#endif if (errstatus != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 1161b031f33a0..d2c49726a877c 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -8,12 +8,15 @@ http://pear.php.net/dtd/package-2.0.xsd"> Extension for Oracle Database - This extension allows you to access Oracle Database. OCI8 2.0 can - be built with PHP 4.3.9 onwards. OCI8 can be linked with Oracle - Database 9.2, 10, 11, or 12.1 client libraries. Oracle's standard - cross-version connectivity applies. For example PHP linked with - Oracle Database 11.2 client libraries can connect to Oracle - Database 9.2 onwards. +The PHP OCI8 extension gives access to Oracle Database. The extension +can be linked with Oracle client libraries from Oracle Database 10.2, +11, or 12.1. These libraries are found in the database installation, +or in the free Oracle Instant Client. Oracle's standard cross-version +connectivity applies. For example, PHP OCI8 linked with Instant +Client 11.2 can connect to Oracle Database 9.2 onwards. PHP OCI8 2.0 +can be built with PHP 5.2 onwards. Use the older PHP OCI8 1.4.10 when +using PHP 4.3.9 through to PHP 5.1.x, or when only Oracle Database 9.2 +client libraries are available. Christopher Jones @@ -40,7 +43,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-09-27 + 2013-10-08 @@ -53,7 +56,10 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP - - no notes yet +Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle +client library 10.2 (Note this will connect to Oracle Database 8.1.7 +onwards). Use the older OCI8 1.4 if an earlier PHP version or older +Oracle client library support is necessary. @@ -438,8 +444,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 4.3.9 - 6.0.0 + 5.2.0 1.4.0b1 diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 2d4ff26947e99..e50983d75eb53 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -438,11 +438,7 @@ int php_oci_lob_append(php_oci_descriptor *descriptor_dest, php_oci_descriptor * int php_oci_lob_truncate(php_oci_descriptor *descriptor, long new_lob_length TSRMLS_DC); int php_oci_lob_erase(php_oci_descriptor *descriptor, long offset, ub4 length, ub4 *bytes_erased TSRMLS_DC); int php_oci_lob_is_equal(php_oci_descriptor *descriptor_first, php_oci_descriptor *descriptor_second, boolean *result TSRMLS_DC); -#if defined(HAVE_OCI_LOB_READ2) sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, oraub8 len, ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp); -#else -sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece); -#endif /* }}} */ /* {{{ collection related prototypes */ From 1675fd22775c7067c5d21e0cc1a0cc81f9434a5c Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 7 Oct 2013 17:26:00 -0700 Subject: [PATCH 0103/1256] Add new tests --- ext/oci8/tests/db_op_1.phpt | 61 ++++++++++++++++++++++++++++++++ ext/oci8/tests/db_op_2.phpt | 69 +++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 ext/oci8/tests/db_op_1.phpt create mode 100644 ext/oci8/tests/db_op_2.phpt diff --git a/ext/oci8/tests/db_op_1.phpt b/ext/oci8/tests/db_op_1.phpt new file mode 100644 index 0000000000000..f645cf80ff3b2 --- /dev/null +++ b/ext/oci8/tests/db_op_1.phpt @@ -0,0 +1,61 @@ +--TEST-- +oci_set_db_operation: basic test for end-to-end tracing +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +if (strcasecmp($user, "system") && strcasecmp($user, "sys")) { + die("skip needs to be run as a DBA user"); +} +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +if (!function_exists('oci_set_db_operation')) +{ + die("skip function oci_set_db_operation() does not exist"); +} +?> +--FILE-- + +===DONE=== + +--EXPECTF-- +Test 1 +array(1) { + ["DUMMY"]=> + string(1) "X" +} +array(1) { + ["DBOP_NAME"]=> + string(7) "db_op_1" +} +===DONE=== + diff --git a/ext/oci8/tests/db_op_2.phpt b/ext/oci8/tests/db_op_2.phpt new file mode 100644 index 0000000000000..05c2269ae0bfd --- /dev/null +++ b/ext/oci8/tests/db_op_2.phpt @@ -0,0 +1,69 @@ +--TEST-- +oci_set_db_operation: basic test for end-to-end tracing +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +if (strcasecmp($user, "system") && strcasecmp($user, "sys")) { + die("skip needs to be run as a DBA user"); +} +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +if (!function_exists('oci_set_db_operation')) +{ + die("skip function oci_set_db_operation() does not exist"); +} +?> +--FILE-- + +===DONE=== + +--XFAIL-- +Fails due to Oracle Bug 16695981 +--EXPECTF-- +Test 1 +array(1) { + ["DUMMY"]=> + string(1) "X" +} +Test 2 +array(1) { + ["DUMMY"]=> + string(1) "X" +} +Test 3 +array(2) { + ["DBOP_NAME"]=> + string(7) "db_op_2a" +} +===DONE=== + From f0863fa43aa2201b7e2a749f5a8e98e519cfd47f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 7 Oct 2013 17:38:56 -0700 Subject: [PATCH 0104/1256] Add new tests to package.xml --- ext/oci8/package.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index d2c49726a877c..47e5415aa8394 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -227,6 +227,8 @@ Oracle client library support is necessary. + + From 6106896440572dd8093acdd11ea691a07d9b169c Mon Sep 17 00:00:00 2001 From: datibbaw Date: Tue, 8 Oct 2013 10:07:54 +0800 Subject: [PATCH 0105/1256] DNS name comparison is now case insensitive. --- ext/openssl/openssl.c | 6 +++--- ext/openssl/tests/bug65729.phpt | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 2b345700ff853..15cf798ddba33 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4834,7 +4834,7 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn char *wildcard; int prefix_len, suffix_len, subject_len; - if (strcmp(subjectname, certname) == 0) { + if (strcasecmp(subjectname, certname) == 0) { return 1; } @@ -4844,7 +4844,7 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn // 1) prefix, if not empty, must match subject prefix_len = wildcard - certname; - if (prefix_len && strncmp(subjectname, certname, prefix_len) != 0) { + if (prefix_len && strncasecmp(subjectname, certname, prefix_len) != 0) { return 0; } @@ -4854,7 +4854,7 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn /* 2) suffix must match * 3) no . between prefix and suffix **/ - return strcmp(wildcard + 1, subjectname + subject_len - suffix_len) == 0 && + return strcasecmp(wildcard + 1, subjectname + subject_len - suffix_len) == 0 && memchr(subjectname + prefix_len, '.', subject_len - suffix_len - prefix_len) == NULL; } diff --git a/ext/openssl/tests/bug65729.phpt b/ext/openssl/tests/bug65729.phpt index 7008f3c7b56c4..c0ee4443ebee5 100644 --- a/ext/openssl/tests/bug65729.phpt +++ b/ext/openssl/tests/bug65729.phpt @@ -13,7 +13,7 @@ stream_context_set_option($context, 'ssl', 'allow_self_signed', true); $server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); -$expected_names = array('foo.test.com.sg', 'foo.test.com', 'foo.bar.test.com'); +$expected_names = array('foo.test.com.sg', 'foo.test.com', 'FOO.TEST.COM', 'foo.bar.test.com'); $pid = pcntl_fork(); if ($pid == -1) { @@ -44,6 +44,7 @@ Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) resource(%d) of type (stream) +resource(%d) of type (stream) Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.bar.test.com' in %s on line %d From f32d2ac3aaa7d4af7c348b00ebebb9ae64955704 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 8 Oct 2013 08:37:08 +0200 Subject: [PATCH 0106/1256] fix bug #51076 (race condition in shtool's mkdir -p) --- NEWS | 4 ++++ build/shtool | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 796f82f207847..6649a4965acf9 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.5.5 +- Buildsystem: + . Fixed bug #51076 (race condition in shtool's mkdir -p implementation). + (Mike, Raphael Geissert) + - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). (Nikita) diff --git a/build/shtool b/build/shtool index 684a01f5df968..fc6ae1e6efbbb 100755 --- a/build/shtool +++ b/build/shtool @@ -1003,7 +1003,14 @@ mkdir ) if [ ".$opt_t" = .yes ]; then echo "mkdir $pathcomp" 1>&2 fi - mkdir $pathcomp || errstatus=$? + # See https://bugs.php.net/51076 + # The fix is from Debian who have sent it + # upstream, too; but upstream seems dead. + mkdir $pathcomp || { + _errstatus=$? + [ -d "$pathcomp" ] || errstatus=${_errstatus} + unset _errstatus + } if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $pathcomp" 1>&2 From 5d430ad90257e353321789d9dfe529554028ff6e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 8 Oct 2013 11:16:53 +0200 Subject: [PATCH 0107/1256] fix bad cast --- ext/standard/php_fopen_wrapper.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 76f77ebf7b5f4..0adb1e05290a0 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -120,11 +120,11 @@ static int php_stream_input_flush(php_stream *stream TSRMLS_DC) /* {{{ */ static int php_stream_input_seek(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC) /* {{{ */ { - php_stream *inner = stream->abstract; + php_stream_input_t *input = stream->abstract; - if (inner) { - int sought = php_stream_seek(inner, offset, whence); - *newoffset = inner->position; + if (*input->body_ptr) { + int sought = php_stream_seek(*input->body_ptr, offset, whence); + *newoffset = (*input->body_ptr)->position; return sought; } From cf6413ae7ca9773ea154df3b94ce9299435f0e33 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 8 Oct 2013 16:20:07 +0200 Subject: [PATCH 0108/1256] openssl NEWS,UPGRADING --- NEWS | 5 +++++ UPGRADING | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/NEWS b/NEWS index 8113514420b8d..c2cf3d76d21d9 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,11 @@ PHP NEWS cache_slots) in op_array->literals table. (Laruence, Dmitry) . Added script level constant replacement optimization pass. (Dmitry) +- Openssl: + . Added crypto_method option for the ssl stream context. (Martin Jansen) + . Added certificate fingerprint support. (Tjerk Meesters) + . Fixed bug #65729 (CN_match gives false positive). (Tjerk Meesters) + - PDO_pgsql: . Fixed Bug #42614 (PDO_pgsql: add pg_get_notify support). (Matteo) . Fixed Bug #63657 (pgsqlCopyFromFile, pgsqlCopyToArray use Postgres < 7.3 diff --git a/UPGRADING b/UPGRADING index fb8daab2d609c..238aa5ea41a9c 100755 --- a/UPGRADING +++ b/UPGRADING @@ -42,6 +42,11 @@ PHP X.Y UPGRADE NOTES - Added gost-crypto (CryptoPro S-box) hash algo. +- Added openssl certificate fingerprint support (inclusive stream context + option). + +- Added openssl crypto method stream context option. + ======================================== 2. Changes in SAPI modules ======================================== @@ -71,6 +76,8 @@ PHP X.Y UPGRADE NOTES 5. New Functions ======================================== +- Openssl: + Added string openssl_x509_fingerprint($x509, $type, $binary). ======================================== 6. New Classes and Interfaces @@ -106,6 +113,11 @@ PHP X.Y UPGRADE NOTES 9. New Global Constants ======================================== +- Openssl: + . STREAM_CRYPTO_METHOD_SSLv2_CLIENT + . STREAM_CRYPTO_METHOD_SSLv3_CLIENT + . STREAM_CRYPTO_METHOD_SSLv23_CLIENT + . STREAM_CRYPTO_METHOD_TLS_CLIENT ======================================== 10. Changes to INI File Handling From 1970b964430a357d9c9acf01268849d86a99f4ec Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Tue, 8 Oct 2013 12:37:44 -0400 Subject: [PATCH 0109/1256] Added SAN matching during peer verification --- ext/openssl/openssl.c | 71 +++++++++++++++++------- ext/openssl/tests/san-ca.pem | 15 +++++ ext/openssl/tests/san-cert.pem | 31 +++++++++++ ext/openssl/tests/san-peer-matching.phpt | 60 ++++++++++++++++++++ 4 files changed, 158 insertions(+), 19 deletions(-) create mode 100644 ext/openssl/tests/san-ca.pem create mode 100644 ext/openssl/tests/san-cert.pem create mode 100644 ext/openssl/tests/san-peer-matching.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 90329d06caa6d..c77405762304b 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4951,7 +4951,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ -static zend_bool php_openssl_match_cn(const char *subjectname, const char *certname) +static int matches_wildcard_name(const char *subjectname, const char *certname) { char *wildcard; int prefix_len, suffix_len, subject_len; @@ -4983,12 +4983,55 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn return 0; } +static int matches_san_list(X509 *peer, const char *subject_name) +{ + int is_match, i; + unsigned char *cert_name; + GENERAL_NAMES *alt_names = X509_get_ext_d2i(peer, NID_subject_alt_name, 0, 0); + int alt_name_count = sk_GENERAL_NAME_num(alt_names); + + for (i = 0; i < alt_name_count; i++) { + GENERAL_NAME *san = sk_GENERAL_NAME_value(alt_names, i); + + if (GEN_DNS == san->type) { + ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); + is_match = matches_wildcard_name(subject_name, cert_name); + OPENSSL_free(cert_name); + } + + if (is_match) { + break; + } + } + + return is_match; +} + +static int matches_common_name(X509 *peer, const char *subject_name) +{ + char buf[1024]; + X509_NAME *cert_name; + cert_name = X509_get_subject_name(peer); + int cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); + + if (cert_name_len == -1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); + return 0; + } else if (cert_name_len != strlen(buf)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' is malformed", cert_name_len, buf); + return 0; + } else if (matches_wildcard_name(subject_name, buf)) { + return 1; + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", cert_name_len, buf, subject_name); + return 0; + } +} + int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ { zval **val = NULL; char *cnmatch = NULL; - X509_NAME *name; - char buf[1024]; int err; /* verification is turned off */ @@ -5030,24 +5073,14 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre } } - name = X509_get_subject_name(peer); - - /* Does the common name match ? (used primarily for https://) */ GET_VER_OPT_STRING("CN_match", cnmatch); - if (cnmatch) { - int name_len = X509_NAME_get_text_by_NID(name, NID_commonName, buf, sizeof(buf)); - if (name_len == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); - return FAILURE; - } else if (name_len != strlen(buf)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' is malformed", name_len, buf); - return FAILURE; - } - - if (!php_openssl_match_cn(cnmatch, buf)) { - /* didn't match */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", name_len, buf, cnmatch); + if (cnmatch) { + if (matches_san_list(peer, cnmatch)) { + return SUCCESS; + } else if (matches_common_name(peer, cnmatch)) { + return SUCCESS; + } else { return FAILURE; } } diff --git a/ext/openssl/tests/san-ca.pem b/ext/openssl/tests/san-ca.pem new file mode 100644 index 0000000000000..88682ba2dcf65 --- /dev/null +++ b/ext/openssl/tests/san-ca.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICYTCCAcqgAwIBAgIJAIaqxtY5dwjtMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UEBxMLTWlubmVhcG9saXMxITAfBgNV +BAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDAeFw0xMzA5MjQwODA1NTFaFw0y +MTEyMTEwODA1NTFaMFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UE +BxMLTWlubmVhcG9saXMxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRl +ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsFGqfbU/8D+KjroQl4XMyt9m +dcSP7iZtqphOu9nVZxYAAqfaqj8FnC/pwYV3TU6ZHndLTQAllwYT3sQBQPPGmZQ9 +clSIMEL003t3pi4ZVXkttG6Vvr+Z9PBcHhlKLQ7WMHnn4qctllWXTSoyTQpkETF3 +Fc3mrG5G37BhoUno7NECAwEAAaM9MDswOQYDVR0RBDIwMIILZXhhbXBsZS5vcmeC +D3d3dy5leGFtcGxlLm9yZ4IQdGVzdC5leGFtcGxlLm9yZzANBgkqhkiG9w0BAQUF +AAOBgQBf/FZhzheIcQJ+dyTk8xQ/nJLvpmBhbd1LNtfwk/MsC9UHsz4QXs9sBw1k +rH0FjoqgM6avj7zKHJFTj6q7Rd+OX5V4HynYPhX67sWbN3KWEHffL98nGGd/bo3X +pSjNk5vnyKYiwdUUe11Ac9csh0HcSBbhOYjy0T/i9AlQcKbuCg== +-----END CERTIFICATE----- diff --git a/ext/openssl/tests/san-cert.pem b/ext/openssl/tests/san-cert.pem new file mode 100644 index 0000000000000..923d490e72fd3 --- /dev/null +++ b/ext/openssl/tests/san-cert.pem @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIICYTCCAcqgAwIBAgIJAIaqxtY5dwjtMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UEBxMLTWlubmVhcG9saXMxITAfBgNV +BAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDAeFw0xMzA5MjQwODA1NTFaFw0y +MTEyMTEwODA1NTFaMFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UE +BxMLTWlubmVhcG9saXMxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRl +ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsFGqfbU/8D+KjroQl4XMyt9m +dcSP7iZtqphOu9nVZxYAAqfaqj8FnC/pwYV3TU6ZHndLTQAllwYT3sQBQPPGmZQ9 +clSIMEL003t3pi4ZVXkttG6Vvr+Z9PBcHhlKLQ7WMHnn4qctllWXTSoyTQpkETF3 +Fc3mrG5G37BhoUno7NECAwEAAaM9MDswOQYDVR0RBDIwMIILZXhhbXBsZS5vcmeC +D3d3dy5leGFtcGxlLm9yZ4IQdGVzdC5leGFtcGxlLm9yZzANBgkqhkiG9w0BAQUF +AAOBgQBf/FZhzheIcQJ+dyTk8xQ/nJLvpmBhbd1LNtfwk/MsC9UHsz4QXs9sBw1k +rH0FjoqgM6avj7zKHJFTj6q7Rd+OX5V4HynYPhX67sWbN3KWEHffL98nGGd/bo3X +pSjNk5vnyKYiwdUUe11Ac9csh0HcSBbhOYjy0T/i9AlQcKbuCg== +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALBRqn21P/A/io66 +EJeFzMrfZnXEj+4mbaqYTrvZ1WcWAAKn2qo/BZwv6cGFd01OmR53S00AJZcGE97E +AUDzxpmUPXJUiDBC9NN7d6YuGVV5LbRulb6/mfTwXB4ZSi0O1jB55+KnLZZVl00q +Mk0KZBExdxXN5qxuRt+wYaFJ6OzRAgMBAAECgYB11e5iWvqjPmQEZRdnnJU0VD8u +n7ItT+Nk6qtb4gY8Abj6DWIW+01th5vqqJ8FvGyartFVYa69kuM+srG/zevAZWeu +fGZtwiwZR4DRSyRcPp4rnNiksK3dkAZA6UewmRDPv8uyHJlXc5i+Ft1ILJ5Q5jgn +UkC4z3EJP5Se9KZywQJBAOO4lRq42wLsYr2SDrQDSs4leie3FKc2bgvjF7Djosh1 +ZYbf55F5b9w1zgnccmni2HkqOnyFu4SKarmXyCsYxrkCQQDGNvnUh7/zZswrdWZ/ +PMp9zVDTh/5Oc2B4ByNLw1ERDwYhjchKgPRlQvn4cp3Pwf3UYPQ/8XGXzzEJey3A +r0rZAkBf/tDEOgcBPXsGZQrTscuYCU5sbY5ESvqrAilbhSp7DJom+D5bIfEYyIm5 +uHd20Yzlzvpmwc1huyPwZt6X5FLpAkATDReoGMAXSesXxjnqwtIHk2NQYYLM0YQV +JUJ8NrKk/Bevw+vbVVeoH+7ctU97t36JGiR/vNoZKD3jVmaIXZDJAkEA4wJbwzIo +L32mu9VmZa7wjmfkraQEmXTPaA5D9lNC0AwRTgkj+x2Qe1vawNblNK9PPLBDdplQ +L//53ADq/wv5rA== +-----END PRIVATE KEY----- diff --git a/ext/openssl/tests/san-peer-matching.phpt b/ext/openssl/tests/san-peer-matching.phpt new file mode 100644 index 0000000000000..4e6531d6cc6b6 --- /dev/null +++ b/ext/openssl/tests/san-peer-matching.phpt @@ -0,0 +1,60 @@ +--TEST-- +Peer verification matches SAN names +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/san-cert.pem', + 'allow_self_signed' => true, + ), +)); + +$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, + STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); + + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} else if ($pid) { + $contextC = stream_context_create( + array( + 'ssl' => array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/san-ca.pem', + 'CN_match' => 'example.org', + ) + ) + ); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); + + $contextC = stream_context_create(array( + 'ssl' => array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/san-ca.pem', + 'CN_match' => 'moar.example.org', + ) + )); + + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); + +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 1); + @stream_socket_accept($server, 1); +} +--EXPECTF-- +resource(%d) of type (stream) + +Warning: stream_socket_client(): Unable to locate peer certificate CN in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d + +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) From 2ddefbd2b3027882490eb997fc7bc13185a67207 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Tue, 8 Oct 2013 13:54:22 -0400 Subject: [PATCH 0110/1256] Added support for TLSv1.1 and TLSv1.2 --- ext/openssl/openssl.c | 8 +++ ext/openssl/tests/tlsv1.1_wrapper_001.phpt | 46 ++++++++++++++++ ext/openssl/tests/tlsv1.2_wrapper_002.phpt | 46 ++++++++++++++++ ext/openssl/xp_ssl.c | 62 +++++++++++++++++++++- ext/standard/file.c | 4 ++ main/streams/php_stream_transport.h | 6 ++- 6 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 ext/openssl/tests/tlsv1.1_wrapper_001.phpt create mode 100644 ext/openssl/tests/tlsv1.2_wrapper_002.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 90329d06caa6d..d6f02f22c32d9 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1183,6 +1183,10 @@ PHP_MINIT_FUNCTION(openssl) php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC); #endif php_stream_xport_register("tls", php_openssl_ssl_socket_factory TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_register("tlsv1.1", php_openssl_ssl_socket_factory TSRMLS_CC); + php_stream_xport_register("tlsv1.2", php_openssl_ssl_socket_factory TSRMLS_CC); +#endif /* override the default tcp socket provider */ php_stream_xport_register("tcp", php_openssl_ssl_socket_factory TSRMLS_CC); @@ -1221,6 +1225,10 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #endif php_stream_xport_unregister("sslv3" TSRMLS_CC); php_stream_xport_unregister("tls" TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_unregister("tlsv1.1" TSRMLS_CC); + php_stream_xport_unregister("tlsv1.2" TSRMLS_CC); +#endif /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); diff --git a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt new file mode 100644 index 0000000000000..56211f0b965e0 --- /dev/null +++ b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.1 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt new file mode 100644 index 0000000000000..cb3f4106c727e --- /dev/null +++ b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.2 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 1ac8a0220e3a0..9154a03773a2c 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -346,6 +346,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 1; method = TLSv1_client_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_1_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_2_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif case STREAM_CRYPTO_METHOD_SSLv23_SERVER: sslsock->is_client = 0; method = SSLv23_server_method(); @@ -367,6 +385,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 0; method = TLSv1_server_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_1_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_2_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif default: return -1; @@ -667,6 +703,12 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ case STREAM_CRYPTO_METHOD_TLS_CLIENT: sock->method = STREAM_CRYPTO_METHOD_TLS_SERVER; break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_1_SERVER; + break; + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; + break; default: break; } @@ -867,6 +909,8 @@ static int get_crypto_method(php_stream_context *ctx) { case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: case STREAM_CRYPTO_METHOD_TLS_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: return crypto_method; } @@ -982,8 +1026,24 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, } else if (strncmp(proto, "tls", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_TLS_CLIENT; + } else if (strncmp(proto, "tlsv1.1", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif + } else if (strncmp(proto, "tlsv1.2", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif } - + return stream; } diff --git a/ext/standard/file.c b/ext/standard/file.c index 1ec6a74f3f0b5..2bd35bf8941ae 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -223,10 +223,14 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_CS|CONST_PERSISTENT); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index 52df73d731a44..15ba09430f981 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -170,10 +170,14 @@ typedef enum { STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_SSLv2_SERVER, STREAM_CRYPTO_METHOD_SSLv3_SERVER, STREAM_CRYPTO_METHOD_SSLv23_SERVER, - STREAM_CRYPTO_METHOD_TLS_SERVER + STREAM_CRYPTO_METHOD_TLS_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_2_SERVER } php_stream_xport_crypt_method_t; BEGIN_EXTERN_C() From e3c7b487099f317378cc747aea4dbe044f7faba8 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 08:16:00 +0200 Subject: [PATCH 0111/1256] consolidate NEWS with 5.4 --- NEWS | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 6649a4965acf9..b70bdcc71b98a 100644 --- a/NEWS +++ b/NEWS @@ -2,22 +2,23 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.5.5 -- Buildsystem: - . Fixed bug #51076 (race condition in shtool's mkdir -p implementation). - (Mike, Raphael Geissert) - - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). (Nikita) + . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) . Fixed bug #65821 (By-ref foreach on property access of string offset segfaults). (Nikita) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) + . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer + encoding). (Felipe) . Added application/pdf to PHP CLI Web Server mime types (Chris Jones) - Datetime: + . Fixed bug #64157 (DateTime::createFromFormat() reports confusing error + message). (Boro Sitnikovski) . Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime). (Boro Sitnikovski) . Fixed bug #65548 (Comparison for DateTimeImmutable doesn't work). @@ -27,6 +28,14 @@ PHP NEWS . Fixed bug #65708 (dba functions cast $key param to string in-place, bypassing copy on write). (Adam) +- Filter: + . Add RFC 6598 IPs to reserved addresses. (Sebastian Nohn) + . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). + (Syra) + +- FTP: + . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) + - GD . Ensure that the defined interpolation method is used with the generic scaling methods. (Pierre) @@ -45,10 +54,29 @@ PHP NEWS . Fixed issue #135 (segfault in interned strings if initial memory is too low). (Julien) +- Sockets: + . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). + (Mike) + - SPL: . Fix bug #64782 (SplFileObject constructor make $context optional / give it a default value). (Nikita) +- Standard: + . Fixed bug #61548 (content-type must appear at the end of headers for 201 + Location to work in http). (Mike) + +- XMLReader: + . Fixed bug #51936 (Crash with clone XMLReader). (Mike) + . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) + +- Build system: + . Fixed bug #51076 (race condition in shtool's mkdir -p implementation). + (Mike, Raphael Geissert) + . Fixed bug #62396 ('make test' crashes starting with 5.3.14 (missing + gzencode())). (Mike) + + 19 Sep 2013, PHP 5.5.4 - Core: @@ -59,6 +87,7 @@ PHP NEWS DTRACE_FUNCTION_*). (Chris Jones) . Fixed bug #65483 (quoted-printable encode stream filter incorrectly encoding spaces). (Michael M Slusarz) + . Fixed bug #65481 (shutdown segfault due to serialize) (Mike) . Fixed bug #65470 (Segmentation fault in zend_error() with --enable-dtrace). (Chris Jones, Kris Van Hees) . Fixed bug #65225 (PHP_BINARY incorrectly set). (Patrick Allaert) @@ -85,6 +114,10 @@ PHP NEWS . Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in some cases). (Mark Jones) +- PDO: + . Fixed bug #64953 (Postgres prepared statement positional parameter + casting). (Mike) + - Session: . Fixed bug #65475 (Session ID is not initialized properly when strict session is enabled). (Yasuo) @@ -95,6 +128,10 @@ PHP NEWS . Fix issue with return types of password API helper functions. Found via static analysis by cjones. (Anthony Ferrara) +- Zlib: + . Fixed bug #65391 (Unable to send vary header user-agent when + ob_start('ob_gzhandler') is called) (Mike) + 22 Aug 2013, PHP 5.5.3 - Openssl: From 1815942f53a976555e9cb60ac3ce2425142d1cb1 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 08:22:33 +0200 Subject: [PATCH 0112/1256] Thanks Daniel, I didn't think long enough --- UPGRADING | 5 ----- 1 file changed, 5 deletions(-) diff --git a/UPGRADING b/UPGRADING index 238aa5ea41a9c..b19c3dd5410e5 100755 --- a/UPGRADING +++ b/UPGRADING @@ -113,11 +113,6 @@ PHP X.Y UPGRADE NOTES 9. New Global Constants ======================================== -- Openssl: - . STREAM_CRYPTO_METHOD_SSLv2_CLIENT - . STREAM_CRYPTO_METHOD_SSLv3_CLIENT - . STREAM_CRYPTO_METHOD_SSLv23_CLIENT - . STREAM_CRYPTO_METHOD_TLS_CLIENT ======================================== 10. Changes to INI File Handling From b026993a74f452c5f6a689124b4ad4d7b3ac2491 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Mon, 7 Oct 2013 15:02:48 -0400 Subject: [PATCH 0113/1256] Fixed segfault when built with OpenSSL >= 1.0.1 (PR #481) --- ext/openssl/openssl.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index f1dfa5024ae95..a2cdfb5c1649a 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4613,9 +4613,6 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ GET_VER_OPT_STRING("local_cert", certfile); if (certfile) { - X509 *cert = NULL; - EVP_PKEY *key = NULL; - SSL *tmpssl; char resolved_path_buff[MAXPATHLEN]; const char * private_key = NULL; @@ -4642,7 +4639,11 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ } } - tmpssl = SSL_new(ctx); +#if OPENSSL_VERSION_NUMBER < 0x10001001L + /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ + X509 *cert = NULL; + EVP_PKEY *key = NULL; + SSL *tmpssl = SSL_new(ctx); cert = SSL_get_certificate(tmpssl); if (cert) { @@ -4651,7 +4652,7 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ EVP_PKEY_free(key); } SSL_free(tmpssl); - +#endif if (!SSL_CTX_check_private_key(ctx)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Private key does not match certificate!"); } From 22700890d4c332b76866c73a5a68c76f601257a6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 12:30:31 +0200 Subject: [PATCH 0114/1256] C89 compatibility --- ext/openssl/openssl.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a2cdfb5c1649a..26792e2428822 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4640,18 +4640,20 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ } #if OPENSSL_VERSION_NUMBER < 0x10001001L - /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ - X509 *cert = NULL; - EVP_PKEY *key = NULL; - SSL *tmpssl = SSL_new(ctx); - cert = SSL_get_certificate(tmpssl); - - if (cert) { - key = X509_get_pubkey(cert); - EVP_PKEY_copy_parameters(key, SSL_get_privatekey(tmpssl)); - EVP_PKEY_free(key); - } - SSL_free(tmpssl); + do { + /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ + X509 *cert = NULL; + EVP_PKEY *key = NULL; + SSL *tmpssl = SSL_new(ctx); + cert = SSL_get_certificate(tmpssl); + + if (cert) { + key = X509_get_pubkey(cert); + EVP_PKEY_copy_parameters(key, SSL_get_privatekey(tmpssl)); + EVP_PKEY_free(key); + } + SSL_free(tmpssl); + } while (0); #endif if (!SSL_CTX_check_private_key(ctx)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Private key does not match certificate!"); From a40dd6e963e35ecc0708eebaa22a63700ade69e3 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Wed, 9 Oct 2013 09:55:36 -0400 Subject: [PATCH 0115/1256] Changed return types to zend_bool, renamed test --- ext/openssl/openssl.c | 19 +++++++++++-------- ...r-matching.phpt => san_peer_matching.phpt} | 0 2 files changed, 11 insertions(+), 8 deletions(-) rename ext/openssl/tests/{san-peer-matching.phpt => san_peer_matching.phpt} (100%) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c77405762304b..43b3e0cadd285 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4951,7 +4951,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ -static int matches_wildcard_name(const char *subjectname, const char *certname) +static zend_bool matches_wildcard_name(const char *subjectname, const char *certname) { char *wildcard; int prefix_len, suffix_len, subject_len; @@ -4983,10 +4983,12 @@ static int matches_wildcard_name(const char *subjectname, const char *certname) return 0; } -static int matches_san_list(X509 *peer, const char *subject_name) +static zend_bool matches_san_list(X509 *peer, const char *subject_name) { - int is_match, i; + int i; + zend_bool is_match = 0; unsigned char *cert_name; + GENERAL_NAMES *alt_names = X509_get_ext_d2i(peer, NID_subject_alt_name, 0, 0); int alt_name_count = sk_GENERAL_NAME_num(alt_names); @@ -5007,25 +5009,26 @@ static int matches_san_list(X509 *peer, const char *subject_name) return is_match; } -static int matches_common_name(X509 *peer, const char *subject_name) +static zend_bool matches_common_name(X509 *peer, const char *subject_name) { char buf[1024]; X509_NAME *cert_name; + zend_bool is_match = 0; + cert_name = X509_get_subject_name(peer); int cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); if (cert_name_len == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); - return 0; } else if (cert_name_len != strlen(buf)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' is malformed", cert_name_len, buf); - return 0; } else if (matches_wildcard_name(subject_name, buf)) { - return 1; + is_match = 1; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", cert_name_len, buf, subject_name); - return 0; } + + return is_match; } int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ diff --git a/ext/openssl/tests/san-peer-matching.phpt b/ext/openssl/tests/san_peer_matching.phpt similarity index 100% rename from ext/openssl/tests/san-peer-matching.phpt rename to ext/openssl/tests/san_peer_matching.phpt From e2d123a72092cf010209607d6aa504cfda743e75 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 17:16:25 +0200 Subject: [PATCH 0116/1256] C89 --- ext/openssl/openssl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 4bacfb7d0347a..952bd75927ff5 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -5014,9 +5014,10 @@ static zend_bool matches_common_name(X509 *peer, const char *subject_name) char buf[1024]; X509_NAME *cert_name; zend_bool is_match = 0; + int cert_name_len; cert_name = X509_get_subject_name(peer); - int cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); + cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); if (cert_name_len == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); From 141c2cb97aa1ce682d97704249ec23067bd1b89a Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 9 Oct 2013 12:17:11 -0700 Subject: [PATCH 0117/1256] Re-enable OCI8 DLL builds with Oracle 10g & 11g client libraries on Windows, in addition to Oracle 12c. From discussions with Anatol & Pierre this seems to be the most direct way for the Windows PECL build scripts to automatically create links to the generated DLLs. The issue is that the name php_oci8_12c.dll doesn't match the package name. In the far future when php_oci8.dll (with Oracle 10g) is no longer built then another Windows PECL packaging fix will be needed. --- ext/oci8/config.w32 | 91 ++++++++++++++++++++++++++++++++++++++++++++ ext/oci8/package.xml | 3 ++ 2 files changed, 94 insertions(+) diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index 750f163950cc9..d83bf3fbdb7d5 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -1,6 +1,97 @@ // $Id$ // vim:ft=javascript +if (PHP_OCI8 != "no" && PHP_OCI8_11G != "no") { + if (!PHP_OCI8_SHARED && !PHP_OCI8_11G_SHARED) { + WARNING("oci8 and oci8-11g provide the same extension and cannot both be built statically"); + PHP_OCI8 = "no" + } +} + +if (PHP_OCI8 != "no" && PHP_OCI8_12C != "no") { + if (!PHP_OCI8_SHARED && !PHP_OCI8_12C_SHARED) { + WARNING("oci8 and oci8-12c provide the same extension and cannot both be built statically"); + PHP_OCI8 = "no" + } +} + +if (PHP_OCI8_11G != "no" && PHP_OCI8_12C != "no") { + if (!PHP_OCI8_11G_SHARED && !PHP_OCI8_12C_SHARED) { + WARNING("oci8-11g and oci8-12c provide the same extension and cannot both be built statically"); + PHP_OCI8_11G = "no" + } +} + +ARG_WITH("oci8", "OCI8 support", "no"); + +if (PHP_OCI8 != "no") { + + oci8_dirs = new Array( + PHP_OCI8 + ); + + oci8_lib_paths = ""; + oci8_inc_paths = ""; + + // find the Oracle install + for (i = 0; i < oci8_dirs.length; i++) { + oci8_lib_paths += oci8_dirs[i] + "\\lib;"; + oci8_lib_paths += oci8_dirs[i] + "\\lib\\msvc;"; + oci8_inc_paths += oci8_dirs[i] + "\\include;"; + } + + oci8_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient;" + oci8_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient;"; + + if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8", oci8_inc_paths) && + CHECK_LIB("oci.lib", "oci8", oci8_lib_paths)) + { + EXTENSION('oci8', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c'); + + AC_DEFINE('HAVE_OCI8', 1); + AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); + + } else { + WARNING("oci8 not enabled: Oracle Database client libraries or Oracle 10g Instant Client not found"); + PHP_OCI8 = "no" + } +} + +ARG_WITH("oci8-11g", "OCI8 support using Oracle 11g Instant Client", "no"); + +if (PHP_OCI8_11G != "no") { + + oci8_11g_dirs = new Array( + PHP_OCI8_11G + ); + + oci8_11g_lib_paths = ""; + oci8_11g_inc_paths = ""; + + // find the Oracle install + for (i = 0; i < oci8_11g_dirs.length; i++) { + oci8_11g_lib_paths += oci8_11g_dirs[i] + "\\lib;"; + oci8_11g_lib_paths += oci8_11g_dirs[i] + "\\lib\\msvc;"; + oci8_11g_inc_paths += oci8_11g_dirs[i] + "\\include;"; + } + + oci8_11g_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_11;" + oci8_11g_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_11;"; + + if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8_11G", oci8_11g_inc_paths) && + CHECK_LIB("oci.lib", "oci8_11g", oci8_11g_lib_paths)) + { + EXTENSION('oci8_11g', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c', null, null, null, "ext\\oci8_11g") + + AC_DEFINE('HAVE_OCI8', 1); + AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); + + } else { + WARNING("oci8-11g not enabled: Oracle Database client libraries or Oracle 11g Instant Client not found"); + PHP_OCI8_11G = "no" + } +} + ARG_WITH("oci8-12c", "OCI8 support using Oracle Database 12c Instant Client", "no"); if (PHP_OCI8_12C != "no") { diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 47e5415aa8394..d85faf046c970 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -60,6 +60,9 @@ Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle client library 10.2 (Note this will connect to Oracle Database 8.1.7 onwards). Use the older OCI8 1.4 if an earlier PHP version or older Oracle client library support is necessary. + +Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL +linking works in the new Windows PECL infrastructure. From ef8cf76815e10db08d07897296c09b925a1511a1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 10 Oct 2013 15:32:30 +0400 Subject: [PATCH 0118/1256] Fixed bug #65845 (Error when Zend Opcache Optimizer is fully enabled). --- NEWS | 2 + ext/opcache/Optimizer/pass1_5.c | 130 ++---------------------- ext/opcache/Optimizer/zend_optimizer.c | 131 +++++++++++++++++++++++++ ext/opcache/tests/bug65845.phpt | 14 +++ 4 files changed, 154 insertions(+), 123 deletions(-) create mode 100644 ext/opcache/tests/bug65845.phpt diff --git a/NEWS b/NEWS index b70bdcc71b98a..9436fe98835b2 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,8 @@ PHP NEWS . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) + . Fixed bug #65845 (Error when Zend Opcache Optimizer is fully enabled). + (Dmitry) . Fixed bug #65665 (Exception not properly caught when opcache enabled). (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 795b954173e7b..70ec6d5e2ec11 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -37,7 +37,6 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC) = get_binary_op(opline->opcode); zend_uint tv = ZEND_RESULT(opline).var; /* temporary variable */ zval result; - zend_op *tmp_opline; int er; if (opline->opcode == ZEND_DIV && @@ -61,95 +60,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { literal_dtor(&ZEND_OP2_LITERAL(opline)); MAKE_NOP(opline); - /* substitute the following TMP_VAR usage with constant */ - for (tmp_opline = opline + 1; tmp_opline < end; tmp_opline++) { - if (ZEND_OP1_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP1(tmp_opline).var == tv) { - if (tmp_opline->opcode == ZEND_FREE) { - MAKE_NOP(tmp_opline); - zval_dtor(&result); - } else { - ZEND_OP1_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op1.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); - if (Z_TYPE(result) == IS_STRING) { - Z_HASH_P(&ZEND_OP1_LITERAL(tmp_opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(tmp_opline)), Z_STRLEN(ZEND_OP1_LITERAL(tmp_opline)) + 1); - if (tmp_opline->opcode == ZEND_INIT_STATIC_METHOD_CALL || - tmp_opline->opcode == ZEND_DO_FCALL || - tmp_opline->opcode == ZEND_CATCH || - tmp_opline->opcode == ZEND_FETCH_CONSTANT) { - op_array->literals[tmp_opline->op1.constant].cache_slot = op_array->last_cache_slot++; - } - } -#else - ZEND_OP1_LITERAL(tmp_opline) = result; -#endif - } - /* TMP_VAR my be used only once */ - break; - } - if (ZEND_OP2_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP2(tmp_opline).var == tv) { - ZEND_OP2_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op2.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); - if (Z_TYPE(result) == IS_STRING) { - Z_HASH_P(&ZEND_OP2_LITERAL(tmp_opline)) = zend_hash_func(Z_STRVAL(ZEND_OP2_LITERAL(tmp_opline)), Z_STRLEN(ZEND_OP2_LITERAL(tmp_opline)) + 1); - if (tmp_opline->opcode == ZEND_FETCH_R || - tmp_opline->opcode == ZEND_FETCH_W || - tmp_opline->opcode == ZEND_FETCH_RW || - tmp_opline->opcode == ZEND_FETCH_IS || - tmp_opline->opcode == ZEND_FETCH_UNSET || - tmp_opline->opcode == ZEND_FETCH_FUNC_ARG || - tmp_opline->opcode == ZEND_FETCH_CLASS || - tmp_opline->opcode == ZEND_INIT_FCALL_BY_NAME || - tmp_opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME || - tmp_opline->opcode == ZEND_UNSET_VAR || - tmp_opline->opcode == ZEND_ISSET_ISEMPTY_VAR || - tmp_opline->opcode == ZEND_ADD_INTERFACE || - tmp_opline->opcode == ZEND_ADD_TRAIT) { - op_array->literals[tmp_opline->op2.constant].cache_slot = op_array->last_cache_slot++; - } else if (tmp_opline->opcode == ZEND_INIT_METHOD_CALL || - tmp_opline->opcode == ZEND_INIT_STATIC_METHOD_CALL || - tmp_opline->opcode == ZEND_FETCH_CONSTANT || - tmp_opline->opcode == ZEND_ASSIGN_OBJ || - tmp_opline->opcode == ZEND_FETCH_OBJ_R || - tmp_opline->opcode == ZEND_FETCH_OBJ_W || - tmp_opline->opcode == ZEND_FETCH_OBJ_RW || - tmp_opline->opcode == ZEND_FETCH_OBJ_IS || - tmp_opline->opcode == ZEND_FETCH_OBJ_UNSET || - tmp_opline->opcode == ZEND_FETCH_OBJ_FUNC_ARG || - tmp_opline->opcode == ZEND_UNSET_OBJ || - tmp_opline->opcode == ZEND_PRE_INC_OBJ || - tmp_opline->opcode == ZEND_PRE_DEC_OBJ || - tmp_opline->opcode == ZEND_POST_INC_OBJ || - tmp_opline->opcode == ZEND_POST_DEC_OBJ || - tmp_opline->opcode == ZEND_ISSET_ISEMPTY_PROP_OBJ) { - op_array->literals[tmp_opline->op2.constant].cache_slot = op_array->last_cache_slot; - op_array->last_cache_slot += 2; - } else if (tmp_opline->opcode == ZEND_ASSIGN_ADD || - tmp_opline->opcode == ZEND_ASSIGN_SUB || - tmp_opline->opcode == ZEND_ASSIGN_MUL || - tmp_opline->opcode == ZEND_ASSIGN_DIV || - tmp_opline->opcode == ZEND_ASSIGN_MOD || - tmp_opline->opcode == ZEND_ASSIGN_SL || - tmp_opline->opcode == ZEND_ASSIGN_SR || - tmp_opline->opcode == ZEND_ASSIGN_CONCAT || - tmp_opline->opcode == ZEND_ASSIGN_BW_OR || - tmp_opline->opcode == ZEND_ASSIGN_BW_AND || - tmp_opline->opcode == ZEND_ASSIGN_BW_XOR) { - if (tmp_opline->extended_value == ZEND_ASSIGN_OBJ) { - op_array->literals[tmp_opline->op2.constant].cache_slot = op_array->last_cache_slot; - op_array->last_cache_slot += 2; - } - } - } -#else - ZEND_OP2_LITERAL(tmp_opline) = result; -#endif - break; - } - } + replace_tmp_by_const(op_array, opline + 1, tv, &result TSRMLS_CC); } break; @@ -159,6 +70,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { opline->extended_value != IS_OBJECT && opline->extended_value != IS_RESOURCE) { /* cast of constant operand */ + zend_uint tv = ZEND_RESULT(opline).var; /* temporary variable */ zval res; res = ZEND_OP1_LITERAL(opline); zval_copy_ctor(&res); @@ -179,11 +91,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { convert_to_string(&res); break; } + literal_dtor(&ZEND_OP1_LITERAL(opline)); - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - ZEND_OP1_LITERAL(opline) = res; - SET_UNUSED(opline->op2); + MAKE_NOP(opline); + + replace_tmp_by_const(op_array, opline + 1, tv, &res TSRMLS_CC); } else if (opline->extended_value == IS_BOOL) { /* T = CAST(X, IS_BOOL) => T = BOOL(X) */ opline->opcode = ZEND_BOOL; @@ -197,7 +109,6 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { /* unary operation on constant operand */ unary_op_type unary_op = get_unary_op(opline->opcode); zval result; - zend_op *tmp_opline; zend_uint tv = ZEND_RESULT(opline).var; /* temporary variable */ int er; @@ -218,34 +129,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { literal_dtor(&ZEND_OP1_LITERAL(opline)); MAKE_NOP(opline); - /* substitute the following TMP_VAR usage with constant */ - for (tmp_opline = opline + 1; tmp_opline < end; tmp_opline++) { - if (ZEND_OP1_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP1(tmp_opline).var == tv) { - if (tmp_opline->opcode == ZEND_FREE) { - MAKE_NOP(tmp_opline); - zval_dtor(&result); - } else { - ZEND_OP1_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op1.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); -#else - ZEND_OP1_LITERAL(tmp_opline) = result; -#endif - } - break; - } - if (ZEND_OP2_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP2(tmp_opline).var == tv) { - ZEND_OP2_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op2.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); -#else - ZEND_OP2_LITERAL(tmp_opline) = result; -#endif - break; - } - } + replace_tmp_by_const(op_array, opline + 1, tv, &result TSRMLS_CC); } break; diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 1f411d5da8073..28085cb441e22 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -110,6 +110,137 @@ int zend_optimizer_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC #endif +static void replace_tmp_by_const(zend_op_array *op_array, + zend_op *opline, + zend_uint var, + zval *val + TSRMLS_DC) +{ + zend_op *end = op_array->opcodes + op_array->last; + + while (opline < end) { + if (ZEND_OP1_TYPE(opline) == IS_TMP_VAR && + ZEND_OP1(opline).var == var) { + + if (opline->opcode == ZEND_FREE) { + MAKE_NOP(opline); + zval_dtor(val); + } else { + ZEND_OP1_TYPE(opline) = IS_CONST; +#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO + if (Z_TYPE_P(val) == IS_STRING) { + switch (opline->opcode) { + case ZEND_INIT_STATIC_METHOD_CALL: + case ZEND_CATCH: + case ZEND_FETCH_CONSTANT: + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1); + op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++; + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + zend_optimizer_add_literal(op_array, val TSRMLS_CC); + op_array->literals[opline->op1.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op1.constant+1].constant), Z_STRLEN(op_array->literals[opline->op1.constant+1].constant) + 1); + break; + case ZEND_DO_FCALL: + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1); + op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++; + break; + default: + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1); + break; + } + } else { + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + } +#else + ZEND_OP1_LITERAL(opline) = *val; +#endif + } + /* TMP_VAR my be used only once */ + break; + } + + if (ZEND_OP2_TYPE(opline) == IS_TMP_VAR && + ZEND_OP2(opline).var == var) { + + ZEND_OP2_TYPE(opline) = IS_CONST; +#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO + opline->op2.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + if (Z_TYPE_P(val) == IS_STRING) { + Z_HASH_P(&ZEND_OP2_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)) + 1); + switch (opline->opcode) { + case ZEND_FETCH_R: + case ZEND_FETCH_W: + case ZEND_FETCH_RW: + case ZEND_FETCH_IS: + case ZEND_FETCH_UNSET: + case ZEND_FETCH_FUNC_ARG: + case ZEND_FETCH_CLASS: + case ZEND_INIT_FCALL_BY_NAME: + /*case ZEND_INIT_NS_FCALL_BY_NAME:*/ + case ZEND_UNSET_VAR: + case ZEND_ISSET_ISEMPTY_VAR: + case ZEND_ADD_INTERFACE: + case ZEND_ADD_TRAIT: + op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot++; + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + zend_optimizer_add_literal(op_array, val TSRMLS_CC); + op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1); + break; + case ZEND_INIT_METHOD_CALL: + case ZEND_INIT_STATIC_METHOD_CALL: + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + zend_optimizer_add_literal(op_array, val TSRMLS_CC); + op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1); + /* break missing intentionally */ + /*case ZEND_FETCH_CONSTANT:*/ + case ZEND_ASSIGN_OBJ: + case ZEND_FETCH_OBJ_R: + case ZEND_FETCH_OBJ_W: + case ZEND_FETCH_OBJ_RW: + case ZEND_FETCH_OBJ_IS: + case ZEND_FETCH_OBJ_UNSET: + case ZEND_FETCH_OBJ_FUNC_ARG: + case ZEND_UNSET_OBJ: + case ZEND_PRE_INC_OBJ: + case ZEND_PRE_DEC_OBJ: + case ZEND_POST_INC_OBJ: + case ZEND_POST_DEC_OBJ: + case ZEND_ISSET_ISEMPTY_PROP_OBJ: + op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot; + op_array->last_cache_slot += 2; + break; + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + if (opline->extended_value == ZEND_ASSIGN_OBJ) { + op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot; + op_array->last_cache_slot += 2; + } + break; + default: + break; + } + } +#else + ZEND_OP2_LITERAL(opline) = *val; +#endif + break; + } + opline++; + } +} + #include "Optimizer/nop_removal.c" #include "Optimizer/block_pass.c" #include "Optimizer/optimize_temp_vars_5.c" diff --git a/ext/opcache/tests/bug65845.phpt b/ext/opcache/tests/bug65845.phpt new file mode 100644 index 0000000000000..2ae5f3974ae93 --- /dev/null +++ b/ext/opcache/tests/bug65845.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #65845 (Error when Zend Opcache Optimizer is fully enabled) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(4) "tutu" From 5ae8c51e688060d0a3263b67ff9fb24ba2c8c1d2 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 10 Oct 2013 13:38:38 -0700 Subject: [PATCH 0119/1256] OCI8: sync README and package.xml descriptions --- ext/oci8/README | 21 ++++++++++++++------- ext/oci8/package.xml | 20 +++++++++++--------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ext/oci8/README b/ext/oci8/README index af5beeb5c0745..d662072743fd1 100644 --- a/ext/oci8/README +++ b/ext/oci8/README @@ -1,13 +1,20 @@ The OCI8 Extension ------------------ -Use the OCI8 extension to access Oracle Database. +Use the OCI8 extension to access Oracle Database. Documentation is at http://php.net/oci8 -The extension can be built with PHP versions 4.3.9 to 5.x using Oracle -Database 9.2, 10, 11 or 12 client libraries. Oracle's standard -cross-version connectivity applies. For example PHP linked with -Oracle 11.2 client libraries can connect to Oracle Database 9.2 -onwards. See Oracle's note "Oracle Client / Server Interoperability -Support" (ID 207303.1) for details. +The extension can be linked with Oracle client libraries from Oracle +Database 10.2, 11, or 12.1. These libraries are found in the database +installation, or in the free Oracle Instant Client available from +Oracle. + +Oracle's standard cross-version connectivity applies. For example, +PHP OCI8 linked with Instant Client 11.2 can connect to Oracle +Database 9.2 onward. See Oracle's note "Oracle Client / Server +Interoperability Support" (ID 207303.1) for details. + +PHP OCI8 2.0 can be built with PHP 5.2 onward. Use the older PHP OCI8 +1.4.10 when using PHP 4.3.9 through to PHP 5.1.x, or when only Oracle +Database 9.2 client libraries are available. diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index d85faf046c970..f61def59c9851 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -8,15 +8,17 @@ http://pear.php.net/dtd/package-2.0.xsd"> Extension for Oracle Database -The PHP OCI8 extension gives access to Oracle Database. The extension -can be linked with Oracle client libraries from Oracle Database 10.2, -11, or 12.1. These libraries are found in the database installation, -or in the free Oracle Instant Client. Oracle's standard cross-version -connectivity applies. For example, PHP OCI8 linked with Instant -Client 11.2 can connect to Oracle Database 9.2 onwards. PHP OCI8 2.0 -can be built with PHP 5.2 onwards. Use the older PHP OCI8 1.4.10 when -using PHP 4.3.9 through to PHP 5.1.x, or when only Oracle Database 9.2 -client libraries are available. +Use the OCI8 extension to access Oracle Database. The extension can +be linked with Oracle client libraries from Oracle Database 10.2, 11, +or 12.1. These libraries are found in the database installation, or +in the free Oracle Instant Client available from Oracle. Oracle's +standard cross-version connectivity applies. For example, PHP OCI8 +linked with Instant Client 11.2 can connect to Oracle Database 9.2 +onward. See Oracle's note "Oracle Client / Server Interoperability +Support" (ID 207303.1) for details. PHP OCI8 2.0 can be built with +PHP 5.2 onward. Use the older PHP OCI8 1.4.10 when using PHP 4.3.9 +through to PHP 5.1.x, or when only Oracle Database 9.2 client +libraries are available. Christopher Jones From 7f3b5b77cca19b6e9c80a58abc93733cd52eaaaf Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Fri, 11 Oct 2013 10:32:40 -0600 Subject: [PATCH 0120/1256] Standardized usage of zpp_none and the order of the comparison zpp(...) == FAILURE --- ext/spl/spl_dllist.c | 14 +++++++------- ext/spl/spl_fixedarray.c | 14 +++++++------- ext/spl/spl_heap.c | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 273bc7506aa74..d5a9f83ae1411 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -603,7 +603,7 @@ SPL_METHOD(SplDoublyLinkedList, pop) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -626,7 +626,7 @@ SPL_METHOD(SplDoublyLinkedList, shift) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -649,7 +649,7 @@ SPL_METHOD(SplDoublyLinkedList, top) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -672,7 +672,7 @@ SPL_METHOD(SplDoublyLinkedList, bottom) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -695,7 +695,7 @@ SPL_METHOD(SplDoublyLinkedList, count) long count; spl_dllist_object *intern = (spl_dllist_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -710,7 +710,7 @@ SPL_METHOD(SplDoublyLinkedList, isEmpty) { long count; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -750,7 +750,7 @@ SPL_METHOD(SplDoublyLinkedList, getIteratorMode) { spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 86a5371ed30d3..8624b35a4b616 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -583,7 +583,7 @@ SPL_METHOD(SplFixedArray, __construct) spl_fixedarray_object *intern; long size = 0; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &size)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &size) == FAILURE) { return; } @@ -613,7 +613,7 @@ SPL_METHOD(SplFixedArray, __wakeup) HashTable *intern_ht = zend_std_get_properties(getThis() TSRMLS_CC); zval **data; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -643,7 +643,7 @@ SPL_METHOD(SplFixedArray, count) zval *object = getThis(); spl_fixedarray_object *intern; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -661,7 +661,7 @@ SPL_METHOD(SplFixedArray, toArray) { spl_fixedarray_object *intern; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -693,7 +693,7 @@ SPL_METHOD(SplFixedArray, fromArray) int num; zend_bool save_indexes = 1; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &data, &save_indexes)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &data, &save_indexes) == FAILURE) { return; } @@ -777,7 +777,7 @@ SPL_METHOD(SplFixedArray, getSize) zval *object = getThis(); spl_fixedarray_object *intern; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -797,7 +797,7 @@ SPL_METHOD(SplFixedArray, setSize) spl_fixedarray_object *intern; long size; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size) == FAILURE) { return; } diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index cb1f68dcf1196..77b31c06dcdc7 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -587,7 +587,7 @@ SPL_METHOD(SplHeap, count) long count; spl_heap_object *intern = (spl_heap_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -602,7 +602,7 @@ SPL_METHOD(SplHeap, isEmpty) { spl_heap_object *intern = (spl_heap_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -643,7 +643,7 @@ SPL_METHOD(SplHeap, extract) zval *value; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -705,7 +705,7 @@ SPL_METHOD(SplPriorityQueue, extract) zval *value, *value_out, **value_out_pp; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -748,7 +748,7 @@ SPL_METHOD(SplPriorityQueue, top) zval *value, **value_out; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -802,7 +802,7 @@ SPL_METHOD(SplHeap, recoverFromCorruption) { spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -835,7 +835,7 @@ SPL_METHOD(SplHeap, top) zval *value; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } From 73c44d6e6adcaefe64bbeb69de07741e93905d48 Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Fri, 11 Oct 2013 10:13:51 -0600 Subject: [PATCH 0121/1256] Fixed assumption that the temporary directory is located in /tmp --- sapi/cli/tests/upload_2G.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/cli/tests/upload_2G.phpt b/sapi/cli/tests/upload_2G.phpt index fe13d90007036..b8416ea730972 100644 --- a/sapi/cli/tests/upload_2G.phpt +++ b/sapi/cli/tests/upload_2G.phpt @@ -89,7 +89,7 @@ array(1) { ["type"]=> string(10) "text/plain" ["tmp_name"]=> - string(14) "/tmp/php%s" + string(%d) "%s" ["error"]=> int(0) ["size"]=> From 5c6dbc35e73a9dd6d6ffc8bb57c4b98a8918e008 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 12 Oct 2013 17:25:26 -0300 Subject: [PATCH 0122/1256] - Fixed resource leak --- ext/opcache/zend_accelerator_blacklist.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/zend_accelerator_blacklist.c b/ext/opcache/zend_accelerator_blacklist.c index da83cfd3119e1..eb0bc2146cd55 100644 --- a/ext/opcache/zend_accelerator_blacklist.c +++ b/ext/opcache/zend_accelerator_blacklist.c @@ -314,6 +314,7 @@ void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename) blacklist->entries[blacklist->pos].path = (char *)malloc(path_length + 1); if (!blacklist->entries[blacklist->pos].path) { zend_accel_error(ACCEL_LOG_ERROR, "malloc() failed\n"); + fclose(fp); return; } blacklist->entries[blacklist->pos].id = blacklist->pos; From 9d572437949689b51fcd7a90cdaba2af9f052598 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Wed, 9 Oct 2013 15:39:06 -0400 Subject: [PATCH 0123/1256] Fixes broken zts build (recent openssl changes) --- ext/openssl/openssl.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 952bd75927ff5..a52ade0e5ce17 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1672,7 +1672,7 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len) +static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len TSRMLS_DC) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; @@ -1699,13 +1699,13 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_boo return SUCCESS; } -static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected) +static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected TSRMLS_DC) { char *fingerprint; int fingerprint_len; int result = -1; - if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len) == SUCCESS) { + if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len TSRMLS_CC) == SUCCESS) { result = strcmp(expected, fingerprint); efree(fingerprint); } @@ -1713,7 +1713,7 @@ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char * return result; } -static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) +static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val TSRMLS_DC) { if (Z_TYPE_P(val) == IS_STRING) { const char *method = NULL; @@ -1728,7 +1728,7 @@ static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) break; } - return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_P(val)) == 0; + return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_P(val) TSRMLS_CC) == 0; } else if (Z_TYPE_P(val) == IS_ARRAY) { HashPosition pos; zval **current; @@ -1744,7 +1744,7 @@ static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) if (key_type == HASH_KEY_IS_STRING && Z_TYPE_PP(current) == IS_STRING - && php_x509_fingerprint_cmp(peer, key, Z_STRVAL_PP(current)) != 0 + && php_x509_fingerprint_cmp(peer, key, Z_STRVAL_PP(current) TSRMLS_CC) != 0 ) { return 0; } @@ -1776,7 +1776,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len) == SUCCESS) { + if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len TSRMLS_CC) == SUCCESS) { RETVAL_STRINGL(fingerprint, fingerprint_len, 0); } else { RETVAL_FALSE; @@ -5009,7 +5009,7 @@ static zend_bool matches_san_list(X509 *peer, const char *subject_name) return is_match; } -static zend_bool matches_common_name(X509 *peer, const char *subject_name) +static zend_bool matches_common_name(X509 *peer, const char *subject_name TSRMLS_DC) { char buf[1024]; X509_NAME *cert_name; @@ -5068,7 +5068,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre if (GET_VER_OPT("peer_fingerprint")) { if (Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) == IS_ARRAY) { - if (!php_x509_fingerprint_match(peer, *val)) { + if (!php_x509_fingerprint_match(peer, *val TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint doesn't match"); return FAILURE; } @@ -5082,7 +5082,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre if (cnmatch) { if (matches_san_list(peer, cnmatch)) { return SUCCESS; - } else if (matches_common_name(peer, cnmatch)) { + } else if (matches_common_name(peer, cnmatch TSRMLS_CC)) { return SUCCESS; } else { return FAILURE; From 960b4e81f316528fc554ec1bff7daf46faa7129f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 12 Oct 2013 18:06:20 -0300 Subject: [PATCH 0124/1256] - Fixed possible memory leak --- win32/readdir.c | 1 + 1 file changed, 1 insertion(+) diff --git a/win32/readdir.c b/win32/readdir.c index 9525fc0d6b499..0edd5764d4988 100644 --- a/win32/readdir.c +++ b/win32/readdir.c @@ -45,6 +45,7 @@ DIR *opendir(const char *dir) dp = (DIR *) malloc(sizeof(DIR)); if (dp == NULL) { + free(filespec); return NULL; } dp->offset = 0; From c092d286fc5bcf6875c96451aa230c2e144aeb77 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sun, 13 Oct 2013 15:52:39 +0100 Subject: [PATCH 0125/1256] Fix compiler warnings in openssl.c --- ext/openssl/openssl.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a52ade0e5ce17..a0495eaae53dd 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1602,7 +1602,7 @@ PHP_FUNCTION(openssl_spki_export_challenge) goto cleanup; } - RETVAL_STRING(ASN1_STRING_data(spki->spkac->challenge), 1); + RETVAL_STRING((char *) ASN1_STRING_data(spki->spkac->challenge), 1); goto cleanup; cleanup: @@ -1676,7 +1676,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_boo { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; - int n; + unsigned int n; if (!(mdtype = EVP_get_digestbyname(method))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); @@ -1688,7 +1688,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_boo if (raw) { *out_len = n; - *out = estrndup(md, n); + *out = estrndup((char *) md, n); } else { *out_len = n * 2; *out = emalloc(*out_len + 1); @@ -4916,14 +4916,12 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ { php_stream *stream; SSL *ssl; - X509 *err_cert; int err, depth, ret; zval **val; ret = preverify_ok; /* determine the status for the current cert */ - err_cert = X509_STORE_CTX_get_current_cert(ctx); err = X509_STORE_CTX_get_error(ctx); depth = X509_STORE_CTX_get_error_depth(ctx); @@ -4997,7 +4995,7 @@ static zend_bool matches_san_list(X509 *peer, const char *subject_name) if (GEN_DNS == san->type) { ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); - is_match = matches_wildcard_name(subject_name, cert_name); + is_match = matches_wildcard_name(subject_name, (char *) cert_name); OPENSSL_free(cert_name); } From 7a038ccbe61c88b007a3a3ba1580185058792e91 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 14:18:43 +0200 Subject: [PATCH 0126/1256] fixed skeleton to produce the normalized ext version macros See http://news.php.net/php.pecl.dev/11191 for more info. --- ext/skeleton/php_skeleton.h | 2 ++ ext/skeleton/skeleton.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/skeleton/php_skeleton.h b/ext/skeleton/php_skeleton.h index 495907bbd16ed..0716ae05e6241 100644 --- a/ext/skeleton/php_skeleton.h +++ b/ext/skeleton/php_skeleton.h @@ -6,6 +6,8 @@ extern zend_module_entry extname_module_entry; #define phpext_extname_ptr &extname_module_entry +#define PHP_EXTNAME_VERSION "0.1.0" /* Replace with version number for your extension */ + #ifdef PHP_WIN32 # define PHP_EXTNAME_API __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c index ee4ea74e16866..2e373442d8dd1 100644 --- a/ext/skeleton/skeleton.c +++ b/ext/skeleton/skeleton.c @@ -41,7 +41,7 @@ zend_module_entry extname_module_entry = { PHP_RSHUTDOWN(extname), /* Replace with NULL if there's nothing to do at request end */ PHP_MINFO(extname), #if ZEND_MODULE_API_NO >= 20010901 - "0.1", /* Replace with version number for your extension */ + PHP_EXTNAME_VERSION, #endif STANDARD_MODULE_PROPERTIES }; From dcfd753104085d8337b8a5f4a21ce3b629ad4651 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 14:37:39 +0200 Subject: [PATCH 0127/1256] fixed skeleton to produce the normalized ext version macros See http://news.php.net/php.pecl.dev/11191 for more info. --- ext/skeleton/php_skeleton.h | 2 ++ ext/skeleton/skeleton.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/skeleton/php_skeleton.h b/ext/skeleton/php_skeleton.h index 86836c03e287a..d0ba6f04abea4 100644 --- a/ext/skeleton/php_skeleton.h +++ b/ext/skeleton/php_skeleton.h @@ -6,6 +6,8 @@ extern zend_module_entry extname_module_entry; #define phpext_extname_ptr &extname_module_entry +#define PHP_EXTNAME_VERSION "0.1.0" /* Replace with version number for your extension */ + #ifdef PHP_WIN32 # define PHP_EXTNAME_API __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c index b9a918806c810..462e48756ff07 100644 --- a/ext/skeleton/skeleton.c +++ b/ext/skeleton/skeleton.c @@ -142,7 +142,7 @@ zend_module_entry extname_module_entry = { PHP_RINIT(extname), /* Replace with NULL if there's nothing to do at request start */ PHP_RSHUTDOWN(extname), /* Replace with NULL if there's nothing to do at request end */ PHP_MINFO(extname), - "0.1", /* Replace with version number for your extension */ + PHP_EXTNAME_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */ From 9ccde8a41571282521c677edf2b481a526ae03c9 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 16:07:26 +0200 Subject: [PATCH 0128/1256] added notes about the PECL site conformity --- README.EXTENSIONS | 2 +- README.EXT_SKEL | 5 +++++ README.SELF-CONTAINED-EXTENSIONS | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.EXTENSIONS b/README.EXTENSIONS index 51e3b730e7de7..7f06c0fb1bc3c 100644 --- a/README.EXTENSIONS +++ b/README.EXTENSIONS @@ -30,7 +30,7 @@ zend_module_entry foo_module_entry = { PHP_RSHUTDOWN(foo), /* per-request shutdown function */ PHP_MINFO(foo), /* information function */ #if ZEND_MODULE_API_NO >= 20010901 - FOO_VERSION, /* extension version number (string) */ + PHP_FOO_VERSION, /* extension version number (string) */ #endif STANDARD_MODULE_PROPERTIES }; diff --git a/README.EXT_SKEL b/README.EXT_SKEL index b0db843a42ba0..d44fcc5c6a92c 100644 --- a/README.EXT_SKEL +++ b/README.EXT_SKEL @@ -31,6 +31,11 @@ HOW TO USE IT ./buildconf; ./configure --enable-module_name; make + The definition of PHP_MODULE_NAME_VERSION will be present in the + php_module_name.h and injected into the zend_module_entry definition. This + is required by the PECL website for the version string conformity checks + against package.xml + But if you already have planned the overall scheme of your module, what functions it will contain, their return types and the arguments they take (a very good idea) and don't want to bother yourself with creating function diff --git a/README.SELF-CONTAINED-EXTENSIONS b/README.SELF-CONTAINED-EXTENSIONS index e6a375331b4a5..5287230e1aea0 100644 --- a/README.SELF-CONTAINED-EXTENSIONS +++ b/README.SELF-CONTAINED-EXTENSIONS @@ -153,3 +153,18 @@ ADDING SHARED MODULE SUPPORT TO A MODULE #ifdef COMPILE_DL_FOO ZEND_GET_MODULE(foo) #endif + +PECL SITE CONFORMITY + + If you plan to release an extension to the PECL website, there are several + points to be regarded. + + 1. Add LICENSE or COPYING to the package.xml + + 2. The following should be defined in one of the extension header files + + #define PHP_FOO_VERSION "1.2.3" + + This macros has to be used within your foo_module_entry to indicate the + extension version. + From b0a36007abb522b6b1e3a6b3108eb726053b9d72 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 17:12:32 +0200 Subject: [PATCH 0129/1256] fix whitespaces --- README.EXTENSIONS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.EXTENSIONS b/README.EXTENSIONS index 7f06c0fb1bc3c..06d6cdd85f2e4 100644 --- a/README.EXTENSIONS +++ b/README.EXTENSIONS @@ -30,7 +30,7 @@ zend_module_entry foo_module_entry = { PHP_RSHUTDOWN(foo), /* per-request shutdown function */ PHP_MINFO(foo), /* information function */ #if ZEND_MODULE_API_NO >= 20010901 - PHP_FOO_VERSION, /* extension version number (string) */ + PHP_FOO_VERSION, /* extension version number (string) */ #endif STANDARD_MODULE_PROPERTIES }; From e23ad4eeb2249c18f11eee751611395cb845c010 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Mon, 14 Oct 2013 23:21:06 +0200 Subject: [PATCH 0130/1256] Add "Done" output to distinguish hard from soft failures --- Zend/tests/use_const/define_imported_before.phpt | 4 ++++ Zend/tests/use_function/define_imported_before.phpt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Zend/tests/use_const/define_imported_before.phpt b/Zend/tests/use_const/define_imported_before.phpt index 19374a2c5868b..f674ce81e8ec2 100644 --- a/Zend/tests/use_const/define_imported_before.phpt +++ b/Zend/tests/use_const/define_imported_before.phpt @@ -9,6 +9,10 @@ namespace { use const foo\bar; } +namespace { + echo "Done"; +} + ?> --EXPECTF-- Fatal error: Cannot use const foo\bar as bar because the name is already in use in %s on line %d diff --git a/Zend/tests/use_function/define_imported_before.phpt b/Zend/tests/use_function/define_imported_before.phpt index ff5d5ca28d364..91974e0783d15 100644 --- a/Zend/tests/use_function/define_imported_before.phpt +++ b/Zend/tests/use_function/define_imported_before.phpt @@ -9,6 +9,10 @@ namespace { use function foo\bar; } +namespace { + echo "Done"; +} + ?> --EXPECTF-- Fatal error: Cannot use function foo\bar as bar because the name is already in use in %s on line %d From 602fef0e52caacf754eacfb96e9342ce32d29a37 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Mon, 14 Oct 2013 23:32:11 +0200 Subject: [PATCH 0131/1256] Clarify type of use in error messages --- Zend/tests/use_const/conflicting_use.phpt | 2 +- Zend/tests/use_function/case_insensivity.phpt | 2 +- Zend/tests/use_function/conflicting_use.phpt | 2 +- Zend/zend_compile.c | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/tests/use_const/conflicting_use.phpt b/Zend/tests/use_const/conflicting_use.phpt index f873fdcc65304..3b3c4b3262e79 100644 --- a/Zend/tests/use_const/conflicting_use.phpt +++ b/Zend/tests/use_const/conflicting_use.phpt @@ -18,4 +18,4 @@ namespace { ?> --EXPECTF-- -Fatal error: Cannot use bar\baz as baz because the name is already in use in %s on line %d +Fatal error: Cannot use const bar\baz as baz because the name is already in use in %s on line %d diff --git a/Zend/tests/use_function/case_insensivity.phpt b/Zend/tests/use_function/case_insensivity.phpt index 53ae3658a9771..ba6e3a7e4b1b5 100644 --- a/Zend/tests/use_function/case_insensivity.phpt +++ b/Zend/tests/use_function/case_insensivity.phpt @@ -10,4 +10,4 @@ namespace { ?> --EXPECTF-- -Fatal error: Cannot use foo\BAR as BAR because the name is already in use in %s on line %d +Fatal error: Cannot use function foo\BAR as BAR because the name is already in use in %s on line %d diff --git a/Zend/tests/use_function/conflicting_use.phpt b/Zend/tests/use_function/conflicting_use.phpt index ed531e4febe0d..0221fbdebb38a 100644 --- a/Zend/tests/use_function/conflicting_use.phpt +++ b/Zend/tests/use_function/conflicting_use.phpt @@ -22,4 +22,4 @@ namespace { ?> --EXPECTF-- -Fatal error: Cannot use bar\baz as baz because the name is already in use in %s on line %d +Fatal error: Cannot use function bar\baz as baz because the name is already in use in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b811554812d49..9c238ac67cfb3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7220,10 +7220,10 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const } if (zend_hash_add(current_import_sub, lookup_name, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); } if (warn) { - zend_error(E_WARNING, "The use statement with non-compound name '%s' has no effect", Z_STRVAL_P(name)); + zend_error(E_WARNING, "The use %s statement with non-compound name '%s' has no effect", type, Z_STRVAL_P(name)); } efree(lookup_name); zval_dtor(name); From a2eacd8a2c417027fda4c19e54e2b6af9f1fa90d Mon Sep 17 00:00:00 2001 From: Paul Tarjan Date: Mon, 14 Oct 2013 23:54:59 -0700 Subject: [PATCH 0132/1256] fix typo in copy_variation16 test --- ext/standard/tests/file/copy_variation16-win32.phpt | 4 ++-- ext/standard/tests/file/copy_variation16.phpt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/tests/file/copy_variation16-win32.phpt b/ext/standard/tests/file/copy_variation16-win32.phpt index 7688f5eeabf86..d95d24adacb56 100644 --- a/ext/standard/tests/file/copy_variation16-win32.phpt +++ b/ext/standard/tests/file/copy_variation16-win32.phpt @@ -22,7 +22,7 @@ mkdir($base_dir); $sub_dir = $base_dir."/copy_variation16_sub"; mkdir($sub_dir); -$dirname_with_blank = $sub_dir."/copy variation6"; +$dirname_with_blank = $sub_dir."/copy variation16"; mkdir($dirname_with_blank); $src_file_name = dirname(__FILE__)."/copy_variation16.tmp"; @@ -139,6 +139,6 @@ Existence of destination file => bool(false) Size of source file => int(3500) Copy operation => bool(true) Existence of destination file => bool(true) -Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation6/copy_copy_variation16.tmp +Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation16/copy_copy_variation16.tmp Size of destination file => int(3500) *** Done *** diff --git a/ext/standard/tests/file/copy_variation16.phpt b/ext/standard/tests/file/copy_variation16.phpt index 9ad834bdb4192..e36fee1d666b7 100644 --- a/ext/standard/tests/file/copy_variation16.phpt +++ b/ext/standard/tests/file/copy_variation16.phpt @@ -22,7 +22,7 @@ mkdir($base_dir); $sub_dir = $base_dir."/copy_variation16_sub"; mkdir($sub_dir); -$dirname_with_blank = $sub_dir."/copy variation6"; +$dirname_with_blank = $sub_dir."/copy variation16"; mkdir($dirname_with_blank); $src_file_name = dirname(__FILE__)."/copy_variation16.tmp"; @@ -138,6 +138,6 @@ Size of destination file => int(3500) Size of source file => int(3500) Copy operation => bool(true) Existence of destination file => bool(true) -Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation6/copy_copy_variation16.tmp +Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation16/copy_copy_variation16.tmp Size of destination file => int(3500) *** Done *** From aa76f779ef76e15d40b3db68c14033cac5ef0637 Mon Sep 17 00:00:00 2001 From: Julien Pauli Date: Tue, 15 Oct 2013 16:11:11 +0200 Subject: [PATCH 0133/1256] 5.5.6 now --- NEWS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9436fe98835b2..a15204c05bde4 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 2013, PHP 5.5.5 +?? ??? 2013, PHP 5.5.6 + +17 Oct 2013, PHP 5.5.5 - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). From 8495d6303400edd9b84a6febd2a6b62b38e11c97 Mon Sep 17 00:00:00 2001 From: Andrea Faulds Date: Tue, 15 Oct 2013 20:42:31 +0000 Subject: [PATCH 0134/1256] Better test: Check combined leading/trailing --- ext/json/tests/bug64874_part1.phpt | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/ext/json/tests/bug64874_part1.phpt b/ext/json/tests/bug64874_part1.phpt index 4047eb895c1e5..6b79b8dc047ed 100644 --- a/ext/json/tests/bug64874_part1.phpt +++ b/ext/json/tests/bug64874_part1.phpt @@ -22,6 +22,24 @@ decode("true\t"); decode("true\n"); decode("true\r"); +// And so should the combination of both +decode(" true "); +decode(" true\t"); +decode(" true\n"); +decode(" true\r"); +decode("\ttrue "); +decode("\ttrue\t"); +decode("\ttrue\n"); +decode("\ttrue\r"); +decode("\ntrue "); +decode("\ntrue\t"); +decode("\ntrue\n"); +decode("\ntrue\r"); +decode("\rtrue "); +decode("\rtrue\t"); +decode("\rtrue\n"); +decode("\rtrue\r"); + echo "Done\n"; --EXPECT-- bool(true) @@ -48,4 +66,52 @@ bool(false) bool(true) bool(false) +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + +bool(true) +bool(false) + Done From 872ef919ca665d632d55410ef2ff066659af4769 Mon Sep 17 00:00:00 2001 From: Andrea Faulds Date: Tue, 15 Oct 2013 22:44:23 +0000 Subject: [PATCH 0135/1256] UPGRADING and NEWS --- NEWS | 4 ++++ UPGRADING | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/NEWS b/NEWS index fcf34c3fb9ec9..0fe7e6825af5a 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,10 @@ PHP NEWS - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) +- JSON + . Fixed whitespace part of bug #64874 ("json_decode handles whitespace and + case-sensitivity incorrectly") + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/UPGRADING b/UPGRADING index e6f582a4a8b13..edcaa17b30524 100755 --- a/UPGRADING +++ b/UPGRADING @@ -492,6 +492,16 @@ b. Extensions with changed behavior - the output of the tiger hash family has been corrected, see https://bugs.php.net/61307 + - JSON extension + - Fixed whitespace part of bug #64874 ("json_decode handles whitespace and + case-sensitivity incorrectly") + This means that leading and trailing whitespace when deserialising lone + JSON null, true, false, string and number values no longer causes an + error. Please note that this only applies to the deserialising of strings + containing only a null, true, false, string or number value. Leading and + trailing whitespace around and inside objects and arrays has never caused + an error. + =========================== 10. Changes in SAPI support =========================== From 4c0bb6d76eb0c8b9fdc74c3c8858a146ab34e2f8 Mon Sep 17 00:00:00 2001 From: bwoebi Date: Wed, 16 Oct 2013 16:04:23 +0200 Subject: [PATCH 0136/1256] Fixed bug #65911 ($this not usable as static property) In context of static accesses like classname::$this, the string "$this" should not be handled like a $this variable, but as an identifier for a static variable. --- NEWS | 4 ++++ Zend/tests/bug65911.phpt | 20 ++++++++++++++++++++ Zend/zend_compile.c | 1 + 3 files changed, 25 insertions(+) create mode 100644 Zend/tests/bug65911.phpt diff --git a/NEWS b/NEWS index fcf34c3fb9ec9..6c2c6ed13b5aa 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- Core: + . Fixed bug #65911 (scope resolution operator - strange behavior with $this). + (Bob Weinand) + - CLI server: . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding). (Felipe) diff --git a/Zend/tests/bug65911.phpt b/Zend/tests/bug65911.phpt new file mode 100644 index 0000000000000..b9f37b7bd6a45 --- /dev/null +++ b/Zend/tests/bug65911.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #65911 (scope resolution operator - strange behavior with $this) +--FILE-- +foo = 'bar'; + echo A::$this->foo; // should not output 'bar' + } +} + +$obj = new B(); +$obj->go(); +?> +--EXPECTF-- +Fatal error: Access to undeclared static property: A::$this in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 326d4ef976795..10390b04a8df0 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -905,6 +905,7 @@ static zend_bool opline_is_fetch_this(const zend_op *opline TSRMLS_DC) /* {{{ */ { if ((opline->opcode == ZEND_FETCH_W) && (opline->op1_type == IS_CONST) && (Z_TYPE(CONSTANT(opline->op1.constant)) == IS_STRING) + && ((opline->extended_value & ZEND_FETCH_STATIC_MEMBER) != ZEND_FETCH_STATIC_MEMBER) && (Z_HASH_P(&CONSTANT(opline->op1.constant)) == THIS_HASHVAL) && (Z_STRLEN(CONSTANT(opline->op1.constant)) == (sizeof("this")-1)) && !memcmp(Z_STRVAL(CONSTANT(opline->op1.constant)), "this", sizeof("this"))) { From 06994a419d625291c2ae071e3b22716901b45cf6 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 17 Oct 2013 12:23:09 +0800 Subject: [PATCH 0137/1256] Add ability of alias resolving (it cause problem while work with opcache) --- ext/phar/config.m4 | 2 ++ ext/phar/php_phar.h | 7 +++++-- ext/phar/util.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ext/phar/config.m4 b/ext/phar/config.m4 index d424060f2a247..614d672eabd9d 100644 --- a/ext/phar/config.m4 +++ b/ext/phar/config.m4 @@ -28,5 +28,7 @@ if test "$PHP_PHAR" != "no"; then PHP_ADD_EXTENSION_DEP(phar, spl, true) PHP_ADD_MAKEFILE_FRAGMENT + PHP_INSTALL_HEADERS([ext/phar], [php_phar.h]) + PHP_OUTPUT(ext/phar/phar.1 ext/phar/phar.phar.1) fi diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index a6d7bff414b8c..4146e28f770da 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -22,7 +22,7 @@ #ifndef PHP_PHAR_H #define PHP_PHAR_H -#define PHP_PHAR_VERSION "2.0.1" +#define PHP_PHAR_VERSION "2.0.2" #include "ext/standard/basic_functions.h" extern zend_module_entry phar_module_entry; @@ -31,9 +31,12 @@ extern zend_module_entry phar_module_entry; #ifdef PHP_WIN32 #define PHP_PHAR_API __declspec(dllexport) #else -#define PHP_PHAR_API +#define PHP_PHAR_API PHPAPI #endif +#define PHAR_HAVE_RESOLVE_ALIAS +PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); + #endif /* PHP_PHAR_H */ diff --git a/ext/phar/util.c b/ext/phar/util.c index 8348a47874eab..e9f1b1673c324 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1185,6 +1185,17 @@ phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, } /* }}} */ +PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC) /* {{{ */ { + phar_archive_data **fd_ptr; + if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { + *filename = (*fd_ptr)->fname; + *filename_len = (*fd_ptr)->fname_len; + return 1; + } + return 0; +} +/* }}} */ + int phar_free_alias(phar_archive_data *phar, char *alias, int alias_len TSRMLS_DC) /* {{{ */ { if (phar->refcount || phar->is_persistent) { From 0d909f5bfcfa54d7bfad41270df435500e909da7 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 16 Oct 2013 22:02:32 -0700 Subject: [PATCH 0138/1256] OCI8: Mostly SKIPIF version updates to simplify version checks at the expense of not testing some edge cases with older Oracle patch set versions. Delete two obsolete .phpt's. --- ext/oci8/package.xml | 8 +- ext/oci8/tests/bind_char_1.phpt | 11 +- ext/oci8/tests/bind_char_1_11gR1.phpt | 7 +- ext/oci8/tests/bind_char_2.phpt | 11 +- ext/oci8/tests/bind_char_2_11gR1.phpt | 7 +- ext/oci8/tests/bind_char_3.phpt | 11 +- ext/oci8/tests/bind_char_3_11gR1.phpt | 7 +- ext/oci8/tests/bind_char_4.phpt | 11 +- ext/oci8/tests/bind_char_4_11gR1.phpt | 7 +- ext/oci8/tests/bind_misccoltypes.phpt | 3 - ext/oci8/tests/bind_number.phpt | 3 - ext/oci8/tests/bind_sqltnum.phpt | 3 - ext/oci8/tests/bind_unsupported_2.phpt | 4 - ext/oci8/tests/bug27303_1.phpt | 11 +- ext/oci8/tests/bug27303_1_11gR1.phpt | 8 +- ext/oci8/tests/bug27303_2.phpt | 11 +- ext/oci8/tests/bug27303_2_11gR1.phpt | 8 +- ext/oci8/tests/bug27303_4.phpt | 12 +- ext/oci8/tests/bug27303_4_11gR1.phpt | 8 +- ext/oci8/tests/bug36403.phpt | 4 - ext/oci8/tests/bug43497.phpt | 4 - ext/oci8/tests/bug43497_92.phpt | 305 ------------------ ext/oci8/tests/bug47281.phpt | 4 +- ext/oci8/tests/clientversion.phpt | 3 - ext/oci8/tests/clientversion_92.phpt | 20 -- ext/oci8/tests/conn_attr_1.phpt | 4 - ext/oci8/tests/conn_attr_2.phpt | 4 - ext/oci8/tests/conn_attr_3.phpt | 4 - ext/oci8/tests/conn_attr_4.phpt | 4 - ext/oci8/tests/conn_attr_5.phpt | 4 - .../tests/connect_without_oracle_home.phpt | 6 +- .../tests/connect_without_oracle_home_11.phpt | 6 +- .../connect_without_oracle_home_old.phpt | 3 - .../connect_without_oracle_home_old_11.phpt | 6 +- ext/oci8/tests/drcp_cclass1.phpt | 14 +- ext/oci8/tests/drcp_connection_class.phpt | 8 +- ext/oci8/tests/driver_name.phpt | 17 +- ext/oci8/tests/edition_1.phpt | 15 +- ext/oci8/tests/edition_2.phpt | 16 +- ext/oci8/tests/ini_1.phpt | 8 +- ext/oci8/tests/password_new.phpt | 28 +- ext/oci8/tests/password_old.phpt | 29 +- ext/oci8/tests/pecl_bug16035.phpt | 3 - ext/oci8/tests/refcur_prefetch_1.phpt | 13 +- ext/oci8/tests/refcur_prefetch_2.phpt | 13 +- ext/oci8/tests/refcur_prefetch_3.phpt | 16 +- ext/oci8/tests/refcur_prefetch_4.phpt | 13 +- 47 files changed, 168 insertions(+), 557 deletions(-) delete mode 100644 ext/oci8/tests/bug43497_92.phpt delete mode 100644 ext/oci8/tests/clientversion_92.phpt diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index f61def59c9851..7eccd9d8f9950 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -45,7 +45,7 @@ libraries are available. no - 2013-10-08 + 2013-10-17 @@ -53,8 +53,8 @@ libraries are available. 2.0.5 - devel - devel + stable + stable PHP @@ -150,7 +150,6 @@ linking works in the new Windows PECL infrastructure. - @@ -163,7 +162,6 @@ linking works in the new Windows PECL infrastructure. - diff --git a/ext/oci8/tests/bind_char_1.phpt b/ext/oci8/tests/bind_char_1.phpt index d68991a7f2baf..dc162ff943182 100644 --- a/ext/oci8/tests/bind_char_1.phpt +++ b/ext/oci8/tests/bind_char_1.phpt @@ -6,15 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] >= 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_1_11gR1.phpt b/ext/oci8/tests/bind_char_1_11gR1.phpt index 2a7c713aa7f15..bdc29f766dab3 100644 --- a/ext/oci8/tests/bind_char_1_11gR1.phpt +++ b/ext/oci8/tests/bind_char_1_11gR1.phpt @@ -6,11 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 11 && $matches[2] == 1) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_2.phpt b/ext/oci8/tests/bind_char_2.phpt index 3695c85854904..9c61a858c8e71 100644 --- a/ext/oci8/tests/bind_char_2.phpt +++ b/ext/oci8/tests/bind_char_2.phpt @@ -6,15 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] >= 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_2_11gR1.phpt b/ext/oci8/tests/bind_char_2_11gR1.phpt index b9afd6940bcca..06c37afc93e20 100644 --- a/ext/oci8/tests/bind_char_2_11gR1.phpt +++ b/ext/oci8/tests/bind_char_2_11gR1.phpt @@ -6,11 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 11 && $matches[2] == 1) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_3.phpt b/ext/oci8/tests/bind_char_3.phpt index 009e60a542b6a..177676e25ca3b 100644 --- a/ext/oci8/tests/bind_char_3.phpt +++ b/ext/oci8/tests/bind_char_3.phpt @@ -6,15 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] >= 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_3_11gR1.phpt b/ext/oci8/tests/bind_char_3_11gR1.phpt index a894de00c075f..c3ec999d0f10d 100644 --- a/ext/oci8/tests/bind_char_3_11gR1.phpt +++ b/ext/oci8/tests/bind_char_3_11gR1.phpt @@ -6,11 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 11 && $matches[2] == 1) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_4.phpt b/ext/oci8/tests/bind_char_4.phpt index 0ac60e503de87..b4d3e089b136f 100644 --- a/ext/oci8/tests/bind_char_4.phpt +++ b/ext/oci8/tests/bind_char_4.phpt @@ -6,15 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] >= 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_4_11gR1.phpt b/ext/oci8/tests/bind_char_4_11gR1.phpt index d5ce116afb65a..ccad2cb7894c1 100644 --- a/ext/oci8/tests/bind_char_4_11gR1.phpt +++ b/ext/oci8/tests/bind_char_4_11gR1.phpt @@ -6,11 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 11 && $matches[2] == 1) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_misccoltypes.phpt b/ext/oci8/tests/bind_misccoltypes.phpt index 0da8c8bf8803a..9e55b3b1ff74b 100644 --- a/ext/oci8/tests/bind_misccoltypes.phpt +++ b/ext/oci8/tests/bind_misccoltypes.phpt @@ -4,9 +4,6 @@ Bind miscellaneous column types using default types true, 'timesten' => false); // test runs on these DBs require(dirname(__FILE__).'/skipif.inc'); -if (preg_match('/^1[012]\./', oci_client_version()) != 1) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --FILE-- --INI-- precision = 14 diff --git a/ext/oci8/tests/bind_sqltnum.phpt b/ext/oci8/tests/bind_sqltnum.phpt index d3828b73eea95..93fc4809ec10d 100644 --- a/ext/oci8/tests/bind_sqltnum.phpt +++ b/ext/oci8/tests/bind_sqltnum.phpt @@ -3,9 +3,6 @@ Bind with SQLT_NUM --SKIPIF-- --FILE-- --FILE-- = 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bug27303_1_11gR1.phpt b/ext/oci8/tests/bug27303_1_11gR1.phpt index 7b4c158561959..d2018783bc925 100644 --- a/ext/oci8/tests/bug27303_1_11gR1.phpt +++ b/ext/oci8/tests/bug27303_1_11gR1.phpt @@ -6,12 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || - ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_2.phpt b/ext/oci8/tests/bug27303_2.phpt index 72d4e5a7ddbcf..ee2f7b52aa5e6 100644 --- a/ext/oci8/tests/bug27303_2.phpt +++ b/ext/oci8/tests/bug27303_2.phpt @@ -6,15 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bug27303_2_11gR1.phpt b/ext/oci8/tests/bug27303_2_11gR1.phpt index 27d8a585bd452..06133e0115723 100644 --- a/ext/oci8/tests/bug27303_2_11gR1.phpt +++ b/ext/oci8/tests/bug27303_2_11gR1.phpt @@ -6,12 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || - ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using specific Oracle database versions"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_4.phpt b/ext/oci8/tests/bug27303_4.phpt index a24ae705aba57..ed9d5a1fe6d43 100644 --- a/ext/oci8/tests/bug27303_4.phpt +++ b/ext/oci8/tests/bug27303_4.phpt @@ -6,16 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) - ))) { - die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); - // Other point releases may also work -} -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 11) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bug27303_4_11gR1.phpt b/ext/oci8/tests/bug27303_4_11gR1.phpt index 01db1dc5a0bef..550d89fdcc52f 100644 --- a/ext/oci8/tests/bug27303_4_11gR1.phpt +++ b/ext/oci8/tests/bug27303_4_11gR1.phpt @@ -6,12 +6,8 @@ if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); -if (!(isset($matches[0]) && - (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || - ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || - ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) - ))) { - die("skip expected output only valid when using specific Oracle database versions"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug36403.phpt b/ext/oci8/tests/bug36403.phpt index 4ac32c4b069a5..122b06bbfa2b0 100644 --- a/ext/oci8/tests/bug36403.phpt +++ b/ext/oci8/tests/bug36403.phpt @@ -3,10 +3,6 @@ Bug #36403 (oci_execute no longer supports OCI_DESCRIBE_ONLY) --SKIPIF-- --FILE-- true, 'timesten' => false); // test runs on these DBs require(dirname(__FILE__).'/skipif.inc'); if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request'); -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 10) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --FILE-- true, 'timesten' => false); // test runs on these DBs -require(dirname(__FILE__).'/skipif.inc'); -if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request'); -ob_start(); -phpinfo(INFO_MODULES); -$phpinfo = ob_get_clean(); -$iv = preg_match('/Oracle .*Version => (9\.2)/', $phpinfo); -if ($iv != 1) { - die ("skip tests a feature that works only with Oracle 9iR2 client"); -} -?> ---FILE-- -free(); // cleanup properly - ++$cntchk; - } - } - echo "Loop count check = $cntchk\n"; -} - -// Read all XML data using explicit LOB locator but without freeing the temp lobs -function readxmltab_ex_nofree($c) -{ - $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab"); - - $cntchk = 0; - if (oci_execute($stmt)) { - while ($result = oci_fetch_array($stmt, OCI_NUM)) { - ++$cntchk; - } - } - echo "Loop count check = $cntchk\n"; -} - -// Read all XML data using implicit LOB locator -function readxmltab_im($c) -{ - $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab"); - - $cntchk = 0; - if (oci_execute($stmt)) { - while ($result = oci_fetch_array($stmt, OCI_NUM+OCI_RETURN_LOBS)) { - ++$cntchk; - } - } - echo "Loop count check = $cntchk\n"; -} - -function createxmltab($c) // create table w/ field of XML type -{ - @dropxmltab($c); - $stmt = oci_parse($c, "create table bug43497_tab (id number primary key, xml xmltype)"); - oci_execute($stmt); -} - -function dropxmltab($c) // delete table -{ - $stmt = oci_parse($c, "drop table bug43497_tab"); - oci_execute($stmt); -} - - -function fillxmltab($c) -{ - for ($id = 1; $id <= 100; $id++) { - - // create an XML element string with random data - $s = ""; - for ($j = 0; $j < 128; $j++) { - $s .= rand(); - } - $s .= "\n"; - for ($j = 0; $j < 4; $j++) { - $s .= $s; - } - $data = "" . $s . ""; - - // insert XML data into database - - $stmt = oci_parse($c, "insert into bug43497_tab(id, xml) values (:id, sys.xmltype.createxml(:xml))"); - oci_bind_by_name($stmt, ":id", $id); - $clob = oci_new_descriptor($c, OCI_D_LOB); - oci_bind_by_name($stmt, ":xml", $clob, -1, OCI_B_CLOB); - $clob->writetemporary($data); - oci_execute($stmt); - - $clob->close(); - $clob->free(); - } -} - - -// Initialize - -createxmltab($c); -fillxmltab($c); - -// Run Test - -$sid = sessionid($c); - -echo "Explicit LOB use\n"; -for ($i = 1; $i <= 10; $i++) { - echo "\nRun = " . $i . "\n"; - echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; - readxmltab_ex($c); -} - -echo "\nImplicit LOB use\n"; -for ($i = 1; $i <= 10; $i++) { - echo "\nRun = " . $i . "\n"; - echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; - readxmltab_im($c); -} - -echo "\nExplicit LOB with no free (i.e. a temp lob leak)\n"; -for ($i = 1; $i <= 10; $i++) { - echo "\nRun = " . $i . "\n"; - echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; - readxmltab_ex_nofree($c); -} - - - -// Cleanup - -dropxmltab($c); - -oci_close($c); - -echo "Done\n"; -?> ---EXPECT-- -Explicit LOB use - -Run = 1 -Temporary LOBs = 0 -Loop count check = 100 - -Run = 2 -Temporary LOBs = 100 -Loop count check = 100 - -Run = 3 -Temporary LOBs = 200 -Loop count check = 100 - -Run = 4 -Temporary LOBs = 300 -Loop count check = 100 - -Run = 5 -Temporary LOBs = 400 -Loop count check = 100 - -Run = 6 -Temporary LOBs = 500 -Loop count check = 100 - -Run = 7 -Temporary LOBs = 600 -Loop count check = 100 - -Run = 8 -Temporary LOBs = 700 -Loop count check = 100 - -Run = 9 -Temporary LOBs = 800 -Loop count check = 100 - -Run = 10 -Temporary LOBs = 900 -Loop count check = 100 - -Implicit LOB use - -Run = 1 -Temporary LOBs = 1000 -Loop count check = 100 - -Run = 2 -Temporary LOBs = 1100 -Loop count check = 100 - -Run = 3 -Temporary LOBs = 1200 -Loop count check = 100 - -Run = 4 -Temporary LOBs = 1300 -Loop count check = 100 - -Run = 5 -Temporary LOBs = 1400 -Loop count check = 100 - -Run = 6 -Temporary LOBs = 1500 -Loop count check = 100 - -Run = 7 -Temporary LOBs = 1600 -Loop count check = 100 - -Run = 8 -Temporary LOBs = 1700 -Loop count check = 100 - -Run = 9 -Temporary LOBs = 1800 -Loop count check = 100 - -Run = 10 -Temporary LOBs = 1900 -Loop count check = 100 - -Explicit LOB with no free (i.e. a temp lob leak) - -Run = 1 -Temporary LOBs = 2000 -Loop count check = 100 - -Run = 2 -Temporary LOBs = 2100 -Loop count check = 100 - -Run = 3 -Temporary LOBs = 2200 -Loop count check = 100 - -Run = 4 -Temporary LOBs = 2300 -Loop count check = 100 - -Run = 5 -Temporary LOBs = 2400 -Loop count check = 100 - -Run = 6 -Temporary LOBs = 2500 -Loop count check = 100 - -Run = 7 -Temporary LOBs = 2600 -Loop count check = 100 - -Run = 8 -Temporary LOBs = 2700 -Loop count check = 100 - -Run = 9 -Temporary LOBs = 2800 -Loop count check = 100 - -Run = 10 -Temporary LOBs = 2900 -Loop count check = 100 -Done \ No newline at end of file diff --git a/ext/oci8/tests/bug47281.phpt b/ext/oci8/tests/bug47281.phpt index 0098ec5ebb772..00c43c22dac7c 100644 --- a/ext/oci8/tests/bug47281.phpt +++ b/ext/oci8/tests/bug47281.phpt @@ -6,9 +6,9 @@ $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on t require(dirname(__FILE__).'/skipif.inc'); // error3.phpt obsoletes this test for newer Oracle client versions // Assume runtime client version is >= compile time client version -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); if (!isset($matches[0]) || - ($matches[0] > 11 || ($matches[0] == 11 && $matches[1] > 2) || ($matches[0] == 11 && $matches[1] == 2 && $matches[3] >= 3) + ($matches[1] > 11 || ($matches[1] == 11 && $matches[2] > 2) || ($matches[1] == 11 && $matches[2] == 2 && $matches[4] >= 3) )) { die("skip test works only with Oracle 11.2.0.2 or earlier Oracle client libraries"); } diff --git a/ext/oci8/tests/clientversion.phpt b/ext/oci8/tests/clientversion.phpt index db70b5affcea4..262ded462f9d9 100644 --- a/ext/oci8/tests/clientversion.phpt +++ b/ext/oci8/tests/clientversion.phpt @@ -3,9 +3,6 @@ oci_client_version() --SKIPIF-- --FILE-- ---FILE-- - -===DONE=== - ---EXPECTF-- -Unknown -===DONE=== diff --git a/ext/oci8/tests/conn_attr_1.phpt b/ext/oci8/tests/conn_attr_1.phpt index 631bc19c1d416..745b1cd93f906 100644 --- a/ext/oci8/tests/conn_attr_1.phpt +++ b/ext/oci8/tests/conn_attr_1.phpt @@ -13,10 +13,6 @@ preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 10) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --FILE-- = 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 10) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --INI-- oci8.privileged_connect = On diff --git a/ext/oci8/tests/conn_attr_3.phpt b/ext/oci8/tests/conn_attr_3.phpt index 921487c9a00e1..1b00ac5a4ff45 100644 --- a/ext/oci8/tests/conn_attr_3.phpt +++ b/ext/oci8/tests/conn_attr_3.phpt @@ -12,10 +12,6 @@ preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 10) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --FILE-- --FILE-- = 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); -if (isset($matches[0]) && $matches[0] < 10) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --FILE-- --ENV-- diff --git a/ext/oci8/tests/connect_without_oracle_home_11.phpt b/ext/oci8/tests/connect_without_oracle_home_11.phpt index 40dc5a98fc7e3..42c45644567c4 100644 --- a/ext/oci8/tests/connect_without_oracle_home_11.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_11.phpt @@ -10,10 +10,10 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov != 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); if (!(isset($matches[0]) && - (($matches[0] == 11 && $matches[1] >= 2) || - ($matches[0] >= 12) + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } diff --git a/ext/oci8/tests/connect_without_oracle_home_old.phpt b/ext/oci8/tests/connect_without_oracle_home_old.phpt index 5a731337af13c..82d8ae451bc70 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old.phpt @@ -10,9 +10,6 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov !== 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -if (preg_match('/^10\.2\./', oci_client_version()) != 1) { - die("skip test expected to work only with Oracle 10gR2 client libraries"); -} ?> --ENV-- ORACLE_HOME="" diff --git a/ext/oci8/tests/connect_without_oracle_home_old_11.phpt b/ext/oci8/tests/connect_without_oracle_home_old_11.phpt index e04016f41a766..eb5fb0cc4d333 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old_11.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old_11.phpt @@ -10,10 +10,10 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov !== 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); if (!(isset($matches[0]) && - (($matches[0] == 11 && $matches[1] >= 2) || - ($matches[0] >= 12) + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } diff --git a/ext/oci8/tests/drcp_cclass1.phpt b/ext/oci8/tests/drcp_cclass1.phpt index 068331e5a95ae..5c78a2943e94e 100644 --- a/ext/oci8/tests/drcp_cclass1.phpt +++ b/ext/oci8/tests/drcp_cclass1.phpt @@ -3,9 +3,21 @@ DRCP: Test setting connection class inline --SKIPIF-- = 12) { + $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual"); + $r = @oci_execute($s); + if (!$r) + die('skip could not identify container type'); + $r = oci_fetch_array($s); + if ($r['DBTYPE'] !== 'CDB$ROOT') + die('skip cannot run test using a PDB'); +} ?> --FILE-- += 11)) { + die("skip works only with Oracle 11g or greater version of Oracle client libraries"); +} +?> --INI-- oci8.connection_class=test --FILE-- diff --git a/ext/oci8/tests/driver_name.phpt b/ext/oci8/tests/driver_name.phpt index bf86e66e7b64f..f63979d6b54c0 100644 --- a/ext/oci8/tests/driver_name.phpt +++ b/ext/oci8/tests/driver_name.phpt @@ -7,10 +7,19 @@ require(dirname(__FILE__)."/connect.inc"); if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip as Output might vary with DRCP"); -if (preg_match('/Release (11\.2|12)/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR2 or greater databases"); -} else if (preg_match('/^(11\.2|12\.)/', oci_client_version()) != 1) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { + die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/edition_1.phpt b/ext/oci8/tests/edition_1.phpt index d8ca53cddf061..3e55ee902c970 100644 --- a/ext/oci8/tests/edition_1.phpt +++ b/ext/oci8/tests/edition_1.phpt @@ -10,9 +10,18 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys")) { if ($test_drcp) { die("skip as Output might vary with DRCP"); } -if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR2 or greater databases"); -} else if (preg_match('/^(11\.2|12)\./', oci_client_version()) != 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/edition_2.phpt b/ext/oci8/tests/edition_2.phpt index 0ffb62dc32633..12e902667e621 100644 --- a/ext/oci8/tests/edition_2.phpt +++ b/ext/oci8/tests/edition_2.phpt @@ -8,10 +8,18 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip as Output might vary with DRCP"); - -if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR2 or greater databases"); -} else if (preg_match('/^(11\.2|12)\./', oci_client_version()) != 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } diff --git a/ext/oci8/tests/ini_1.phpt b/ext/oci8/tests/ini_1.phpt index 4c23b72b41fdb..2fba79813e845 100644 --- a/ext/oci8/tests/ini_1.phpt +++ b/ext/oci8/tests/ini_1.phpt @@ -1,7 +1,13 @@ --TEST-- Test OCI8 php.ini settings --SKIPIF-- - += 11)) { + die("skip works only with Oracle 11g or greater version of Oracle client libraries"); +} +?> --INI-- oci8.privileged_connect = On oci8.max_persistent = 111 diff --git a/ext/oci8/tests/password_new.phpt b/ext/oci8/tests/password_new.phpt index 2c66dd94ab7dc..a29fb8f52ff2b 100644 --- a/ext/oci8/tests/password_new.phpt +++ b/ext/oci8/tests/password_new.phpt @@ -8,15 +8,18 @@ if (empty($dbase)) die ("skip requires database connection string be set"); if ($test_drcp) die("skip password change not supported in DRCP Mode"); preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches_sv); -if (isset($matches_sv[1]) && $matches_sv[1] >= 11) { - preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); - if (isset($matches[0]) && $matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] < 5) { - die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); - } +preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches_sv[0]) && isset($matches[0]) + && $matches_sv[1] == $matches[1] + && $matches_sv[2] == $matches[2] + && $matches_sv[3] == $matches[3] + && $matches_sv[4] == $matches[4])) { + // Avoid diffs due to cross version protocol changes (e.g. like 11.2.0.2-11.2.0.3) and bugs like Oracle bug: 6277160 + die ("skip test only runs when database client libraries and database server are the same version"); } // This test in Oracle 12c needs a non-CDB or the root container -if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { +if (isset($matches_sv[0]) && $matches_sv[1] >= 12) { $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual"); $r = @oci_execute($s); if (!$r) @@ -29,22 +32,11 @@ if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { --FILE-- = 11) { - preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); - if (isset($matches[0]) && $matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] < 5) { - die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); - } +preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches_sv[0]) && isset($matches[0]) + && $matches_sv[1] == $matches[1] + && $matches_sv[2] == $matches[2] + && $matches_sv[3] == $matches[3] + && $matches_sv[4] == $matches[4])) { + // Avoid diffs due to cross version protocol changes (e.g. like 11.2.0.2-11.2.0.3) and bugs like Oracle bug: 6277160 + die ("skip test only runs when database client libraries and database server are the same version"); } // This test in Oracle 12c needs a non-CDB or the root container -if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { +if (isset($matches_sv[0]) && $matches_sv[1] >= 12) { $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual"); $r = @oci_execute($s); if (!$r) @@ -29,25 +32,13 @@ if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { --FILE-- diff --git a/ext/oci8/tests/pecl_bug16035.phpt b/ext/oci8/tests/pecl_bug16035.phpt index ddd0038de1524..29ff6439d1c8a 100644 --- a/ext/oci8/tests/pecl_bug16035.phpt +++ b/ext/oci8/tests/pecl_bug16035.phpt @@ -10,9 +10,6 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov !== 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -if (preg_match('/Unknown/', oci_client_version()) == 1) { - die("skip expected output only valid with Oracle clients > 9gR2"); -} ?> --ENV-- ORACLE_HOME="" diff --git a/ext/oci8/tests/refcur_prefetch_1.phpt b/ext/oci8/tests/refcur_prefetch_1.phpt index ea09fbcd979cf..c7e200932aece 100644 --- a/ext/oci8/tests/refcur_prefetch_1.phpt +++ b/ext/oci8/tests/refcur_prefetch_1.phpt @@ -4,9 +4,16 @@ Prefetch with REF cursor. Test different values for prefetch with oci_set_prefet = 10))) { + die("skip expected output only valid when using Oracle 10g or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/refcur_prefetch_2.phpt b/ext/oci8/tests/refcur_prefetch_2.phpt index 8d65251077ea3..9b2472db5df44 100644 --- a/ext/oci8/tests/refcur_prefetch_2.phpt +++ b/ext/oci8/tests/refcur_prefetch_2.phpt @@ -4,9 +4,16 @@ Prefetch with REF cursor. Test No 2 = 10))) { + die("skip expected output only valid when using Oracle 10g or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/refcur_prefetch_3.phpt b/ext/oci8/tests/refcur_prefetch_3.phpt index 974864cbd90e7..f29345e515d47 100644 --- a/ext/oci8/tests/refcur_prefetch_3.phpt +++ b/ext/oci8/tests/refcur_prefetch_3.phpt @@ -6,12 +6,20 @@ oci8.default_prefetch=5 = 2) || + ($matches[1] >= 12) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } - ?> --FILE-- = 10))) { + die("skip expected output only valid when using Oracle 10g or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> From 89e93bd2a27d66c9d56218e31cd42441298548e6 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 16 Oct 2013 22:33:34 -0700 Subject: [PATCH 0139/1256] OCI8: More test updates --- .../tests/connect_without_oracle_home_old.phpt | 3 +++ ext/oci8/tests/drcp_privileged.phpt | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ext/oci8/tests/connect_without_oracle_home_old.phpt b/ext/oci8/tests/connect_without_oracle_home_old.phpt index 82d8ae451bc70..d6d12b47ba338 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old.phpt @@ -30,5 +30,8 @@ else { --EXPECTF-- Warning: ocilogon(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and %s are set and point to the right directories in %s on line %d + +Warning: ocilogon(): %s ORA-01804 + in %s on line %d bool(false) ===DONE=== diff --git a/ext/oci8/tests/drcp_privileged.phpt b/ext/oci8/tests/drcp_privileged.phpt index da8702e3c9204..3871341bc50cc 100644 --- a/ext/oci8/tests/drcp_privileged.phpt +++ b/ext/oci8/tests/drcp_privileged.phpt @@ -3,7 +3,8 @@ DRCP: privileged connect --SKIPIF-- = 12) { + $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual"); + $r = @oci_execute($s); + if (!$r) + die('skip could not identify container type'); + $r = oci_fetch_array($s); + if ($r['DBTYPE'] !== 'CDB$ROOT') + die('skip cannot run test using a PDB'); +} ?> --INI-- oci8.privileged_connect=1 From e30b2aae5ad93405eee19bca6125ea872f409c82 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 17 Oct 2013 09:43:52 +0200 Subject: [PATCH 0140/1256] initial move on renaming files and fixing includes --- TSRM/Makefile.am | 2 +- TSRM/TSRM.dsp | 4 - TSRM/config.w32 | 2 +- TSRM/tsrm_win32.c | 2 +- Zend/Makefile.am | 2 +- Zend/Zend.dsp | 4 + Zend/zend_compile.c | 2 +- Zend/zend_execute.c | 2 +- Zend/zend_ini_scanner.c | 9326 ++++++++--------- Zend/zend_language_scanner.c | 2 +- Zend/zend_language_scanner.l | 2 +- .../zend_virtual_cwd.c | 2 +- .../zend_virtual_cwd.h | 0 configure.in | 5 +- ext/opcache/ZendAccelerator.c | 2 +- ext/opcache/zend_accelerator_module.c | 2 +- ext/soap/php_sdl.c | 2 +- main/php.h | 2 +- win32/build/config.w32 | 2 +- 19 files changed, 4684 insertions(+), 4683 deletions(-) rename TSRM/tsrm_virtual_cwd.c => Zend/zend_virtual_cwd.c (99%) rename TSRM/tsrm_virtual_cwd.h => Zend/zend_virtual_cwd.h (100%) diff --git a/TSRM/Makefile.am b/TSRM/Makefile.am index 91e585b65c89a..e232381a019e1 100644 --- a/TSRM/Makefile.am +++ b/TSRM/Makefile.am @@ -1,6 +1,6 @@ ## process this file with automake to produce Makefile.am AUTOMAKE_OPTIONS=foreign noinst_LTLIBRARIES=libtsrm.la -libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c +libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c depend: diff --git a/TSRM/TSRM.dsp b/TSRM/TSRM.dsp index 1a5693f5a23c4..6c3e8bfb8bede 100644 --- a/TSRM/TSRM.dsp +++ b/TSRM/TSRM.dsp @@ -143,10 +143,6 @@ SOURCE=.\tsrm_strtok_r.c # End Source File # Begin Source File -SOURCE=.\tsrm_virtual_cwd.c -# End Source File -# Begin Source File - SOURCE=.\tsrm_win32.c # End Source File # End Group diff --git a/TSRM/config.w32 b/TSRM/config.w32 index 5498f8e7bd3ec..91b4eead2a07d 100644 --- a/TSRM/config.w32 +++ b/TSRM/config.w32 @@ -1,5 +1,5 @@ // vim:ft=javascript // $Id$ -ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c tsrm_win32.c"); +ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_win32.c"); diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 2ec97be0116bc..7b9ebc3061b34 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -32,7 +32,7 @@ #ifdef TSRM_WIN32 #include #include "tsrm_win32.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #ifdef ZTS static ts_rsrc_id win32_globals_id; diff --git a/Zend/Makefile.am b/Zend/Makefile.am index 6417f3eb141ed..924a00daebb39 100644 --- a/Zend/Makefile.am +++ b/Zend/Makefile.am @@ -18,7 +18,7 @@ libZend_la_SOURCES=\ zend_default_classes.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c \ zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \ - zend_generators.c + zend_generators.c zend_virtual_cwd.c libZend_la_LDFLAGS = libZend_la_LIBADD = @ZEND_EXTRA_LIBS@ diff --git a/Zend/Zend.dsp b/Zend/Zend.dsp index 23ebd4532b5e7..d1b3b8903004d 100644 --- a/Zend/Zend.dsp +++ b/Zend/Zend.dsp @@ -429,6 +429,10 @@ SOURCE=.\zend_ts_hash.h SOURCE=.\zend_variables.h # End Source File +# Begin Source File + +SOURCE=.\zend_virtual_cwd.c +# End Source File # End Group # Begin Group "Parsers" diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 85536f43b7ce2..d5be53e8bf7c2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -26,7 +26,7 @@ #include "zend_llist.h" #include "zend_API.h" #include "zend_exceptions.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "zend_multibyte.h" #include "zend_language_scanner.h" diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9f78218d3de35..270b449e4327d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -40,7 +40,7 @@ #include "zend_dtrace.h" /* Virtual current working directory support */ -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #define _CONST_CODE 0 #define _TMP_CODE 1 diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c index 87ba664312712..a3ecdef4949ac 100644 --- a/Zend/zend_ini_scanner.c +++ b/Zend/zend_ini_scanner.c @@ -1,4663 +1,4663 @@ -/* Generated by re2c 0.13.5 */ -#line 1 "Zend/zend_ini_scanner.l" -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Zeev Suraski | - | Jani Taskinen | - | Marcus Boerger | - | Nuno Lopes | - | Scott MacVicar | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#include -#include "zend.h" -#include "zend_globals.h" -#include -#include "zend_ini_scanner.h" - -#if 0 -# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) -#else -# define YYDEBUG(s, c) -#endif - -#include "zend_ini_scanner_defs.h" - -#define YYCTYPE unsigned char -/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD) - * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */ -#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; } -#define YYCURSOR SCNG(yy_cursor) -#define YYLIMIT SCNG(yy_limit) -#define YYMARKER SCNG(yy_marker) - -#define YYGETCONDITION() SCNG(yy_state) -#define YYSETCONDITION(s) SCNG(yy_state) = s - -#define STATE(name) yyc##name - -/* emulate flex constructs */ -#define BEGIN(state) YYSETCONDITION(STATE(state)) -#define YYSTATE YYGETCONDITION() -#define yytext ((char*)SCNG(yy_text)) -#define yyleng SCNG(yy_leng) -#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \ - yyleng = (unsigned int)x; } while(0) - -/* #define yymore() goto yymore_restart */ - -/* perform sanity check. If this message is triggered you should - increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ -#define YYMAXFILL 6 -#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1) -# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL -#endif - - -/* How it works (for the core ini directives): - * =========================================== - * - * 1. Scanner scans file for tokens and passes them to parser. - * 2. Parser parses the tokens and passes the name/value pairs to the callback - * function which stores them in the configuration hash table. - * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual - * registering of ini entries and uses zend_get_configuration_directive() - * to fetch the previously stored name/value pair from configuration hash table - * and registers the static ini entries which match the name to the value - * into EG(ini_directives) hash table. - * 4. PATH section entries are used per-request from down to top, each overriding - * previous if one exists. zend_alter_ini_entry() is called for each entry. - * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the - * php_admin_* directives used within Apache httpd.conf when PHP is compiled as - * module for Apache. - * 5. User defined ini files (like .htaccess for apache) are parsed for each request and - * stored in separate hash defined by SAPI. - */ - -/* TODO: (ordered by importance :-) - * =============================================================================== - * - * - Separate constant lookup totally from plain strings (using CONSTANT pattern) - * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators - * - Add #include "some.ini" - * - Allow variables to refer to options also when using parse_ini_file() - * - */ - -/* Globals Macros */ -#define SCNG INI_SCNG -#ifdef ZTS -ZEND_API ts_rsrc_id ini_scanner_globals_id; -#else -ZEND_API zend_ini_scanner_globals ini_scanner_globals; -#endif - -/* Eat leading whitespace */ -#define EAT_LEADING_WHITESPACE() \ - while (yytext[0]) { \ - if (yytext[0] == ' ' || yytext[0] == '\t') { \ - SCNG(yy_text)++; \ - yyleng--; \ - } else { \ - break; \ - } \ - } - -/* Eat trailing whitespace + extra char */ -#define EAT_TRAILING_WHITESPACE_EX(ch) \ - while (yyleng > 0 && ( \ - (ch != 'X' && yytext[yyleng - 1] == ch) || \ - yytext[yyleng - 1] == '\n' || \ - yytext[yyleng - 1] == '\r' || \ - yytext[yyleng - 1] == '\t' || \ - yytext[yyleng - 1] == ' ') \ - ) { \ - yyleng--; \ - } - -/* Eat trailing whitespace */ -#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X') - -#define zend_ini_copy_value(retval, str, len) { \ - Z_STRVAL_P(retval) = zend_strndup(str, len); \ - Z_STRLEN_P(retval) = len; \ - Z_TYPE_P(retval) = IS_STRING; \ -} - -#define RETURN_TOKEN(type, str, len) { \ - zend_ini_copy_value(ini_lval, str, len); \ - return type; \ -} - -static void _yy_push_state(int new_state TSRMLS_DC) -{ - zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); - YYSETCONDITION(new_state); -} - -#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) - -static void yy_pop_state(TSRMLS_D) -{ - int *stack_state; - zend_stack_top(&SCNG(state_stack), (void **) &stack_state); - YYSETCONDITION(*stack_state); - zend_stack_del_top(&SCNG(state_stack)); -} - -static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) -{ - YYCURSOR = (YYCTYPE*)str; - SCNG(yy_start) = YYCURSOR; - YYLIMIT = YYCURSOR + len; -} - -#define ini_filename SCNG(filename) - -/* {{{ init_ini_scanner() -*/ -static int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC) -{ - /* Sanity check */ - if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) { - zend_error(E_WARNING, "Invalid scanner mode"); - return FAILURE; - } - - SCNG(lineno) = 1; - SCNG(scanner_mode) = scanner_mode; - SCNG(yy_in) = fh; - - if (fh != NULL) { - ini_filename = zend_strndup(fh->filename, strlen(fh->filename)); - } else { - ini_filename = NULL; - } - - zend_stack_init(&SCNG(state_stack)); - BEGIN(INITIAL); - - return SUCCESS; -} -/* }}} */ - -/* {{{ shutdown_ini_scanner() -*/ -void shutdown_ini_scanner(TSRMLS_D) -{ - zend_stack_destroy(&SCNG(state_stack)); - if (ini_filename) { - free(ini_filename); - } -} -/* }}} */ - -/* {{{ zend_ini_scanner_get_lineno() -*/ -int zend_ini_scanner_get_lineno(TSRMLS_D) -{ - return SCNG(lineno); -} -/* }}} */ - -/* {{{ zend_ini_scanner_get_filename() -*/ -char *zend_ini_scanner_get_filename(TSRMLS_D) -{ - return ini_filename ? ini_filename : "Unknown"; -} -/* }}} */ - -/* {{{ zend_ini_open_file_for_scanning() -*/ -int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC) -{ - char *buf; - size_t size; - - if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) { - return FAILURE; - } - - if (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) { - zend_file_handle_dtor(fh TSRMLS_CC); - return FAILURE; - } - - yy_scan_buffer(buf, size TSRMLS_CC); - - return SUCCESS; -} -/* }}} */ - -/* {{{ zend_ini_prepare_string_for_scanning() -*/ -int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC) -{ - int len = strlen(str); - - if (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) { - return FAILURE; - } - - yy_scan_buffer(str, len TSRMLS_CC); - - return SUCCESS; -} -/* }}} */ - -/* {{{ zend_ini_escape_string() - */ -static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC) -{ - register char *s, *t; - char *end; - - zend_ini_copy_value(lval, str, len); - - /* convert escape sequences */ - s = t = Z_STRVAL_P(lval); - end = s + Z_STRLEN_P(lval); - - while (s < end) { - if (*s == '\\') { - s++; - if (s >= end) { - *t++ = '\\'; - continue; - } - switch (*s) { - case '"': - if (*s != quote_type) { - *t++ = '\\'; - *t++ = *s; - break; - } - case '\\': - case '$': - *t++ = *s; - Z_STRLEN_P(lval)--; - break; - default: - *t++ = '\\'; - *t++ = *s; - break; - } - } else { - *t++ = *s; - } - if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { - SCNG(lineno)++; - } - s++; - } - *t = 0; -} -/* }}} */ - -int ini_lex(zval *ini_lval TSRMLS_DC) -{ -restart: - SCNG(yy_text) = YYCURSOR; - -/* yymore_restart: */ - /* detect EOF */ - if (YYCURSOR >= YYLIMIT) { - if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) { - BEGIN(INITIAL); - return END_OF_LINE; - } - return 0; - } - - /* Eat any UTF-8 BOM we find in the first 3 bytes */ - if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) { - if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) { - YYCURSOR += 3; - goto restart; - } - } - -#line 337 "Zend/zend_ini_scanner.c" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - if (YYGETCONDITION() < 4) { - if (YYGETCONDITION() < 2) { - if (YYGETCONDITION() < 1) { - goto yyc_INITIAL; - } else { - goto yyc_ST_OFFSET; - } - } else { - if (YYGETCONDITION() < 3) { - goto yyc_ST_SECTION_VALUE; - } else { - goto yyc_ST_VALUE; - } - } - } else { - if (YYGETCONDITION() < 6) { - if (YYGETCONDITION() < 5) { - goto yyc_ST_SECTION_RAW; - } else { - goto yyc_ST_DOUBLE_QUOTES; - } - } else { - if (YYGETCONDITION() < 7) { - goto yyc_ST_VARNAME; - } else { - goto yyc_ST_RAW; - } - } - } -/* *********************************** */ -yyc_INITIAL: - { - static const unsigned char yybm[] = { - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 160, 0, 144, 144, 0, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 240, 128, 128, 144, 128, 144, 128, 144, - 128, 128, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 144, 128, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 144, 144, 128, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 128, 128, 128, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - }; - - YYDEBUG(0, *YYCURSOR); - YYFILL(5); - yych = *YYCURSOR; - YYDEBUG(-1, yych); - switch (yych) { - case '\t': goto yy4; - case '\n': goto yy6; - case '\r': goto yy8; - case ' ': goto yy9; - case '!': - case '"': - case '$': - case '&': - case '(': - case ')': - case '^': - case '{': - case '|': - case '}': - case '~': goto yy10; - case '#': goto yy12; - case '%': - case '\'': - case '*': - case '+': - case ',': - case '-': - case '.': - case '/': - case ':': - case '<': - case '>': - case '?': - case '@': - case ']': goto yy13; - case ';': goto yy14; - case '=': goto yy16; - case 'F': - case 'f': goto yy18; - case 'N': - case 'n': goto yy19; - case 'O': - case 'o': goto yy20; - case 'T': - case 't': goto yy21; - case 'Y': - case 'y': goto yy22; - case '[': goto yy23; - default: goto yy2; - } -yy2: - YYDEBUG(2, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy26; -yy3: - YYDEBUG(3, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 429 "Zend/zend_ini_scanner.l" - { /* Get option name */ - /* Eat leading whitespace */ - EAT_LEADING_WHITESPACE(); - - /* Eat trailing whitespace */ - EAT_TRAILING_WHITESPACE(); - - RETURN_TOKEN(TC_LABEL, yytext, yyleng); -} -#line 476 "Zend/zend_ini_scanner.c" -yy4: - YYDEBUG(4, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy68; -yy5: - YYDEBUG(5, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 575 "Zend/zend_ini_scanner.l" - { - /* eat whitespace */ - goto restart; -} -#line 490 "Zend/zend_ini_scanner.c" -yy6: - YYDEBUG(6, *YYCURSOR); - ++YYCURSOR; -yy7: - YYDEBUG(7, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 580 "Zend/zend_ini_scanner.l" - { - SCNG(lineno)++; - return END_OF_LINE; -} -#line 502 "Zend/zend_ini_scanner.c" -yy8: - YYDEBUG(8, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy71; - goto yy7; -yy9: - YYDEBUG(9, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy26; - if (yych <= '\t') goto yy67; - goto yy71; - } else { - if (yych == '\r') goto yy72; - if (yych <= 0x1F) goto yy26; - goto yy69; - } - } else { - if (yych <= ':') { - if (yych == '#') goto yy58; - goto yy26; - } else { - if (yych <= ';') goto yy53; - if (yych == '=') goto yy51; - goto yy26; - } - } -yy10: - YYDEBUG(10, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(11, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 503 "Zend/zend_ini_scanner.l" - { /* Disallow these chars outside option values */ - return yytext[0]; -} -#line 541 "Zend/zend_ini_scanner.c" -yy12: - YYDEBUG(12, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy59; -yy13: - YYDEBUG(13, *YYCURSOR); - yych = *++YYCURSOR; - goto yy26; -yy14: - YYDEBUG(14, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - goto yy54; - YYDEBUG(15, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 562 "Zend/zend_ini_scanner.c" -yy16: - YYDEBUG(16, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy52; -yy17: - YYDEBUG(17, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 439 "Zend/zend_ini_scanner.l" - { /* Start option value */ - if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { - yy_push_state(ST_RAW TSRMLS_CC); - } else { - yy_push_state(ST_VALUE TSRMLS_CC); - } - return '='; -} -#line 580 "Zend/zend_ini_scanner.c" -yy18: - YYDEBUG(18, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy48; - if (yych == 'a') goto yy48; - goto yy26; -yy19: - YYDEBUG(19, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych == 'O') goto yy44; - if (yych <= 'T') goto yy26; - goto yy45; - } else { - if (yych <= 'o') { - if (yych <= 'n') goto yy26; - goto yy44; - } else { - if (yych == 'u') goto yy45; - goto yy26; - } - } -yy20: - YYDEBUG(20, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'N') { - if (yych == 'F') goto yy38; - if (yych <= 'M') goto yy26; - goto yy31; - } else { - if (yych <= 'f') { - if (yych <= 'e') goto yy26; - goto yy38; - } else { - if (yych == 'n') goto yy31; - goto yy26; - } - } -yy21: - YYDEBUG(21, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy36; - if (yych == 'r') goto yy36; - goto yy26; -yy22: - YYDEBUG(22, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy27; - if (yych == 'e') goto yy27; - goto yy26; -yy23: - YYDEBUG(23, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(24, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 358 "Zend/zend_ini_scanner.l" - { /* Section start */ - /* Enter section data lookup state */ - if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { - yy_push_state(ST_SECTION_RAW TSRMLS_CC); - } else { - yy_push_state(ST_SECTION_VALUE TSRMLS_CC); - } - return TC_SECTION; -} -#line 646 "Zend/zend_ini_scanner.c" -yy25: - YYDEBUG(25, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy26: - YYDEBUG(26, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy25; - } - if (yych == '[') goto yy28; - goto yy3; -yy27: - YYDEBUG(27, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy31; - if (yych == 's') goto yy31; - goto yy26; -yy28: - YYDEBUG(28, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(29, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy28; - } - YYDEBUG(30, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 383 "Zend/zend_ini_scanner.l" - { /* Start of option with offset */ - /* Eat leading whitespace */ - EAT_LEADING_WHITESPACE(); - - /* Eat trailing whitespace and [ */ - EAT_TRAILING_WHITESPACE_EX('['); - - /* Enter offset lookup state */ - yy_push_state(ST_OFFSET TSRMLS_CC); - - RETURN_TOKEN(TC_OFFSET, yytext, yyleng); -} -#line 689 "Zend/zend_ini_scanner.c" -yy31: - YYDEBUG(31, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(32, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy31; - } - if (yych <= '\'') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy34; - } else { - if (yych != '\r') goto yy25; - } - } else { - if (yych <= '$') { - if (yych == '#') goto yy25; - } else { - if (yych != '&') goto yy25; - } - } - } else { - if (yych <= 'Z') { - if (yych <= ';') { - if (yych <= ')') goto yy33; - if (yych <= ':') goto yy25; - } else { - if (yych != '=') goto yy25; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy28; - if (yych <= ']') goto yy25; - } else { - if (yych <= 'z') goto yy25; - if (yych >= 0x7F) goto yy25; - } - } - } -yy33: - YYDEBUG(33, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 421 "Zend/zend_ini_scanner.l" - { /* TRUE value (when used outside option value/offset this causes parse error!) */ - RETURN_TOKEN(BOOL_TRUE, "1", 1); -} -#line 739 "Zend/zend_ini_scanner.c" -yy34: - YYDEBUG(34, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(35, *YYCURSOR); - if (yych == '\t') goto yy34; - if (yych == ' ') goto yy34; - goto yy33; -yy36: - YYDEBUG(36, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'U') goto yy37; - if (yych != 'u') goto yy26; -yy37: - YYDEBUG(37, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy31; - if (yych == 'e') goto yy31; - goto yy26; -yy38: - YYDEBUG(38, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy39; - if (yych != 'f') goto yy26; -yy39: - YYDEBUG(39, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(40, *YYCURSOR); - if (yych <= '&') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy42; - } else { - if (yych != '\r') goto yy25; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy39; - if (yych >= '#') goto yy25; - } else { - if (yych == '%') goto yy25; - } - } - } else { - if (yych <= '=') { - if (yych <= ':') { - if (yych <= '\'') goto yy25; - if (yych >= '*') goto yy25; - } else { - if (yych == '<') goto yy25; - } - } else { - if (yych <= ']') { - if (yych == '[') goto yy28; - goto yy25; - } else { - if (yych <= '^') goto yy41; - if (yych <= 'z') goto yy25; - if (yych >= 0x7F) goto yy25; - } - } - } -yy41: - YYDEBUG(41, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 425 "Zend/zend_ini_scanner.l" - { /* FALSE value (when used outside option value/offset this causes parse error!)*/ - RETURN_TOKEN(BOOL_FALSE, "", 0); -} -#line 813 "Zend/zend_ini_scanner.c" -yy42: - YYDEBUG(42, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(43, *YYCURSOR); - if (yych == '\t') goto yy42; - if (yych == ' ') goto yy42; - goto yy41; -yy44: - YYDEBUG(44, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\'') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy26; - if (yych <= '\t') goto yy42; - goto yy41; - } else { - if (yych == '\r') goto yy41; - goto yy26; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy39; - if (yych <= '"') goto yy41; - goto yy26; - } else { - if (yych == '%') goto yy26; - if (yych <= '&') goto yy41; - goto yy26; - } - } - } else { - if (yych <= 'N') { - if (yych <= ';') { - if (yych <= ')') goto yy41; - if (yych <= ':') goto yy26; - goto yy41; - } else { - if (yych == '=') goto yy41; - if (yych <= 'M') goto yy26; - goto yy47; - } - } else { - if (yych <= 'm') { - if (yych == '^') goto yy41; - goto yy26; - } else { - if (yych <= 'n') goto yy47; - if (yych <= 'z') goto yy26; - if (yych <= '~') goto yy41; - goto yy26; - } - } - } -yy45: - YYDEBUG(45, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy46; - if (yych != 'l') goto yy26; -yy46: - YYDEBUG(46, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy39; - if (yych == 'l') goto yy39; - goto yy26; -yy47: - YYDEBUG(47, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy39; - if (yych == 'e') goto yy39; - goto yy26; -yy48: - YYDEBUG(48, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy49; - if (yych != 'l') goto yy26; -yy49: - YYDEBUG(49, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy50; - if (yych != 's') goto yy26; -yy50: - YYDEBUG(50, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy39; - if (yych == 'e') goto yy39; - goto yy26; -yy51: - YYDEBUG(51, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy52: - YYDEBUG(52, *YYCURSOR); - if (yych == '\t') goto yy51; - if (yych == ' ') goto yy51; - goto yy17; -yy53: - YYDEBUG(53, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy54: - YYDEBUG(54, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy53; - } - if (yych >= '\r') goto yy57; -yy55: - YYDEBUG(55, *YYCURSOR); - ++YYCURSOR; -yy56: - YYDEBUG(56, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 585 "Zend/zend_ini_scanner.l" - { /* Comment */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 936 "Zend/zend_ini_scanner.c" -yy57: - YYDEBUG(57, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy55; - goto yy56; -yy58: - YYDEBUG(58, *YYCURSOR); - yyaccept = 1; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy59: - YYDEBUG(59, *YYCURSOR); - if (yych <= '\'') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy58; - if (yych >= '\n') goto yy64; - } else { - if (yych == '\r') goto yy66; - goto yy58; - } - } else { - if (yych <= '$') { - if (yych == '#') goto yy58; - } else { - if (yych != '&') goto yy58; - } - } - } else { - if (yych <= 'Z') { - if (yych <= ';') { - if (yych <= ')') goto yy60; - if (yych <= ':') goto yy58; - } else { - if (yych != '=') goto yy58; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy62; - if (yych <= ']') goto yy58; - } else { - if (yych <= 'z') goto yy58; - if (yych >= 0x7F) goto yy58; - } - } - } -yy60: - YYDEBUG(60, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; - YYDEBUG(61, *YYCURSOR); - if (yych == '\n') goto yy64; - if (yych == '\r') goto yy66; - goto yy60; -yy62: - YYDEBUG(62, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; - YYDEBUG(63, *YYCURSOR); - if (yych <= '\f') { - if (yych <= 0x08) goto yy60; - if (yych <= '\t') goto yy62; - if (yych >= '\v') goto yy60; - } else { - if (yych <= '\r') goto yy66; - if (yych == ' ') goto yy62; - goto yy60; - } -yy64: - YYDEBUG(64, *YYCURSOR); - ++YYCURSOR; -yy65: - YYDEBUG(65, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 591 "Zend/zend_ini_scanner.l" - { /* #Comment */ - zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno)); - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 1022 "Zend/zend_ini_scanner.c" -yy66: - YYDEBUG(66, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy64; - goto yy65; -yy67: - YYDEBUG(67, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy68: - YYDEBUG(68, *YYCURSOR); - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy5; - if (yych <= '\t') goto yy67; - goto yy71; - } else { - if (yych == '\r') goto yy72; - if (yych <= 0x1F) goto yy5; - goto yy67; - } - } else { - if (yych <= ':') { - if (yych == '#') goto yy60; - goto yy5; - } else { - if (yych <= ';') goto yy53; - if (yych == '=') goto yy51; - goto yy5; - } - } -yy69: - YYDEBUG(69, *YYCURSOR); - yyaccept = 1; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; - YYDEBUG(70, *YYCURSOR); - if (yych <= '&') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy67; - } else { - if (yych == '\r') goto yy72; - goto yy25; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy69; - if (yych <= '"') goto yy3; - goto yy58; - } else { - if (yych == '%') goto yy25; - goto yy3; - } - } - } else { - if (yych <= '=') { - if (yych <= ':') { - if (yych <= '\'') goto yy25; - if (yych <= ')') goto yy3; - goto yy25; - } else { - if (yych <= ';') goto yy53; - if (yych <= '<') goto yy25; - goto yy51; - } - } else { - if (yych <= ']') { - if (yych == '[') goto yy28; - goto yy25; - } else { - if (yych <= '^') goto yy3; - if (yych <= 'z') goto yy25; - if (yych <= '~') goto yy3; - goto yy25; - } - } - } -yy71: - YYDEBUG(71, *YYCURSOR); - yych = *++YYCURSOR; - goto yy7; -yy72: - YYDEBUG(72, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy71; - goto yy7; - } -/* *********************************** */ -yyc_ST_DOUBLE_QUOTES: - { - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - YYDEBUG(73, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych == '"') goto yy77; - if (yych == '$') goto yy79; - YYDEBUG(75, *YYCURSOR); - ++YYCURSOR; -yy76: - YYDEBUG(76, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 535 "Zend/zend_ini_scanner.l" - { /* Escape double quoted string contents */ - if (YYCURSOR > YYLIMIT) { - return 0; - } - - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '"': - if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') { - continue; - } - break; - case '$': - if (*YYCURSOR == '{') { - break; - } - continue; - case '\\': - if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') { - YYCURSOR++; - } - /* fall through */ - default: - continue; - } - - YYCURSOR--; - break; - } - - yyleng = YYCURSOR - SCNG(yy_text); - - zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC); - return TC_QUOTED_STRING; -} -#line 1198 "Zend/zend_ini_scanner.c" -yy77: - YYDEBUG(77, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy83; -yy78: - YYDEBUG(78, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 530 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string ends */ - yy_pop_state(TSRMLS_C); - return '"'; -} -#line 1212 "Zend/zend_ini_scanner.c" -yy79: - YYDEBUG(79, *YYCURSOR); - yych = *++YYCURSOR; - if (yych != '{') goto yy76; - YYDEBUG(80, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(81, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 1226 "Zend/zend_ini_scanner.c" -yy82: - YYDEBUG(82, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy83: - YYDEBUG(83, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy82; - } - goto yy78; - } -/* *********************************** */ -yyc_ST_OFFSET: - { - static const unsigned char yybm[] = { - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 194, 64, 66, 66, 64, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 194, 66, 64, 66, 68, 66, 66, 0, - 66, 66, 66, 66, 66, 66, 66, 66, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 66, 64, 66, 66, 66, 66, - 66, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 66, 72, 64, 66, 82, - 66, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - }; - YYDEBUG(84, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych <= '-') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy86; - if (yych <= '\t') goto yy88; - goto yy89; - } else { - if (yych == '\r') goto yy89; - if (yych >= ' ') goto yy88; - } - } else { - if (yych <= '$') { - if (yych == '"') goto yy91; - if (yych >= '$') goto yy93; - } else { - if (yych == '\'') goto yy94; - if (yych >= '-') goto yy95; - } - } - } else { - if (yych <= 'Z') { - if (yych <= '9') { - if (yych <= '.') goto yy96; - if (yych >= '0') goto yy97; - } else { - if (yych == ';') goto yy89; - if (yych >= 'A') goto yy99; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy86; - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy102; - } else { - if (yych == '`') goto yy86; - if (yych <= 'z') goto yy99; - } - } - } -yy86: - YYDEBUG(86, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy105; -yy87: - YYDEBUG(87, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 521 "Zend/zend_ini_scanner.l" - { /* Get rest as section/offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); -} -#line 1330 "Zend/zend_ini_scanner.c" -yy88: - YYDEBUG(88, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy131; - } - if (yych == '"') goto yy133; - if (yych == ']') goto yy134; - goto yy105; -yy89: - YYDEBUG(89, *YYCURSOR); - ++YYCURSOR; -yy90: - YYDEBUG(90, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 1351 "Zend/zend_ini_scanner.c" -yy91: - YYDEBUG(91, *YYCURSOR); - ++YYCURSOR; -yy92: - YYDEBUG(92, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 525 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string start */ - yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); - return '"'; -} -#line 1363 "Zend/zend_ini_scanner.c" -yy93: - YYDEBUG(93, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy90; - if (yych <= '[') goto yy104; - goto yy109; - } else { - if (yych == '{') goto yy129; - goto yy104; - } -yy94: - YYDEBUG(94, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy125; - } - goto yy90; -yy95: - YYDEBUG(95, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy105; - if (yych <= '9') goto yy123; - goto yy105; -yy96: - YYDEBUG(96, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy105; - if (yych <= '9') goto yy121; - goto yy105; -yy97: - YYDEBUG(97, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '\'') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy105; - } else { - if (yych == '"') goto yy98; - if (yych <= '&') goto yy105; - } - } else { - if (yych <= '9') { - if (yych == '.') goto yy117; - if (yych <= '/') goto yy105; - goto yy119; - } else { - if (yych <= ';') { - if (yych <= ':') goto yy105; - } else { - if (yych != ']') goto yy105; - } - } - } -yy98: - YYDEBUG(98, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 499 "Zend/zend_ini_scanner.l" - { /* Get number option value as string */ - RETURN_TOKEN(TC_NUMBER, yytext, yyleng); -} -#line 1429 "Zend/zend_ini_scanner.c" -yy99: - YYDEBUG(99, *YYCURSOR); - yyaccept = 3; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy115; - } - if (yych <= '"') { - if (yych <= '\f') { - if (yych != '\n') goto yy105; - } else { - if (yych <= '\r') goto yy100; - if (yych <= '!') goto yy105; - } - } else { - if (yych <= ':') { - if (yych != '\'') goto yy105; - } else { - if (yych <= ';') goto yy100; - if (yych != ']') goto yy105; - } - } -yy100: - YYDEBUG(100, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 495 "Zend/zend_ini_scanner.l" - { /* Get constant option value */ - RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); -} -#line 1459 "Zend/zend_ini_scanner.c" -yy101: - YYDEBUG(101, *YYCURSOR); - yych = *++YYCURSOR; - goto yy104; -yy102: - YYDEBUG(102, *YYCURSOR); - ++YYCURSOR; -yy103: - YYDEBUG(103, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 396 "Zend/zend_ini_scanner.l" - { /* End of section or an option offset */ - BEGIN(INITIAL); - return ']'; -} -#line 1475 "Zend/zend_ini_scanner.c" -yy104: - YYDEBUG(104, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy105: - YYDEBUG(105, *YYCURSOR); - if (yybm[0+yych] & 2) { - goto yy104; - } - if (yych == '$') goto yy107; - if (yych != '\\') goto yy87; -yy106: - YYDEBUG(106, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - goto yy104; -yy107: - YYDEBUG(107, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy108; - if (yych <= '[') goto yy104; - goto yy109; - } else { - if (yych != '{') goto yy104; - } -yy108: - YYDEBUG(108, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy87; - } else { - goto yy90; - } - } else { - if (yyaccept <= 2) { - goto yy98; - } else { - goto yy100; - } - } -yy109: - YYDEBUG(109, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy112; - goto yy104; -yy110: - YYDEBUG(110, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(111, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy114; - goto yy104; -yy112: - YYDEBUG(112, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(113, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy112; - goto yy104; -yy114: - YYDEBUG(114, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy112; - goto yy104; -yy115: - YYDEBUG(115, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(116, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy115; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy100; - if (yych <= '\f') goto yy104; - goto yy100; - } else { - if (yych == '"') goto yy100; - if (yych <= '#') goto yy104; - goto yy107; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy100; - if (yych <= ':') goto yy104; - goto yy100; - } else { - if (yych <= '[') goto yy104; - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy100; - goto yy104; - } - } -yy117: - YYDEBUG(117, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(118, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy117; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy104; - goto yy98; - } else { - if (yych == '"') goto yy98; - if (yych <= '#') goto yy104; - goto yy107; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy98; - if (yych <= ':') goto yy104; - goto yy98; - } else { - if (yych <= '[') goto yy104; - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } -yy119: - YYDEBUG(119, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(120, *YYCURSOR); - if (yych <= '\'') { - if (yych <= '!') { - if (yych <= '\n') { - if (yych <= '\t') goto yy104; - goto yy98; - } else { - if (yych == '\r') goto yy98; - goto yy104; - } - } else { - if (yych <= '#') { - if (yych <= '"') goto yy98; - goto yy104; - } else { - if (yych <= '$') goto yy107; - if (yych <= '&') goto yy104; - goto yy98; - } - } - } else { - if (yych <= ':') { - if (yych <= '.') { - if (yych <= '-') goto yy104; - goto yy117; - } else { - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy119; - goto yy104; - } - } else { - if (yych <= '[') { - if (yych <= ';') goto yy98; - goto yy104; - } else { - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } - } -yy121: - YYDEBUG(121, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(122, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy104; - goto yy98; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy104; - goto yy98; - } else { - if (yych == '$') goto yy107; - goto yy104; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy98; - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy121; - goto yy104; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy98; - goto yy104; - } else { - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } - } -yy123: - YYDEBUG(123, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(124, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy104; - goto yy98; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy104; - goto yy98; - } else { - if (yych == '$') goto yy107; - goto yy104; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy98; - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy123; - goto yy104; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy98; - goto yy104; - } else { - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } - } -yy125: - YYDEBUG(125, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(126, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy125; - } - YYDEBUG(127, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(128, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 368 "Zend/zend_ini_scanner.l" - { /* Raw string */ - /* Eat leading and trailing single quotes */ - if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 1774 "Zend/zend_ini_scanner.c" -yy129: - YYDEBUG(129, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(130, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 1785 "Zend/zend_ini_scanner.c" -yy131: - YYDEBUG(131, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(132, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy131; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy87; - if (yych <= '\f') goto yy104; - goto yy87; - } else { - if (yych == '"') goto yy133; - if (yych <= '#') goto yy104; - goto yy107; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy87; - if (yych <= ':') goto yy104; - goto yy87; - } else { - if (yych <= '[') goto yy104; - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy134; - goto yy104; - } - } -yy133: - YYDEBUG(133, *YYCURSOR); - yych = *++YYCURSOR; - goto yy92; -yy134: - YYDEBUG(134, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy103; - } -/* *********************************** */ -yyc_ST_RAW: - { - static const unsigned char yybm[] = { - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 192, 0, 64, 64, 0, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 192, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - }; - YYDEBUG(135, *YYCURSOR); - YYFILL(3); - yych = *YYCURSOR; - if (yych <= '\f') { - if (yych <= 0x08) { - if (yych >= 0x01) goto yy139; - } else { - if (yych <= '\t') goto yy141; - if (yych <= '\n') goto yy142; - goto yy139; - } - } else { - if (yych <= ' ') { - if (yych <= '\r') goto yy144; - if (yych <= 0x1F) goto yy139; - goto yy141; - } else { - if (yych == ';') goto yy145; - goto yy139; - } - } - YYDEBUG(137, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(138, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 598 "Zend/zend_ini_scanner.l" - { /* End of option value (if EOF is reached before EOL */ - BEGIN(INITIAL); - return END_OF_LINE; -} -#line 1895 "Zend/zend_ini_scanner.c" -yy139: - YYDEBUG(139, *YYCURSOR); - ++YYCURSOR; -yy140: - YYDEBUG(140, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 448 "Zend/zend_ini_scanner.l" - { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ - char *sc = NULL; - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR) { - case '\n': - case '\r': - goto end_raw_value_chars; - break; - case ';': - if (sc == NULL) { - sc = YYCURSOR; - } - /* no break */ - default: - YYCURSOR++; - break; - } - } -end_raw_value_chars: - yyleng = YYCURSOR - SCNG(yy_text); - - /* Eat trailing semicolons */ - while (yytext[yyleng - 1] == ';') { - yyleng--; - } - - /* Eat leading and trailing double quotes */ - if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } else if (sc) { - YYCURSOR = sc; - yyleng = YYCURSOR - SCNG(yy_text); - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 1939 "Zend/zend_ini_scanner.c" -yy141: - YYDEBUG(141, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '\r') { - if (yych <= 0x08) goto yy140; - if (yych <= '\n') goto yy153; - if (yych <= '\f') goto yy140; - goto yy153; - } else { - if (yych <= ' ') { - if (yych <= 0x1F) goto yy140; - goto yy153; - } else { - if (yych == ';') goto yy153; - goto yy140; - } - } -yy142: - YYDEBUG(142, *YYCURSOR); - ++YYCURSOR; -yy143: - YYDEBUG(143, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 489 "Zend/zend_ini_scanner.l" - { /* End of option value */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 1970 "Zend/zend_ini_scanner.c" -yy144: - YYDEBUG(144, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy151; - goto yy143; -yy145: - YYDEBUG(145, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy147; -yy146: - YYDEBUG(146, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy147: - YYDEBUG(147, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy146; - } - if (yych >= '\r') goto yy150; -yy148: - YYDEBUG(148, *YYCURSOR); - ++YYCURSOR; -yy149: - YYDEBUG(149, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 585 "Zend/zend_ini_scanner.l" - { /* Comment */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 2004 "Zend/zend_ini_scanner.c" -yy150: - YYDEBUG(150, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy148; - goto yy149; -yy151: - YYDEBUG(151, *YYCURSOR); - yych = *++YYCURSOR; - goto yy143; -yy152: - YYDEBUG(152, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy153: - YYDEBUG(153, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy152; - } - if (yych <= '\f') { - if (yych == '\n') goto yy151; - } else { - if (yych <= '\r') goto yy155; - if (yych == ';') goto yy146; - } - YYDEBUG(154, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 575 "Zend/zend_ini_scanner.l" - { - /* eat whitespace */ - goto restart; -} -#line 2038 "Zend/zend_ini_scanner.c" -yy155: - YYDEBUG(155, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy151; - goto yy143; - } -/* *********************************** */ -yyc_ST_SECTION_RAW: - { - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 192, 0, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(156, *YYCURSOR); - YYFILL(3); - yych = *YYCURSOR; - if (yych <= '\f') { - if (yych == '\n') goto yy160; - } else { - if (yych <= '\r') goto yy160; - if (yych == ']') goto yy162; - } - YYDEBUG(158, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy169; -yy159: - YYDEBUG(159, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 485 "Zend/zend_ini_scanner.l" - { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 2102 "Zend/zend_ini_scanner.c" -yy160: - YYDEBUG(160, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(161, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 2112 "Zend/zend_ini_scanner.c" -yy162: - YYDEBUG(162, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy165; -yy163: - YYDEBUG(163, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 377 "Zend/zend_ini_scanner.l" - { /* End of section */ - BEGIN(INITIAL); - SCNG(lineno)++; - return ']'; -} -#line 2127 "Zend/zend_ini_scanner.c" -yy164: - YYDEBUG(164, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy165: - YYDEBUG(165, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy164; - } - if (yych == '\n') goto yy166; - if (yych == '\r') goto yy167; - goto yy163; -yy166: - YYDEBUG(166, *YYCURSOR); - yych = *++YYCURSOR; - goto yy163; -yy167: - YYDEBUG(167, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy166; - goto yy163; -yy168: - YYDEBUG(168, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy169: - YYDEBUG(169, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy168; - } - goto yy159; - } -/* *********************************** */ -yyc_ST_SECTION_VALUE: - { - static const unsigned char yybm[] = { - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 134, 128, 132, 132, 128, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 134, 132, 128, 132, 136, 132, 132, 0, - 132, 132, 132, 132, 132, 132, 132, 132, - 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 132, 128, 132, 132, 132, 132, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 144, 128, 132, 164, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - }; - YYDEBUG(170, *YYCURSOR); - YYFILL(3); - yych = *YYCURSOR; - if (yych <= '-') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy172; - if (yych <= '\t') goto yy174; - goto yy175; - } else { - if (yych == '\r') goto yy175; - if (yych >= ' ') goto yy174; - } - } else { - if (yych <= '$') { - if (yych == '"') goto yy177; - if (yych >= '$') goto yy179; - } else { - if (yych == '\'') goto yy180; - if (yych >= '-') goto yy181; - } - } - } else { - if (yych <= 'Z') { - if (yych <= '9') { - if (yych <= '.') goto yy182; - if (yych >= '0') goto yy183; - } else { - if (yych == ';') goto yy175; - if (yych >= 'A') goto yy185; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy172; - if (yych <= '\\') goto yy187; - if (yych <= ']') goto yy188; - } else { - if (yych == '`') goto yy172; - if (yych <= 'z') goto yy185; - } - } - } -yy172: - YYDEBUG(172, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy195; -yy173: - YYDEBUG(173, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 521 "Zend/zend_ini_scanner.l" - { /* Get rest as section/offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); -} -#line 2253 "Zend/zend_ini_scanner.c" -yy174: - YYDEBUG(174, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy221; - goto yy195; - } else { - if (yych <= ' ') goto yy221; - if (yych == '"') goto yy223; - goto yy195; - } -yy175: - YYDEBUG(175, *YYCURSOR); - ++YYCURSOR; -yy176: - YYDEBUG(176, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 2276 "Zend/zend_ini_scanner.c" -yy177: - YYDEBUG(177, *YYCURSOR); - ++YYCURSOR; -yy178: - YYDEBUG(178, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 525 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string start */ - yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); - return '"'; -} -#line 2288 "Zend/zend_ini_scanner.c" -yy179: - YYDEBUG(179, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy176; - if (yych <= '[') goto yy194; - goto yy199; - } else { - if (yych == '{') goto yy219; - goto yy194; - } -yy180: - YYDEBUG(180, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy215; - } - goto yy176; -yy181: - YYDEBUG(181, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy195; - if (yych <= '9') goto yy213; - goto yy195; -yy182: - YYDEBUG(182, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy195; - if (yych <= '9') goto yy211; - goto yy195; -yy183: - YYDEBUG(183, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '\'') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy195; - } else { - if (yych == '"') goto yy184; - if (yych <= '&') goto yy195; - } - } else { - if (yych <= '9') { - if (yych == '.') goto yy207; - if (yych <= '/') goto yy195; - goto yy209; - } else { - if (yych <= ';') { - if (yych <= ':') goto yy195; - } else { - if (yych != ']') goto yy195; - } - } - } -yy184: - YYDEBUG(184, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 499 "Zend/zend_ini_scanner.l" - { /* Get number option value as string */ - RETURN_TOKEN(TC_NUMBER, yytext, yyleng); -} -#line 2354 "Zend/zend_ini_scanner.c" -yy185: - YYDEBUG(185, *YYCURSOR); - yyaccept = 3; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy205; - } - if (yych <= '"') { - if (yych <= '\f') { - if (yych != '\n') goto yy195; - } else { - if (yych <= '\r') goto yy186; - if (yych <= '!') goto yy195; - } - } else { - if (yych <= ':') { - if (yych != '\'') goto yy195; - } else { - if (yych <= ';') goto yy186; - if (yych != ']') goto yy195; - } - } -yy186: - YYDEBUG(186, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 495 "Zend/zend_ini_scanner.l" - { /* Get constant option value */ - RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); -} -#line 2384 "Zend/zend_ini_scanner.c" -yy187: - YYDEBUG(187, *YYCURSOR); - yych = *++YYCURSOR; - goto yy194; -yy188: - YYDEBUG(188, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy191; -yy189: - YYDEBUG(189, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 377 "Zend/zend_ini_scanner.l" - { /* End of section */ - BEGIN(INITIAL); - SCNG(lineno)++; - return ']'; -} -#line 2403 "Zend/zend_ini_scanner.c" -yy190: - YYDEBUG(190, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy191: - YYDEBUG(191, *YYCURSOR); - if (yybm[0+yych] & 2) { - goto yy190; - } - if (yych == '\n') goto yy192; - if (yych == '\r') goto yy193; - goto yy189; -yy192: - YYDEBUG(192, *YYCURSOR); - yych = *++YYCURSOR; - goto yy189; -yy193: - YYDEBUG(193, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy192; - goto yy189; -yy194: - YYDEBUG(194, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy195: - YYDEBUG(195, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy194; - } - if (yych == '$') goto yy197; - if (yych != '\\') goto yy173; -yy196: - YYDEBUG(196, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - goto yy194; -yy197: - YYDEBUG(197, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy198; - if (yych <= '[') goto yy194; - goto yy199; - } else { - if (yych != '{') goto yy194; - } -yy198: - YYDEBUG(198, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy173; - } else { - goto yy176; - } - } else { - if (yyaccept <= 2) { - goto yy184; - } else { - goto yy186; - } - } -yy199: - YYDEBUG(199, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy202; - goto yy194; -yy200: - YYDEBUG(200, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(201, *YYCURSOR); - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy204; - goto yy194; -yy202: - YYDEBUG(202, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(203, *YYCURSOR); - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy202; - goto yy194; -yy204: - YYDEBUG(204, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy202; - goto yy194; -yy205: - YYDEBUG(205, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(206, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy205; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy186; - if (yych <= '\f') goto yy194; - goto yy186; - } else { - if (yych == '"') goto yy186; - if (yych <= '#') goto yy194; - goto yy197; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy186; - if (yych <= ':') goto yy194; - goto yy186; - } else { - if (yych <= '[') goto yy194; - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy186; - goto yy194; - } - } -yy207: - YYDEBUG(207, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(208, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy207; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy194; - goto yy184; - } else { - if (yych == '"') goto yy184; - if (yych <= '#') goto yy194; - goto yy197; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy184; - if (yych <= ':') goto yy194; - goto yy184; - } else { - if (yych <= '[') goto yy194; - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } -yy209: - YYDEBUG(209, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(210, *YYCURSOR); - if (yych <= '\'') { - if (yych <= '!') { - if (yych <= '\n') { - if (yych <= '\t') goto yy194; - goto yy184; - } else { - if (yych == '\r') goto yy184; - goto yy194; - } - } else { - if (yych <= '#') { - if (yych <= '"') goto yy184; - goto yy194; - } else { - if (yych <= '$') goto yy197; - if (yych <= '&') goto yy194; - goto yy184; - } - } - } else { - if (yych <= ':') { - if (yych <= '.') { - if (yych <= '-') goto yy194; - goto yy207; - } else { - if (yych <= '/') goto yy194; - if (yych <= '9') goto yy209; - goto yy194; - } - } else { - if (yych <= '[') { - if (yych <= ';') goto yy184; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } - } -yy211: - YYDEBUG(211, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(212, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy194; - goto yy184; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy194; - goto yy184; - } else { - if (yych == '$') goto yy197; - goto yy194; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy184; - if (yych <= '/') goto yy194; - if (yych <= '9') goto yy211; - goto yy194; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy184; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } - } -yy213: - YYDEBUG(213, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(214, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy194; - goto yy184; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy194; - goto yy184; - } else { - if (yych == '$') goto yy197; - goto yy194; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy184; - if (yych <= '/') goto yy194; - if (yych <= '9') goto yy213; - goto yy194; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy184; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } - } -yy215: - YYDEBUG(215, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(216, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy215; - } - YYDEBUG(217, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(218, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 368 "Zend/zend_ini_scanner.l" - { /* Raw string */ - /* Eat leading and trailing single quotes */ - if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 2724 "Zend/zend_ini_scanner.c" -yy219: - YYDEBUG(219, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(220, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 2735 "Zend/zend_ini_scanner.c" -yy221: - YYDEBUG(221, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(222, *YYCURSOR); - if (yych <= '"') { - if (yych <= '\f') { - if (yych <= 0x08) goto yy194; - if (yych <= '\t') goto yy221; - if (yych <= '\n') goto yy173; - goto yy194; - } else { - if (yych <= 0x1F) { - if (yych <= '\r') goto yy173; - goto yy194; - } else { - if (yych <= ' ') goto yy221; - if (yych <= '!') goto yy194; - } - } - } else { - if (yych <= ':') { - if (yych <= '$') { - if (yych <= '#') goto yy194; - goto yy197; - } else { - if (yych == '\'') goto yy173; - goto yy194; - } - } else { - if (yych <= '[') { - if (yych <= ';') goto yy173; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy173; - goto yy194; - } - } - } -yy223: - YYDEBUG(223, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy178; - } -/* *********************************** */ -yyc_ST_VALUE: - { - static const unsigned char yybm[] = { - 160, 162, 162, 162, 162, 162, 162, 162, - 162, 176, 128, 162, 162, 128, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 176, 160, 160, 162, 168, 162, 160, 32, - 160, 160, 162, 162, 162, 162, 162, 162, - 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 162, 160, 162, 160, 162, 162, - 162, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 162, 162, 162, 160, 166, - 162, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 162, 160, 162, 160, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - }; - YYDEBUG(224, *YYCURSOR); - YYFILL(6); - yych = *YYCURSOR; - YYDEBUG(-1, yych); - switch (yych) { - case 0x00: goto yy226; - case '\t': - case ' ': goto yy230; - case '\n': goto yy232; - case '\r': goto yy234; - case '!': - case '&': - case '(': - case ')': - case '^': - case '|': - case '~': goto yy235; - case '"': goto yy237; - case '$': goto yy239; - case '\'': goto yy240; - case '-': goto yy241; - case '.': goto yy242; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy243; - case ';': goto yy245; - case '=': goto yy246; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Z': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'p': - case 'q': - case 'r': - case 's': - case 'u': - case 'v': - case 'w': - case 'x': - case 'z': goto yy248; - case 'F': - case 'f': goto yy250; - case 'N': - case 'n': goto yy251; - case 'O': - case 'o': goto yy252; - case 'T': - case 't': goto yy253; - case 'Y': - case 'y': goto yy254; - default: goto yy228; - } -yy226: - YYDEBUG(226, *YYCURSOR); - ++YYCURSOR; -yy227: - YYDEBUG(227, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 598 "Zend/zend_ini_scanner.l" - { /* End of option value (if EOF is reached before EOL */ - BEGIN(INITIAL); - return END_OF_LINE; -} -#line 2921 "Zend/zend_ini_scanner.c" -yy228: - YYDEBUG(228, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy256; -yy229: - YYDEBUG(229, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 517 "Zend/zend_ini_scanner.l" - { /* Get everything else as option/offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); -} -#line 2934 "Zend/zend_ini_scanner.c" -yy230: - YYDEBUG(230, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy306; -yy231: - YYDEBUG(231, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 571 "Zend/zend_ini_scanner.l" - { - RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); -} -#line 2947 "Zend/zend_ini_scanner.c" -yy232: - YYDEBUG(232, *YYCURSOR); - ++YYCURSOR; -yy233: - YYDEBUG(233, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 489 "Zend/zend_ini_scanner.l" - { /* End of option value */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 2960 "Zend/zend_ini_scanner.c" -yy234: - YYDEBUG(234, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy304; - goto yy233; -yy235: - YYDEBUG(235, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy303; -yy236: - YYDEBUG(236, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 507 "Zend/zend_ini_scanner.l" - { /* Boolean operators */ - return yytext[0]; -} -#line 2978 "Zend/zend_ini_scanner.c" -yy237: - YYDEBUG(237, *YYCURSOR); - ++YYCURSOR; -yy238: - YYDEBUG(238, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 525 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string start */ - yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); - return '"'; -} -#line 2990 "Zend/zend_ini_scanner.c" -yy239: - YYDEBUG(239, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy227; - if (yych <= '[') goto yy255; - goto yy262; - } else { - if (yych == '{') goto yy300; - goto yy255; - } -yy240: - YYDEBUG(240, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy296; - } - goto yy227; -yy241: - YYDEBUG(241, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy294; - goto yy256; -yy242: - YYDEBUG(242, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy292; - goto yy256; -yy243: - YYDEBUG(243, *YYCURSOR); - yyaccept = 3; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy256; - } else { - if (yych != '\r') goto yy256; - } - } else { - if (yych <= ')') { - if (yych <= '"') goto yy244; - if (yych <= '%') goto yy256; - } else { - if (yych == '.') goto yy288; - goto yy256; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= '9') goto yy290; - if (yych <= ':') goto yy256; - } else { - if (yych != '=') goto yy256; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy256; - } else { - if (yych != '~') goto yy256; - } - } - } -yy244: - YYDEBUG(244, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 499 "Zend/zend_ini_scanner.l" - { /* Get number option value as string */ - RETURN_TOKEN(TC_NUMBER, yytext, yyleng); -} -#line 3069 "Zend/zend_ini_scanner.c" -yy245: - YYDEBUG(245, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - goto yy284; -yy246: - YYDEBUG(246, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(247, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 511 "Zend/zend_ini_scanner.l" - { /* Make = used in option value to trigger error */ - yyless(0); - BEGIN(INITIAL); - return END_OF_LINE; -} -#line 3086 "Zend/zend_ini_scanner.c" -yy248: - YYDEBUG(248, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy257; - } - if (yych <= ':') { - if (yych <= '\r') { - if (yych <= 0x08) { - if (yych >= 0x01) goto yy256; - } else { - if (yych <= '\n') goto yy249; - if (yych <= '\f') goto yy256; - } - } else { - if (yych <= '"') { - if (yych <= 0x1F) goto yy256; - } else { - if (yych <= '%') goto yy256; - if (yych >= '*') goto yy256; - } - } - } else { - if (yych <= '^') { - if (yych <= '<') { - if (yych >= '<') goto yy256; - } else { - if (yych <= '=') goto yy249; - if (yych <= ']') goto yy256; - } - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - } else { - if (yych != '~') goto yy256; - } - } - } -yy249: - YYDEBUG(249, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 495 "Zend/zend_ini_scanner.l" - { /* Get constant option value */ - RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); -} -#line 3133 "Zend/zend_ini_scanner.c" -yy250: - YYDEBUG(250, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '<') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '/') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - goto yy256; - } else { - if (yych <= '9') goto yy257; - if (yych == ';') goto yy249; - goto yy256; - } - } - } else { - if (yych <= '_') { - if (yych <= 'A') { - if (yych <= '=') goto yy249; - if (yych <= '@') goto yy256; - goto yy280; - } else { - if (yych <= 'Z') goto yy257; - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - goto yy257; - } - } else { - if (yych <= '{') { - if (yych <= '`') goto yy256; - if (yych <= 'a') goto yy280; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy251: - YYDEBUG(251, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'N') { - if (yych <= '%') { - if (yych <= '\f') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - if (yych <= '\n') goto yy249; - goto yy256; - } else { - if (yych <= '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - if (yych <= '"') goto yy249; - goto yy256; - } - } else { - if (yych <= ':') { - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy257; - goto yy256; - } else { - if (yych <= '<') { - if (yych <= ';') goto yy249; - goto yy256; - } else { - if (yych <= '=') goto yy249; - if (yych <= '@') goto yy256; - goto yy257; - } - } - } - } else { - if (yych <= 'n') { - if (yych <= 'Z') { - if (yych <= 'O') goto yy276; - if (yych == 'U') goto yy277; - goto yy257; - } else { - if (yych <= '^') { - if (yych <= ']') goto yy256; - goto yy249; - } else { - if (yych == '`') goto yy256; - goto yy257; - } - } - } else { - if (yych <= 'z') { - if (yych <= 'o') goto yy276; - if (yych == 'u') goto yy277; - goto yy257; - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - goto yy249; - } else { - if (yych == '~') goto yy249; - goto yy256; - } - } - } - } -yy252: - YYDEBUG(252, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'E') { - if (yych <= '%') { - if (yych <= '\f') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - if (yych <= '\n') goto yy249; - goto yy256; - } else { - if (yych <= '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - if (yych <= '"') goto yy249; - goto yy256; - } - } else { - if (yych <= ':') { - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy257; - goto yy256; - } else { - if (yych <= '<') { - if (yych <= ';') goto yy249; - goto yy256; - } else { - if (yych <= '=') goto yy249; - if (yych <= '@') goto yy256; - goto yy257; - } - } - } - } else { - if (yych <= 'e') { - if (yych <= 'Z') { - if (yych <= 'F') goto yy271; - if (yych == 'N') goto yy265; - goto yy257; - } else { - if (yych <= '^') { - if (yych <= ']') goto yy256; - goto yy249; - } else { - if (yych == '`') goto yy256; - goto yy257; - } - } - } else { - if (yych <= 'z') { - if (yych <= 'f') goto yy271; - if (yych == 'n') goto yy265; - goto yy257; - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - goto yy249; - } else { - if (yych == '~') goto yy249; - goto yy256; - } - } - } - } -yy253: - YYDEBUG(253, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'R') goto yy269; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'r') goto yy269; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy254: - YYDEBUG(254, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy259; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy259; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy255: - YYDEBUG(255, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy256: - YYDEBUG(256, *YYCURSOR); - if (yybm[0+yych] & 2) { - goto yy255; - } - if (yych == '$') goto yy260; - goto yy229; -yy257: - YYDEBUG(257, *YYCURSOR); - yyaccept = 4; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(258, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy257; - } - if (yych <= ')') { - if (yych <= '\r') { - if (yych <= 0x08) { - if (yych <= 0x00) goto yy249; - goto yy255; - } else { - if (yych <= '\n') goto yy249; - if (yych <= '\f') goto yy255; - goto yy249; - } - } else { - if (yych <= '#') { - if (yych <= 0x1F) goto yy255; - if (yych <= '"') goto yy249; - goto yy255; - } else { - if (yych <= '$') goto yy260; - if (yych <= '%') goto yy255; - goto yy249; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= ':') goto yy255; - goto yy249; - } else { - if (yych == '=') goto yy249; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy249; - if (yych <= '{') goto yy255; - goto yy249; - } else { - if (yych == '~') goto yy249; - goto yy255; - } - } - } -yy259: - YYDEBUG(259, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'S') goto yy265; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 's') goto yy265; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy260: - YYDEBUG(260, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy261; - if (yych <= '[') goto yy255; - goto yy262; - } else { - if (yych != '{') goto yy255; - } -yy261: - YYDEBUG(261, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 3) { - if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy229; - } else { - goto yy231; - } - } else { - if (yyaccept <= 2) { - goto yy227; - } else { - goto yy244; - } - } - } else { - if (yyaccept <= 5) { - if (yyaccept <= 4) { - goto yy249; - } else { - goto yy266; - } - } else { - goto yy273; - } - } -yy262: - YYDEBUG(262, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 8) { - goto yy263; - } - goto yy255; -yy263: - YYDEBUG(263, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(264, *YYCURSOR); - if (yybm[0+yych] & 8) { - goto yy263; - } - if (yych <= 0x00) goto yy229; - if (yych == '\\') goto yy262; - goto yy255; -yy265: - YYDEBUG(265, *YYCURSOR); - yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy267; - } - if (yych <= ';') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy266; - if (yych <= '\t') goto yy256; - } else { - if (yych != '\r') goto yy256; - } - } else { - if (yych <= ')') { - if (yych <= '"') goto yy266; - if (yych <= '%') goto yy256; - } else { - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy257; - if (yych <= ':') goto yy256; - } - } - } else { - if (yych <= '_') { - if (yych <= '@') { - if (yych != '=') goto yy256; - } else { - if (yych <= 'Z') goto yy257; - if (yych <= ']') goto yy256; - if (yych >= '_') goto yy257; - } - } else { - if (yych <= '{') { - if (yych <= '`') goto yy256; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych >= 0x7F) goto yy256; - } - } - } -yy266: - YYDEBUG(266, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 421 "Zend/zend_ini_scanner.l" - { /* TRUE value (when used outside option value/offset this causes parse error!) */ - RETURN_TOKEN(BOOL_TRUE, "1", 1); -} -#line 3645 "Zend/zend_ini_scanner.c" -yy267: - YYDEBUG(267, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(268, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy267; - } - goto yy266; -yy269: - YYDEBUG(269, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'U') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'u') goto yy270; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy270: - YYDEBUG(270, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy265; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy265; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy271: - YYDEBUG(271, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'F') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'f') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy272: - YYDEBUG(272, *YYCURSOR); - yyaccept = 6; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy257; - } - if (yych <= ')') { - if (yych <= '\f') { - if (yych <= 0x08) { - if (yych >= 0x01) goto yy256; - } else { - if (yych <= '\t') goto yy274; - if (yych >= '\v') goto yy256; - } - } else { - if (yych <= ' ') { - if (yych <= '\r') goto yy273; - if (yych <= 0x1F) goto yy256; - goto yy274; - } else { - if (yych <= '"') goto yy273; - if (yych <= '%') goto yy256; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= ':') goto yy256; - } else { - if (yych != '=') goto yy256; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy273; - if (yych <= '{') goto yy256; - } else { - if (yych != '~') goto yy256; - } - } - } -yy273: - YYDEBUG(273, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 425 "Zend/zend_ini_scanner.l" - { /* FALSE value (when used outside option value/offset this causes parse error!)*/ - RETURN_TOKEN(BOOL_FALSE, "", 0); -} -#line 3855 "Zend/zend_ini_scanner.c" -yy274: - YYDEBUG(274, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(275, *YYCURSOR); - if (yych == '\t') goto yy274; - if (yych == ' ') goto yy274; - goto yy273; -yy276: - YYDEBUG(276, *YYCURSOR); - yyaccept = 6; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '<') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy273; - if (yych <= 0x08) goto yy256; - if (yych <= '\t') goto yy274; - goto yy273; - } else { - if (yych == '\r') goto yy273; - if (yych <= 0x1F) goto yy256; - goto yy274; - } - } else { - if (yych <= '/') { - if (yych <= '"') goto yy273; - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy273; - goto yy256; - } else { - if (yych <= '9') goto yy257; - if (yych == ';') goto yy273; - goto yy256; - } - } - } else { - if (yych <= '_') { - if (yych <= 'N') { - if (yych <= '=') goto yy273; - if (yych <= '@') goto yy256; - if (yych <= 'M') goto yy257; - goto yy279; - } else { - if (yych <= 'Z') goto yy257; - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy273; - goto yy257; - } - } else { - if (yych <= 'z') { - if (yych <= '`') goto yy256; - if (yych == 'n') goto yy279; - goto yy257; - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - goto yy273; - } else { - if (yych == '~') goto yy273; - goto yy256; - } - } - } - } -yy277: - YYDEBUG(277, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'L') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'l') goto yy278; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy278: - YYDEBUG(278, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'L') goto yy272; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'l') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy279: - YYDEBUG(279, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy272; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy280: - YYDEBUG(280, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'L') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'l') goto yy281; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy281: - YYDEBUG(281, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'S') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 's') goto yy282; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy282: - YYDEBUG(282, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy272; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy283: - YYDEBUG(283, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy284: - YYDEBUG(284, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy283; - } - if (yych >= '\r') goto yy287; -yy285: - YYDEBUG(285, *YYCURSOR); - ++YYCURSOR; -yy286: - YYDEBUG(286, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 585 "Zend/zend_ini_scanner.l" - { /* Comment */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 4248 "Zend/zend_ini_scanner.c" -yy287: - YYDEBUG(287, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy285; - goto yy286; -yy288: - YYDEBUG(288, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(289, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy288; - } - if (yych <= ')') { - if (yych <= '\r') { - if (yych <= 0x08) { - if (yych <= 0x00) goto yy244; - goto yy255; - } else { - if (yych <= '\n') goto yy244; - if (yych <= '\f') goto yy255; - goto yy244; - } - } else { - if (yych <= '#') { - if (yych <= 0x1F) goto yy255; - if (yych <= '"') goto yy244; - goto yy255; - } else { - if (yych <= '$') goto yy260; - if (yych <= '%') goto yy255; - goto yy244; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= ':') goto yy255; - goto yy244; - } else { - if (yych == '=') goto yy244; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy255; - goto yy244; - } else { - if (yych == '~') goto yy244; - goto yy255; - } - } - } -yy290: - YYDEBUG(290, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(291, *YYCURSOR); - if (yych <= '.') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy255; - goto yy244; - } else { - if (yych == '\r') goto yy244; - goto yy255; - } - } else { - if (yych <= '$') { - if (yych <= '"') goto yy244; - if (yych <= '#') goto yy255; - goto yy260; - } else { - if (yych <= '%') goto yy255; - if (yych <= ')') goto yy244; - if (yych <= '-') goto yy255; - goto yy288; - } - } - } else { - if (yych <= '=') { - if (yych <= ':') { - if (yych <= '/') goto yy255; - if (yych <= '9') goto yy290; - goto yy255; - } else { - if (yych == '<') goto yy255; - goto yy244; - } - } else { - if (yych <= '{') { - if (yych == '^') goto yy244; - goto yy255; - } else { - if (yych == '}') goto yy255; - if (yych <= '~') goto yy244; - goto yy255; - } - } - } -yy292: - YYDEBUG(292, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(293, *YYCURSOR); - if (yych <= '/') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy255; - goto yy244; - } else { - if (yych == '\r') goto yy244; - goto yy255; - } - } else { - if (yych <= '$') { - if (yych <= '"') goto yy244; - if (yych <= '#') goto yy255; - goto yy260; - } else { - if (yych <= '%') goto yy255; - if (yych <= ')') goto yy244; - goto yy255; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= '9') goto yy292; - if (yych <= ':') goto yy255; - goto yy244; - } else { - if (yych == '=') goto yy244; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy255; - goto yy244; - } else { - if (yych == '~') goto yy244; - goto yy255; - } - } - } -yy294: - YYDEBUG(294, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(295, *YYCURSOR); - if (yych <= '/') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy255; - goto yy244; - } else { - if (yych == '\r') goto yy244; - goto yy255; - } - } else { - if (yych <= '$') { - if (yych <= '"') goto yy244; - if (yych <= '#') goto yy255; - goto yy260; - } else { - if (yych <= '%') goto yy255; - if (yych <= ')') goto yy244; - goto yy255; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= '9') goto yy294; - if (yych <= ':') goto yy255; - goto yy244; - } else { - if (yych == '=') goto yy244; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy255; - goto yy244; - } else { - if (yych == '~') goto yy244; - goto yy255; - } - } - } -yy296: - YYDEBUG(296, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(297, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy296; - } - YYDEBUG(298, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(299, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 368 "Zend/zend_ini_scanner.l" - { /* Raw string */ - /* Eat leading and trailing single quotes */ - if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 4475 "Zend/zend_ini_scanner.c" -yy300: - YYDEBUG(300, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(301, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 4486 "Zend/zend_ini_scanner.c" -yy302: - YYDEBUG(302, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy303: - YYDEBUG(303, *YYCURSOR); - if (yych == '\t') goto yy302; - if (yych == ' ') goto yy302; - goto yy236; -yy304: - YYDEBUG(304, *YYCURSOR); - yych = *++YYCURSOR; - goto yy233; -yy305: - YYDEBUG(305, *YYCURSOR); - yyaccept = 1; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy306: - YYDEBUG(306, *YYCURSOR); - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy231; - if (yych <= '\t') goto yy305; - goto yy304; - } else { - if (yych == '\r') goto yy308; - goto yy231; - } - } else { - if (yych <= '"') { - if (yych <= ' ') goto yy305; - if (yych <= '!') goto yy231; - } else { - if (yych == ';') goto yy283; - goto yy231; - } - } - YYDEBUG(307, *YYCURSOR); - yych = *++YYCURSOR; - goto yy238; -yy308: - YYDEBUG(308, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy304; - goto yy233; - } -/* *********************************** */ -yyc_ST_VARNAME: - { - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 0, 0, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 0, 0, 128, 0, 128, 0, 128, - 0, 0, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 0, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(309, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych <= ')') { - if (yych <= '"') { - if (yych <= '\f') { - if (yych <= 0x08) goto yy311; - if (yych <= '\n') goto yy313; - } else { - if (yych <= '\r') goto yy313; - if (yych >= '!') goto yy313; - } - } else { - if (yych <= '%') { - if (yych == '$') goto yy313; - } else { - if (yych != '\'') goto yy313; - } - } - } else { - if (yych <= '[') { - if (yych <= '<') { - if (yych == ';') goto yy313; - } else { - if (yych <= '=') goto yy313; - if (yych >= '[') goto yy313; - } - } else { - if (yych <= 'z') { - if (yych == '^') goto yy313; - } else { - if (yych == '}') goto yy315; - if (yych <= '~') goto yy313; - } - } - } -yy311: - YYDEBUG(311, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy318; -yy312: - YYDEBUG(312, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 406 "Zend/zend_ini_scanner.l" - { /* Variable name */ - /* Eat leading whitespace */ - EAT_LEADING_WHITESPACE(); - - /* Eat trailing whitespace */ - EAT_TRAILING_WHITESPACE(); - - RETURN_TOKEN(TC_VARNAME, yytext, yyleng); -} -#line 4627 "Zend/zend_ini_scanner.c" -yy313: - YYDEBUG(313, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(314, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 4637 "Zend/zend_ini_scanner.c" -yy315: - YYDEBUG(315, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(316, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 416 "Zend/zend_ini_scanner.l" - { /* Variable end */ - yy_pop_state(TSRMLS_C); - return '}'; -} -#line 4648 "Zend/zend_ini_scanner.c" -yy317: - YYDEBUG(317, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy318: - YYDEBUG(318, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy317; - } - goto yy312; - } -} -#line 607 "Zend/zend_ini_scanner.l" - -} +/* Generated by re2c 0.13.5 */ +#line 1 "Zend/zend_ini_scanner.l" +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Zeev Suraski | + | Jani Taskinen | + | Marcus Boerger | + | Nuno Lopes | + | Scott MacVicar | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include +#include "zend.h" +#include "zend_globals.h" +#include +#include "zend_ini_scanner.h" + +#if 0 +# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) +#else +# define YYDEBUG(s, c) +#endif + +#include "zend_ini_scanner_defs.h" + +#define YYCTYPE unsigned char +/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD) + * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */ +#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; } +#define YYCURSOR SCNG(yy_cursor) +#define YYLIMIT SCNG(yy_limit) +#define YYMARKER SCNG(yy_marker) + +#define YYGETCONDITION() SCNG(yy_state) +#define YYSETCONDITION(s) SCNG(yy_state) = s + +#define STATE(name) yyc##name + +/* emulate flex constructs */ +#define BEGIN(state) YYSETCONDITION(STATE(state)) +#define YYSTATE YYGETCONDITION() +#define yytext ((char*)SCNG(yy_text)) +#define yyleng SCNG(yy_leng) +#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \ + yyleng = (unsigned int)x; } while(0) + +/* #define yymore() goto yymore_restart */ + +/* perform sanity check. If this message is triggered you should + increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ +#define YYMAXFILL 6 +#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1) +# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL +#endif + + +/* How it works (for the core ini directives): + * =========================================== + * + * 1. Scanner scans file for tokens and passes them to parser. + * 2. Parser parses the tokens and passes the name/value pairs to the callback + * function which stores them in the configuration hash table. + * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual + * registering of ini entries and uses zend_get_configuration_directive() + * to fetch the previously stored name/value pair from configuration hash table + * and registers the static ini entries which match the name to the value + * into EG(ini_directives) hash table. + * 4. PATH section entries are used per-request from down to top, each overriding + * previous if one exists. zend_alter_ini_entry() is called for each entry. + * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the + * php_admin_* directives used within Apache httpd.conf when PHP is compiled as + * module for Apache. + * 5. User defined ini files (like .htaccess for apache) are parsed for each request and + * stored in separate hash defined by SAPI. + */ + +/* TODO: (ordered by importance :-) + * =============================================================================== + * + * - Separate constant lookup totally from plain strings (using CONSTANT pattern) + * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators + * - Add #include "some.ini" + * - Allow variables to refer to options also when using parse_ini_file() + * + */ + +/* Globals Macros */ +#define SCNG INI_SCNG +#ifdef ZTS +ZEND_API ts_rsrc_id ini_scanner_globals_id; +#else +ZEND_API zend_ini_scanner_globals ini_scanner_globals; +#endif + +/* Eat leading whitespace */ +#define EAT_LEADING_WHITESPACE() \ + while (yytext[0]) { \ + if (yytext[0] == ' ' || yytext[0] == '\t') { \ + SCNG(yy_text)++; \ + yyleng--; \ + } else { \ + break; \ + } \ + } + +/* Eat trailing whitespace + extra char */ +#define EAT_TRAILING_WHITESPACE_EX(ch) \ + while (yyleng > 0 && ( \ + (ch != 'X' && yytext[yyleng - 1] == ch) || \ + yytext[yyleng - 1] == '\n' || \ + yytext[yyleng - 1] == '\r' || \ + yytext[yyleng - 1] == '\t' || \ + yytext[yyleng - 1] == ' ') \ + ) { \ + yyleng--; \ + } + +/* Eat trailing whitespace */ +#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X') + +#define zend_ini_copy_value(retval, str, len) { \ + Z_STRVAL_P(retval) = zend_strndup(str, len); \ + Z_STRLEN_P(retval) = len; \ + Z_TYPE_P(retval) = IS_STRING; \ +} + +#define RETURN_TOKEN(type, str, len) { \ + zend_ini_copy_value(ini_lval, str, len); \ + return type; \ +} + +static void _yy_push_state(int new_state TSRMLS_DC) +{ + zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); + YYSETCONDITION(new_state); +} + +#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) + +static void yy_pop_state(TSRMLS_D) +{ + int *stack_state; + zend_stack_top(&SCNG(state_stack), (void **) &stack_state); + YYSETCONDITION(*stack_state); + zend_stack_del_top(&SCNG(state_stack)); +} + +static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) +{ + YYCURSOR = (YYCTYPE*)str; + SCNG(yy_start) = YYCURSOR; + YYLIMIT = YYCURSOR + len; +} + +#define ini_filename SCNG(filename) + +/* {{{ init_ini_scanner() +*/ +static int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC) +{ + /* Sanity check */ + if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) { + zend_error(E_WARNING, "Invalid scanner mode"); + return FAILURE; + } + + SCNG(lineno) = 1; + SCNG(scanner_mode) = scanner_mode; + SCNG(yy_in) = fh; + + if (fh != NULL) { + ini_filename = zend_strndup(fh->filename, strlen(fh->filename)); + } else { + ini_filename = NULL; + } + + zend_stack_init(&SCNG(state_stack)); + BEGIN(INITIAL); + + return SUCCESS; +} +/* }}} */ + +/* {{{ shutdown_ini_scanner() +*/ +void shutdown_ini_scanner(TSRMLS_D) +{ + zend_stack_destroy(&SCNG(state_stack)); + if (ini_filename) { + free(ini_filename); + } +} +/* }}} */ + +/* {{{ zend_ini_scanner_get_lineno() +*/ +int zend_ini_scanner_get_lineno(TSRMLS_D) +{ + return SCNG(lineno); +} +/* }}} */ + +/* {{{ zend_ini_scanner_get_filename() +*/ +char *zend_ini_scanner_get_filename(TSRMLS_D) +{ + return ini_filename ? ini_filename : "Unknown"; +} +/* }}} */ + +/* {{{ zend_ini_open_file_for_scanning() +*/ +int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC) +{ + char *buf; + size_t size; + + if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + if (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) { + zend_file_handle_dtor(fh TSRMLS_CC); + return FAILURE; + } + + yy_scan_buffer(buf, size TSRMLS_CC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ zend_ini_prepare_string_for_scanning() +*/ +int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC) +{ + int len = strlen(str); + + if (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + yy_scan_buffer(str, len TSRMLS_CC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ zend_ini_escape_string() + */ +static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC) +{ + register char *s, *t; + char *end; + + zend_ini_copy_value(lval, str, len); + + /* convert escape sequences */ + s = t = Z_STRVAL_P(lval); + end = s + Z_STRLEN_P(lval); + + while (s < end) { + if (*s == '\\') { + s++; + if (s >= end) { + *t++ = '\\'; + continue; + } + switch (*s) { + case '"': + if (*s != quote_type) { + *t++ = '\\'; + *t++ = *s; + break; + } + case '\\': + case '$': + *t++ = *s; + Z_STRLEN_P(lval)--; + break; + default: + *t++ = '\\'; + *t++ = *s; + break; + } + } else { + *t++ = *s; + } + if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { + SCNG(lineno)++; + } + s++; + } + *t = 0; +} +/* }}} */ + +int ini_lex(zval *ini_lval TSRMLS_DC) +{ +restart: + SCNG(yy_text) = YYCURSOR; + +/* yymore_restart: */ + /* detect EOF */ + if (YYCURSOR >= YYLIMIT) { + if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) { + BEGIN(INITIAL); + return END_OF_LINE; + } + return 0; + } + + /* Eat any UTF-8 BOM we find in the first 3 bytes */ + if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) { + if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) { + YYCURSOR += 3; + goto restart; + } + } + +#line 337 "Zend/zend_ini_scanner.c" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + if (YYGETCONDITION() < 4) { + if (YYGETCONDITION() < 2) { + if (YYGETCONDITION() < 1) { + goto yyc_INITIAL; + } else { + goto yyc_ST_OFFSET; + } + } else { + if (YYGETCONDITION() < 3) { + goto yyc_ST_SECTION_VALUE; + } else { + goto yyc_ST_VALUE; + } + } + } else { + if (YYGETCONDITION() < 6) { + if (YYGETCONDITION() < 5) { + goto yyc_ST_SECTION_RAW; + } else { + goto yyc_ST_DOUBLE_QUOTES; + } + } else { + if (YYGETCONDITION() < 7) { + goto yyc_ST_VARNAME; + } else { + goto yyc_ST_RAW; + } + } + } +/* *********************************** */ +yyc_INITIAL: + { + static const unsigned char yybm[] = { + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 160, 0, 144, 144, 0, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 240, 128, 128, 144, 128, 144, 128, 144, + 128, 128, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 128, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 144, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 128, 128, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + }; + + YYDEBUG(0, *YYCURSOR); + YYFILL(5); + yych = *YYCURSOR; + YYDEBUG(-1, yych); + switch (yych) { + case '\t': goto yy4; + case '\n': goto yy6; + case '\r': goto yy8; + case ' ': goto yy9; + case '!': + case '"': + case '$': + case '&': + case '(': + case ')': + case '^': + case '{': + case '|': + case '}': + case '~': goto yy10; + case '#': goto yy12; + case '%': + case '\'': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case '<': + case '>': + case '?': + case '@': + case ']': goto yy13; + case ';': goto yy14; + case '=': goto yy16; + case 'F': + case 'f': goto yy18; + case 'N': + case 'n': goto yy19; + case 'O': + case 'o': goto yy20; + case 'T': + case 't': goto yy21; + case 'Y': + case 'y': goto yy22; + case '[': goto yy23; + default: goto yy2; + } +yy2: + YYDEBUG(2, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy26; +yy3: + YYDEBUG(3, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 429 "Zend/zend_ini_scanner.l" + { /* Get option name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + + RETURN_TOKEN(TC_LABEL, yytext, yyleng); +} +#line 476 "Zend/zend_ini_scanner.c" +yy4: + YYDEBUG(4, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy68; +yy5: + YYDEBUG(5, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 575 "Zend/zend_ini_scanner.l" + { + /* eat whitespace */ + goto restart; +} +#line 490 "Zend/zend_ini_scanner.c" +yy6: + YYDEBUG(6, *YYCURSOR); + ++YYCURSOR; +yy7: + YYDEBUG(7, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 580 "Zend/zend_ini_scanner.l" + { + SCNG(lineno)++; + return END_OF_LINE; +} +#line 502 "Zend/zend_ini_scanner.c" +yy8: + YYDEBUG(8, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy71; + goto yy7; +yy9: + YYDEBUG(9, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy26; + goto yy69; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy58; + goto yy26; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy26; + } + } +yy10: + YYDEBUG(10, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(11, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 503 "Zend/zend_ini_scanner.l" + { /* Disallow these chars outside option values */ + return yytext[0]; +} +#line 541 "Zend/zend_ini_scanner.c" +yy12: + YYDEBUG(12, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy59; +yy13: + YYDEBUG(13, *YYCURSOR); + yych = *++YYCURSOR; + goto yy26; +yy14: + YYDEBUG(14, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + goto yy54; + YYDEBUG(15, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 562 "Zend/zend_ini_scanner.c" +yy16: + YYDEBUG(16, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy52; +yy17: + YYDEBUG(17, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 439 "Zend/zend_ini_scanner.l" + { /* Start option value */ + if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { + yy_push_state(ST_RAW TSRMLS_CC); + } else { + yy_push_state(ST_VALUE TSRMLS_CC); + } + return '='; +} +#line 580 "Zend/zend_ini_scanner.c" +yy18: + YYDEBUG(18, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy48; + if (yych == 'a') goto yy48; + goto yy26; +yy19: + YYDEBUG(19, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'U') { + if (yych == 'O') goto yy44; + if (yych <= 'T') goto yy26; + goto yy45; + } else { + if (yych <= 'o') { + if (yych <= 'n') goto yy26; + goto yy44; + } else { + if (yych == 'u') goto yy45; + goto yy26; + } + } +yy20: + YYDEBUG(20, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'N') { + if (yych == 'F') goto yy38; + if (yych <= 'M') goto yy26; + goto yy31; + } else { + if (yych <= 'f') { + if (yych <= 'e') goto yy26; + goto yy38; + } else { + if (yych == 'n') goto yy31; + goto yy26; + } + } +yy21: + YYDEBUG(21, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy36; + if (yych == 'r') goto yy36; + goto yy26; +yy22: + YYDEBUG(22, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy27; + if (yych == 'e') goto yy27; + goto yy26; +yy23: + YYDEBUG(23, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(24, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 358 "Zend/zend_ini_scanner.l" + { /* Section start */ + /* Enter section data lookup state */ + if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { + yy_push_state(ST_SECTION_RAW TSRMLS_CC); + } else { + yy_push_state(ST_SECTION_VALUE TSRMLS_CC); + } + return TC_SECTION; +} +#line 646 "Zend/zend_ini_scanner.c" +yy25: + YYDEBUG(25, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy26: + YYDEBUG(26, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy25; + } + if (yych == '[') goto yy28; + goto yy3; +yy27: + YYDEBUG(27, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy31; + if (yych == 's') goto yy31; + goto yy26; +yy28: + YYDEBUG(28, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(29, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy28; + } + YYDEBUG(30, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 383 "Zend/zend_ini_scanner.l" + { /* Start of option with offset */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace and [ */ + EAT_TRAILING_WHITESPACE_EX('['); + + /* Enter offset lookup state */ + yy_push_state(ST_OFFSET TSRMLS_CC); + + RETURN_TOKEN(TC_OFFSET, yytext, yyleng); +} +#line 689 "Zend/zend_ini_scanner.c" +yy31: + YYDEBUG(31, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(32, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy31; + } + if (yych <= '\'') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy34; + } else { + if (yych != '\r') goto yy25; + } + } else { + if (yych <= '$') { + if (yych == '#') goto yy25; + } else { + if (yych != '&') goto yy25; + } + } + } else { + if (yych <= 'Z') { + if (yych <= ';') { + if (yych <= ')') goto yy33; + if (yych <= ':') goto yy25; + } else { + if (yych != '=') goto yy25; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy28; + if (yych <= ']') goto yy25; + } else { + if (yych <= 'z') goto yy25; + if (yych >= 0x7F) goto yy25; + } + } + } +yy33: + YYDEBUG(33, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 421 "Zend/zend_ini_scanner.l" + { /* TRUE value (when used outside option value/offset this causes parse error!) */ + RETURN_TOKEN(BOOL_TRUE, "1", 1); +} +#line 739 "Zend/zend_ini_scanner.c" +yy34: + YYDEBUG(34, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(35, *YYCURSOR); + if (yych == '\t') goto yy34; + if (yych == ' ') goto yy34; + goto yy33; +yy36: + YYDEBUG(36, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'U') goto yy37; + if (yych != 'u') goto yy26; +yy37: + YYDEBUG(37, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy31; + if (yych == 'e') goto yy31; + goto yy26; +yy38: + YYDEBUG(38, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'F') goto yy39; + if (yych != 'f') goto yy26; +yy39: + YYDEBUG(39, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(40, *YYCURSOR); + if (yych <= '&') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy42; + } else { + if (yych != '\r') goto yy25; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy39; + if (yych >= '#') goto yy25; + } else { + if (yych == '%') goto yy25; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '\'') goto yy25; + if (yych >= '*') goto yy25; + } else { + if (yych == '<') goto yy25; + } + } else { + if (yych <= ']') { + if (yych == '[') goto yy28; + goto yy25; + } else { + if (yych <= '^') goto yy41; + if (yych <= 'z') goto yy25; + if (yych >= 0x7F) goto yy25; + } + } + } +yy41: + YYDEBUG(41, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 425 "Zend/zend_ini_scanner.l" + { /* FALSE value (when used outside option value/offset this causes parse error!)*/ + RETURN_TOKEN(BOOL_FALSE, "", 0); +} +#line 813 "Zend/zend_ini_scanner.c" +yy42: + YYDEBUG(42, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(43, *YYCURSOR); + if (yych == '\t') goto yy42; + if (yych == ' ') goto yy42; + goto yy41; +yy44: + YYDEBUG(44, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\'') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy42; + goto yy41; + } else { + if (yych == '\r') goto yy41; + goto yy26; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy39; + if (yych <= '"') goto yy41; + goto yy26; + } else { + if (yych == '%') goto yy26; + if (yych <= '&') goto yy41; + goto yy26; + } + } + } else { + if (yych <= 'N') { + if (yych <= ';') { + if (yych <= ')') goto yy41; + if (yych <= ':') goto yy26; + goto yy41; + } else { + if (yych == '=') goto yy41; + if (yych <= 'M') goto yy26; + goto yy47; + } + } else { + if (yych <= 'm') { + if (yych == '^') goto yy41; + goto yy26; + } else { + if (yych <= 'n') goto yy47; + if (yych <= 'z') goto yy26; + if (yych <= '~') goto yy41; + goto yy26; + } + } + } +yy45: + YYDEBUG(45, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy46; + if (yych != 'l') goto yy26; +yy46: + YYDEBUG(46, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy39; + if (yych == 'l') goto yy39; + goto yy26; +yy47: + YYDEBUG(47, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; +yy48: + YYDEBUG(48, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy49; + if (yych != 'l') goto yy26; +yy49: + YYDEBUG(49, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy50; + if (yych != 's') goto yy26; +yy50: + YYDEBUG(50, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; +yy51: + YYDEBUG(51, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy52: + YYDEBUG(52, *YYCURSOR); + if (yych == '\t') goto yy51; + if (yych == ' ') goto yy51; + goto yy17; +yy53: + YYDEBUG(53, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy54: + YYDEBUG(54, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy53; + } + if (yych >= '\r') goto yy57; +yy55: + YYDEBUG(55, *YYCURSOR); + ++YYCURSOR; +yy56: + YYDEBUG(56, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 936 "Zend/zend_ini_scanner.c" +yy57: + YYDEBUG(57, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy55; + goto yy56; +yy58: + YYDEBUG(58, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy59: + YYDEBUG(59, *YYCURSOR); + if (yych <= '\'') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy58; + if (yych >= '\n') goto yy64; + } else { + if (yych == '\r') goto yy66; + goto yy58; + } + } else { + if (yych <= '$') { + if (yych == '#') goto yy58; + } else { + if (yych != '&') goto yy58; + } + } + } else { + if (yych <= 'Z') { + if (yych <= ';') { + if (yych <= ')') goto yy60; + if (yych <= ':') goto yy58; + } else { + if (yych != '=') goto yy58; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy62; + if (yych <= ']') goto yy58; + } else { + if (yych <= 'z') goto yy58; + if (yych >= 0x7F) goto yy58; + } + } + } +yy60: + YYDEBUG(60, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(61, *YYCURSOR); + if (yych == '\n') goto yy64; + if (yych == '\r') goto yy66; + goto yy60; +yy62: + YYDEBUG(62, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(63, *YYCURSOR); + if (yych <= '\f') { + if (yych <= 0x08) goto yy60; + if (yych <= '\t') goto yy62; + if (yych >= '\v') goto yy60; + } else { + if (yych <= '\r') goto yy66; + if (yych == ' ') goto yy62; + goto yy60; + } +yy64: + YYDEBUG(64, *YYCURSOR); + ++YYCURSOR; +yy65: + YYDEBUG(65, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 591 "Zend/zend_ini_scanner.l" + { /* #Comment */ + zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno)); + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 1022 "Zend/zend_ini_scanner.c" +yy66: + YYDEBUG(66, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy64; + goto yy65; +yy67: + YYDEBUG(67, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy68: + YYDEBUG(68, *YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy5; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy5; + goto yy67; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy60; + goto yy5; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy5; + } + } +yy69: + YYDEBUG(69, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(70, *YYCURSOR); + if (yych <= '&') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy67; + } else { + if (yych == '\r') goto yy72; + goto yy25; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy69; + if (yych <= '"') goto yy3; + goto yy58; + } else { + if (yych == '%') goto yy25; + goto yy3; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '\'') goto yy25; + if (yych <= ')') goto yy3; + goto yy25; + } else { + if (yych <= ';') goto yy53; + if (yych <= '<') goto yy25; + goto yy51; + } + } else { + if (yych <= ']') { + if (yych == '[') goto yy28; + goto yy25; + } else { + if (yych <= '^') goto yy3; + if (yych <= 'z') goto yy25; + if (yych <= '~') goto yy3; + goto yy25; + } + } + } +yy71: + YYDEBUG(71, *YYCURSOR); + yych = *++YYCURSOR; + goto yy7; +yy72: + YYDEBUG(72, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy71; + goto yy7; + } +/* *********************************** */ +yyc_ST_DOUBLE_QUOTES: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + YYDEBUG(73, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych == '"') goto yy77; + if (yych == '$') goto yy79; + YYDEBUG(75, *YYCURSOR); + ++YYCURSOR; +yy76: + YYDEBUG(76, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 535 "Zend/zend_ini_scanner.l" + { /* Escape double quoted string contents */ + if (YYCURSOR > YYLIMIT) { + return 0; + } + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '"': + if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') { + continue; + } + break; + case '$': + if (*YYCURSOR == '{') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') { + YYCURSOR++; + } + /* fall through */ + default: + continue; + } + + YYCURSOR--; + break; + } + + yyleng = YYCURSOR - SCNG(yy_text); + + zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC); + return TC_QUOTED_STRING; +} +#line 1198 "Zend/zend_ini_scanner.c" +yy77: + YYDEBUG(77, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy83; +yy78: + YYDEBUG(78, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 530 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string ends */ + yy_pop_state(TSRMLS_C); + return '"'; +} +#line 1212 "Zend/zend_ini_scanner.c" +yy79: + YYDEBUG(79, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '{') goto yy76; + YYDEBUG(80, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(81, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 1226 "Zend/zend_ini_scanner.c" +yy82: + YYDEBUG(82, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy83: + YYDEBUG(83, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy82; + } + goto yy78; + } +/* *********************************** */ +yyc_ST_OFFSET: + { + static const unsigned char yybm[] = { + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 194, 64, 66, 66, 64, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 194, 66, 64, 66, 68, 66, 66, 0, + 66, 66, 66, 66, 66, 66, 66, 66, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 66, 64, 66, 66, 66, 66, + 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 72, 64, 66, 82, + 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + }; + YYDEBUG(84, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= '-') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy86; + if (yych <= '\t') goto yy88; + goto yy89; + } else { + if (yych == '\r') goto yy89; + if (yych >= ' ') goto yy88; + } + } else { + if (yych <= '$') { + if (yych == '"') goto yy91; + if (yych >= '$') goto yy93; + } else { + if (yych == '\'') goto yy94; + if (yych >= '-') goto yy95; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy96; + if (yych >= '0') goto yy97; + } else { + if (yych == ';') goto yy89; + if (yych >= 'A') goto yy99; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy86; + if (yych <= '\\') goto yy101; + if (yych <= ']') goto yy102; + } else { + if (yych == '`') goto yy86; + if (yych <= 'z') goto yy99; + } + } + } +yy86: + YYDEBUG(86, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy105; +yy87: + YYDEBUG(87, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 521 "Zend/zend_ini_scanner.l" + { /* Get rest as section/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 1330 "Zend/zend_ini_scanner.c" +yy88: + YYDEBUG(88, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy131; + } + if (yych == '"') goto yy133; + if (yych == ']') goto yy134; + goto yy105; +yy89: + YYDEBUG(89, *YYCURSOR); + ++YYCURSOR; +yy90: + YYDEBUG(90, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 1351 "Zend/zend_ini_scanner.c" +yy91: + YYDEBUG(91, *YYCURSOR); + ++YYCURSOR; +yy92: + YYDEBUG(92, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 1363 "Zend/zend_ini_scanner.c" +yy93: + YYDEBUG(93, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy90; + if (yych <= '[') goto yy104; + goto yy109; + } else { + if (yych == '{') goto yy129; + goto yy104; + } +yy94: + YYDEBUG(94, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy125; + } + goto yy90; +yy95: + YYDEBUG(95, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy123; + goto yy105; +yy96: + YYDEBUG(96, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy121; + goto yy105; +yy97: + YYDEBUG(97, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\'') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy105; + } else { + if (yych == '"') goto yy98; + if (yych <= '&') goto yy105; + } + } else { + if (yych <= '9') { + if (yych == '.') goto yy117; + if (yych <= '/') goto yy105; + goto yy119; + } else { + if (yych <= ';') { + if (yych <= ':') goto yy105; + } else { + if (yych != ']') goto yy105; + } + } + } +yy98: + YYDEBUG(98, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 1429 "Zend/zend_ini_scanner.c" +yy99: + YYDEBUG(99, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy115; + } + if (yych <= '"') { + if (yych <= '\f') { + if (yych != '\n') goto yy105; + } else { + if (yych <= '\r') goto yy100; + if (yych <= '!') goto yy105; + } + } else { + if (yych <= ':') { + if (yych != '\'') goto yy105; + } else { + if (yych <= ';') goto yy100; + if (yych != ']') goto yy105; + } + } +yy100: + YYDEBUG(100, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 1459 "Zend/zend_ini_scanner.c" +yy101: + YYDEBUG(101, *YYCURSOR); + yych = *++YYCURSOR; + goto yy104; +yy102: + YYDEBUG(102, *YYCURSOR); + ++YYCURSOR; +yy103: + YYDEBUG(103, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 396 "Zend/zend_ini_scanner.l" + { /* End of section or an option offset */ + BEGIN(INITIAL); + return ']'; +} +#line 1475 "Zend/zend_ini_scanner.c" +yy104: + YYDEBUG(104, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy105: + YYDEBUG(105, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy104; + } + if (yych == '$') goto yy107; + if (yych != '\\') goto yy87; +yy106: + YYDEBUG(106, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + goto yy104; +yy107: + YYDEBUG(107, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy108; + if (yych <= '[') goto yy104; + goto yy109; + } else { + if (yych != '{') goto yy104; + } +yy108: + YYDEBUG(108, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy87; + } else { + goto yy90; + } + } else { + if (yyaccept <= 2) { + goto yy98; + } else { + goto yy100; + } + } +yy109: + YYDEBUG(109, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy110: + YYDEBUG(110, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(111, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy114; + goto yy104; +yy112: + YYDEBUG(112, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(113, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy114: + YYDEBUG(114, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy115: + YYDEBUG(115, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(116, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy115; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy100; + if (yych <= '\f') goto yy104; + goto yy100; + } else { + if (yych == '"') goto yy100; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy100; + if (yych <= ':') goto yy104; + goto yy100; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy100; + goto yy104; + } + } +yy117: + YYDEBUG(117, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(118, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy117; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych == '"') goto yy98; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy98; + if (yych <= ':') goto yy104; + goto yy98; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } +yy119: + YYDEBUG(119, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(120, *YYCURSOR); + if (yych <= '\'') { + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy104; + goto yy98; + } else { + if (yych == '\r') goto yy98; + goto yy104; + } + } else { + if (yych <= '#') { + if (yych <= '"') goto yy98; + goto yy104; + } else { + if (yych <= '$') goto yy107; + if (yych <= '&') goto yy104; + goto yy98; + } + } + } else { + if (yych <= ':') { + if (yych <= '.') { + if (yych <= '-') goto yy104; + goto yy117; + } else { + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy119; + goto yy104; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy121: + YYDEBUG(121, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(122, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy104; + goto yy98; + } else { + if (yych == '$') goto yy107; + goto yy104; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy121; + goto yy104; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy123: + YYDEBUG(123, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(124, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy104; + goto yy98; + } else { + if (yych == '$') goto yy107; + goto yy104; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy123; + goto yy104; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy125: + YYDEBUG(125, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(126, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy125; + } + YYDEBUG(127, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(128, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 1774 "Zend/zend_ini_scanner.c" +yy129: + YYDEBUG(129, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(130, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 1785 "Zend/zend_ini_scanner.c" +yy131: + YYDEBUG(131, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(132, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy131; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy87; + if (yych <= '\f') goto yy104; + goto yy87; + } else { + if (yych == '"') goto yy133; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy87; + if (yych <= ':') goto yy104; + goto yy87; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy134; + goto yy104; + } + } +yy133: + YYDEBUG(133, *YYCURSOR); + yych = *++YYCURSOR; + goto yy92; +yy134: + YYDEBUG(134, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy103; + } +/* *********************************** */ +yyc_ST_RAW: + { + static const unsigned char yybm[] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + }; + YYDEBUG(135, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy139; + } else { + if (yych <= '\t') goto yy141; + if (yych <= '\n') goto yy142; + goto yy139; + } + } else { + if (yych <= ' ') { + if (yych <= '\r') goto yy144; + if (yych <= 0x1F) goto yy139; + goto yy141; + } else { + if (yych == ';') goto yy145; + goto yy139; + } + } + YYDEBUG(137, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(138, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 598 "Zend/zend_ini_scanner.l" + { /* End of option value (if EOF is reached before EOL */ + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 1895 "Zend/zend_ini_scanner.c" +yy139: + YYDEBUG(139, *YYCURSOR); + ++YYCURSOR; +yy140: + YYDEBUG(140, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 448 "Zend/zend_ini_scanner.l" + { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ + char *sc = NULL; + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR) { + case '\n': + case '\r': + goto end_raw_value_chars; + break; + case ';': + if (sc == NULL) { + sc = YYCURSOR; + } + /* no break */ + default: + YYCURSOR++; + break; + } + } +end_raw_value_chars: + yyleng = YYCURSOR - SCNG(yy_text); + + /* Eat trailing semicolons */ + while (yytext[yyleng - 1] == ';') { + yyleng--; + } + + /* Eat leading and trailing double quotes */ + if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } else if (sc) { + YYCURSOR = sc; + yyleng = YYCURSOR - SCNG(yy_text); + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 1939 "Zend/zend_ini_scanner.c" +yy141: + YYDEBUG(141, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych <= 0x08) goto yy140; + if (yych <= '\n') goto yy153; + if (yych <= '\f') goto yy140; + goto yy153; + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy140; + goto yy153; + } else { + if (yych == ';') goto yy153; + goto yy140; + } + } +yy142: + YYDEBUG(142, *YYCURSOR); + ++YYCURSOR; +yy143: + YYDEBUG(143, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 489 "Zend/zend_ini_scanner.l" + { /* End of option value */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 1970 "Zend/zend_ini_scanner.c" +yy144: + YYDEBUG(144, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy151; + goto yy143; +yy145: + YYDEBUG(145, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy147; +yy146: + YYDEBUG(146, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy147: + YYDEBUG(147, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy146; + } + if (yych >= '\r') goto yy150; +yy148: + YYDEBUG(148, *YYCURSOR); + ++YYCURSOR; +yy149: + YYDEBUG(149, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 2004 "Zend/zend_ini_scanner.c" +yy150: + YYDEBUG(150, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy148; + goto yy149; +yy151: + YYDEBUG(151, *YYCURSOR); + yych = *++YYCURSOR; + goto yy143; +yy152: + YYDEBUG(152, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy153: + YYDEBUG(153, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy152; + } + if (yych <= '\f') { + if (yych == '\n') goto yy151; + } else { + if (yych <= '\r') goto yy155; + if (yych == ';') goto yy146; + } + YYDEBUG(154, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 575 "Zend/zend_ini_scanner.l" + { + /* eat whitespace */ + goto restart; +} +#line 2038 "Zend/zend_ini_scanner.c" +yy155: + YYDEBUG(155, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy151; + goto yy143; + } +/* *********************************** */ +yyc_ST_SECTION_RAW: + { + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 192, 0, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(156, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '\f') { + if (yych == '\n') goto yy160; + } else { + if (yych <= '\r') goto yy160; + if (yych == ']') goto yy162; + } + YYDEBUG(158, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy169; +yy159: + YYDEBUG(159, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 485 "Zend/zend_ini_scanner.l" + { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 2102 "Zend/zend_ini_scanner.c" +yy160: + YYDEBUG(160, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(161, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 2112 "Zend/zend_ini_scanner.c" +yy162: + YYDEBUG(162, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy165; +yy163: + YYDEBUG(163, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 377 "Zend/zend_ini_scanner.l" + { /* End of section */ + BEGIN(INITIAL); + SCNG(lineno)++; + return ']'; +} +#line 2127 "Zend/zend_ini_scanner.c" +yy164: + YYDEBUG(164, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy165: + YYDEBUG(165, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy164; + } + if (yych == '\n') goto yy166; + if (yych == '\r') goto yy167; + goto yy163; +yy166: + YYDEBUG(166, *YYCURSOR); + yych = *++YYCURSOR; + goto yy163; +yy167: + YYDEBUG(167, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy166; + goto yy163; +yy168: + YYDEBUG(168, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy169: + YYDEBUG(169, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy168; + } + goto yy159; + } +/* *********************************** */ +yyc_ST_SECTION_VALUE: + { + static const unsigned char yybm[] = { + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 134, 128, 132, 132, 128, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 134, 132, 128, 132, 136, 132, 132, 0, + 132, 132, 132, 132, 132, 132, 132, 132, + 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 132, 128, 132, 132, 132, 132, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 144, 128, 132, 164, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + }; + YYDEBUG(170, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '-') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy172; + if (yych <= '\t') goto yy174; + goto yy175; + } else { + if (yych == '\r') goto yy175; + if (yych >= ' ') goto yy174; + } + } else { + if (yych <= '$') { + if (yych == '"') goto yy177; + if (yych >= '$') goto yy179; + } else { + if (yych == '\'') goto yy180; + if (yych >= '-') goto yy181; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy182; + if (yych >= '0') goto yy183; + } else { + if (yych == ';') goto yy175; + if (yych >= 'A') goto yy185; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy172; + if (yych <= '\\') goto yy187; + if (yych <= ']') goto yy188; + } else { + if (yych == '`') goto yy172; + if (yych <= 'z') goto yy185; + } + } + } +yy172: + YYDEBUG(172, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy195; +yy173: + YYDEBUG(173, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 521 "Zend/zend_ini_scanner.l" + { /* Get rest as section/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 2253 "Zend/zend_ini_scanner.c" +yy174: + YYDEBUG(174, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy221; + goto yy195; + } else { + if (yych <= ' ') goto yy221; + if (yych == '"') goto yy223; + goto yy195; + } +yy175: + YYDEBUG(175, *YYCURSOR); + ++YYCURSOR; +yy176: + YYDEBUG(176, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 2276 "Zend/zend_ini_scanner.c" +yy177: + YYDEBUG(177, *YYCURSOR); + ++YYCURSOR; +yy178: + YYDEBUG(178, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 2288 "Zend/zend_ini_scanner.c" +yy179: + YYDEBUG(179, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy176; + if (yych <= '[') goto yy194; + goto yy199; + } else { + if (yych == '{') goto yy219; + goto yy194; + } +yy180: + YYDEBUG(180, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy215; + } + goto yy176; +yy181: + YYDEBUG(181, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy213; + goto yy195; +yy182: + YYDEBUG(182, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy211; + goto yy195; +yy183: + YYDEBUG(183, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\'') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy195; + } else { + if (yych == '"') goto yy184; + if (yych <= '&') goto yy195; + } + } else { + if (yych <= '9') { + if (yych == '.') goto yy207; + if (yych <= '/') goto yy195; + goto yy209; + } else { + if (yych <= ';') { + if (yych <= ':') goto yy195; + } else { + if (yych != ']') goto yy195; + } + } + } +yy184: + YYDEBUG(184, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 2354 "Zend/zend_ini_scanner.c" +yy185: + YYDEBUG(185, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy205; + } + if (yych <= '"') { + if (yych <= '\f') { + if (yych != '\n') goto yy195; + } else { + if (yych <= '\r') goto yy186; + if (yych <= '!') goto yy195; + } + } else { + if (yych <= ':') { + if (yych != '\'') goto yy195; + } else { + if (yych <= ';') goto yy186; + if (yych != ']') goto yy195; + } + } +yy186: + YYDEBUG(186, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 2384 "Zend/zend_ini_scanner.c" +yy187: + YYDEBUG(187, *YYCURSOR); + yych = *++YYCURSOR; + goto yy194; +yy188: + YYDEBUG(188, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy191; +yy189: + YYDEBUG(189, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 377 "Zend/zend_ini_scanner.l" + { /* End of section */ + BEGIN(INITIAL); + SCNG(lineno)++; + return ']'; +} +#line 2403 "Zend/zend_ini_scanner.c" +yy190: + YYDEBUG(190, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy191: + YYDEBUG(191, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy190; + } + if (yych == '\n') goto yy192; + if (yych == '\r') goto yy193; + goto yy189; +yy192: + YYDEBUG(192, *YYCURSOR); + yych = *++YYCURSOR; + goto yy189; +yy193: + YYDEBUG(193, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy192; + goto yy189; +yy194: + YYDEBUG(194, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy195: + YYDEBUG(195, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy194; + } + if (yych == '$') goto yy197; + if (yych != '\\') goto yy173; +yy196: + YYDEBUG(196, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + goto yy194; +yy197: + YYDEBUG(197, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy198; + if (yych <= '[') goto yy194; + goto yy199; + } else { + if (yych != '{') goto yy194; + } +yy198: + YYDEBUG(198, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy173; + } else { + goto yy176; + } + } else { + if (yyaccept <= 2) { + goto yy184; + } else { + goto yy186; + } + } +yy199: + YYDEBUG(199, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy200: + YYDEBUG(200, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(201, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy204; + goto yy194; +yy202: + YYDEBUG(202, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(203, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy204: + YYDEBUG(204, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy205: + YYDEBUG(205, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(206, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy205; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy186; + if (yych <= '\f') goto yy194; + goto yy186; + } else { + if (yych == '"') goto yy186; + if (yych <= '#') goto yy194; + goto yy197; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy186; + if (yych <= ':') goto yy194; + goto yy186; + } else { + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy186; + goto yy194; + } + } +yy207: + YYDEBUG(207, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(208, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy207; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych == '"') goto yy184; + if (yych <= '#') goto yy194; + goto yy197; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy184; + if (yych <= ':') goto yy194; + goto yy184; + } else { + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } +yy209: + YYDEBUG(209, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(210, *YYCURSOR); + if (yych <= '\'') { + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy194; + goto yy184; + } else { + if (yych == '\r') goto yy184; + goto yy194; + } + } else { + if (yych <= '#') { + if (yych <= '"') goto yy184; + goto yy194; + } else { + if (yych <= '$') goto yy197; + if (yych <= '&') goto yy194; + goto yy184; + } + } + } else { + if (yych <= ':') { + if (yych <= '.') { + if (yych <= '-') goto yy194; + goto yy207; + } else { + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy209; + goto yy194; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy211: + YYDEBUG(211, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(212, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy194; + goto yy184; + } else { + if (yych == '$') goto yy197; + goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy211; + goto yy194; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy213: + YYDEBUG(213, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(214, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy194; + goto yy184; + } else { + if (yych == '$') goto yy197; + goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy213; + goto yy194; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy215: + YYDEBUG(215, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(216, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy215; + } + YYDEBUG(217, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(218, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 2724 "Zend/zend_ini_scanner.c" +yy219: + YYDEBUG(219, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(220, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 2735 "Zend/zend_ini_scanner.c" +yy221: + YYDEBUG(221, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(222, *YYCURSOR); + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy194; + if (yych <= '\t') goto yy221; + if (yych <= '\n') goto yy173; + goto yy194; + } else { + if (yych <= 0x1F) { + if (yych <= '\r') goto yy173; + goto yy194; + } else { + if (yych <= ' ') goto yy221; + if (yych <= '!') goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '$') { + if (yych <= '#') goto yy194; + goto yy197; + } else { + if (yych == '\'') goto yy173; + goto yy194; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy173; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy173; + goto yy194; + } + } + } +yy223: + YYDEBUG(223, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy178; + } +/* *********************************** */ +yyc_ST_VALUE: + { + static const unsigned char yybm[] = { + 160, 162, 162, 162, 162, 162, 162, 162, + 162, 176, 128, 162, 162, 128, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 176, 160, 160, 162, 168, 162, 160, 32, + 160, 160, 162, 162, 162, 162, 162, 162, + 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 162, 160, 162, 160, 162, 162, + 162, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 162, 162, 162, 160, 166, + 162, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 162, 160, 162, 160, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + }; + YYDEBUG(224, *YYCURSOR); + YYFILL(6); + yych = *YYCURSOR; + YYDEBUG(-1, yych); + switch (yych) { + case 0x00: goto yy226; + case '\t': + case ' ': goto yy230; + case '\n': goto yy232; + case '\r': goto yy234; + case '!': + case '&': + case '(': + case ')': + case '^': + case '|': + case '~': goto yy235; + case '"': goto yy237; + case '$': goto yy239; + case '\'': goto yy240; + case '-': goto yy241; + case '.': goto yy242; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy243; + case ';': goto yy245; + case '=': goto yy246; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'p': + case 'q': + case 'r': + case 's': + case 'u': + case 'v': + case 'w': + case 'x': + case 'z': goto yy248; + case 'F': + case 'f': goto yy250; + case 'N': + case 'n': goto yy251; + case 'O': + case 'o': goto yy252; + case 'T': + case 't': goto yy253; + case 'Y': + case 'y': goto yy254; + default: goto yy228; + } +yy226: + YYDEBUG(226, *YYCURSOR); + ++YYCURSOR; +yy227: + YYDEBUG(227, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 598 "Zend/zend_ini_scanner.l" + { /* End of option value (if EOF is reached before EOL */ + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 2921 "Zend/zend_ini_scanner.c" +yy228: + YYDEBUG(228, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy256; +yy229: + YYDEBUG(229, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 517 "Zend/zend_ini_scanner.l" + { /* Get everything else as option/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 2934 "Zend/zend_ini_scanner.c" +yy230: + YYDEBUG(230, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy306; +yy231: + YYDEBUG(231, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 571 "Zend/zend_ini_scanner.l" + { + RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); +} +#line 2947 "Zend/zend_ini_scanner.c" +yy232: + YYDEBUG(232, *YYCURSOR); + ++YYCURSOR; +yy233: + YYDEBUG(233, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 489 "Zend/zend_ini_scanner.l" + { /* End of option value */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 2960 "Zend/zend_ini_scanner.c" +yy234: + YYDEBUG(234, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy304; + goto yy233; +yy235: + YYDEBUG(235, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy303; +yy236: + YYDEBUG(236, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 507 "Zend/zend_ini_scanner.l" + { /* Boolean operators */ + return yytext[0]; +} +#line 2978 "Zend/zend_ini_scanner.c" +yy237: + YYDEBUG(237, *YYCURSOR); + ++YYCURSOR; +yy238: + YYDEBUG(238, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 2990 "Zend/zend_ini_scanner.c" +yy239: + YYDEBUG(239, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy227; + if (yych <= '[') goto yy255; + goto yy262; + } else { + if (yych == '{') goto yy300; + goto yy255; + } +yy240: + YYDEBUG(240, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy296; + } + goto yy227; +yy241: + YYDEBUG(241, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy294; + goto yy256; +yy242: + YYDEBUG(242, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy292; + goto yy256; +yy243: + YYDEBUG(243, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy256; + } else { + if (yych != '\r') goto yy256; + } + } else { + if (yych <= ')') { + if (yych <= '"') goto yy244; + if (yych <= '%') goto yy256; + } else { + if (yych == '.') goto yy288; + goto yy256; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy290; + if (yych <= ':') goto yy256; + } else { + if (yych != '=') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy244: + YYDEBUG(244, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 3069 "Zend/zend_ini_scanner.c" +yy245: + YYDEBUG(245, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + goto yy284; +yy246: + YYDEBUG(246, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(247, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 511 "Zend/zend_ini_scanner.l" + { /* Make = used in option value to trigger error */ + yyless(0); + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 3086 "Zend/zend_ini_scanner.c" +yy248: + YYDEBUG(248, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ':') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy256; + } else { + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy256; + } + } else { + if (yych <= '"') { + if (yych <= 0x1F) goto yy256; + } else { + if (yych <= '%') goto yy256; + if (yych >= '*') goto yy256; + } + } + } else { + if (yych <= '^') { + if (yych <= '<') { + if (yych >= '<') goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= ']') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy249: + YYDEBUG(249, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 3133 "Zend/zend_ini_scanner.c" +yy250: + YYDEBUG(250, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '<') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '/') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + goto yy256; + } else { + if (yych <= '9') goto yy257; + if (yych == ';') goto yy249; + goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= 'A') { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy280; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + goto yy257; + } + } else { + if (yych <= '{') { + if (yych <= '`') goto yy256; + if (yych <= 'a') goto yy280; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy251: + YYDEBUG(251, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'N') { + if (yych <= '%') { + if (yych <= '\f') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; + } else { + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; + } + } else { + if (yych <= ':') { + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; + } else { + if (yych <= '<') { + if (yych <= ';') goto yy249; + goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; + } + } + } + } else { + if (yych <= 'n') { + if (yych <= 'Z') { + if (yych <= 'O') goto yy276; + if (yych == 'U') goto yy277; + goto yy257; + } else { + if (yych <= '^') { + if (yych <= ']') goto yy256; + goto yy249; + } else { + if (yych == '`') goto yy256; + goto yy257; + } + } + } else { + if (yych <= 'z') { + if (yych <= 'o') goto yy276; + if (yych == 'u') goto yy277; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy256; + } + } + } + } +yy252: + YYDEBUG(252, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'E') { + if (yych <= '%') { + if (yych <= '\f') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; + } else { + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; + } + } else { + if (yych <= ':') { + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; + } else { + if (yych <= '<') { + if (yych <= ';') goto yy249; + goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; + } + } + } + } else { + if (yych <= 'e') { + if (yych <= 'Z') { + if (yych <= 'F') goto yy271; + if (yych == 'N') goto yy265; + goto yy257; + } else { + if (yych <= '^') { + if (yych <= ']') goto yy256; + goto yy249; + } else { + if (yych == '`') goto yy256; + goto yy257; + } + } + } else { + if (yych <= 'z') { + if (yych <= 'f') goto yy271; + if (yych == 'n') goto yy265; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy256; + } + } + } + } +yy253: + YYDEBUG(253, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'R') goto yy269; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'r') goto yy269; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy254: + YYDEBUG(254, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy259; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy259; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy255: + YYDEBUG(255, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy256: + YYDEBUG(256, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy255; + } + if (yych == '$') goto yy260; + goto yy229; +yy257: + YYDEBUG(257, *YYCURSOR); + yyaccept = 4; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(258, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych <= 0x00) goto yy249; + goto yy255; + } else { + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy255; + goto yy249; + } + } else { + if (yych <= '#') { + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy249; + goto yy255; + } else { + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy249; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy255; + goto yy249; + } else { + if (yych == '=') goto yy249; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy249; + if (yych <= '{') goto yy255; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy255; + } + } + } +yy259: + YYDEBUG(259, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'S') goto yy265; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 's') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy260: + YYDEBUG(260, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy261; + if (yych <= '[') goto yy255; + goto yy262; + } else { + if (yych != '{') goto yy255; + } +yy261: + YYDEBUG(261, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 3) { + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy229; + } else { + goto yy231; + } + } else { + if (yyaccept <= 2) { + goto yy227; + } else { + goto yy244; + } + } + } else { + if (yyaccept <= 5) { + if (yyaccept <= 4) { + goto yy249; + } else { + goto yy266; + } + } else { + goto yy273; + } + } +yy262: + YYDEBUG(262, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy263; + } + goto yy255; +yy263: + YYDEBUG(263, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(264, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy263; + } + if (yych <= 0x00) goto yy229; + if (yych == '\\') goto yy262; + goto yy255; +yy265: + YYDEBUG(265, *YYCURSOR); + yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy267; + } + if (yych <= ';') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy266; + if (yych <= '\t') goto yy256; + } else { + if (yych != '\r') goto yy256; + } + } else { + if (yych <= ')') { + if (yych <= '"') goto yy266; + if (yych <= '%') goto yy256; + } else { + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + if (yych <= ':') goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= '@') { + if (yych != '=') goto yy256; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych >= '_') goto yy257; + } + } else { + if (yych <= '{') { + if (yych <= '`') goto yy256; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych >= 0x7F) goto yy256; + } + } + } +yy266: + YYDEBUG(266, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 421 "Zend/zend_ini_scanner.l" + { /* TRUE value (when used outside option value/offset this causes parse error!) */ + RETURN_TOKEN(BOOL_TRUE, "1", 1); +} +#line 3645 "Zend/zend_ini_scanner.c" +yy267: + YYDEBUG(267, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(268, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy267; + } + goto yy266; +yy269: + YYDEBUG(269, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'U') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'u') goto yy270; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy270: + YYDEBUG(270, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy265; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy271: + YYDEBUG(271, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'F') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'f') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy272: + YYDEBUG(272, *YYCURSOR); + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ')') { + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy256; + } else { + if (yych <= '\t') goto yy274; + if (yych >= '\v') goto yy256; + } + } else { + if (yych <= ' ') { + if (yych <= '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; + } else { + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy256; + } else { + if (yych != '=') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy273; + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy273: + YYDEBUG(273, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 425 "Zend/zend_ini_scanner.l" + { /* FALSE value (when used outside option value/offset this causes parse error!)*/ + RETURN_TOKEN(BOOL_FALSE, "", 0); +} +#line 3855 "Zend/zend_ini_scanner.c" +yy274: + YYDEBUG(274, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(275, *YYCURSOR); + if (yych == '\t') goto yy274; + if (yych == ' ') goto yy274; + goto yy273; +yy276: + YYDEBUG(276, *YYCURSOR); + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy273; + if (yych <= 0x08) goto yy256; + if (yych <= '\t') goto yy274; + goto yy273; + } else { + if (yych == '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; + } + } else { + if (yych <= '/') { + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy273; + goto yy256; + } else { + if (yych <= '9') goto yy257; + if (yych == ';') goto yy273; + goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= 'N') { + if (yych <= '=') goto yy273; + if (yych <= '@') goto yy256; + if (yych <= 'M') goto yy257; + goto yy279; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy273; + goto yy257; + } + } else { + if (yych <= 'z') { + if (yych <= '`') goto yy256; + if (yych == 'n') goto yy279; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy273; + } else { + if (yych == '~') goto yy273; + goto yy256; + } + } + } + } +yy277: + YYDEBUG(277, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'L') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy278; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy278: + YYDEBUG(278, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'L') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy279: + YYDEBUG(279, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy280: + YYDEBUG(280, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'L') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy281; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy281: + YYDEBUG(281, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'S') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 's') goto yy282; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy282: + YYDEBUG(282, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy283: + YYDEBUG(283, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy284: + YYDEBUG(284, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy283; + } + if (yych >= '\r') goto yy287; +yy285: + YYDEBUG(285, *YYCURSOR); + ++YYCURSOR; +yy286: + YYDEBUG(286, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 4248 "Zend/zend_ini_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy285; + goto yy286; +yy288: + YYDEBUG(288, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(289, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy288; + } + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych <= 0x00) goto yy244; + goto yy255; + } else { + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy255; + goto yy244; + } + } else { + if (yych <= '#') { + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy244; + goto yy255; + } else { + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy244; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy290: + YYDEBUG(290, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(291, *YYCURSOR); + if (yych <= '.') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + if (yych <= '-') goto yy255; + goto yy288; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '/') goto yy255; + if (yych <= '9') goto yy290; + goto yy255; + } else { + if (yych == '<') goto yy255; + goto yy244; + } + } else { + if (yych <= '{') { + if (yych == '^') goto yy244; + goto yy255; + } else { + if (yych == '}') goto yy255; + if (yych <= '~') goto yy244; + goto yy255; + } + } + } +yy292: + YYDEBUG(292, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(293, *YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy292; + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy294: + YYDEBUG(294, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(295, *YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy294; + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy296: + YYDEBUG(296, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(297, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy296; + } + YYDEBUG(298, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(299, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 4475 "Zend/zend_ini_scanner.c" +yy300: + YYDEBUG(300, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(301, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 4486 "Zend/zend_ini_scanner.c" +yy302: + YYDEBUG(302, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy303: + YYDEBUG(303, *YYCURSOR); + if (yych == '\t') goto yy302; + if (yych == ' ') goto yy302; + goto yy236; +yy304: + YYDEBUG(304, *YYCURSOR); + yych = *++YYCURSOR; + goto yy233; +yy305: + YYDEBUG(305, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy306: + YYDEBUG(306, *YYCURSOR); + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy231; + if (yych <= '\t') goto yy305; + goto yy304; + } else { + if (yych == '\r') goto yy308; + goto yy231; + } + } else { + if (yych <= '"') { + if (yych <= ' ') goto yy305; + if (yych <= '!') goto yy231; + } else { + if (yych == ';') goto yy283; + goto yy231; + } + } + YYDEBUG(307, *YYCURSOR); + yych = *++YYCURSOR; + goto yy238; +yy308: + YYDEBUG(308, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy304; + goto yy233; + } +/* *********************************** */ +yyc_ST_VARNAME: + { + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 0, 128, 0, 128, + 0, 0, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 128, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(309, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= ')') { + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy311; + if (yych <= '\n') goto yy313; + } else { + if (yych <= '\r') goto yy313; + if (yych >= '!') goto yy313; + } + } else { + if (yych <= '%') { + if (yych == '$') goto yy313; + } else { + if (yych != '\'') goto yy313; + } + } + } else { + if (yych <= '[') { + if (yych <= '<') { + if (yych == ';') goto yy313; + } else { + if (yych <= '=') goto yy313; + if (yych >= '[') goto yy313; + } + } else { + if (yych <= 'z') { + if (yych == '^') goto yy313; + } else { + if (yych == '}') goto yy315; + if (yych <= '~') goto yy313; + } + } + } +yy311: + YYDEBUG(311, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy318; +yy312: + YYDEBUG(312, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 406 "Zend/zend_ini_scanner.l" + { /* Variable name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + + RETURN_TOKEN(TC_VARNAME, yytext, yyleng); +} +#line 4627 "Zend/zend_ini_scanner.c" +yy313: + YYDEBUG(313, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(314, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 4637 "Zend/zend_ini_scanner.c" +yy315: + YYDEBUG(315, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(316, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 416 "Zend/zend_ini_scanner.l" + { /* Variable end */ + yy_pop_state(TSRMLS_C); + return '}'; +} +#line 4648 "Zend/zend_ini_scanner.c" +yy317: + YYDEBUG(317, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy318: + YYDEBUG(318, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy317; + } + goto yy312; + } +} +#line 607 "Zend/zend_ini_scanner.l" + +} diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 12ee1f59c2da0..76e3e5645129a 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -49,7 +49,7 @@ #include "zend_API.h" #include "zend_strtod.h" #include "zend_exceptions.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "tsrm_config_common.h" #define YYCTYPE unsigned char diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index f620cb8b4695b..736d7712d5ab8 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -47,7 +47,7 @@ #include "zend_API.h" #include "zend_strtod.h" #include "zend_exceptions.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "tsrm_config_common.h" #define YYCTYPE unsigned char diff --git a/TSRM/tsrm_virtual_cwd.c b/Zend/zend_virtual_cwd.c similarity index 99% rename from TSRM/tsrm_virtual_cwd.c rename to Zend/zend_virtual_cwd.c index a7d09630a26c7..e535e5c8db68e 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -30,7 +30,7 @@ #include #include -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "tsrm_strtok_r.h" #ifdef TSRM_WIN32 diff --git a/TSRM/tsrm_virtual_cwd.h b/Zend/zend_virtual_cwd.h similarity index 100% rename from TSRM/tsrm_virtual_cwd.h rename to Zend/zend_virtual_cwd.h diff --git a/configure.in b/configure.in index 16738fe30ab67..805aa48f5940f 100644 --- a/configure.in +++ b/configure.in @@ -1440,7 +1440,7 @@ PHP_SUBST(install_binary_targets) PHP_INSTALL_HEADERS([Zend/ TSRM/ include/ main/ main/streams/]) -PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c) +PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c) PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \ fopen_wrappers.c alloca.c php_scandir.c \ @@ -1475,7 +1475,8 @@ PHP_ADD_SOURCES(Zend, \ zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \ zend_ini.c zend_qsort.c zend_multibyte.c zend_ts_hash.c zend_stream.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \ - zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c) + zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c \ + zend_virtual_cwd.c) if test -r "$abs_srcdir/Zend/zend_objects.c"; then PHP_ADD_SOURCES(Zend, zend_objects.c zend_object_handlers.c zend_objects_API.c zend_default_classes.c) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 2860562a4539c..a546a77cb6b92 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -36,7 +36,7 @@ #include "main/php_open_temporary_file.h" #include "zend_API.h" #include "zend_ini.h" -#include "TSRM/tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index dedb7215c1df3..7fbd9634ca6df 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -28,7 +28,7 @@ #include "zend_accelerator_blacklist.h" #include "php_ini.h" #include "SAPI.h" -#include "TSRM/tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "ext/standard/info.h" #include "ext/standard/php_filestat.h" diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 0ac4c2ed7a9bf..2748eda070768 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -24,7 +24,7 @@ #include "libxml/uri.h" #include "ext/standard/md5.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include #include diff --git a/main/php.h b/main/php.h index 17ac8b4fd29d9..f9c6f2030c839 100644 --- a/main/php.h +++ b/main/php.h @@ -400,7 +400,7 @@ END_EXTERN_C() /* Virtual current working directory support */ -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "zend_constants.h" diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 3401205c8fc1e..af92eb0d4c050 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -364,7 +364,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \ zend_stream.c zend_iterators.c zend_interfaces.c zend_objects.c \ zend_object_handlers.c zend_objects_API.c \ zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c \ - zend_float.c zend_string.c zend_generators.c"); + zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c"); if (VCVERS == 1200) { AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1); From cf6ab0e915f95f01a8db1ce7daf70ed36cf49c66 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 17 Oct 2013 10:40:43 +0200 Subject: [PATCH 0141/1256] applied and fixed the original patch initial work on the patch import done --- Zend/zend.c | 12 ++++ Zend/zend_virtual_cwd.c | 117 +++++++++++++++++++-------------- Zend/zend_virtual_cwd.h | 2 + ext/zip/php_zip.c | 16 ++--- main/SAPI.c | 4 -- main/fopen_wrappers.c | 6 +- main/main.c | 16 ++--- main/php_open_temporary_file.c | 10 +-- main/streams/plain_wrapper.c | 2 +- 9 files changed, 106 insertions(+), 79 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 11baf34c93566..b98d264a3c050 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -30,6 +30,7 @@ #include "zend_ini.h" #include "zend_vm.h" #include "zend_dtrace.h" +#include "zend_virtual_cwd.h" #ifdef ZTS # define GLOBAL_FUNCTION_TABLE global_function_table @@ -652,6 +653,8 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions TS start_memory_manager(TSRMLS_C); + virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */ + #if defined(__FreeBSD__) || defined(__DragonFly__) /* FreeBSD and DragonFly floating point precision fix */ fpsetmask(0); @@ -802,9 +805,14 @@ void zend_post_startup(TSRMLS_D) /* {{{ */ compiler_globals_ctor(compiler_globals, tsrm_ls); } free(EG(zend_constants)); + + virtual_cwd_deactivate(TSRMLS_C); + executor_globals_ctor(executor_globals, tsrm_ls); global_persistent_list = &EG(persistent_list); zend_copy_ini_directives(TSRMLS_C); +#else + virtual_cwd_deactivate(TSRMLS_C); #endif } /* }}} */ @@ -820,6 +828,9 @@ void zend_shutdown(TSRMLS_D) /* {{{ */ zend_destroy_rsrc_list(&EG(persistent_list) TSRMLS_CC); zend_destroy_modules(); + virtual_cwd_deactivate(TSRMLS_C); + virtual_cwd_shutdown(); + zend_hash_destroy(GLOBAL_FUNCTION_TABLE); zend_hash_destroy(GLOBAL_CLASS_TABLE); @@ -910,6 +921,7 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { + virtual_cwd_activate(TSRMLS_C); gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index e535e5c8db68e..968390d353925 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -30,6 +30,7 @@ #include #include +#include "zend.h" #include "zend_virtual_cwd.h" #include "tsrm_strtok_r.h" @@ -149,11 +150,12 @@ static int php_check_dots(const char *element, int n) #define CWD_STATE_COPY(d, s) \ (d)->cwd_length = (s)->cwd_length; \ - (d)->cwd = (char *) malloc((s)->cwd_length+1); \ + (d)->cwd = (char *) emalloc((s)->cwd_length+1); \ memcpy((d)->cwd, (s)->cwd, (s)->cwd_length+1); #define CWD_STATE_FREE(s) \ - free((s)->cwd); + efree((s)->cwd); \ + (s)->cwd = NULL; #ifdef TSRM_WIN32 @@ -337,16 +339,15 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ HANDLE hLink = NULL; REPARSE_DATA_BUFFER * pbuffer; unsigned int retlength = 0; - TSRM_ALLOCA_FLAG(use_heap_large); hLink = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL); if(hLink == INVALID_HANDLE_VALUE) { return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)tsrm_do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); + pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); CloseHandle(hLink); return -1; } @@ -363,7 +364,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ buf->st_mode |=; } #endif - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); } else { buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG; buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6)); @@ -424,12 +425,13 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ cwd_g->realpath_cache_size_limit = REALPATH_CACHE_SIZE; cwd_g->realpath_cache_ttl = REALPATH_CACHE_TTL; memset(cwd_g->realpath_cache, 0, sizeof(cwd_g->realpath_cache)); + virtual_cwd_activate(TSRMLS_C); } /* }}} */ static void cwd_globals_dtor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ { - CWD_STATE_FREE(&cwd_g->cwd); +/* CWD_STATE_FREE(&cwd_globals->cwd); */ realpath_cache_clean(TSRMLS_C); } /* }}} */ @@ -490,6 +492,24 @@ CWD_API void virtual_cwd_shutdown(void) /* {{{ */ } /* }}} */ +CWD_API int virtual_cwd_activate(TSRMLS_D) /* {{{ */ +{ + if (CWDG(cwd).cwd == NULL) { + CWD_STATE_COPY(&CWDG(cwd), &main_cwd_state); + } + return 0; +} +/* }}} */ + +CWD_API int virtual_cwd_deactivate(TSRMLS_D) /* {{{ */ +{ + if (CWDG(cwd).cwd != NULL) { + CWD_STATE_FREE(&CWDG(cwd)); + } + return 0; +} +/* }}} */ + CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ { cwd_state *state; @@ -500,7 +520,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ char *retval; *length = 1; - retval = (char *) malloc(2); + retval = (char *) emalloc(2); if (retval == NULL) { return NULL; } @@ -515,7 +535,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ char *retval; *length = state->cwd_length+1; - retval = (char *) malloc(*length+1); + retval = (char *) emalloc(*length+1); if (retval == NULL) { return NULL; } @@ -527,7 +547,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ } #endif *length = state->cwd_length; - return strdup(state->cwd); + return estrdup(state->cwd); } /* }}} */ @@ -543,12 +563,12 @@ CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC) /* {{{ */ return cwd; } if (length > size-1) { - free(cwd); + efree(cwd); errno = ERANGE; /* Is this OK? */ return NULL; } memcpy(buf, cwd, length+1); - free(cwd); + efree(cwd); return buf; } /* }}} */ @@ -754,13 +774,11 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #ifdef TSRM_WIN32 WIN32_FIND_DATA data; HANDLE hFind; - TSRM_ALLOCA_FLAG(use_heap_large) #else struct stat st; #endif realpath_cache_bucket *bucket; char *tmp; - TSRM_ALLOCA_FLAG(use_heap) while (1) { if (len <= start) { @@ -860,7 +878,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i FindClose(hFind); } - tmp = tsrm_do_alloca(len+1, use_heap); + tmp = emalloc(len+1); memcpy(tmp, path, len+1); if(save && @@ -887,12 +905,12 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)tsrm_do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); + pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); if (pbuffer == NULL) { return -1; } if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); CloseHandle(hLink); return -1; } @@ -908,7 +926,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; printname_len = pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR); @@ -920,7 +938,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; substitutename[substitutename_len] = 0; @@ -934,7 +952,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; printname[pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR)] = 0; @@ -945,7 +963,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; substitutename[substitutename_len] = 0; @@ -955,7 +973,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i memcpy(substitutename, path, len + 1); substitutename_len = len; } else { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; } @@ -999,21 +1017,21 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i fprintf(stderr, "sub: %s ", substitutename); fprintf(stderr, "resolved: %s ", path); #endif - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); if(isabsolute == 1) { if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) { /* use_realpath is 0 in the call below coz path is absolute*/ j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC); if(j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } } else { if(i + j >= MAXPATHLEN - 1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } @@ -1022,7 +1040,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if(j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } @@ -1043,7 +1061,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #elif defined(NETWARE) save = 0; - tmp = tsrm_do_alloca(len+1, use_heap); + tmp = emalloc(len+1); memcpy(tmp, path, len+1); #else if (save && php_sys_lstat(path, &st) < 0) { @@ -1055,25 +1073,25 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i save = 0; } - tmp = tsrm_do_alloca(len+1, use_heap); + tmp = emalloc(len+1); memcpy(tmp, path, len+1); if (save && S_ISLNK(st.st_mode)) { if (++(*ll) > LINK_MAX || (j = php_sys_readlink(tmp, path, MAXPATHLEN)) < 0) { /* too many links or broken symlinks */ - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } path[j] = 0; if (IS_ABSOLUTE_PATH(path, j)) { j = tsrm_realpath_r(path, 1, j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } else { if (i + j >= MAXPATHLEN-1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; /* buffer overflow */ } memmove(path+i, path, j+1); @@ -1081,7 +1099,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } @@ -1096,7 +1114,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } if (is_dir && !directory) { /* not a directory */ - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } @@ -1112,7 +1130,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #ifdef TSRM_WIN32 if (j < 0 || j + len - i >= MAXPATHLEN-1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } if (save) { @@ -1127,7 +1145,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #else if (j < 0 || j + len - i >= MAXPATHLEN-1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } memcpy(path+j, tmp+i, len-i+1); @@ -1140,7 +1158,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i realpath_cache_add(tmp, len, path, j, directory, *t TSRMLS_CC); } - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return j; } } @@ -1316,7 +1334,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func CWD_STATE_COPY(&old_state, state); state->cwd_length = path_length; - tmp = realloc(state->cwd, state->cwd_length+1); + tmp = erealloc(state->cwd, state->cwd_length+1); if (tmp == NULL) { #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Out of memory\n"); @@ -1336,7 +1354,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func } } else { state->cwd_length = path_length; - tmp = realloc(state->cwd, state->cwd_length+1); + tmp = erealloc(state->cwd, state->cwd_length+1); if (tmp == NULL) { #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Out of memory\n"); @@ -1367,7 +1385,6 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path int length = strlen(path); char *temp; int retval; - TSRM_ALLOCA_FLAG(use_heap) if (length == 0) { return 1; /* Can't cd to empty string */ @@ -1384,14 +1401,14 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path if (length == COPY_WHEN_ABSOLUTE(path) && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */ length++; } - temp = (char *) tsrm_do_alloca(length+1, use_heap); + temp = (char *) emalloc(length+1); memcpy(temp, path, length); temp[length] = 0; #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Changing directory to %s\n", temp); #endif retval = p_chdir(temp TSRMLS_CC); - tsrm_free_alloca(temp, use_heap); + efree(temp); return retval; } /* }}} */ @@ -1404,7 +1421,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) /* { /* realpath("") returns CWD */ if (!*path) { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { retval = NULL; goto end; @@ -1417,7 +1434,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) /* { } else if (!IS_ABSOLUTE_PATH(path, strlen(path))) { CWD_STATE_COPY(&new_state, &CWDG(cwd)); } else { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { retval = NULL; goto end; @@ -1882,7 +1899,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) /* dir_length = CWDG(cwd).cwd_length; dir = CWDG(cwd).cwd; - ptr = command_line = (char *) malloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1); + ptr = command_line = (char *) emalloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1); if (!command_line) { return NULL; } @@ -1916,7 +1933,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) /* memcpy(ptr, command, command_length+1); retval = popen(command_line, type); - free(command_line); + efree(command_line); return retval; } /* }}} */ @@ -1929,7 +1946,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ /* realpath("") returns CWD */ if (!*path) { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { return NULL; } @@ -1940,10 +1957,10 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ } } else if (!IS_ABSOLUTE_PATH(path, strlen(path)) && VCWD_GETCWD(cwd, MAXPATHLEN)) { - new_state.cwd = strdup(cwd); + new_state.cwd = estrdup(cwd); new_state.cwd_length = strlen(cwd); } else { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { return NULL; } @@ -1952,7 +1969,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ } if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { - free(new_state.cwd); + efree(new_state.cwd); return NULL; } @@ -1960,7 +1977,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ int copy_len = new_state.cwd_length>MAXPATHLEN-1 ? MAXPATHLEN-1 : new_state.cwd_length; memcpy(real_path, new_state.cwd, copy_len); real_path[copy_len] = '\0'; - free(new_state.cwd); + efree(new_state.cwd); return real_path; } else { return new_state.cwd; diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h index 72c4424670566..a6ac0aeef7162 100644 --- a/Zend/zend_virtual_cwd.h +++ b/Zend/zend_virtual_cwd.h @@ -151,6 +151,8 @@ typedef int (*verify_path_func)(const cwd_state *); CWD_API void virtual_cwd_startup(void); CWD_API void virtual_cwd_shutdown(void); +CWD_API int virtual_cwd_activate(TSRMLS_D); +CWD_API int virtual_cwd_deactivate(TSRMLS_D); CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC); CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC); CWD_API int virtual_chdir(const char *path TSRMLS_DC); diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 969bac1aa6b5d..59e026baa245f 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -154,7 +154,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil size_t path_cleaned_len; cwd_state new_state; - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); new_state.cwd[0] = '\0'; new_state.cwd_length = 0; @@ -191,7 +191,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname_fullpath)) { efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } } @@ -215,7 +215,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil efree(file_dirname_fullpath); if (!is_dir_only) { efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); } return 0; } @@ -224,7 +224,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil /* it is a standalone directory, job done */ if (is_dir_only) { efree(file_dirname_fullpath); - free(new_state.cwd); + efree(new_state.cwd); return 1; } @@ -232,13 +232,13 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil if (!len) { efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } else if (len > MAXPATHLEN) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Full extraction path exceed MAXPATHLEN (%i)", MAXPATHLEN); efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } @@ -250,7 +250,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil efree(fullpath); efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } @@ -285,7 +285,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil efree(fullpath); efree(file_basename); efree(file_dirname_fullpath); - free(new_state.cwd); + efree(new_state.cwd); if (n<0) { return 0; diff --git a/main/SAPI.c b/main/SAPI.c index 8ee7649648d53..c9ba5d5dce851 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -91,8 +91,6 @@ SAPI_API void sapi_startup(sapi_module_struct *sf) sapi_globals_ctor(&sapi_globals); #endif - virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */ - #ifdef PHP_WIN32 tsrm_win32_startup(); #endif @@ -110,8 +108,6 @@ SAPI_API void sapi_shutdown(void) reentrancy_shutdown(); - virtual_cwd_shutdown(); - #ifdef PHP_WIN32 tsrm_win32_shutdown(); #endif diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 1d99a4e20e93b..6722798598af5 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -791,11 +791,11 @@ PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, co } } - new_state.cwd = strdup(cwd); + new_state.cwd = estrdup(cwd); new_state.cwd_length = strlen(cwd); if (virtual_file_ex(&new_state, filepath, NULL, realpath_mode TSRMLS_CC)) { - free(new_state.cwd); + efree(new_state.cwd); return NULL; } @@ -806,7 +806,7 @@ PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, co } else { real_path = estrndup(new_state.cwd, new_state.cwd_length); } - free(new_state.cwd); + efree(new_state.cwd); return real_path; } diff --git a/main/main.c b/main/main.c index 1cc842b212944..2d018a74670fb 100644 --- a/main/main.c +++ b/main/main.c @@ -1816,6 +1816,9 @@ void php_request_shutdown(void *dummy) sapi_deactivate(TSRMLS_C); } zend_end_try(); + /* 9.5 free virtual CWD memory */ + virtual_cwd_deactivate(TSRMLS_C); + /* 10. Destroy stream hashes */ zend_try { php_shutdown_stream_hashes(TSRMLS_C); @@ -2243,9 +2246,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod } #endif -#ifdef ZTS zend_post_startup(TSRMLS_C); -#endif module_initialized = 1; @@ -2315,6 +2316,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod shutdown_memory_manager(1, 0 TSRMLS_CC); zend_interned_strings_snapshot(TSRMLS_C); + virtual_cwd_activate(TSRMLS_C); /* we're done */ return retval; @@ -2410,14 +2412,13 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) volatile int old_cwd_fd = -1; #else char *old_cwd; - ALLOCA_FLAG(use_heap) #endif int retval = 0; EG(exit_status) = 0; #ifndef HAVE_BROKEN_GETCWD # define OLD_CWD_SIZE 4096 - old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); + old_cwd = emalloc(OLD_CWD_SIZE); old_cwd[0] = '\0'; #endif @@ -2498,7 +2499,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) if (old_cwd[0] != '\0') { php_ignore_value(VCWD_CHDIR(old_cwd)); } - free_alloca(old_cwd, use_heap); + efree(old_cwd); #endif return retval; } @@ -2509,11 +2510,10 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC) { char *old_cwd; - ALLOCA_FLAG(use_heap) EG(exit_status) = 0; #define OLD_CWD_SIZE 4096 - old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); + old_cwd = emalloc(OLD_CWD_SIZE); old_cwd[0] = '\0'; zend_try { @@ -2536,7 +2536,7 @@ PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret php_ignore_value(VCWD_CHDIR(old_cwd)); } - free_alloca(old_cwd, use_heap); + efree(old_cwd); return EG(exit_status); } /* }}} */ diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c index 054d497be6d5c..8315297738165 100644 --- a/main/php_open_temporary_file.c +++ b/main/php_open_temporary_file.c @@ -124,11 +124,11 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** cwd[0] = '\0'; } - new_state.cwd = strdup(cwd); + new_state.cwd = estrdup(cwd); new_state.cwd_length = strlen(cwd); if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { - free(new_state.cwd); + efree(new_state.cwd); return -1; } @@ -140,7 +140,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** if (spprintf(&opened_path, 0, "%s%s%sXXXXXX", new_state.cwd, trailing_slash, pfx) >= MAXPATHLEN) { efree(opened_path); - free(new_state.cwd); + efree(new_state.cwd); return -1; } @@ -151,7 +151,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** * which means that opening it will fail... */ if (VCWD_CHMOD(opened_path, 0600)) { efree(opened_path); - free(new_state.cwd); + efree(new_state.cwd); return -1; } fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600); @@ -170,7 +170,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** } else { *opened_path_p = opened_path; } - free(new_state.cwd); + efree(new_state.cwd); return fd; } /* }}} */ diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 949b827679ecd..4dbf6889d7c11 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -1436,7 +1436,7 @@ PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s/%s path was truncated to %d", cwd, filename, MAXPATHLEN); } - free(cwd); + efree(cwd); if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(trypath TSRMLS_CC)) { return NULL; From 51b809e3ad244df1102ca2f44a03ea1fee063579 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Wed, 9 Oct 2013 09:06:33 +0800 Subject: [PATCH 0142/1256] Assume the free space is correct on Travis CI. --- ext/standard/tests/file/disk_free_space_basic.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index 7ea8d36153f06..c3917a9417880 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -33,7 +33,7 @@ echo "\n Free Space after writing to a file\n"; $space2 = disk_free_space($file_path.$dir); var_dump( $space2 ); -if( $space1 > $space2 ) +if(getenv('TRAVIS') === 'true' || $space1 > $space2 ) echo "\n Free Space Value Is Correct\n"; else echo "\n Free Space Value Is Incorrect\n"; From 2aaa3d538a7b93d92c52aec95707d8230f21be65 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Tue, 8 Oct 2013 13:54:22 -0400 Subject: [PATCH 0143/1256] Added support for TLSv1.1 and TLSv1.2 Conflicts: ext/openssl/xp_ssl.c --- ext/openssl/openssl.c | 8 ++ ext/openssl/tests/streams_crypto_method.pem | 33 ++++++++ ext/openssl/tests/tlsv1.1_wrapper_001.phpt | 46 +++++++++++ ext/openssl/tests/tlsv1.2_wrapper_002.phpt | 46 +++++++++++ ext/openssl/xp_ssl.c | 86 ++++++++++++++++++++- ext/standard/file.c | 4 + main/streams/php_stream_transport.h | 6 +- 7 files changed, 226 insertions(+), 3 deletions(-) create mode 100644 ext/openssl/tests/streams_crypto_method.pem create mode 100644 ext/openssl/tests/tlsv1.1_wrapper_001.phpt create mode 100644 ext/openssl/tests/tlsv1.2_wrapper_002.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 59a58b1c00256..5d0cf4384d156 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1151,6 +1151,10 @@ PHP_MINIT_FUNCTION(openssl) php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC); #endif php_stream_xport_register("tls", php_openssl_ssl_socket_factory TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_register("tlsv1.1", php_openssl_ssl_socket_factory TSRMLS_CC); + php_stream_xport_register("tlsv1.2", php_openssl_ssl_socket_factory TSRMLS_CC); +#endif /* override the default tcp socket provider */ php_stream_xport_register("tcp", php_openssl_ssl_socket_factory TSRMLS_CC); @@ -1189,6 +1193,10 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #endif php_stream_xport_unregister("sslv3" TSRMLS_CC); php_stream_xport_unregister("tls" TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_unregister("tlsv1.1" TSRMLS_CC); + php_stream_xport_unregister("tlsv1.2" TSRMLS_CC); +#endif /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem new file mode 100644 index 0000000000000..9d754d460d57c --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET +MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx +HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN +MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu +ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB +ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy +V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 +JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S +S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R +aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E +1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY +BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy +NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho ++Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ +JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 +Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg +wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ +vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB +AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc +z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz +xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 +HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD +yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS +xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj +7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG +h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL +QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q +hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= +-----END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt new file mode 100644 index 0000000000000..56211f0b965e0 --- /dev/null +++ b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.1 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt new file mode 100644 index 0000000000000..cb3f4106c727e --- /dev/null +++ b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.2 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index a1a7ffc3f4bdc..d62ab89fcf392 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -346,6 +346,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 1; method = TLSv1_client_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_1_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_2_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif case STREAM_CRYPTO_METHOD_SSLv23_SERVER: sslsock->is_client = 0; method = SSLv23_server_method(); @@ -367,6 +385,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 0; method = TLSv1_server_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_1_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_2_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif default: return -1; @@ -667,6 +703,12 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ case STREAM_CRYPTO_METHOD_TLS_CLIENT: sock->method = STREAM_CRYPTO_METHOD_TLS_SERVER; break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_1_SERVER; + break; + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; + break; default: break; } @@ -853,8 +895,32 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; -static char * get_sni(php_stream_context *ctx, char *resourcename, long resourcenamelen, int is_persistent TSRMLS_DC) { +static int get_crypto_method(php_stream_context *ctx) { + if (ctx) { + zval **val = NULL; + long crypto_method; + + if (php_stream_context_get_option(ctx, "ssl", "crypto_method", &val) == SUCCESS) { + convert_to_long_ex(val); + crypto_method = (long)Z_LVAL_PP(val); + + switch (crypto_method) { + case STREAM_CRYPTO_METHOD_SSLv2_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: + case STREAM_CRYPTO_METHOD_TLS_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: + return crypto_method; + } + + } + } + + return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; +} +static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; if (ctx) { @@ -954,8 +1020,24 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, } else if (strncmp(proto, "tls", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_TLS_CLIENT; + } else if (strncmp(proto, "tlsv1.1", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif + } else if (strncmp(proto, "tlsv1.2", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif } - + return stream; } diff --git a/ext/standard/file.c b/ext/standard/file.c index ad6bdad34f2ed..13561aa3a9f09 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -223,10 +223,14 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_CS|CONST_PERSISTENT); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index c2d911032ef8a..3c276ad6d3002 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -170,10 +170,14 @@ typedef enum { STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_SSLv2_SERVER, STREAM_CRYPTO_METHOD_SSLv3_SERVER, STREAM_CRYPTO_METHOD_SSLv23_SERVER, - STREAM_CRYPTO_METHOD_TLS_SERVER + STREAM_CRYPTO_METHOD_TLS_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_2_SERVER } php_stream_xport_crypt_method_t; BEGIN_EXTERN_C() From ad0a85b9e2e090b4a8f2997bb1e6fb89f1888913 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:09:28 +0200 Subject: [PATCH 0144/1256] fix ws --- ext/openssl/tests/streams_crypto_method.phpt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/openssl/tests/streams_crypto_method.phpt b/ext/openssl/tests/streams_crypto_method.phpt index 7ac195bfb6ad9..97a6e9ee8ba85 100644 --- a/ext/openssl/tests/streams_crypto_method.phpt +++ b/ext/openssl/tests/streams_crypto_method.phpt @@ -19,13 +19,13 @@ function client($port, $method) { } function server($port, $transport) { - $context = stream_context_create(); + $context = stream_context_create(); - stream_context_set_option($context, 'ssl', 'local_cert', dirname(__FILE__) . '/streams_crypto_method.pem'); - stream_context_set_option($context, 'ssl', 'allow_self_signed', true); - stream_context_set_option($context, 'ssl', 'verify_peer', false); + stream_context_set_option($context, 'ssl', 'local_cert', dirname(__FILE__) . '/streams_crypto_method.pem'); + stream_context_set_option($context, 'ssl', 'allow_self_signed', true); + stream_context_set_option($context, 'ssl', 'verify_peer', false); - $server = stream_socket_server($transport . '127.0.0.1:' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); + $server = stream_socket_server($transport . '127.0.0.1:' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); $client = @stream_socket_accept($server); From 62be976abee38066a5c19f9badf14e8f12922d8a Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:13:12 +0200 Subject: [PATCH 0145/1256] TLS news --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 4978c7e722527..a5a6d8f197818 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) +- Openssl: + . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) + 17 Oct 2013, PHP 5.5.5 - Core: From 8aaecef524b6abbbebac5b2a72124ec4138ea00d Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:20:38 +0200 Subject: [PATCH 0146/1256] Revert "Added support for TLSv1.1 and TLSv1.2" This reverts commit 2aaa3d538a7b93d92c52aec95707d8230f21be65. --- ext/openssl/openssl.c | 8 -- ext/openssl/tests/streams_crypto_method.pem | 33 -------- ext/openssl/tests/tlsv1.1_wrapper_001.phpt | 46 ----------- ext/openssl/tests/tlsv1.2_wrapper_002.phpt | 46 ----------- ext/openssl/xp_ssl.c | 86 +-------------------- ext/standard/file.c | 4 - main/streams/php_stream_transport.h | 6 +- 7 files changed, 3 insertions(+), 226 deletions(-) delete mode 100644 ext/openssl/tests/streams_crypto_method.pem delete mode 100644 ext/openssl/tests/tlsv1.1_wrapper_001.phpt delete mode 100644 ext/openssl/tests/tlsv1.2_wrapper_002.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 5d0cf4384d156..59a58b1c00256 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1151,10 +1151,6 @@ PHP_MINIT_FUNCTION(openssl) php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC); #endif php_stream_xport_register("tls", php_openssl_ssl_socket_factory TSRMLS_CC); -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - php_stream_xport_register("tlsv1.1", php_openssl_ssl_socket_factory TSRMLS_CC); - php_stream_xport_register("tlsv1.2", php_openssl_ssl_socket_factory TSRMLS_CC); -#endif /* override the default tcp socket provider */ php_stream_xport_register("tcp", php_openssl_ssl_socket_factory TSRMLS_CC); @@ -1193,10 +1189,6 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #endif php_stream_xport_unregister("sslv3" TSRMLS_CC); php_stream_xport_unregister("tls" TSRMLS_CC); -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - php_stream_xport_unregister("tlsv1.1" TSRMLS_CC); - php_stream_xport_unregister("tlsv1.2" TSRMLS_CC); -#endif /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem deleted file mode 100644 index 9d754d460d57c..0000000000000 --- a/ext/openssl/tests/streams_crypto_method.pem +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx -HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN -MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu -ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB -ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy -V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 -JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S -S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R -aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E -1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY -BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy -NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho -+Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ -JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 -Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= ------END CERTIFICATE----- ------BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg -wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ -vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB -AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc -z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz -xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 -HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD -yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS -xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj -7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG -h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL -QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q -hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= ------END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt deleted file mode 100644 index 56211f0b965e0..0000000000000 --- a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt +++ /dev/null @@ -1,46 +0,0 @@ ---TEST-- -tlsv1.1 stream wrapper ---SKIPIF-- - array( - 'local_cert' => __DIR__ . '/streams_crypto_method.pem', -))); - -$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); -var_dump($server); - -$pid = pcntl_fork(); -if ($pid == -1) { - die('could not fork'); -} elseif ($pid) { - $flags = STREAM_CLIENT_CONNECT; - $ctx = stream_context_create(array('ssl' => array( - 'verify_peer' => false - ))); - - $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - -} else { - @pcntl_wait($status); - for ($i=0; $i < 3; $i++) { - @stream_socket_accept($server, 1); - } -} ---EXPECTF-- -resource(%d) of type (stream) -resource(%d) of type (stream) -bool(false) -bool(false) diff --git a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt deleted file mode 100644 index cb3f4106c727e..0000000000000 --- a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt +++ /dev/null @@ -1,46 +0,0 @@ ---TEST-- -tlsv1.2 stream wrapper ---SKIPIF-- - array( - 'local_cert' => __DIR__ . '/streams_crypto_method.pem', -))); - -$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); -var_dump($server); - -$pid = pcntl_fork(); -if ($pid == -1) { - die('could not fork'); -} elseif ($pid) { - $flags = STREAM_CLIENT_CONNECT; - $ctx = stream_context_create(array('ssl' => array( - 'verify_peer' => false - ))); - - $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - -} else { - @pcntl_wait($status); - for ($i=0; $i < 3; $i++) { - @stream_socket_accept($server, 1); - } -} ---EXPECTF-- -resource(%d) of type (stream) -resource(%d) of type (stream) -bool(false) -bool(false) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index d62ab89fcf392..a1a7ffc3f4bdc 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -346,24 +346,6 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 1; method = TLSv1_client_method(); break; - case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 1; - method = TLSv1_1_client_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif - case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 1; - method = TLSv1_2_client_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif case STREAM_CRYPTO_METHOD_SSLv23_SERVER: sslsock->is_client = 0; method = SSLv23_server_method(); @@ -385,24 +367,6 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 0; method = TLSv1_server_method(); break; - case STREAM_CRYPTO_METHOD_TLSv1_1_SERVER: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 0; - method = TLSv1_1_server_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif - case STREAM_CRYPTO_METHOD_TLSv1_2_SERVER: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 0; - method = TLSv1_2_server_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif default: return -1; @@ -703,12 +667,6 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ case STREAM_CRYPTO_METHOD_TLS_CLIENT: sock->method = STREAM_CRYPTO_METHOD_TLS_SERVER; break; - case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: - sock->method = STREAM_CRYPTO_METHOD_TLSv1_1_SERVER; - break; - case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: - sock->method = STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; - break; default: break; } @@ -895,32 +853,8 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; -static int get_crypto_method(php_stream_context *ctx) { - if (ctx) { - zval **val = NULL; - long crypto_method; - - if (php_stream_context_get_option(ctx, "ssl", "crypto_method", &val) == SUCCESS) { - convert_to_long_ex(val); - crypto_method = (long)Z_LVAL_PP(val); - - switch (crypto_method) { - case STREAM_CRYPTO_METHOD_SSLv2_CLIENT: - case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: - case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: - case STREAM_CRYPTO_METHOD_TLS_CLIENT: - case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: - case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: - return crypto_method; - } - - } - } - - return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; -} +static char * get_sni(php_stream_context *ctx, char *resourcename, long resourcenamelen, int is_persistent TSRMLS_DC) { -static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; if (ctx) { @@ -1020,24 +954,8 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, } else if (strncmp(proto, "tls", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_TLS_CLIENT; - } else if (strncmp(proto, "tlsv1.1", protolen) == 0) { -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->enable_on_connect = 1; - sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); - return NULL; -#endif - } else if (strncmp(proto, "tlsv1.2", protolen) == 0) { -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->enable_on_connect = 1; - sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); - return NULL; -#endif } - + return stream; } diff --git a/ext/standard/file.c b/ext/standard/file.c index 13561aa3a9f09..ad6bdad34f2ed 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -223,14 +223,10 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_CS|CONST_PERSISTENT); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index 3c276ad6d3002..c2d911032ef8a 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -170,14 +170,10 @@ typedef enum { STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, STREAM_CRYPTO_METHOD_TLS_CLIENT, - STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, - STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_SSLv2_SERVER, STREAM_CRYPTO_METHOD_SSLv3_SERVER, STREAM_CRYPTO_METHOD_SSLv23_SERVER, - STREAM_CRYPTO_METHOD_TLS_SERVER, - STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, - STREAM_CRYPTO_METHOD_TLSv1_2_SERVER + STREAM_CRYPTO_METHOD_TLS_SERVER } php_stream_xport_crypt_method_t; BEGIN_EXTERN_C() From d89d46d9409309592b1896493d85ff35974321f3 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:21:34 +0200 Subject: [PATCH 0147/1256] Revert "TLS news" This reverts commit 62be976abee38066a5c19f9badf14e8f12922d8a. --- NEWS | 3 --- 1 file changed, 3 deletions(-) diff --git a/NEWS b/NEWS index a5a6d8f197818..4978c7e722527 100644 --- a/NEWS +++ b/NEWS @@ -6,9 +6,6 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) -- Openssl: - . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) - 17 Oct 2013, PHP 5.5.5 - Core: From b95f9fa0aa097159d02627dd07cf9a9b129e113c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:32:18 +0200 Subject: [PATCH 0148/1256] previous revert killed that file --- ext/openssl/tests/streams_crypto_method.pem | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ext/openssl/tests/streams_crypto_method.pem diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem new file mode 100644 index 0000000000000..9d754d460d57c --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET +MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx +HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN +MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu +ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB +ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy +V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 +JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S +S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R +aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E +1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY +BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy +NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho ++Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ +JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 +Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg +wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ +vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB +AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc +z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz +xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 +HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD +yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS +xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj +7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG +h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL +QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q +hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= +-----END RSA PRIVATE KEY----- From 66868c8fd4054eb99d8b4f255620d8630fa929c2 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:47:55 +0200 Subject: [PATCH 0149/1256] TLS news --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index c2cf3d76d21d9..57c2938bbf967 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,7 @@ PHP NEWS - Openssl: . Added crypto_method option for the ssl stream context. (Martin Jansen) . Added certificate fingerprint support. (Tjerk Meesters) + . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) . Fixed bug #65729 (CN_match gives false positive). (Tjerk Meesters) - PDO_pgsql: From c59d79094925400bbcf208d0f2f03df0a0ac154f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 17 Oct 2013 12:15:45 -0700 Subject: [PATCH 0150/1256] Prepare for OCI8 2.0.5 release --- ext/oci8/package.xml | 9 ++++----- ext/oci8/php_oci8.h | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 7eccd9d8f9950..1ef8f1fd855e5 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -58,13 +58,12 @@ libraries are available. PHP -Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle -client library 10.2 (Note this will connect to Oracle Database 8.1.7 -onwards). Use the older OCI8 1.4 if an earlier PHP version or older -Oracle client library support is necessary. +Bump PHP OCI8 2.0 mininum requirements to PHP 5.2 and Oracle client +library 10.2. (Use OCI8 1.4 for older PHP version support or if only +Oracle 9.2 client libraries are available.) Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL -linking works in the new Windows PECL infrastructure. +links work in the new Windows PECL infrastructure. diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 1ea0411073e2e..ee8d83122114f 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -41,12 +41,11 @@ */ #ifdef PHP_OCI8_VERSION /* The definition of PHP_OCI8_VERSION changed in PHP 5.3 and building - * this code with PHP 5.2 and earlier (e.g. when using OCI8 from PECL) - * will conflict. + * this code with PHP 5.2 (e.g. when using OCI8 from PECL) will conflict. */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.5-dev" +#define PHP_OCI8_VERSION "2.0.5" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From 5e368b76ed985a50004126aeba4aaf5dae53aab8 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 17 Oct 2013 13:49:50 -0700 Subject: [PATCH 0151/1256] Add missing test to package.xml --- ext/oci8/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 1ef8f1fd855e5..b180b0d5f0bdc 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -276,6 +276,7 @@ links work in the new Windows PECL infrastructure. + From 6b90f237879563497c888024947eb6064fb1b51c Mon Sep 17 00:00:00 2001 From: ArunSK Date: Thu, 17 Oct 2013 22:00:40 -0400 Subject: [PATCH 0152/1256] fixed typo and few grammar mistakes --- Zend/RFCs/003.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/RFCs/003.txt b/Zend/RFCs/003.txt index 30fb4cec4912f..ac042183d426c 100644 --- a/Zend/RFCs/003.txt +++ b/Zend/RFCs/003.txt @@ -9,11 +9,11 @@ Modified: 2001-09-17 1. Background/Need ================== -Many internal function of PHP will reject parameters because of their +Many internal functions of PHP will reject parameters because of their type (the array and variable function come to mind). For userland this is not an easy task as there is no uniform way to do it. An addition to the engine for requiring loose types would allow -delevopers to know that the data passed to their functions is of the +developers to know that the data passed to their functions are of the correct type and reduce the need for duplicating the same code in every function to check for the type of data. @@ -57,7 +57,7 @@ function foo (array $var){ =========== Mis-matches in type should be reported as fatal errors and should halt -the execution of a script as that function can not be run and code +the execution of a script as that function cannot be run and code following could not reliably run. From 4417421ab6133ce0658e285a4e48d93a27931820 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 18 Oct 2013 10:33:53 +0800 Subject: [PATCH 0153/1256] Retruning SUCCESS/FAILURE instead of int --- UPGRADING | 2 ++ ext/phar/php_phar.h | 1 - ext/phar/util.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/UPGRADING b/UPGRADING index 39fe2d736929f..43e4118b21245 100755 --- a/UPGRADING +++ b/UPGRADING @@ -343,6 +343,8 @@ None - Intl: - This extension now requires ICU 4.0+. +- Phar: + - Added ability of resolving alias created by Phar::map ======================================== 9. New Global Constants diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index 4146e28f770da..f8325d0c635e3 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -34,7 +34,6 @@ extern zend_module_entry phar_module_entry; #define PHP_PHAR_API PHPAPI #endif -#define PHAR_HAVE_RESOLVE_ALIAS PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); #endif /* PHP_PHAR_H */ diff --git a/ext/phar/util.c b/ext/phar/util.c index e9f1b1673c324..dc4508f91cd7a 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1190,9 +1190,9 @@ PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { *filename = (*fd_ptr)->fname; *filename_len = (*fd_ptr)->fname_len; - return 1; + return SUCCESS; } - return 0; + return FAILURE; } /* }}} */ From 8713089f22a96e0a21adf79655e2143dc5e07a8b Mon Sep 17 00:00:00 2001 From: jrchamp Date: Fri, 18 Oct 2013 02:01:06 -0400 Subject: [PATCH 0154/1256] Fix 100.64 IPv4 Range Check --- ext/filter/logical_filters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 653cce23e6b26..39433d6ece8b4 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 && ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || From fd06c5206a40d2d91825a49536ad862587ab6e58 Mon Sep 17 00:00:00 2001 From: jrchamp Date: Fri, 18 Oct 2013 02:04:15 -0400 Subject: [PATCH 0155/1256] Fix RFC 6598 IPv4 Range --- ext/filter/tests/018.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index 9c73fc3cfc4e6..75bbd13427994 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,7 +15,7 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); -var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.64.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); From a03b1328b807766c4104d2f1457660d7ebdcef26 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 18 Oct 2013 11:34:24 +0200 Subject: [PATCH 0156/1256] fix compiler warnings and type usage --- ext/ldap/ldap.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index c5c87ae7072bd..d50b78321fb89 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2143,45 +2143,47 @@ PHP_FUNCTION(ldap_set_rebind_proc) /* }}} */ #endif -static void php_ldap_do_escape(const zend_bool *map, const unsigned char *value, const int valuelen, unsigned char **result, int *resultlen) +static void php_ldap_do_escape(const zend_bool *map, const char *value, size_t valuelen, char **result, size_t *resultlen) { char hex[] = "0123456789abcdef"; int i, p = 0; size_t len = 0; for (i = 0; i < valuelen; i++) { - len += (map[value[i]]) ? 3 : 1; + len += (map[(unsigned char) value[i]]) ? 3 : 1; } - len += 1; - (*result) = (unsigned char *)emalloc(len); - (*resultlen) = (int)len; + (*result) = (char *) safe_emalloc(1, len, 1); + (*resultlen) = len; for (i = 0; i < valuelen; i++) { - if (map[value[i]]) { + unsigned char v = (unsigned char) value[i]; + + if (map[v]) { (*result)[p++] = '\\'; - (*result)[p++] = hex[value[i] >> 4]; - (*result)[p++] = hex[value[i] & 0x0f]; + (*result)[p++] = hex[v >> 4]; + (*result)[p++] = hex[v & 0x0f]; } else { - (*result)[p++] = value[i]; + (*result)[p++] = v; } } (*result)[p++] = '\0'; } -static void php_ldap_escape_map_set_chars(zend_bool *map, const unsigned char *chars, const int charslen, char escape) +static void php_ldap_escape_map_set_chars(zend_bool *map, const char *chars, const int charslen, char escape) { int i = 0; while (i < charslen) { - map[chars[i++]] = escape; + map[(unsigned char) chars[i++]] = escape; } } PHP_FUNCTION(ldap_escape) { - unsigned char *value, *ignores, *result; - int valuelen = 0, ignoreslen = 0, resultlen = 0, i; + char *value, *ignores, *result; + int valuelen = 0, ignoreslen = 0, i; + size_t resultlen; long flags = 0; zend_bool map[256] = {0}, havecharlist = 0; @@ -2215,7 +2217,7 @@ PHP_FUNCTION(ldap_escape) php_ldap_do_escape(map, value, valuelen, &result, &resultlen); - RETURN_STRINGL(result, resultlen - 1, 0); + RETURN_STRINGL(result, resultlen, 0); } #ifdef STR_TRANSLATION From 515ef09b62c6d47b79aad5d87db17b8f0bb15f7a Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 05:01:16 -0700 Subject: [PATCH 0157/1256] preserve the error code otherwise it'd be cleared by a subsequent calls --- Zend/zend_virtual_cwd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 968390d353925..e171386b1b3d9 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -1695,6 +1695,9 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / cwd_state old_state; cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&old_state, &CWDG(cwd)); if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) { @@ -1716,6 +1719,7 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / #ifdef TSRM_WIN32 /* MoveFileEx returns 0 on failure, other way 'round for this function */ retval = (MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED) == 0) ? -1 : 0; + last_error = GetLastError(); #else retval = rename(oldname, newname); #endif @@ -1723,6 +1727,10 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / CWD_STATE_FREE(&old_state); CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif + return retval; } /* }}} */ From 2786a2a1ab907e0e7d6b69a6feffef46ec956c33 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 07:00:05 -0700 Subject: [PATCH 0158/1256] fixed all the places where last error could be lost whereby this commit should be applied to master anyway --- Zend/zend_virtual_cwd.c | 201 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index e171386b1b3d9..f94227f99d9a7 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -1484,6 +1484,9 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ { cwd_state new_state; FILE *f; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif if (path[0] == '\0') { /* Fail to open empty path */ return NULL; @@ -1491,13 +1494,25 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return NULL; } f = fopen(new_state.cwd, mode); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return f; } /* }}} */ @@ -1506,20 +1521,33 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } #if defined(TSRM_WIN32) ret = tsrm_win32_access(new_state.cwd, mode TSRMLS_CC); + last_error = GetLastError(); #else ret = access(new_state.cwd, mode); #endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } @@ -1579,20 +1607,33 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC) / { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } #ifdef TSRM_WIN32 ret = win32_utime(new_state.cwd, buf); + last_error = GetLastError(); #else ret = utime(new_state.cwd, buf); #endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } /* }}} */ @@ -1602,16 +1643,31 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } ret = chmod(new_state.cwd, mode); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } /* }}} */ @@ -1621,10 +1677,19 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } @@ -1638,7 +1703,13 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li ret = chown(new_state.cwd, owner, group); } +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } /* }}} */ @@ -1648,10 +1719,19 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ { cwd_state new_state; int f; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } @@ -1667,7 +1747,13 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ } else { f = open(new_state.cwd, flags); } +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return f; } /* }}} */ @@ -1676,16 +1762,31 @@ CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int f; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } f = creat(new_state.cwd, mode); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return f; } /* }}} */ @@ -1701,15 +1802,27 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / CWD_STATE_COPY(&old_state, &CWDG(cwd)); if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&old_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } oldname = old_state.cwd; CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, newname, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&old_state); CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } newname = new_state.cwd; @@ -1739,16 +1852,31 @@ CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = php_sys_stat(new_state.cwd, buf); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1757,16 +1885,31 @@ CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ * { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = php_sys_lstat(new_state.cwd, buf); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1775,16 +1918,31 @@ CWD_API int virtual_unlink(const char *path TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = unlink(new_state.cwd); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1793,19 +1951,32 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_FILEPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } #ifdef TSRM_WIN32 retval = mkdir(new_state.cwd); + last_error = GetLastError(); #else retval = mkdir(new_state.cwd, mode); #endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1814,16 +1985,31 @@ CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = rmdir(new_state.cwd); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1836,16 +2022,31 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; DIR *retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return NULL; } retval = opendir(new_state.cwd); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ From 423e1c77b58efe05cbb0d1209b0ea81a64fc5be2 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 07:57:01 -0700 Subject: [PATCH 0159/1256] updated NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index c2cf3d76d21d9..2660df8f63193 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS variable. (Mike) . Implemented dedicated syntax for variadic functions (RFC: https://wiki.php.net/rfc/variadics). (Nikita) + . Fixed bug #50333 (Improving multi-threaded scalability by using + emalloc/efree/estrdup)). (yoarvi at gmail dot com, Anatol) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir From ecd03baf6121a708ff46105da133457d012b13c7 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 10:02:19 -0700 Subject: [PATCH 0160/1256] fixed virtual cwd header in phar --- ext/phar/phar_internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 64953f66b72d3..359f25b4c635b 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -54,7 +54,7 @@ #ifndef PHP_WIN32 #include "TSRM/tsrm_strtok_r.h" #endif -#include "TSRM/tsrm_virtual_cwd.h" +#include "Zend/zend_virtual_cwd.h" #if HAVE_SPL #include "ext/spl/spl_array.h" #include "ext/spl/spl_directory.h" From 1fe1f7305bdc8054dc0fb1f82e0fbd0e99309858 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 9 Aug 2013 08:32:39 +0200 Subject: [PATCH 0161/1256] use $YACC instead of 'bison' as suggested by Yasuo Conflicts: Zend/acinclude.m4 --- Zend/acinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4 index 77430aba791ea..95b5bf2061536 100644 --- a/Zend/acinclude.m4 +++ b/Zend/acinclude.m4 @@ -12,7 +12,7 @@ AC_DEFUN([LIBZEND_BISON_CHECK],[ bison_version=none if test "$YACC"; then AC_CACHE_CHECK([for bison version], php_cv_bison_version, [ - bison_version_vars=`bison --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /' | tr -d a-z` + bison_version_vars=`$YACC --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /g' | tr -d a-z` php_cv_bison_version=invalid if test -n "$bison_version_vars"; then set $bison_version_vars From 6919d15a2ef73ae1b01dc881b9624b9a3ea653ce Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 00:01:13 -0700 Subject: [PATCH 0162/1256] Merge branch 'pull-request/499' Fix RFC 6598 IPv4 Reserved Range Checks --- ext/filter/logical_filters.c | 2 +- ext/filter/tests/018.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 14964883c1b26..03b00bd9f6d3b 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 && ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index 9c73fc3cfc4e6..75bbd13427994 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,7 +15,7 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); -var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.64.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); From 55b16f40a2db6de9f5de08d284b1c37149e25a49 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 00:01:13 -0700 Subject: [PATCH 0163/1256] Merge branch 'pull-request/499' Fix RFC 6598 IPv4 Reserved Range Checks --- ext/filter/logical_filters.c | 2 +- ext/filter/tests/018.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 653cce23e6b26..39433d6ece8b4 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 && ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index 9c73fc3cfc4e6..75bbd13427994 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,7 +15,7 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); -var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.64.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); From 4d7d85640dd8e48166e4fd5dbf04aeb18a9e01c4 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sat, 19 Oct 2013 22:16:31 +0800 Subject: [PATCH 0164/1256] Need a way to check whether this API exists --- ext/phar/php_phar.h | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index f8325d0c635e3..38ace455b926f 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -34,6 +34,7 @@ extern zend_module_entry phar_module_entry; #define PHP_PHAR_API PHPAPI #endif +#define PHP_PHAR_HAS_RESLOVE_ALIAS PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); #endif /* PHP_PHAR_H */ From d42fa2a0592a558d85b1dac498e9c5fd1413d49d Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sat, 19 Oct 2013 22:18:37 +0800 Subject: [PATCH 0165/1256] Revert "Need a way to check whether this API exists" hmm, we can check whether the head file exists instead This reverts commit 4d7d85640dd8e48166e4fd5dbf04aeb18a9e01c4. --- ext/phar/php_phar.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index 38ace455b926f..f8325d0c635e3 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -34,7 +34,6 @@ extern zend_module_entry phar_module_entry; #define PHP_PHAR_API PHPAPI #endif -#define PHP_PHAR_HAS_RESLOVE_ALIAS PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); #endif /* PHP_PHAR_H */ From df501fd464434967225f2ad8b413ed074db1a884 Mon Sep 17 00:00:00 2001 From: Lior Kaplan Date: Sat, 19 Oct 2013 23:52:43 +0300 Subject: [PATCH 0166/1256] Use minus sign instead of hyphen --- sapi/fpm/php-fpm.8.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in index a4e7e74e208d8..b02aa25ba74d4 100644 --- a/sapi/fpm/php-fpm.8.in +++ b/sapi/fpm/php-fpm.8.in @@ -96,7 +96,7 @@ Specify alternative path to FastCGI process manager configuration file (the defa .PD 1 .B \-t Test FPM configuration file and exit -If called twice (-tt), the configuration is dumped before exiting. +If called twice (\-tt), the configuration is dumped before exiting. .TP .PD 0 .B \-\-daemonize From a55d3b9295bec513553bff2522c4720737c4c398 Mon Sep 17 00:00:00 2001 From: Lior Kaplan Date: Sat, 19 Oct 2013 23:53:23 +0300 Subject: [PATCH 0167/1256] Typo fix: managment -> management --- sapi/fpm/fpm/fpm_children.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_children.c b/sapi/fpm/fpm/fpm_children.c index 84a9474332215..45cc075b42a6c 100644 --- a/sapi/fpm/fpm/fpm_children.c +++ b/sapi/fpm/fpm/fpm_children.c @@ -251,7 +251,7 @@ void fpm_children_bury() /* {{{ */ } zlog(severity, "[pool %s] child %d exited %s after %ld.%06d seconds from start", child->wp->config->name, (int) pid, buf, tv2.tv_sec, (int) tv2.tv_usec); } else { - zlog(ZLOG_DEBUG, "[pool %s] child %d has been killed by the process managment after %ld.%06d seconds from start", child->wp->config->name, (int) pid, tv2.tv_sec, (int) tv2.tv_usec); + zlog(ZLOG_DEBUG, "[pool %s] child %d has been killed by the process management after %ld.%06d seconds from start", child->wp->config->name, (int) pid, tv2.tv_sec, (int) tv2.tv_usec); } fpm_child_close(child, 1 /* in event_loop */); From 64caedd927164228c9de2bab97e62a717507bd84 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:22:20 +0200 Subject: [PATCH 0168/1256] Use zend_error_noreturn for all E_COMPILE_ERRORs --- Zend/zend_compile.c | 270 ++++++++++++++++++------------------ Zend/zend_language_parser.y | 4 +- Zend/zend_opcode.c | 4 +- 3 files changed, 139 insertions(+), 139 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 85536f43b7ce2..7ee8dd1e74db3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -877,7 +877,7 @@ void zend_do_abstract_method(const znode *function_name, znode *modifiers, const if (Z_LVAL(modifiers->u.constant) & ZEND_ACC_ABSTRACT) { if(Z_LVAL(modifiers->u.constant) & ZEND_ACC_PRIVATE) { - zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot be declared private", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "%s function %s::%s() cannot be declared private", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } if (Z_LVAL(body->u.constant) == ZEND_ACC_ABSTRACT) { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); @@ -887,11 +887,11 @@ void zend_do_abstract_method(const znode *function_name, znode *modifiers, const SET_UNUSED(opline->op2); } else { /* we had code in the function body */ - zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot contain body", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "%s function %s::%s() cannot contain body", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } } else { if (Z_LVAL(body->u.constant) == ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Non-abstract method %s::%s() must contain body", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Non-abstract method %s::%s() must contain body", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } } } @@ -951,7 +951,7 @@ void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC) /* { if (variable->op_type == IS_CV) { if (variable->u.op.var == CG(active_op_array)->this_var) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } } else if (variable->op_type == IS_VAR) { int n = 0; @@ -997,7 +997,7 @@ void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC) /* { GET_NODE(result, last_op->result); return; } else if (opline_is_fetch_this(last_op TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } else { break; } @@ -1021,7 +1021,7 @@ void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRM if (lvar->op_type == IS_CV) { if (lvar->u.op.var == CG(active_op_array)->this_var) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } } else if (lvar->op_type == IS_VAR) { int last_op_number = get_next_op_number(CG(active_op_array)); @@ -1029,7 +1029,7 @@ void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRM if (last_op_number > 0) { opline = &CG(active_op_array)->opcodes[last_op_number-1]; if (opline_is_fetch_this(opline TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } } } @@ -1271,10 +1271,10 @@ void zend_check_writable_variable(const znode *variable) /* {{{ */ zend_uint type = variable->EA; if (type & ZEND_PARSED_METHOD_CALL) { - zend_error(E_COMPILE_ERROR, "Can't use method return value in write context"); + zend_error_noreturn(E_COMPILE_ERROR, "Can't use method return value in write context"); } if (type == ZEND_PARSED_FUNCTION_CALL) { - zend_error(E_COMPILE_ERROR, "Can't use function return value in write context"); + zend_error_noreturn(E_COMPILE_ERROR, "Can't use function return value in write context"); } } /* }}} */ @@ -1347,7 +1347,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS switch (type) { case BP_VAR_R: if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading"); } opline->opcode -= 3; break; @@ -1358,7 +1358,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS break; case BP_VAR_IS: if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading"); } opline->opcode += 6; /* 3+3 */ break; @@ -1368,7 +1368,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS break; case BP_VAR_UNSET: if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for unsetting"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for unsetting"); } opline->opcode += 12; /* 3+3+3+3 */ break; @@ -1496,22 +1496,22 @@ int zend_do_verify_access_types(const znode *current_access_type, const znode *n { if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_PPP_MASK) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_PPP_MASK)) { - zend_error(E_COMPILE_ERROR, "Multiple access type modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple access type modifiers are not allowed"); } if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_ABSTRACT) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_ABSTRACT)) { - zend_error(E_COMPILE_ERROR, "Multiple abstract modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple abstract modifiers are not allowed"); } if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_STATIC) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_STATIC)) { - zend_error(E_COMPILE_ERROR, "Multiple static modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple static modifiers are not allowed"); } if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_FINAL) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_FINAL)) { - zend_error(E_COMPILE_ERROR, "Multiple final modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple final modifiers are not allowed"); } if (((Z_LVAL(current_access_type->u.constant) | Z_LVAL(new_modifier->u.constant)) & (ZEND_ACC_ABSTRACT | ZEND_ACC_FINAL)) == (ZEND_ACC_ABSTRACT | ZEND_ACC_FINAL)) { - zend_error(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class member"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class member"); } return (Z_LVAL(current_access_type->u.constant) | Z_LVAL(new_modifier->u.constant)); } @@ -1531,7 +1531,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n if (is_method) { if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { if ((Z_LVAL(fn_flags_znode->u.constant) & ~(ZEND_ACC_STATIC|ZEND_ACC_PUBLIC))) { - zend_error(E_COMPILE_ERROR, "Access type for interface method %s::%s() must be omitted", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Access type for interface method %s::%s() must be omitted", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } Z_LVAL(fn_flags_znode->u.constant) |= ZEND_ACC_ABSTRACT; /* propagates to the rest of the parser */ } @@ -1567,7 +1567,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n lcname = zend_new_interned_string(zend_str_tolower_dup(name, name_len), name_len + 1, 1 TSRMLS_CC); hash = str_hash(lcname, name_len); if (zend_hash_quick_add(&CG(active_class_entry)->function_table, lcname, name_len+1, hash, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) == FAILURE) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::%s()", CG(active_class_entry)->name, name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::%s()", CG(active_class_entry)->name, name); } zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context))); @@ -1808,7 +1808,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /* zend_str_tolower_copy(lcname, CG(active_op_array)->function_name, MIN(name_len, sizeof(lcname)-1)); lcname[sizeof(lcname)-1] = '\0'; /* zend_str_tolower_copy won't necessarily set the zero byte */ if (name_len == sizeof(ZEND_AUTOLOAD_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_AUTOLOAD_FUNC_NAME, sizeof(ZEND_AUTOLOAD_FUNC_NAME)) && CG(active_op_array)->num_args != 1) { - zend_error(E_COMPILE_ERROR, "%s() must take exactly 1 argument", ZEND_AUTOLOAD_FUNC_NAME); + zend_error_noreturn(E_COMPILE_ERROR, "%s() must take exactly 1 argument", ZEND_AUTOLOAD_FUNC_NAME); } } @@ -1829,7 +1829,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ znode var; if (zend_is_auto_global(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant) TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); } else { var.op_type = IS_CV; var.u.op.var = lookup_cv(CG(active_op_array), Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), 0 TSRMLS_CC); @@ -1840,19 +1840,19 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ !memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this")-1)) { if (CG(active_op_array)->scope && (CG(active_op_array)->fn_flags & ZEND_ACC_STATIC) == 0) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } CG(active_op_array)->this_var = var.u.op.var; } } if (CG(active_op_array)->fn_flags & ZEND_ACC_VARIADIC) { - zend_error(E_COMPILE_ERROR, "Only the last parameter can be variadic"); + zend_error_noreturn(E_COMPILE_ERROR, "Only the last parameter can be variadic"); } if (is_variadic) { if (op == ZEND_RECV_INIT) { - zend_error(E_COMPILE_ERROR, "Variadic parameter cannot have a default value"); + zend_error_noreturn(E_COMPILE_ERROR, "Variadic parameter cannot have a default value"); } op = ZEND_RECV_VARIADIC; @@ -1894,7 +1894,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; } else if (Z_TYPE(initialization->u.constant) != IS_ARRAY && Z_TYPE(initialization->u.constant) != IS_CONSTANT_ARRAY) { - zend_error(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL"); + zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL"); } } } else if (class_type->u.constant.type == IS_CALLABLE) { @@ -1903,7 +1903,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; } else { - zend_error(E_COMPILE_ERROR, "Default value for parameters with callable type hint can only be NULL"); + zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with callable type hint can only be NULL"); } } } else { @@ -1918,7 +1918,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; } else { - zend_error(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); + zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); } } } @@ -1979,7 +1979,7 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) /* {{{ */ if ((last_op->op2_type == IS_CONST) && (Z_TYPE(CONSTANT(last_op->op2.constant)) == IS_STRING) && (Z_STRLEN(CONSTANT(last_op->op2.constant)) == sizeof(ZEND_CLONE_FUNC_NAME)-1) && !zend_binary_strcasecmp(Z_STRVAL(CONSTANT(last_op->op2.constant)), Z_STRLEN(CONSTANT(last_op->op2.constant)), ZEND_CLONE_FUNC_NAME, sizeof(ZEND_CLONE_FUNC_NAME)-1)) { - zend_error(E_COMPILE_ERROR, "Cannot call __clone() method on objects - use 'clone $obj' instead"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot call __clone() method on objects - use 'clone $obj' instead"); } if (last_op->opcode == ZEND_FETCH_OBJ_R) { @@ -1987,7 +1987,7 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) /* {{{ */ zval name; name = CONSTANT(last_op->op2.constant); if (Z_TYPE(name) != IS_STRING) { - zend_error(E_COMPILE_ERROR, "Method name must be a string"); + zend_error_noreturn(E_COMPILE_ERROR, "Method name must be a string"); } Z_STRVAL(name) = str_estrndup(Z_STRVAL(name), Z_STRLEN(name)); FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant); @@ -2132,7 +2132,7 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static switch (lctype) { case ZEND_FETCH_CLASS_SELF: if (!CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active"); } zval_dtor(&class_name->u.constant); class_name->op_type = IS_CONST; @@ -2142,13 +2142,13 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static case ZEND_FETCH_CLASS_STATIC: case ZEND_FETCH_CLASS_PARENT: if (is_static) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "%s::class cannot be used for compile-time class name resolution", lctype == ZEND_FETCH_CLASS_STATIC ? "static" : "parent" ); } if (!CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Cannot access %s::class when no class scope is active", lctype == ZEND_FETCH_CLASS_STATIC ? "static" : "parent" ); @@ -2188,7 +2188,7 @@ void zend_resolve_class_name(znode *class_name TSRMLS_DC) /* {{{ */ Z_STRLEN(class_name->u.constant) + 1); if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant))) { - zend_error(E_COMPILE_ERROR, "'\\%s' is an invalid class name", Z_STRVAL(class_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "'\\%s' is an invalid class name", Z_STRVAL(class_name->u.constant)); } } else { if (CG(current_import)) { @@ -2296,7 +2296,7 @@ void zend_do_label(znode *label TSRMLS_DC) /* {{{ */ dest.opline_num = get_next_op_number(CG(active_op_array)); if (zend_hash_add(CG(context).labels, Z_STRVAL(label->u.constant), Z_STRLEN(label->u.constant) + 1, (void**)&dest, sizeof(zend_label), NULL) == FAILURE) { - zend_error(E_COMPILE_ERROR, "Label '%s' already defined", Z_STRVAL(label->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Label '%s' already defined", Z_STRVAL(label->u.constant)); } /* Done with label now */ @@ -2322,7 +2322,7 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 CG(in_compilation) = 1; CG(active_op_array) = op_array; CG(zend_lineno) = opline->lineno; - zend_error(E_COMPILE_ERROR, "'goto' to undefined label '%s'", Z_STRVAL_P(label)); + zend_error_noreturn(E_COMPILE_ERROR, "'goto' to undefined label '%s'", Z_STRVAL_P(label)); } else { /* Label is not defined. Delay to pass 2. */ INC_BPC(op_array); @@ -2343,7 +2343,7 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 CG(active_op_array) = op_array; CG(zend_lineno) = opline->lineno; } - zend_error(E_COMPILE_ERROR, "'goto' into loop or switch statement is disallowed"); + zend_error_noreturn(E_COMPILE_ERROR, "'goto' into loop or switch statement is disallowed"); } current = op_array->brk_cont_array[current].parent; } @@ -2430,7 +2430,7 @@ int zend_do_begin_class_member_function_call(znode *class_name, znode *method_na if (method_name->op_type == IS_CONST) { char *lcname; if (Z_TYPE(method_name->u.constant) != IS_STRING) { - zend_error(E_COMPILE_ERROR, "Method name must be a string"); + zend_error_noreturn(E_COMPILE_ERROR, "Method name must be a string"); } lcname = zend_str_tolower_dup(Z_STRVAL(method_name->u.constant), Z_STRLEN(method_name->u.constant)); if ((sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == Z_STRLEN(method_name->u.constant) && @@ -2539,12 +2539,12 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC) /* {{ function_ptr->common.function_name && function_ptr->common.type == ZEND_USER_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(function_ptr, (zend_uint) offset)) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed; " "If you would like to pass argument by reference, modify the declaration of %s().", function_ptr->common.function_name); } else { - zend_error(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed"); + zend_error_noreturn(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed"); } return; } @@ -2585,7 +2585,7 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC) /* {{ op = ZEND_SEND_REF; break; default: - zend_error(E_COMPILE_ERROR, "Only variables can be passed by reference"); + zend_error_noreturn(E_COMPILE_ERROR, "Only variables can be passed by reference"); break; } } @@ -2734,7 +2734,7 @@ void zend_do_yield(znode *result, znode *value, const znode *key, zend_bool is_v zend_op *opline; if (!CG(active_op_array)->function_name) { - zend_error(E_COMPILE_ERROR, "The \"yield\" expression can only be used inside a function"); + zend_error_noreturn(E_COMPILE_ERROR, "The \"yield\" expression can only be used inside a function"); } CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR; @@ -2874,7 +2874,7 @@ void zend_do_begin_catch(znode *catch_token, znode *class_name, znode *catch_var zend_resolve_class_name(class_name TSRMLS_CC); catch_class = *class_name; } else { - zend_error(E_COMPILE_ERROR, "Bad class name in the catch statement"); + zend_error_noreturn(E_COMPILE_ERROR, "Bad class name in the catch statement"); } catch_op_number = get_next_op_number(CG(active_op_array)); @@ -2923,7 +2923,7 @@ void zend_do_bind_catch(znode *try_token, znode *catch_token TSRMLS_DC) /* {{{ * void zend_do_end_finally(znode *try_token, znode* catch_token, znode *finally_token TSRMLS_DC) /* {{{ */ { if (catch_token->op_type == IS_UNUSED && finally_token->op_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use try without catch or finally"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use try without catch or finally"); } if (finally_token->op_type != IS_UNUSED) { zend_op *opline; @@ -3406,14 +3406,14 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * && parent->common.fn_flags & ZEND_ACC_ABSTRACT && parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope) && child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT)) { - zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)", + zend_error_noreturn(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)", parent->common.scope->name, child->common.function_name, child->common.prototype ? child->common.prototype->common.scope->name : child->common.scope->name); } if (parent_flags & ZEND_ACC_FINAL) { - zend_error(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), child->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), child->common.function_name); } child_flags = child->common.fn_flags; @@ -3421,15 +3421,15 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * */ if ((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC)) { if (child->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Cannot make non static method %s::%s() static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non static method %s::%s() static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); } else { - zend_error(E_COMPILE_ERROR, "Cannot make static method %s::%s() non static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make static method %s::%s() non static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); } } /* Disallow making an inherited method abstract. */ if ((child_flags & ZEND_ACC_ABSTRACT) && !(parent_flags & ZEND_ACC_ABSTRACT)) { - zend_error(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); } if (parent_flags & ZEND_ACC_CHANGED) { @@ -3438,7 +3438,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * /* Prevent derived classes from restricting access that was available in parent classes */ if ((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK)) { - zend_error(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); + zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); } else if (((child_flags & ZEND_ACC_PPP_MASK) < (parent_flags & ZEND_ACC_PPP_MASK)) && ((parent_flags & ZEND_ACC_PPP_MASK) & ZEND_ACC_PRIVATE)) { child->common.fn_flags |= ZEND_ACC_CHANGED; @@ -3457,7 +3457,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * if (child->common.prototype && (child->common.prototype->common.fn_flags & ZEND_ACC_ABSTRACT)) { if (!zend_do_perform_implementation_check(child, child->common.prototype TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s::%s() must be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_get_function_declaration(child->common.prototype TSRMLS_CC)); + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s::%s() must be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_get_function_declaration(child->common.prototype TSRMLS_CC)); } } else if (EG(error_reporting) & E_STRICT || EG(user_error_handler)) { /* Check E_STRICT (or custom error handler) before the check so that we save some time */ if (!zend_do_perform_implementation_check(child, parent TSRMLS_CC)) { @@ -3511,7 +3511,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro if (zend_hash_quick_find(&ce->properties_info, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **) &child_info)==SUCCESS) { if ((parent_info->flags & ZEND_ACC_STATIC) != (child_info->flags & ZEND_ACC_STATIC)) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s%s::$%s as %s%s::$%s", + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s%s::$%s as %s%s::$%s", (parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", parent_ce->name, hash_key->arKey, (child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ce->name, hash_key->arKey); @@ -3522,7 +3522,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro } if ((child_info->flags & ZEND_ACC_PPP_MASK) > (parent_info->flags & ZEND_ACC_PPP_MASK)) { - zend_error(E_COMPILE_ERROR, "Access level to %s::$%s must be %s (as in class %s)%s", ce->name, hash_key->arKey, zend_visibility_string(parent_info->flags), parent_ce->name, (parent_info->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); + zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::$%s must be %s (as in class %s)%s", ce->name, hash_key->arKey, zend_visibility_string(parent_info->flags), parent_ce->name, (parent_info->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); } else if ((child_info->flags & ZEND_ACC_STATIC) == 0) { zval_ptr_dtor(&(ce->default_properties_table[parent_info->offset])); ce->default_properties_table[parent_info->offset] = ce->default_properties_table[child_info->offset]; @@ -3607,10 +3607,10 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent if ((ce->ce_flags & ZEND_ACC_INTERFACE) && !(parent_ce->ce_flags & ZEND_ACC_INTERFACE)) { - zend_error(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ce->name, parent_ce->name); } if (parent_ce->ce_flags & ZEND_ACC_FINAL_CLASS) { - zend_error(E_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ce->name, parent_ce->name); } ce->parent = parent_ce; @@ -3732,7 +3732,7 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, con if (zend_hash_quick_find(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); } return 0; } @@ -3764,7 +3764,7 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry if (i < parent_iface_num) { ignore = 1; } else { - zend_error(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ce->name, iface->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ce->name, iface->name); } } } @@ -3837,7 +3837,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, const char* mname, uint ce->clone = fe; fe->common.fn_flags |= ZEND_ACC_CLONE; } else if (!strncmp(mname, ZEND_CONSTRUCTOR_FUNC_NAME, mname_len)) { if (ce->constructor) { - zend_error(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); } ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR; } else if (!strncmp(mname, ZEND_DESTRUCTOR_FUNC_NAME, mname_len)) { @@ -3862,7 +3862,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, const char* mname, uint lowercase_name = (char*)zend_new_interned_string(lowercase_name, ce->name_length + 1, 1 TSRMLS_CC); if (!memcmp(mname, lowercase_name, mname_len)) { if (ce->constructor) { - zend_error(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); } ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR; @@ -3886,14 +3886,14 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, const if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the trait method is compatible with previosly declared abstract method */ if (!zend_traits_method_compatibility_check(fn, existing_fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the abstract declaration is compatible with previous declaration */ if (!zend_traits_method_compatibility_check(existing_fn, fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } @@ -3909,25 +3909,25 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, const } else if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the trait method is compatible with previosly declared abstract method */ if (!zend_traits_method_compatibility_check(fn, existing_fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the abstract declaration is compatible with previous declaration */ if (!zend_traits_method_compatibility_check(existing_fn, fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } return; } else if ((existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - /* two trais can't define the same non-abstract method */ + /* two traits can't define the same non-abstract method */ #if 1 - zend_error(E_COMPILE_ERROR, "Trait method %s has not been applied, because there are collisions with other trait methods on %s", + zend_error_noreturn(E_COMPILE_ERROR, "Trait method %s has not been applied, because there are collisions with other trait methods on %s", name, ce->name); -#else /* TODO: better errot message */ - zend_error(E_COMPILE_ERROR, "Trait method %s::%s has not been applied as %s::%s, because of collision with %s::%s", +#else /* TODO: better error message */ + zend_error_noreturn(E_COMPILE_ERROR, "Trait method %s::%s has not been applied as %s::%s, because of collision with %s::%s", fn->common.scope->name, fn->common.function_name, ce->name, name, existing_fn->common.scope->name, existing_fn->common.function_name); @@ -4051,7 +4051,7 @@ static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait zend_uint i; if ((trait->ce_flags & ZEND_ACC_TRAIT) != ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Class %s is not a trait, Only traits may be used in 'as' and 'insteadof' statements", trait->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s is not a trait, Only traits may be used in 'as' and 'insteadof' statements", trait->name); } for (i = 0; i < ce->num_traits; i++) { @@ -4059,7 +4059,7 @@ static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait return; } } - zend_error(E_COMPILE_ERROR, "Required Trait %s wasn't added to %s", trait->name, ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Required Trait %s wasn't added to %s", trait->name, ce->name); } /* }}} */ @@ -4080,7 +4080,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* cur_method_ref = cur_precedence->trait_method; if (!(cur_precedence->trait_method->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) { - zend_error(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); + zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); } zend_check_trait_usage(ce, cur_precedence->trait_method->ce TSRMLS_CC); @@ -4092,7 +4092,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* cur_method_ref->mname_len + 1); efree(lcname); if (!method_exists) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "A precedence rule was defined for %s::%s but this method does not exist", cur_method_ref->ce->name, cur_method_ref->method_name); @@ -4110,14 +4110,14 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* zend_uint name_length = strlen(class_name); if (!(cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) { - zend_error(E_COMPILE_ERROR, "Could not find trait %s", class_name); + zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", class_name); } zend_check_trait_usage(ce, cur_precedence->exclude_from_classes[j] TSRMLS_CC); /* make sure that the trait method is not from a class mentioned in exclude_from_classes, for consistency */ if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[i]) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Inconsistent insteadof definition. " "The method %s is to be used from %s, but %s is also on the exclude list", cur_method_ref->method_name, @@ -4140,7 +4140,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* if (ce->trait_aliases[i]->trait_method->class_name) { cur_method_ref = ce->trait_aliases[i]->trait_method; if (!(cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) { - zend_error(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); + zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); } zend_check_trait_usage(ce, cur_method_ref->ce TSRMLS_CC); @@ -4152,7 +4152,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* efree(lcname); if (!method_exists) { - zend_error(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", cur_method_ref->ce->name, cur_method_ref->method_name); + zend_error_noreturn(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", cur_method_ref->ce->name, cur_method_ref->method_name); } } i++; @@ -4178,7 +4178,7 @@ static void zend_traits_compile_exclude_table(HashTable* exclude_table, zend_tra if (zend_hash_add(exclude_table, lcname, lcname_len, NULL, 0, NULL) == FAILURE) { efree(lcname); - zend_error(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", precedences[i]->trait_method->method_name, trait->name); + zend_error_noreturn(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", precedences[i]->trait_method->method_name, trait->name); } efree(lcname); } @@ -4303,7 +4303,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* { } if (not_compatible) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "%s and %s define the same property ($%s) in the composition of %s. However, the definition differs and is considered incompatible. Class was composed", find_first_definition(ce, i, prop_name, prop_name_length, prop_hash, coliding_prop->ce)->name, property_info->ce->name, @@ -4352,7 +4352,7 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce if (!cur_alias->trait_method->ce) { if (cur_alias->alias) { /** Plain old inconsistency/typo/bug */ - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "An alias (%s) was defined for method %s(), but this method does not exist", cur_alias->alias, cur_alias->trait_method->method_name); @@ -4371,12 +4371,12 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce lc_method_name, cur_alias->trait_method->mname_len+1)) { efree(lc_method_name); - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "The modifiers for the trait alias %s() need to be changed in the same statment in which the alias is defined. Error", cur_alias->trait_method->method_name); } else { efree(lc_method_name); - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "The modifiers of the trait method %s() are changed, but this method does not exist. Error", cur_alias->trait_method->method_name); @@ -4485,13 +4485,13 @@ void zend_add_trait_alias(znode *method_reference, znode *modifiers, znode *alia zend_trait_alias *trait_alias; if (Z_LVAL(modifiers->u.constant) == ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Cannot use 'static' as method modifier"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'static' as method modifier"); return; } else if (Z_LVAL(modifiers->u.constant) == ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Cannot use 'abstract' as method modifier"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'abstract' as method modifier"); return; } else if (Z_LVAL(modifiers->u.constant) == ZEND_ACC_FINAL) { - zend_error(E_COMPILE_ERROR, "Cannot use 'final' as method modifier"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'final' as method modifier"); return; } @@ -4533,7 +4533,7 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze op2 = opline->op2.zv; } if (zend_hash_quick_find(class_table, Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_HASH_P(op1), (void **) &pce)==FAILURE) { - zend_error(E_COMPILE_ERROR, "Internal Zend error - Missing class information for %s", Z_STRVAL_P(op1)); + zend_error_noreturn(E_COMPILE_ERROR, "Internal Zend error - Missing class information for %s", Z_STRVAL_P(op1)); return NULL; } else { ce = *pce; @@ -4547,7 +4547,7 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze * so we shut up about it. This allows the if (!defined('FOO')) { return; } * approach to work. */ - zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); } return NULL; } else { @@ -4582,7 +4582,7 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array * so we shut up about it. This allows the if (!defined('FOO')) { return; } * approach to work. */ - zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", Z_STRVAL_P(op2)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", Z_STRVAL_P(op2)); } return NULL; } else { @@ -4590,9 +4590,9 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array } if (parent_ce->ce_flags & ZEND_ACC_INTERFACE) { - zend_error(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name, parent_ce->name); } else if ((parent_ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name, parent_ce->name); } zend_do_inheritance(ce, parent_ce TSRMLS_CC); @@ -4601,7 +4601,7 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array /* Register the derived class */ if (zend_hash_quick_add(class_table, Z_STRVAL_P(op2), Z_STRLEN_P(op2)+1, Z_HASH_P(op2), pce, sizeof(zend_class_entry *), NULL)==FAILURE) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); } return ce; } @@ -4670,7 +4670,7 @@ void zend_do_early_binding(TSRMLS_D) /* {{{ */ /* Classes with traits are handled exactly the same, no early-bind here */ return; default: - zend_error(E_COMPILE_ERROR, "Invalid binding type"); + zend_error_noreturn(E_COMPILE_ERROR, "Invalid binding type"); return; } @@ -4801,9 +4801,9 @@ void zend_do_brk_cont(zend_uchar op, const znode *expr TSRMLS_DC) /* {{{ */ SET_UNUSED(opline->op1); if (expr) { if (expr->op_type != IS_CONST) { - zend_error(E_COMPILE_ERROR, "'%s' operator with non-constant operand is no longer supported", op == ZEND_BRK ? "break" : "continue"); + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-constant operand is no longer supported", op == ZEND_BRK ? "break" : "continue"); } else if (Z_TYPE(expr->u.constant) != IS_LONG || Z_LVAL(expr->u.constant) < 1) { - zend_error(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", op == ZEND_BRK ? "break" : "continue"); + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", op == ZEND_BRK ? "break" : "continue"); } SET_NODE(opline->op2, expr); } else { @@ -4962,7 +4962,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name zval **ns_name, key; if (CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, "Class declarations may not be nested"); + zend_error_noreturn(E_COMPILE_ERROR, "Class declarations may not be nested"); return; } @@ -4970,7 +4970,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (!(strcmp(lcname, "self") && strcmp(lcname, "parent"))) { efree(lcname); - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as class name as it is reserved", Z_STRVAL(class_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as class name as it is reserved", Z_STRVAL(class_name->u.constant)); } /* Class name must not conflict with import names */ @@ -4997,7 +4997,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (Z_STRLEN_PP(ns_name) != Z_STRLEN(class_name->u.constant) || memcmp(tmp, lcname, Z_STRLEN(class_name->u.constant))) { - zend_error(E_COMPILE_ERROR, "Cannot declare class %s because the name is already in use", Z_STRVAL(class_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare class %s because the name is already in use", Z_STRVAL(class_name->u.constant)); } efree(tmp); } @@ -5015,13 +5015,13 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (parent_class_name && parent_class_name->op_type != IS_UNUSED) { switch (parent_class_name->EA) { case ZEND_FETCH_CLASS_SELF: - zend_error(E_COMPILE_ERROR, "Cannot use 'self' as class name as it is reserved"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'self' as class name as it is reserved"); break; case ZEND_FETCH_CLASS_PARENT: - zend_error(E_COMPILE_ERROR, "Cannot use 'parent' as class name as it is reserved"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'parent' as class name as it is reserved"); break; case ZEND_FETCH_CLASS_STATIC: - zend_error(E_COMPILE_ERROR, "Cannot use 'static' as class name as it is reserved"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'static' as class name as it is reserved"); break; default: break; @@ -5040,7 +5040,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (doing_inheritance) { /* Make sure a trait does not try to extend a class */ if ((new_class_entry->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "A trait (%s) cannot extend a class. Traits can only be composed from other traits with the 'use' keyword. Error", new_class_entry->name); + zend_error_noreturn(E_COMPILE_ERROR, "A trait (%s) cannot extend a class. Traits can only be composed from other traits with the 'use' keyword. Error", new_class_entry->name); } opline->extended_value = parent_class_name->u.op.var; @@ -5085,19 +5085,19 @@ void zend_do_end_class_declaration(const znode *class_token, const znode *parent if (ce->constructor) { ce->constructor->common.fn_flags |= ZEND_ACC_CTOR; if (ce->constructor->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Constructor %s::%s() cannot be static", ce->name, ce->constructor->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Constructor %s::%s() cannot be static", ce->name, ce->constructor->common.function_name); } } if (ce->destructor) { ce->destructor->common.fn_flags |= ZEND_ACC_DTOR; if (ce->destructor->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Destructor %s::%s() cannot be static", ce->name, ce->destructor->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Destructor %s::%s() cannot be static", ce->name, ce->destructor->common.function_name); } } if (ce->clone) { ce->clone->common.fn_flags |= ZEND_ACC_CLONE; if (ce->clone->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Clone method %s::%s() cannot be static", ce->name, ce->clone->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Clone method %s::%s() cannot be static", ce->name, ce->clone->common.function_name); } } @@ -5146,7 +5146,7 @@ void zend_do_implements_interface(znode *interface_name TSRMLS_DC) /* {{{ */ /* Traits can not implement interfaces */ if ((CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as interface on '%s' since it is a Trait", + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as interface on '%s' since it is a Trait", Z_STRVAL(interface_name->u.constant), CG(active_class_entry)->name); } @@ -5155,7 +5155,7 @@ void zend_do_implements_interface(znode *interface_name TSRMLS_DC) /* {{{ */ case ZEND_FETCH_CLASS_SELF: case ZEND_FETCH_CLASS_PARENT: case ZEND_FETCH_CLASS_STATIC: - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as interface name as it is reserved", Z_STRVAL(interface_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as interface name as it is reserved", Z_STRVAL(interface_name->u.constant)); break; default: break; @@ -5177,7 +5177,7 @@ void zend_do_use_trait(znode *trait_name TSRMLS_DC) /* {{{ */ zend_op *opline; if ((CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use traits inside of interfaces. %s is used in %s", Z_STRVAL(trait_name->u.constant), CG(active_class_entry)->name); } @@ -5187,7 +5187,7 @@ void zend_do_use_trait(znode *trait_name TSRMLS_DC) /* {{{ */ case ZEND_FETCH_CLASS_SELF: case ZEND_FETCH_CLASS_PARENT: case ZEND_FETCH_CLASS_STATIC: - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as trait name as it is reserved", Z_STRVAL(trait_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as trait name as it is reserved", Z_STRVAL(trait_name->u.constant)); break; default: break; @@ -5276,20 +5276,20 @@ void zend_do_declare_property(const znode *var_name, const znode *value, zend_ui int comment_len = 0; if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { - zend_error(E_COMPILE_ERROR, "Interfaces may not include member variables"); + zend_error_noreturn(E_COMPILE_ERROR, "Interfaces may not include member variables"); } if (access_type & ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Properties cannot be declared abstract"); + zend_error_noreturn(E_COMPILE_ERROR, "Properties cannot be declared abstract"); } if (access_type & ZEND_ACC_FINAL) { - zend_error(E_COMPILE_ERROR, "Cannot declare property %s::$%s final, the final modifier is allowed only for methods and classes", + zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare property %s::$%s final, the final modifier is allowed only for methods and classes", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } if (zend_hash_find(&CG(active_class_entry)->properties_info, Z_STRVAL(var_name->u.constant), Z_STRLEN(var_name->u.constant)+1, (void **) &existing_property_info)==SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::$%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::$%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } ALLOC_ZVAL(property); @@ -5319,11 +5319,11 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D zend_ulong hash; if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { - zend_error(E_COMPILE_ERROR, "Arrays are not allowed in class constants"); + zend_error_noreturn(E_COMPILE_ERROR, "Arrays are not allowed in class constants"); return; } if ((CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Traits cannot have constants"); + zend_error_noreturn(E_COMPILE_ERROR, "Traits cannot have constants"); return; } @@ -5334,7 +5334,7 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D hash = str_hash(cname, Z_STRLEN(var_name->u.constant)); if (zend_hash_quick_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, hash, &property, sizeof(zval *), NULL) == FAILURE) { FREE_ZVAL(property); - zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } FREE_PNODE(var_name); @@ -5428,7 +5428,7 @@ void zend_do_halt_compiler_register(TSRMLS_D) /* {{{ */ int len, clen; if (CG(has_bracketed_namespaces) && CG(in_namespace)) { - zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); + zend_error_noreturn(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); } cfilename = zend_get_compiled_filename(TSRMLS_C); @@ -6004,7 +6004,7 @@ void zend_do_fetch_lexical_variable(znode *varname, zend_bool is_ref TSRMLS_DC) if (Z_STRLEN(varname->u.constant) == sizeof("this") - 1 && memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this") - 1) == 0) { - zend_error(E_COMPILE_ERROR, "Cannot use $this as lexical variable"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use $this as lexical variable"); return; } @@ -6148,7 +6148,7 @@ void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC /* empty(func()) can be transformed to !func() */ zend_do_unary_op(ZEND_BOOL_NOT, result, variable TSRMLS_CC); } else { - zend_error(E_COMPILE_ERROR, "Cannot use isset() on the result of a function call (you can use \"null !== func()\" instead)"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use isset() on the result of a function call (you can use \"null !== func()\" instead)"); } return; @@ -6196,7 +6196,7 @@ void zend_do_instanceof(znode *result, const znode *expr, const znode *class_zno } if (expr->op_type == IS_CONST) { - zend_error(E_COMPILE_ERROR, "instanceof expects an object instance, constant given"); + zend_error_noreturn(E_COMPILE_ERROR, "instanceof expects an object instance, constant given"); } opline = get_next_op(CG(active_op_array) TSRMLS_CC); @@ -6287,10 +6287,10 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token if ((key->op_type != IS_UNUSED)) { if (key->EA & ZEND_PARSED_REFERENCE_VARIABLE) { - zend_error(E_COMPILE_ERROR, "Key element cannot be a reference"); + zend_error_noreturn(E_COMPILE_ERROR, "Key element cannot be a reference"); } if (key->EA & ZEND_PARSED_LIST_EXPR) { - zend_error(E_COMPILE_ERROR, "Cannot use list as key element"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use list as key element"); } } @@ -6309,7 +6309,7 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token while (fetch != end) { --fetch; if (fetch->opcode == ZEND_FETCH_DIM_W && fetch->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading"); } if (fetch->opcode == ZEND_SEPARATE) { MAKE_NOP(fetch); @@ -6323,7 +6323,7 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token if (value->EA & ZEND_PARSED_LIST_EXPR) { if (!CG(list_llist).head) { - zend_error(E_COMPILE_ERROR, "Cannot use empty list"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list"); } zend_do_list_end(&dummy, &value_node TSRMLS_CC); zend_do_free(&dummy TSRMLS_CC); @@ -6391,7 +6391,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ CG(declarables).ticks = val->u.constant; } else if (!zend_binary_strcasecmp(Z_STRVAL(var->u.constant), Z_STRLEN(var->u.constant), "encoding", sizeof("encoding")-1)) { if ((Z_TYPE(val->u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zend_error(E_COMPILE_ERROR, "Cannot use constants as encoding"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use constants as encoding"); } /* @@ -6410,7 +6410,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ } if (num > 0) { - zend_error(E_COMPILE_ERROR, "Encoding declaration pragma must be the very first statement in the script"); + zend_error_noreturn(E_COMPILE_ERROR, "Encoding declaration pragma must be the very first statement in the script"); } } @@ -6906,15 +6906,15 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC if (CG(current_namespace)) { /* previous namespace declarations were unbracketed */ if (with_bracket) { - zend_error(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); } } } else { /* previous namespace declarations were bracketed */ if (!with_bracket) { - zend_error(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); } else if (CG(current_namespace) || CG(in_namespace)) { - zend_error(E_COMPILE_ERROR, "Namespace declarations cannot be nested"); + zend_error_noreturn(E_COMPILE_ERROR, "Namespace declarations cannot be nested"); } } @@ -6927,7 +6927,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC --num; } if (num > 0) { - zend_error(E_COMPILE_ERROR, "Namespace declaration statement has to be the very first statement in the script"); + zend_error_noreturn(E_COMPILE_ERROR, "Namespace declaration statement has to be the very first statement in the script"); } } @@ -6942,7 +6942,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC !memcmp(lcname, "self", sizeof("self")-1)) || ((Z_STRLEN(name->u.constant) == sizeof("parent")-1) && !memcmp(lcname, "parent", sizeof("parent")-1))) { - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as namespace name", Z_STRVAL(name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as namespace name", Z_STRVAL(name->u.constant)); } efree(lcname); @@ -7012,7 +7012,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ !memcmp(lcname, "self", sizeof("self")-1)) || ((Z_STRLEN_P(name) == sizeof("parent")-1) && !memcmp(lcname, "parent", sizeof("parent")-1))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); } if (CG(current_namespace)) { @@ -7027,7 +7027,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ if (Z_STRLEN_P(ns) != Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) || memcmp(tmp2, c_ns_name, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(tmp2); } @@ -7039,17 +7039,17 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || memcmp(c_tmp, lcname, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(c_tmp); } if (zend_hash_add(CG(current_import), lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } if (warn) { if (!strcmp(Z_STRVAL_P(name), "strict")) { - zend_error(E_COMPILE_ERROR, "You seem to be trying to use a different language..."); + zend_error_noreturn(E_COMPILE_ERROR, "You seem to be trying to use a different language..."); } zend_error(E_WARNING, "The use statement with non-compound name '%s' has no effect", Z_STRVAL_P(name)); } @@ -7063,11 +7063,11 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ zend_op *opline; if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { - zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants"); + zend_error_noreturn(E_COMPILE_ERROR, "Arrays are not allowed as constants"); } if (zend_get_ct_const(&name->u.constant, 0 TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); } if (CG(current_namespace)) { @@ -7092,7 +7092,7 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ void zend_verify_namespace(TSRMLS_D) /* {{{ */ { if (CG(has_bracketed_namespaces) && !CG(in_namespace)) { - zend_error(E_COMPILE_ERROR, "No code may exist outside of namespace {}"); + zend_error_noreturn(E_COMPILE_ERROR, "No code may exist outside of namespace {}"); } } /* }}} */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index d46149957ac5e..f76b77b555274 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -271,7 +271,7 @@ inner_statement: statement | function_declaration_statement | class_declaration_statement - | T_HALT_COMPILER '(' ')' ';' { zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); } + | T_HALT_COMPILER '(' ')' ';' { zend_error_noreturn(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); } ; @@ -1202,7 +1202,7 @@ isset_variables: isset_variable: variable { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); } - | expr_without_variable { zend_error(E_COMPILE_ERROR, "Cannot use isset() on the result of an expression (you can use \"null !== expression\" instead)"); } + | expr_without_variable { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use isset() on the result of an expression (you can use \"null !== expression\" instead)"); } ; class_constant: diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 41b4bd25710fd..ad0879888426c 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -499,7 +499,7 @@ static void zend_check_finally_breakout(zend_op_array *op_array, zend_uint op_nu CG(in_compilation) = 1; CG(active_op_array) = op_array; CG(zend_lineno) = op_array->opcodes[op_num].lineno; - zend_error(E_COMPILE_ERROR, "jump out of a finally block is disallowed"); + zend_error_noreturn(E_COMPILE_ERROR, "jump out of a finally block is disallowed"); } } } @@ -710,7 +710,7 @@ ZEND_API int pass_two(zend_op_array *op_array TSRMLS_DC) if (op_array->fn_flags & ZEND_ACC_GENERATOR) { if (opline->op1_type != IS_CONST || Z_TYPE_P(opline->op1.zv) != IS_NULL) { CG(zend_lineno) = opline->lineno; - zend_error(E_COMPILE_ERROR, "Generators cannot return values using \"return\""); + zend_error_noreturn(E_COMPILE_ERROR, "Generators cannot return values using \"return\""); } opline->opcode = ZEND_GENERATOR_RETURN; From a1ae79e11415237a89e041c3b96dd1dba6e7636e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:25:31 +0200 Subject: [PATCH 0169/1256] Fix assignment in dummy_encoding_list_parser --- Zend/zend_multibyte.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c index dafcf18393578..a75d074936ec8 100644 --- a/Zend/zend_multibyte.c +++ b/Zend/zend_multibyte.c @@ -53,7 +53,7 @@ static size_t dummy_encoding_converter(unsigned char **to, size_t *to_length, co static int dummy_encoding_list_parser(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, int persistent TSRMLS_DC) { *return_list = pemalloc(0, persistent); - return_size = 0; + *return_size = 0; return SUCCESS; } From 1292091670ed2b7bf7aad2146f1e7e44a786d97a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:43:05 +0200 Subject: [PATCH 0170/1256] Fix misleading sizeof An array of zval* is allocated, but sizeof(zval **) is used. Makes no practical difference as sizeof(zval *) == sizeof(zval **). --- ext/standard/assert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/assert.c b/ext/standard/assert.c index 631834c97c0f3..1a24ade79e64f 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -200,7 +200,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval **), 0); + zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval *), 0); zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); From 870d3e75ca4e220e431683906b616dfbdd164cdc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:46:09 +0200 Subject: [PATCH 0171/1256] Remove dead comparison (size_t < 0) --- ext/standard/password.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/password.c b/ext/standard/password.c index ca852038a67ed..9c5280a4cb7c2 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -183,7 +183,7 @@ PHP_FUNCTION(password_get_info) return; } - if (hash_len < 0 || (size_t) hash_len < 0) { + if (hash_len < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Supplied password hash too long to safely identify"); RETURN_FALSE; } From 9b46a15a6e82f7f1fb3b921b44b89cd74dd0839e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:52:23 +0200 Subject: [PATCH 0172/1256] Remove extraneous NULL check of Z_ARRVAL_P() Z_ARRVAL_P() is never NULL --- ext/standard/var.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index 5d104a90cfee8..08d43997f78b2 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -453,7 +453,7 @@ PHPAPI void php_var_export_ex(zval **struc, int level, smart_str *buf TSRMLS_DC) break; case IS_ARRAY: myht = Z_ARRVAL_PP(struc); - if(myht && myht->nApplyCount > 0){ + if (myht->nApplyCount > 0){ smart_str_appendl(buf, "NULL", 4); zend_error(E_WARNING, "var_export does not handle circular references"); return; From 813e86765263aa91a3c5c4f72b2c40b7becb58a4 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 17:37:59 -0700 Subject: [PATCH 0173/1256] Initialize these to make Coverity happy --- sapi/fpm/fpm/fastcgi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapi/fpm/fpm/fastcgi.c b/sapi/fpm/fpm/fastcgi.c index cf3f098c53676..56b6bfd8cf6da 100644 --- a/sapi/fpm/fpm/fastcgi.c +++ b/sapi/fpm/fpm/fastcgi.c @@ -426,8 +426,9 @@ static int fcgi_get_params(fcgi_request *req, unsigned char *p, unsigned char *e char buf[128]; char *tmp = buf; size_t buf_size = sizeof(buf); - int name_len, val_len; - uint eff_name_len; + int name_len = 0; + int val_len = 0; + uint eff_name_lenk = 0; char *s; int ret = 1; size_t bytes_consumed; From 4a205092f7d474ecfe4f7e00500ec516c1d23caa Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 17:55:34 -0700 Subject: [PATCH 0174/1256] Trivial Coverity fix --- ext/sockets/conversions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index ed55ed52fa754..d81484521d8c0 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -1257,7 +1257,7 @@ void to_zval_read_msghdr(const char *msghdr_c, zval *zv, res_context *ctx) /* CONVERSIONS for if_index */ static void from_zval_write_ifindex(const zval *zv, char *uinteger, ser_context *ctx) { - unsigned ret; + unsigned ret = 0; zval lzval = zval_used_for_init; if (Z_TYPE_P(zv) == IS_LONG) { From 2be67ca457299179d5df05ee569d4efa227e33d9 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 19:24:17 -0700 Subject: [PATCH 0175/1256] Fix unitialized opened_path here - found by Coverity --- ext/dba/dba.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 50a94dd2adca3..ced90f0c62299 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -625,7 +625,8 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) char *file_mode; char mode[4], *pmode, *lock_file_mode = NULL; int persistent_flag = persistent ? STREAM_OPEN_PERSISTENT : 0; - char *opened_path, *lock_name; + char *opened_path = NULL; + char *lock_name; if(ac < 2) { WRONG_PARAM_COUNT; @@ -848,8 +849,10 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (!persistent) { info->lock.name = opened_path; } else { - info->lock.name = pestrdup(opened_path, persistent); - efree(opened_path); + if (opened_path) { + info->lock.name = pestrdup(opened_path, persistent); + efree(opened_path); + } } } } From aa4f9b322b18e3dffbe0646c802e6ed3cf71367e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 19 Oct 2013 23:29:34 -0300 Subject: [PATCH 0176/1256] - Fixed possible memory leak --- ext/bz2/bz2_filter.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c index 5ed7921c17dba..868acec870348 100644 --- a/ext/bz2/bz2_filter.c +++ b/ext/bz2/bz2_filter.c @@ -97,6 +97,7 @@ static php_stream_filter_status_t php_bz2_decompress_filter( status = BZ2_bzDecompressInit(streamp, 0, data->small_footprint); if (BZ_OK != status) { + php_stream_bucket_delref(bucket TSRMLS_CC); return PSFS_ERR_FATAL; } From 85a622e42f815c3a62008eff21ec4ab259906e7e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 19 Oct 2013 23:36:28 -0300 Subject: [PATCH 0177/1256] - Moved allocation to if block to make Coverity happy --- ext/soap/php_sdl.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 0ac4c2ed7a9bf..a7a5071c08535 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -2644,16 +2644,17 @@ static sdlAttributePtr make_persistent_sdl_attribute(sdlAttributePtr attr, HashT zend_hash_internal_pointer_reset(pattr->extraAttributes); while (zend_hash_get_current_data(attr->extraAttributes, (void**)&tmp) == SUCCESS) { - pextra = malloc(sizeof(sdlExtraAttribute)); - memset(pextra, 0, sizeof(sdlExtraAttribute)); - if ((*tmp)->ns) { - pextra->ns = strdup((*tmp)->ns); - } - if ((*tmp)->val) { - pextra->val = strdup((*tmp)->val); - } + if (zend_hash_get_current_key_ex(attr->extraAttributes, &key, &key_len, &index, 0, NULL) == HASH_KEY_IS_STRING) { + pextra = malloc(sizeof(sdlExtraAttribute)); + memset(pextra, 0, sizeof(sdlExtraAttribute)); - if (zend_hash_get_current_key_ex(attr->extraAttributes, &key, &key_len, &index, 0, NULL) == HASH_KEY_IS_STRING) { + if ((*tmp)->ns) { + pextra->ns = strdup((*tmp)->ns); + } + if ((*tmp)->val) { + pextra->val = strdup((*tmp)->val); + } + zend_hash_add(pattr->extraAttributes, key, key_len, (void*)&pextra, sizeof(sdlExtraAttributePtr), NULL); } From 420068c6e1806a2b12be481abba1afec5d73d82e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 01:04:55 -0200 Subject: [PATCH 0178/1256] - Fix possible memory leak --- ext/zip/php_zip.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index d7bd5f49e62be..df16383d10403 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1856,15 +1856,16 @@ static ZIPARCHIVE_METHOD(addFromString) /* TODO: fix _zip_replace */ if (cur_idx >= 0) { if (zip_delete(intern, cur_idx) == -1) { - RETURN_FALSE; + goto fail; } } - if (zip_add(intern, name, zs) == -1) { - RETURN_FALSE; - } else { + if (zip_add(intern, name, zs) != -1) { RETURN_TRUE; } +fail: + zip_source_free(zs); + RETURN_FALSE; } /* }}} */ From a1daebefda6b481450e3b9ec7461609a09e4f578 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 01:16:07 -0200 Subject: [PATCH 0179/1256] - Fix extern declaration according to definition --- ext/gd/php_gd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h index 45193768ea4c3..70bc85a08bfd2 100644 --- a/ext/gd/php_gd.h +++ b/ext/gd/php_gd.h @@ -61,7 +61,7 @@ PHPAPI extern const char php_sig_gif[3]; PHPAPI extern const char php_sig_jpg[3]; -PHPAPI extern const char php_sig_png[3]; +PHPAPI extern const char php_sig_png[8]; extern zend_module_entry gd_module_entry; #define phpext_gd_ptr &gd_module_entry From fb38fdc7fd97f1e057b8c9d9102ce8a39b430f81 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 20:55:02 -0700 Subject: [PATCH 0180/1256] Remove senseless check here --- ext/ftp/ftp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 0d6704f9d21a0..58d3c2ec4d284 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -630,7 +630,7 @@ ftp_alloc(ftpbuf_t *ftp, const long size, char **response) return 0; } - if (response && ftp->inbuf) { + if (response) { *response = estrdup(ftp->inbuf); } From 33d377e7012865e1622e58886416653ec874dcd7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 08:51:09 -0200 Subject: [PATCH 0181/1256] - Fixed possible uninitialized scalar variable usage (spotted by Coverity) --- ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c | 2 +- ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c | 2 +- ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c | 2 +- ext/mbstring/libmbfl/mbfl/mbfilter.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index 4deb02960c3a3..03e9633cae756 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -142,7 +142,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_2022jp_kddi = { int mbfl_filt_conv_2022jp_mobile_wchar(int c, mbfl_convert_filter *filter) { - int c1, s, w, snd; + int c1, s, w, snd = 0; retry: switch (filter->status & 0xf) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c index 4e1838f0601c5..87bb2f21fd5f2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c @@ -134,7 +134,7 @@ int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter) { int k; - int c1, c2, s, s1, s2, w = 0, w1; + int c1, c2, s, s1 = 0, s2 = 0, w = 0, w1; retry: switch (filter->status & 0xf) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c index 7a549af666587..93ac34644a833 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c @@ -605,7 +605,7 @@ mbfilter_unicode2sjis_emoji_sb(int c, int *s1, mbfl_convert_filter *filter) int mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter) { - int c1, s, s1, s2, w; + int c1, s, s1 = 0, s2 = 0, w; int snd = 0; retry: diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index b3759f940d549..3b14727d6b6c1 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -985,7 +985,7 @@ mbfl_strpos( { int result; mbfl_string _haystack_u8, _needle_u8; - const mbfl_string *haystack_u8, *needle_u8; + const mbfl_string *haystack_u8, *needle_u8 = NULL; const unsigned char *u8_tbl; if (haystack == NULL || haystack->val == NULL || needle == NULL || needle->val == NULL) { From 52555a78946cd91034f86eb4ad03c2d76cbef0cd Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 09:04:24 -0200 Subject: [PATCH 0182/1256] - Fixed possible NULL ptr dereference --- ext/phar/util.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 898d8bd4b2146..227bd15dc715c 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1262,8 +1262,10 @@ int phar_get_archive(phar_archive_data **archive, char *fname, int fname_len, ch spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, (*fd_ptr)->fname, fname); } if (SUCCESS == phar_free_alias(*fd_ptr, alias, alias_len TSRMLS_CC)) { - efree(*error); - *error = NULL; + if (error) { + efree(*error); + *error = NULL; + } } return FAILURE; } From 9976b5cd7f36d90b49d1dcf58ec6497f0e592b7d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 09:50:11 -0200 Subject: [PATCH 0183/1256] - Moved NULL check before dereferencing --- ext/zip/php_zip.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index df16383d10403..1f435bbb002ed 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -102,14 +102,14 @@ static char * php_zip_make_relative_path(char *path, int path_len) /* {{{ */ char *path_begin = path; size_t i; - if (IS_SLASH(path[0])) { - return path + 1; - } - if (path_len < 1 || path == NULL) { return NULL; } + if (IS_SLASH(path[0])) { + return path + 1; + } + i = path_len; while (1) { From 1494298231072d5991e76db5ef25f20e81018106 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 08:55:48 -0700 Subject: [PATCH 0184/1256] Minor Coverity tweaks --- ext/ftp/ftp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 58d3c2ec4d284..4da8d602c9083 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -1643,7 +1643,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) if (ftp->resp == 226) { ftp->data = data_close(ftp, data); php_stream_close(tmpstream); - return ecalloc(1, sizeof(char**)); + return ecalloc(1, sizeof(char*)); } /* pull data buffer into tmpfile */ @@ -1671,11 +1671,11 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) } } - ftp->data = data = data_close(ftp, data); + ftp->data = data_close(ftp, data); php_stream_rewind(tmpstream); - ret = safe_emalloc((lines + 1), sizeof(char**), size * sizeof(char*)); + ret = safe_emalloc((lines + 1), sizeof(char*), size * sizeof(char*)); entry = ret; text = (char*) (ret + lines + 1); From 8f4a6d6e1b6c36259a5dc865d16f0dad76f2f2c9 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 09:36:50 -0700 Subject: [PATCH 0185/1256] Clean up this weird safe_emalloc() call --- ext/ftp/ftp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 4da8d602c9083..b82017e21f2a7 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -1675,7 +1675,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) php_stream_rewind(tmpstream); - ret = safe_emalloc((lines + 1), sizeof(char*), size * sizeof(char*)); + ret = safe_emalloc((lines + 1), sizeof(char*), size); entry = ret; text = (char*) (ret + lines + 1); From 2129de4569bec4acd89e5824a471f59d887c5b57 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 14:04:47 -0700 Subject: [PATCH 0186/1256] These getpwnam('') tests are silly and not portable --- ext/posix/tests/posix_getgrnam.phpt | 19 ------------------- ext/posix/tests/posix_getgrnam_basic.phpt | 23 ----------------------- ext/posix/tests/posix_getpwnam.phpt | 19 ------------------- ext/posix/tests/posix_getpwnam_basic.phpt | 23 ----------------------- 4 files changed, 84 deletions(-) delete mode 100644 ext/posix/tests/posix_getgrnam.phpt delete mode 100644 ext/posix/tests/posix_getgrnam_basic.phpt delete mode 100644 ext/posix/tests/posix_getpwnam.phpt delete mode 100644 ext/posix/tests/posix_getpwnam_basic.phpt diff --git a/ext/posix/tests/posix_getgrnam.phpt b/ext/posix/tests/posix_getgrnam.phpt deleted file mode 100644 index 854db4ac1614d..0000000000000 --- a/ext/posix/tests/posix_getgrnam.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -posix_getgrnam(): Basic tests ---SKIPIF-- - ---FILE-- - ---EXPECT-- -bool(false) -bool(false) -bool(false) diff --git a/ext/posix/tests/posix_getgrnam_basic.phpt b/ext/posix/tests/posix_getgrnam_basic.phpt deleted file mode 100644 index fd5bf23172d86..0000000000000 --- a/ext/posix/tests/posix_getgrnam_basic.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -posix_getgrnam(): Basic tests ---SKIPIF-- - ---FILE-- - -===DONE=== ---EXPECT-- -Basic test of POSIX posix_getgrnam function -bool(false) -bool(false) -bool(false) -===DONE=== \ No newline at end of file diff --git a/ext/posix/tests/posix_getpwnam.phpt b/ext/posix/tests/posix_getpwnam.phpt deleted file mode 100644 index b5de1e4ce233d..0000000000000 --- a/ext/posix/tests/posix_getpwnam.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -posix_getpwnam(): Basic tests ---SKIPIF-- - ---FILE-- - ---EXPECT-- -bool(false) -bool(false) -bool(false) diff --git a/ext/posix/tests/posix_getpwnam_basic.phpt b/ext/posix/tests/posix_getpwnam_basic.phpt deleted file mode 100644 index d675d6c182382..0000000000000 --- a/ext/posix/tests/posix_getpwnam_basic.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -posix_getpwnam(): Basic tests ---SKIPIF-- - ---FILE-- - -===DONE==== ---EXPECT-- -Basic test of POSIX posix_getpwnam function -bool(false) -bool(false) -bool(false) -===DONE==== From 18cc5386de399f4410d8e5bf0a7aa5a06b0309be Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 17:55:55 -0700 Subject: [PATCH 0187/1256] Fix typo --- sapi/fpm/fpm/fastcgi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fastcgi.c b/sapi/fpm/fpm/fastcgi.c index 56b6bfd8cf6da..10fd9efa95664 100644 --- a/sapi/fpm/fpm/fastcgi.c +++ b/sapi/fpm/fpm/fastcgi.c @@ -428,7 +428,7 @@ static int fcgi_get_params(fcgi_request *req, unsigned char *p, unsigned char *e size_t buf_size = sizeof(buf); int name_len = 0; int val_len = 0; - uint eff_name_lenk = 0; + uint eff_name_len = 0; char *s; int ret = 1; size_t bytes_consumed; From 9aad9114e3566780c3c7a383acd983b7b861a3f4 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 19:59:39 -0700 Subject: [PATCH 0188/1256] 5.4.21 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6c2c6ed13b5aa..6f3c00caea886 100644 --- a/NEWS +++ b/NEWS @@ -22,7 +22,7 @@ PHP NEWS . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) -?? ??? 2013, PHP 5.4.21 +17 Oct 2013, PHP 5.4.21 - Core: . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) From 646813a37a061763656829ab6470231aa6f38d33 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 21:57:33 -0700 Subject: [PATCH 0189/1256] fix possibility of access to *storedType without initialization --- ext/intl/msgformat/msgformat_helpers.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index c4456d54f3c84..f75fd91dce775 100644 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -209,6 +209,9 @@ static HashTable *umsg_parse_format(MessageFormatter_object *mfo, continue; } } + } else { + intl_errors_set(&err, U_INVALID_FORMAT_ERROR, "Invalid part type encountered", 0 TSRMLS_CC); + continue; } UMessagePatternArgType argType = p.getArgType(); From dab1d76e9def81acd51d2ea9ed55c74af1a093ed Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:04:21 -0700 Subject: [PATCH 0190/1256] Fix coverity issue with -1 returned by findOffset not being handled by getPreferredTag --- ext/intl/locale/locale_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 1707c69f93324..9c5b09a7bcc96 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -127,6 +127,9 @@ static char* getPreferredTag(char* gf_tag) int grOffset = 0; grOffset = findOffset( LOC_GRANDFATHERED ,gf_tag); + if(grOffset < 0) { + return NULL; + } if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); From 2186e1583d9d65d0e79d05ec706f1e12b97bb035 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 22:15:35 -0700 Subject: [PATCH 0191/1256] When src->src is null this doesn't get initialized but it is still used, so the passed in *ze will point to unitialized memory. Hopefully src->src is never null, but just in case this initialization doesn't hurt. --- ext/zip/lib/zip_source_error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/zip/lib/zip_source_error.c b/ext/zip/lib/zip_source_error.c index ffb4652d33621..70ec8bc5d452f 100644 --- a/ext/zip/lib/zip_source_error.c +++ b/ext/zip/lib/zip_source_error.c @@ -40,7 +40,7 @@ ZIP_EXTERN(void) zip_source_error(struct zip_source *src, int *ze, int *se) { - int e[2]; + int e[2] = { 0, 0 }; if (src->src == NULL) { } From ef9069b4ef71ecf1b514e7f8544f0d470e00dca5 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:32:20 -0700 Subject: [PATCH 0192/1256] fix const warnings in intl methods --- ext/intl/collator/collator_create.c | 2 +- ext/intl/formatter/formatter_main.c | 2 +- ext/intl/locale/locale_methods.c | 46 +++++++++++++-------------- ext/intl/msgformat/msgformat.c | 2 +- ext/intl/msgformat/msgformat_format.c | 2 +- ext/intl/msgformat/msgformat_parse.c | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ext/intl/collator/collator_create.c b/ext/intl/collator/collator_create.c index b2a8c7f6bac07..7ed4c534394b4 100644 --- a/ext/intl/collator/collator_create.c +++ b/ext/intl/collator/collator_create.c @@ -27,7 +27,7 @@ /* {{{ */ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; int locale_len = 0; zval* object; Collator_object* co; diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index d0671a88b5e47..0a568472c4835 100644 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -27,7 +27,7 @@ /* {{{ */ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern = NULL; int locale_len = 0, pattern_len = 0; long style; diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 915f4d5af47d8..21b5847f2d339 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -121,7 +121,7 @@ static int16_t findOffset(const char* const* list, const char* key) } /*}}}*/ -static char* getPreferredTag(char* gf_tag) +static char* getPreferredTag(const char* gf_tag) { char* result = NULL; int grOffset = 0; @@ -175,7 +175,7 @@ static int getStrrtokenPos(char* str, int savedPos) * returns -1 if no singleton * strtok equivalent search for singleton */ -static int getSingletonPos(char* str) +static int getSingletonPos(const char* str) { int result =-1; int i=0; @@ -251,7 +251,7 @@ PHP_NAMED_FUNCTION(zif_locale_set_default) * common code shared by get_primary_language,get_script or get_region or get_variant * result = 0 if error, 1 if successful , -1 if no value */ -static char* get_icu_value_internal( char* loc_name , char* tag_name, int* result , int fromParseLocale) +static char* get_icu_value_internal( const char* loc_name , char* tag_name, int* result , int fromParseLocale) { char* tag_value = NULL; int32_t tag_value_len = 512; @@ -281,7 +281,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul /* Handle singletons */ if( strcmp(tag_name , LOC_LANG_TAG)==0 ){ if( strlen(loc_name)>1 && (isIDPrefix(loc_name) ==1 ) ){ - return loc_name; + return (char *)loc_name; } } @@ -370,7 +370,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; char* tag_value = NULL; @@ -465,10 +465,10 @@ PHP_FUNCTION(locale_get_primary_language ) }}} */ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; - char* disp_loc_name = NULL; + const char* disp_loc_name = NULL; int disp_loc_name_len = 0; int free_loc_name = 0; @@ -561,7 +561,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } RETURN_FALSE; @@ -572,7 +572,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } /* Convert display locale name from UTF-16 to UTF-8. */ @@ -666,10 +666,10 @@ PHP_FUNCTION( locale_get_keywords ) UEnumeration* e = NULL; UErrorCode status = U_ZERO_ERROR; - const char* kw_key = NULL; + const char* kw_key = NULL; int32_t kw_key_len = 0; - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; /* @@ -716,7 +716,7 @@ PHP_FUNCTION( locale_get_keywords ) kw_value = erealloc( kw_value , kw_value_len+1); } if (U_FAILURE(status)) { - intl_error_set( NULL, FAILURE, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); if( kw_value){ efree( kw_value ); } @@ -974,12 +974,12 @@ PHP_FUNCTION(locale_compose) * e.g. for locale='en_US-x-prv1-prv2-prv3' * returns a pointer to the string 'prv1-prv2-prv3' */ -static char* get_private_subtags(char* loc_name) +static char* get_private_subtags(const char* loc_name) { char* result =NULL; int singletonPos = 0; int len =0; - char* mod_loc_name =NULL; + const char* mod_loc_name =NULL; if( loc_name && (len = strlen(loc_name)>0 ) ){ mod_loc_name = loc_name ; @@ -1019,7 +1019,7 @@ static char* get_private_subtags(char* loc_name) /* {{{ code used by locale_parse */ -static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) +static int add_array_entry(const char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) { char* key_value = NULL; char* cur_key_name = NULL; @@ -1084,7 +1084,7 @@ static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS */ PHP_FUNCTION(locale_parse) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; int grOffset = 0; @@ -1128,8 +1128,8 @@ PHP_FUNCTION(locale_parse) */ PHP_FUNCTION(locale_get_all_variants) { - char* loc_name = NULL; - int loc_name_len = 0; + const char* loc_name = NULL; + int loc_name_len = 0; int result = 0; char* token = NULL; @@ -1182,10 +1182,10 @@ PHP_FUNCTION(locale_get_all_variants) /*{{{ * Converts to lower case and also replaces all hyphens with the underscore */ -static int strToMatch(char* str ,char *retstr) +static int strToMatch(const char* str ,char *retstr) { char* anchor = NULL; - char* anchor1 = NULL; + const char* anchor1 = NULL; int result = 0; int len = 0; @@ -1225,7 +1225,7 @@ PHP_FUNCTION(locale_filter_matches) { char* lang_tag = NULL; int lang_tag_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; int result = 0; @@ -1401,7 +1401,7 @@ static void array_cleanup( char* arr[] , int arr_size) * returns the lookup result to lookup_loc_range_src_php * internal function */ -static char* lookup_loc_range(char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) +static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) { int i = 0; int cur_arr_len = 0; @@ -1523,7 +1523,7 @@ PHP_FUNCTION(locale_lookup) { char* fallback_loc = NULL; int fallback_loc_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; zval* arr = NULL; diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c index 6a9f04f32b463..7d8cd958e3c08 100644 --- a/ext/intl/msgformat/msgformat.c +++ b/ext/intl/msgformat/msgformat.c @@ -28,7 +28,7 @@ /* {{{ */ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern; int locale_len = 0, pattern_len = 0; UChar* spattern = NULL; diff --git a/ext/intl/msgformat/msgformat_format.c b/ext/intl/msgformat/msgformat_format.c index 4b81cfe2b454c..55ec9e84ba0e8 100644 --- a/ext/intl/msgformat/msgformat_format.c +++ b/ext/intl/msgformat/msgformat_format.c @@ -103,7 +103,7 @@ PHP_FUNCTION( msgfmt_format_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; MessageFormatter_object mf = {0}; MessageFormatter_object *mfo = &mf; diff --git a/ext/intl/msgformat/msgformat_parse.c b/ext/intl/msgformat/msgformat_parse.c index 413d3b1f15d89..14a6363424bf0 100644 --- a/ext/intl/msgformat/msgformat_parse.c +++ b/ext/intl/msgformat/msgformat_parse.c @@ -93,7 +93,7 @@ PHP_FUNCTION( msgfmt_parse_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; char *source = NULL; int src_len = 0; From 8bef8e66cfaa575b63b5032b2cce32c5f73b3c94 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:59:07 -0700 Subject: [PATCH 0193/1256] fix argument type & remove warning --- ext/intl/dateformat/dateformat_parse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/intl/dateformat/dateformat_parse.c b/ext/intl/dateformat/dateformat_parse.c index 4193e890175b9..993077854646e 100644 --- a/ext/intl/dateformat/dateformat_parse.c +++ b/ext/intl/dateformat/dateformat_parse.c @@ -62,7 +62,7 @@ static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* tex } /* }}} */ -static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, UCalendar parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) +static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, const UCalendar *parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) { long calendar_field_val = ucal_get( parsed_calendar, calendar_field, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS( dfo, "Date parsing - localtime failed : could not get a field from calendar" ); @@ -83,7 +83,7 @@ static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_va */ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC) { - UCalendar* parsed_calendar = NULL; + UCalendar *parsed_calendar = NULL; UChar* text_utf16 = NULL; int32_t text_utf16_len = 0; long isInDST = 0; @@ -92,7 +92,7 @@ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* tex intl_convert_utf8_to_utf16(&text_utf16, &text_utf16_len, text_to_parse, text_len, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" ); - parsed_calendar = udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); + parsed_calendar = (UCalendar *)udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); udat_parseCalendar( DATE_FORMAT_OBJECT(dfo), parsed_calendar, text_utf16, text_utf16_len, parse_pos, &INTL_DATA_ERROR_CODE(dfo)); if (text_utf16) { From 27ebcb8d0e2f657ffe666a8ea4a81ae7a9b15cd1 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 19:59:39 -0700 Subject: [PATCH 0194/1256] 5.4.21 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6c2c6ed13b5aa..6f3c00caea886 100644 --- a/NEWS +++ b/NEWS @@ -22,7 +22,7 @@ PHP NEWS . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) -?? ??? 2013, PHP 5.4.21 +17 Oct 2013, PHP 5.4.21 - Core: . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) From 297324146e772fc41d79c23511f66d7d66f6784c Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:04:21 -0700 Subject: [PATCH 0195/1256] Fix coverity issue with -1 returned by findOffset not being handled by getPreferredTag --- ext/intl/locale/locale_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 1707c69f93324..9c5b09a7bcc96 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -127,6 +127,9 @@ static char* getPreferredTag(char* gf_tag) int grOffset = 0; grOffset = findOffset( LOC_GRANDFATHERED ,gf_tag); + if(grOffset < 0) { + return NULL; + } if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); From 219a682e8e977ebe1df49c29c51d52a044a09f8f Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 21:57:33 -0700 Subject: [PATCH 0196/1256] fix possibility of access to *storedType without initialization --- ext/intl/msgformat/msgformat_helpers.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index c4456d54f3c84..f75fd91dce775 100644 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -209,6 +209,9 @@ static HashTable *umsg_parse_format(MessageFormatter_object *mfo, continue; } } + } else { + intl_errors_set(&err, U_INVALID_FORMAT_ERROR, "Invalid part type encountered", 0 TSRMLS_CC); + continue; } UMessagePatternArgType argType = p.getArgType(); From 444612cdc48d68e94c5a94aa47153a2b3933470a Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:04:21 -0700 Subject: [PATCH 0197/1256] Fix coverity issue with -1 returned by findOffset not being handled by getPreferredTag --- ext/intl/locale/locale_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index d1a86d8ee27f4..915f4d5af47d8 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -127,6 +127,9 @@ static char* getPreferredTag(char* gf_tag) int grOffset = 0; grOffset = findOffset( LOC_GRANDFATHERED ,gf_tag); + if(grOffset < 0) { + return NULL; + } if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); From 06954d1bc1966ade0815db3f4ec8983b954950c1 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:32:20 -0700 Subject: [PATCH 0198/1256] fix const warnings in intl methods --- ext/intl/collator/collator_create.c | 2 +- ext/intl/formatter/formatter_main.c | 2 +- ext/intl/locale/locale_methods.c | 46 +++++++++++++-------------- ext/intl/msgformat/msgformat.c | 2 +- ext/intl/msgformat/msgformat_format.c | 2 +- ext/intl/msgformat/msgformat_parse.c | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ext/intl/collator/collator_create.c b/ext/intl/collator/collator_create.c index b2a8c7f6bac07..7ed4c534394b4 100644 --- a/ext/intl/collator/collator_create.c +++ b/ext/intl/collator/collator_create.c @@ -27,7 +27,7 @@ /* {{{ */ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; int locale_len = 0; zval* object; Collator_object* co; diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index d0671a88b5e47..0a568472c4835 100644 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -27,7 +27,7 @@ /* {{{ */ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern = NULL; int locale_len = 0, pattern_len = 0; long style; diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 915f4d5af47d8..21b5847f2d339 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -121,7 +121,7 @@ static int16_t findOffset(const char* const* list, const char* key) } /*}}}*/ -static char* getPreferredTag(char* gf_tag) +static char* getPreferredTag(const char* gf_tag) { char* result = NULL; int grOffset = 0; @@ -175,7 +175,7 @@ static int getStrrtokenPos(char* str, int savedPos) * returns -1 if no singleton * strtok equivalent search for singleton */ -static int getSingletonPos(char* str) +static int getSingletonPos(const char* str) { int result =-1; int i=0; @@ -251,7 +251,7 @@ PHP_NAMED_FUNCTION(zif_locale_set_default) * common code shared by get_primary_language,get_script or get_region or get_variant * result = 0 if error, 1 if successful , -1 if no value */ -static char* get_icu_value_internal( char* loc_name , char* tag_name, int* result , int fromParseLocale) +static char* get_icu_value_internal( const char* loc_name , char* tag_name, int* result , int fromParseLocale) { char* tag_value = NULL; int32_t tag_value_len = 512; @@ -281,7 +281,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul /* Handle singletons */ if( strcmp(tag_name , LOC_LANG_TAG)==0 ){ if( strlen(loc_name)>1 && (isIDPrefix(loc_name) ==1 ) ){ - return loc_name; + return (char *)loc_name; } } @@ -370,7 +370,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; char* tag_value = NULL; @@ -465,10 +465,10 @@ PHP_FUNCTION(locale_get_primary_language ) }}} */ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; - char* disp_loc_name = NULL; + const char* disp_loc_name = NULL; int disp_loc_name_len = 0; int free_loc_name = 0; @@ -561,7 +561,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } RETURN_FALSE; @@ -572,7 +572,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } /* Convert display locale name from UTF-16 to UTF-8. */ @@ -666,10 +666,10 @@ PHP_FUNCTION( locale_get_keywords ) UEnumeration* e = NULL; UErrorCode status = U_ZERO_ERROR; - const char* kw_key = NULL; + const char* kw_key = NULL; int32_t kw_key_len = 0; - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; /* @@ -716,7 +716,7 @@ PHP_FUNCTION( locale_get_keywords ) kw_value = erealloc( kw_value , kw_value_len+1); } if (U_FAILURE(status)) { - intl_error_set( NULL, FAILURE, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); if( kw_value){ efree( kw_value ); } @@ -974,12 +974,12 @@ PHP_FUNCTION(locale_compose) * e.g. for locale='en_US-x-prv1-prv2-prv3' * returns a pointer to the string 'prv1-prv2-prv3' */ -static char* get_private_subtags(char* loc_name) +static char* get_private_subtags(const char* loc_name) { char* result =NULL; int singletonPos = 0; int len =0; - char* mod_loc_name =NULL; + const char* mod_loc_name =NULL; if( loc_name && (len = strlen(loc_name)>0 ) ){ mod_loc_name = loc_name ; @@ -1019,7 +1019,7 @@ static char* get_private_subtags(char* loc_name) /* {{{ code used by locale_parse */ -static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) +static int add_array_entry(const char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) { char* key_value = NULL; char* cur_key_name = NULL; @@ -1084,7 +1084,7 @@ static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS */ PHP_FUNCTION(locale_parse) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; int grOffset = 0; @@ -1128,8 +1128,8 @@ PHP_FUNCTION(locale_parse) */ PHP_FUNCTION(locale_get_all_variants) { - char* loc_name = NULL; - int loc_name_len = 0; + const char* loc_name = NULL; + int loc_name_len = 0; int result = 0; char* token = NULL; @@ -1182,10 +1182,10 @@ PHP_FUNCTION(locale_get_all_variants) /*{{{ * Converts to lower case and also replaces all hyphens with the underscore */ -static int strToMatch(char* str ,char *retstr) +static int strToMatch(const char* str ,char *retstr) { char* anchor = NULL; - char* anchor1 = NULL; + const char* anchor1 = NULL; int result = 0; int len = 0; @@ -1225,7 +1225,7 @@ PHP_FUNCTION(locale_filter_matches) { char* lang_tag = NULL; int lang_tag_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; int result = 0; @@ -1401,7 +1401,7 @@ static void array_cleanup( char* arr[] , int arr_size) * returns the lookup result to lookup_loc_range_src_php * internal function */ -static char* lookup_loc_range(char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) +static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) { int i = 0; int cur_arr_len = 0; @@ -1523,7 +1523,7 @@ PHP_FUNCTION(locale_lookup) { char* fallback_loc = NULL; int fallback_loc_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; zval* arr = NULL; diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c index 6a9f04f32b463..7d8cd958e3c08 100644 --- a/ext/intl/msgformat/msgformat.c +++ b/ext/intl/msgformat/msgformat.c @@ -28,7 +28,7 @@ /* {{{ */ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern; int locale_len = 0, pattern_len = 0; UChar* spattern = NULL; diff --git a/ext/intl/msgformat/msgformat_format.c b/ext/intl/msgformat/msgformat_format.c index 4b81cfe2b454c..55ec9e84ba0e8 100644 --- a/ext/intl/msgformat/msgformat_format.c +++ b/ext/intl/msgformat/msgformat_format.c @@ -103,7 +103,7 @@ PHP_FUNCTION( msgfmt_format_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; MessageFormatter_object mf = {0}; MessageFormatter_object *mfo = &mf; diff --git a/ext/intl/msgformat/msgformat_parse.c b/ext/intl/msgformat/msgformat_parse.c index 413d3b1f15d89..14a6363424bf0 100644 --- a/ext/intl/msgformat/msgformat_parse.c +++ b/ext/intl/msgformat/msgformat_parse.c @@ -93,7 +93,7 @@ PHP_FUNCTION( msgfmt_parse_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; char *source = NULL; int src_len = 0; From 3900ce97a3bc775bb44a8879e03a13dd47d10190 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:59:07 -0700 Subject: [PATCH 0199/1256] fix argument type & remove warning --- ext/intl/dateformat/dateformat_parse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/intl/dateformat/dateformat_parse.c b/ext/intl/dateformat/dateformat_parse.c index 4193e890175b9..993077854646e 100644 --- a/ext/intl/dateformat/dateformat_parse.c +++ b/ext/intl/dateformat/dateformat_parse.c @@ -62,7 +62,7 @@ static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* tex } /* }}} */ -static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, UCalendar parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) +static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, const UCalendar *parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) { long calendar_field_val = ucal_get( parsed_calendar, calendar_field, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS( dfo, "Date parsing - localtime failed : could not get a field from calendar" ); @@ -83,7 +83,7 @@ static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_va */ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC) { - UCalendar* parsed_calendar = NULL; + UCalendar *parsed_calendar = NULL; UChar* text_utf16 = NULL; int32_t text_utf16_len = 0; long isInDST = 0; @@ -92,7 +92,7 @@ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* tex intl_convert_utf8_to_utf16(&text_utf16, &text_utf16_len, text_to_parse, text_len, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" ); - parsed_calendar = udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); + parsed_calendar = (UCalendar *)udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); udat_parseCalendar( DATE_FORMAT_OBJECT(dfo), parsed_calendar, text_utf16, text_utf16_len, parse_pos, &INTL_DATA_ERROR_CODE(dfo)); if (text_utf16) { From f860486de5805eefd63af5d750c913e1515970c8 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 21 Oct 2013 00:01:24 -0700 Subject: [PATCH 0200/1256] fix memory leak on error (from Coverity scan) --- ext/date/php_date.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 70960b161f627..7e4de09c1ec7e 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1362,6 +1362,7 @@ PHPAPI signed long php_parse_date(char *string, signed long *now) parsed_time = timelib_strtotime(string, strlen(string), &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); if (error->error_count) { + timelib_time_dtor(parsed_time); timelib_error_container_dtor(error); return -1; } From 098855433dc5d609e3970f0bc9d6766c007273f3 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 21 Oct 2013 17:40:39 +0800 Subject: [PATCH 0201/1256] Fixed issue #115 (path issue when using phar). --- NEWS | 1 + ext/opcache/ZendAccelerator.c | 44 +++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 4978c7e722527..a3d075af09eb7 100644 --- a/NEWS +++ b/NEWS @@ -51,6 +51,7 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: + . Fixed issue #115 (path issue when using phar). (Laruence) . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 72b5a1b9fe7e7..48ff73019b8f6 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -37,6 +37,7 @@ #include "zend_API.h" #include "zend_ini.h" #include "TSRM/tsrm_virtual_cwd.h" +#include "ext/phar/php_phar.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" @@ -144,6 +145,21 @@ static inline int is_cacheable_stream_path(const char *filename) memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; } +static inline int is_phar_relative_alias_path(const char *filename, char **alias, int *alias_len) +{ + if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 + && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { + char *slash; + *alias = filename + sizeof("phar://") - 1; + slash = strstr(*alias, "/"); + if (slash) { + *alias_len = slash - *alias; + return 1; + } + } + return 0; +} + /* O+ overrides PHP chdir() function and remembers the current working directory * in ZCG(cwd) and ZCG(cwd_len). Later accel_getcwd() can use stored value and * avoid getcwd() call. @@ -1028,15 +1044,33 @@ char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_lengt } memcpy(ZCG(key) + cur_len, include_path, include_path_len); ZCG(key)[key_length] = '\0'; - } else { - /* not use_cwd */ - key_length = path_length; + } else { + /* not use_cwd */ + key_length = path_length; if ((size_t)key_length >= sizeof(ZCG(key))) { ZCG(key_len) = 0; return NULL; + } else { + char *alias; + int alias_len; + if (is_phar_relative_alias_path(file_handle->filename, &alias, &alias_len)) { + char *phar_path; + int phar_path_len; + if (phar_resolve_alias(alias, alias_len, &phar_path, &phar_path_len TSRMLS_CC) == SUCCESS) { + int filename_len = strlen(file_handle->filename); + memcpy(ZCG(key), "phar://", sizeof("phar://") -1); + memcpy(ZCG(key) + sizeof("phar://") - 1, phar_path, phar_path_len); + memcpy(ZCG(key) + sizeof("phar://") - 1 + phar_path_len, + alias + alias_len, filename_len - alias_len - sizeof("phar://") + 2); + key_length = filename_len + (phar_path_len - alias_len); + } else { + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } + } else { + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } } - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } + } *key_len = ZCG(key_len) = key_length; return ZCG(key); From 2ecf94e07efae6059e40069a7c1a895514c24466 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 12:16:41 +0200 Subject: [PATCH 0202/1256] Just SKIP that test on travis --- ext/standard/tests/file/disk_free_space_basic.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index 7ea8d36153f06..9dc663ae16e31 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -1,5 +1,9 @@ --TEST-- Test disk_free_space and its alias diskfreespace() functions : basic functionality +--SKIPIF-- + --INI-- memory_limit=32M --FILE-- From 60ce3811ae3b86eb7bfb86cc965e3f79e61bfc4a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 21 Oct 2013 14:17:10 +0400 Subject: [PATCH 0203/1256] Fixed compilation warning --- ext/opcache/ZendAccelerator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 48ff73019b8f6..8cee80f77693d 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -150,7 +150,7 @@ static inline int is_phar_relative_alias_path(const char *filename, char **alias if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { char *slash; - *alias = filename + sizeof("phar://") - 1; + *alias = (char*)filename + sizeof("phar://") - 1; slash = strstr(*alias, "/"); if (slash) { *alias_len = slash - *alias; From fb610b4e808c770800434d1a42d606f274927a94 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 12:18:58 +0200 Subject: [PATCH 0204/1256] remove TRAVIS check in test source --- ext/standard/tests/file/disk_free_space_basic.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index e0bc367bf4fa5..200e92ab43e84 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -37,7 +37,7 @@ echo "\n Free Space after writing to a file\n"; $space2 = disk_free_space($file_path.$dir); var_dump( $space2 ); -if(getenv('TRAVIS') === 'true' || $space1 > $space2 ) +if($space1 > $space2 ) echo "\n Free Space Value Is Correct\n"; else echo "\n Free Space Value Is Incorrect\n"; From b636c03426193ecf0b7e166126a14b70ce8185e9 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Mon, 21 Oct 2013 15:09:29 +0400 Subject: [PATCH 0205/1256] fix bug #65936 (dangling context pointer causes crash) reported by Leon Sorokin --- NEWS | 1 + ext/standard/basic_functions.c | 1 + 2 files changed, 2 insertions(+) diff --git a/NEWS b/NEWS index a3d075af09eb7..69b1658158db8 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ PHP NEWS . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) . Fixed bug #65821 (By-ref foreach on property access of string offset segfaults). (Nikita) + . Fixed bug #65936 (dangling context pointer causes crash). (Tony) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index eca7d903680fa..b4128e066b7f8 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -3639,6 +3639,7 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ BASIC_ADD_SUBMODULE(dl) BASIC_ADD_SUBMODULE(mail) + BASIC_ADD_SUBMODULE(streams) BASIC_MINIT_SUBMODULE(file) BASIC_MINIT_SUBMODULE(pack) BASIC_MINIT_SUBMODULE(browscap) From 8591a52fab3fa6656669ed853466a01774398ed9 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 21 Oct 2013 11:15:31 -0700 Subject: [PATCH 0206/1256] fixed invalid free --- sapi/cgi/cgi_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 221b0021756dc..ec397bf3aeef4 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -815,7 +815,7 @@ static void php_cgi_ini_activate_user_config(char *path, int path_len, const cha } if (real_path) { - free(real_path); + efree(real_path); } entry->expires = request_time + PG(user_ini_cache_ttl); } @@ -1396,7 +1396,7 @@ static void init_request_info(fcgi_request *request TSRMLS_DC) } else { SG(request_info).request_uri = env_script_name; } - free(real_path); + efree(real_path); } } else { /* pre 4.3 behaviour, shouldn't be used but provides BC */ From 1b43f9504020a1fa607eb58b81defaba9d8cfd6b Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 21:48:27 +0200 Subject: [PATCH 0207/1256] Merged PR #293 (Exif crash on unknown encoding was fixed) By: Draal Conflicts: configure.in main/php_version.h --- ext/exif/exif.c | 12 +++++++----- ext/exif/tests/exif_encoding_crash.jpg | Bin 0 -> 7599 bytes ext/exif/tests/exif_encoding_crash.phpt | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 ext/exif/tests/exif_encoding_crash.jpg create mode 100644 ext/exif/tests/exif_encoding_crash.phpt diff --git a/ext/exif/exif.c b/ext/exif/exif.c index bd646d9adf15a..2fe54f7b31c3c 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -2643,6 +2643,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP } else { decode = ImageInfo->decode_unicode_le; } + /* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */ if (zend_multibyte_encoding_converter( (unsigned char**)pszInfoPtr, &len, @@ -2650,7 +2651,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP ByteCount, zend_multibyte_fetch_encoding(ImageInfo->encode_unicode TSRMLS_CC), zend_multibyte_fetch_encoding(decode TSRMLS_CC) - TSRMLS_CC) < 0) { + TSRMLS_CC) == (size_t)-1) { len = exif_process_string_raw(pszInfoPtr, szValuePtr, ByteCount); } return len; @@ -2663,6 +2664,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP *pszEncoding = estrdup((const char*)szValuePtr); szValuePtr = szValuePtr+8; ByteCount -= 8; + /* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */ if (zend_multibyte_encoding_converter( (unsigned char**)pszInfoPtr, &len, @@ -2670,7 +2672,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP ByteCount, zend_multibyte_fetch_encoding(ImageInfo->encode_jis TSRMLS_CC), zend_multibyte_fetch_encoding(ImageInfo->motorola_intel ? ImageInfo->decode_jis_be : ImageInfo->decode_jis_le TSRMLS_CC) - TSRMLS_CC) < 0) { + TSRMLS_CC) == (size_t)-1) { len = exif_process_string_raw(pszInfoPtr, szValuePtr, ByteCount); } return len; @@ -2700,8 +2702,8 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP static int exif_process_unicode(image_info_type *ImageInfo, xp_field_type *xp_field, int tag, char *szValuePtr, int ByteCount TSRMLS_DC) { xp_field->tag = tag; - - /* Copy the comment */ + + /* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */ if (zend_multibyte_encoding_converter( (unsigned char**)&xp_field->value, &xp_field->size, @@ -2709,7 +2711,7 @@ static int exif_process_unicode(image_info_type *ImageInfo, xp_field_type *xp_fi ByteCount, zend_multibyte_fetch_encoding(ImageInfo->encode_unicode TSRMLS_CC), zend_multibyte_fetch_encoding(ImageInfo->motorola_intel ? ImageInfo->decode_unicode_be : ImageInfo->decode_unicode_le TSRMLS_CC) - TSRMLS_CC) < 0) { + TSRMLS_CC) == (size_t)-1) { xp_field->size = exif_process_string_raw(&xp_field->value, szValuePtr, ByteCount); } return xp_field->size; diff --git a/ext/exif/tests/exif_encoding_crash.jpg b/ext/exif/tests/exif_encoding_crash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55138abe55210de94674b32ad39676608e88b3ab GIT binary patch literal 7599 zcmeHMTW}Lq7(Sa#nlvrYlyVUnUCJeep-r-Ffvjn;qy&ogLRu~OWSVT7we4=$-I}yB zK7bd{@u7`(24{d)MIW321yN^I6a{<(Z-72n@A4wx-O-8vIoWK|(jrmu#hmPE{`2pD zzW@Kf^Y58%PV#i}Q&h6S-{?mawB^)tgpy-L53Y?1T?jQbp=Agm3o4>!AOlFH&=XV% zk*y$)Ql*H7Zwfw$nukn8M(BC!T3tRwRcJPVK)J}=>%i_ciY0Ox$e$QyW^lF($e6;R zxLvz2GTH$BJap9DcvDL=<7)}Dwgl?i8(W$+O@rGBcX9M267pRimO6Q+H6p2!5|N^e zuWbcW(IJRoDW)t%tkYG^Ia$uRiorrP$GQ>oFMS}2CEIqU8K5oOp48=%9pzf4z}pVH zCWjFkLdXpBj82wy4bf?4=($5iU0yy+rEDkz4aOpAl z9L)w+eR|k(Wr)rGafbSF-J#D8h$0{3p5$q zr}M>fI$taoX4zP?BcZa$93QVj9LVG3?I%;V74LAUC)Q_HwmuG$S(rk=8N2;FcD zQa*(ca~L7h37Cr;U~N2rP?-&6{3KAou7NTTAJ`8y{~Y`UHu5dcK%Rj-19=AW4CER3 ze=?99o3SsVs!`725S6MR{-3rgB=tGs!KlMk<#Zs=>UcC5>fu$UlkXP9I{SC8zHVoP zaGkxQw#nHP_3;s5{h-XZ4K}xj275y8uzj`H>WOplzGxq>2AOzYuc&bGIy(X9K*nl^ zogpS_Po2H7FWAj<9DXTim!w|CUB$9?z>vdTT%f_PA;754u7w(l#j0Y}Rg&E8aJk)X zhm&=%Y$aG!Dg&Y#j8}@vLO`%G1fzjhLb4E51xaKuX0TK0SL^I{E2Ba4;918WM+3e? zcmOnp@!%onllr2P$cw7tlf*8eyI&4sXl#)3*T!!lgVd;3@VYz>>=z_#qpR7;)zy=$ zo#WK0f#%8M_^ZG&k;}ZI@ZmLrsLorq>|25VA|nCy*^>HuhS>DN{WCz31YW5?d*~p(KY^)OLlptgG4Zx?J^^cajsudAjm+<-|Zv#`)^X)0GngIT`1x zD^FKW4CG||-&9xTt(zC&RXYan)X9&L4}Qm|@TE1{MB`RqG}0z>f!U0^rLd^bVzFAx zX6rPowWt`Hxp4Z7X~omAj6v{pJPWR3i`jxLa%;&qkj(&hm7DW5to5&3-?*Wz{gzuh zHf_Ew6z03SBf=eu+J9#(J}`LqJ@?+XeaHO|Bp!PBkw+hU{E3}=M@FA|`k8&tK6l`S z7Y`nK>F~?1y!qDAx8FH-{KUJb-h2Op4?jA6=Iq#KpMUY?S6_eg?YRpVzyIOKpML)3 z*WYknaAK57OV4aVUN(HZ0&8G2ntj!;b6!{+t6zC$M1U|sGyT){scQ3 BQ}O@+ literal 0 HcmV?d00001 diff --git a/ext/exif/tests/exif_encoding_crash.phpt b/ext/exif/tests/exif_encoding_crash.phpt new file mode 100644 index 0000000000000..1c4ad63860346 --- /dev/null +++ b/ext/exif/tests/exif_encoding_crash.phpt @@ -0,0 +1,14 @@ +--TEST-- +PHP crash when zend_multibyte_encoding_converter returns (size_t)-1) +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +*** no core dump *** +===DONE=== From 2fa5f39e4c489495b886214aa788d0fbffe06446 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 22:15:09 +0200 Subject: [PATCH 0208/1256] add tests for bug #62523 --- ext/exif/tests/bug62523_1.jpg | 9 +++++++++ ext/exif/tests/bug62523_1.phpt | 18 ++++++++++++++++++ ext/exif/tests/bug62523_2.jpg | Bin 0 -> 516533 bytes ext/exif/tests/bug62523_2.phpt | 16 ++++++++++++++++ ext/exif/tests/bug62523_3.jpg | 12 ++++++++++++ ext/exif/tests/bug62523_3.phpt | 18 ++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 ext/exif/tests/bug62523_1.jpg create mode 100644 ext/exif/tests/bug62523_1.phpt create mode 100644 ext/exif/tests/bug62523_2.jpg create mode 100644 ext/exif/tests/bug62523_2.phpt create mode 100644 ext/exif/tests/bug62523_3.jpg create mode 100644 ext/exif/tests/bug62523_3.phpt diff --git a/ext/exif/tests/bug62523_1.jpg b/ext/exif/tests/bug62523_1.jpg new file mode 100644 index 0000000000000..9a63d1e84d90b --- /dev/null +++ b/ext/exif/tests/bug62523_1.jpg @@ -0,0 +1,9 @@ + + +301 Moved Permanently + +

Moved Permanently

+

The document has moved here.

+
+
Apache Server at getid3.org Port 80
+ diff --git a/ext/exif/tests/bug62523_1.phpt b/ext/exif/tests/bug62523_1.phpt new file mode 100644 index 0000000000000..28d42f021d073 --- /dev/null +++ b/ext/exif/tests/bug62523_1.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug 62523 (php crashes with segfault when exif_read_data called) +--SKIPIF-- + +--FILE-- + +Done +--EXPECTF-- +Test + +Warning: exif_read_data(bug62523_1.jpg): File not supported in %sbug62523_1.php on line %d +int(1) +Done diff --git a/ext/exif/tests/bug62523_2.jpg b/ext/exif/tests/bug62523_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d7fc6c5f41ba1ddfeb20e0a90959ef9b347687f GIT binary patch literal 516533 zcmeFZbyQVfyEeS`rn`~u2I=nZZWKhiI|QVW?oBA5ba$sBD2+6TfFKegDBb-njPpEa zob!!$obQkC9pim}6X%-Oy7xWnUX#tWt~HmppKg}{Y-M>Rc>n?d00{U4+{Ouy)f7LwzyC&O00?@&79rT%|1^^i|XBX$+M=CiD z9V%Wxfq5O&iFZNwazlmD_SPFvqZWcU)eB8H~eGghXTR4pq&h~i-LAM5Z^H}PY@IQ@c~bBi9!2aJ9jzk zUv?k`wBKr&IWNhi0>%k5{RGQ>4jjUJ0O1Xr~Msbuu%|Wf<7l8E(h@) zZ^k77fJPAi?Q8ts`dS9*cW!$0Yt2>cU)eaP;$4C4QZ66g*3|5XBG zK>Xh+f!Uz_uM${%=l@3utOoJ_N(pQReeRS%bUXm)1o2-baEKhd82_(I;BQvMiFKz0 z{>D^b-M>m8HsimPz)6aKDS`7K{+}v=f7QPguBlL43#h?yxP0;XzCTVpk9&g4~k|#El?E`h%xIjPeH`f%xBfF~%Q$ihq53 z`rjji2rirQ4s&-$V(vp%aNBrLj0E_e*^Jf zjtm8*)BhDmMhAWVa%6T8|K-Tm;0?fEj_e5HzZ}^e#D6(5?CvH3OvYfmz_s>^m;W;S zV&&kH`<38;+aS1K9^l@C+buv3D~R@OI?aOu@zft7Q69{+9~>pA2{RW6)pg zR$E9AME|DyWBL zkJD`zfP)OU0=aMy8UTs|fy05^_T1gELg64_`aLD^h=2$Oj|2susDPi!V*?O4I5-Fb zJR%|z68OslfKPGY0R$XGTxu>PJSi=Yi{F@p$x#)<<576P8a!QFN6s}BGU2cDV>7wo`|M!FjT z-;A3lB(Lsv9zcf!FFOt#4j=(&2H$+v`mU|(7Ho&GP*_@7G`jA*k*oYJ=&(ouPiOH< z^5_0$poXtZ`9?bb`a}@7Y0@Tzue1g(en>gsTbzs+*;8eMy%N3@xgb5o@0VPWH%ZCo zBvgy}o3v;dzP>(G+o)QUJjxQK5>XTRrab!g>loo_V$`W_A#c{=P}hE_z#$=idl$9m z$ZWI5rQ~O!-qpIr7mcj*^po3Ig+8}8E|XgIf{mtfwC@+~PI29y=F5B3xlNvV-FWH_ zjc7_DM%;_1yx8K_(LEnsO{AscB5r|bh|HQD6#b!!AX7qugineb=>@d)Ld0URmrr}i z@9kXhm?^o$fk=t=!rr^Ta6*VuJw3c-co`*HatwfNiK^7XA)jeYJwr6 zQKd#bAJ@+^W$h5Skau;aO}y4R$a&3^$=_K9ltrfHmfGYB9^~n76qBadnze4Px#v%4A*~dc zvJ1ZY%8Ohsd5~YH^gz9*%;U9nlTJl5mk!_>B|G_P*ev4S>>5F73ox^Lnb|Ix960{ zS&zkGomZi8*b0neVQS`29S(wUED*-JuHJw59T#-dI~q-mbMiTGn{0J#uCcsN+#eHs z@S>Fu{v@(K^@<>-Y%wjR(T3cJF z21xbzaCKg#t3Y%Pf@2Hs(CN=MWt|Gd!? z`84{3YbfTmI+5efX9ab;jRtW%K^wAWpR>t=pUlO|sV{LQ@#p4Z2Hf4Hs8Vy6F$*%C z059~e#%o4w`L;HbWqW#Ljb{zDOnG()^hQF*&2f_7l1fLhs0*)(dZ>_h zezunR_@Rz`oqs+bDtWk6bEz4?+dwlxed^kxMU8?+n}mu&D{gG?;2W#b<0m~U`rS?B zh<+Rmmoe2BCU}J7cFMjzsbR_870)f9eOwz-Pf4jCPz&wBc2}4q*0|@04l9m&nqMg$ z6WDGxhV1zEnM>#9$mrdtrup{KHU-C8aH+qbH1`-Hc>b-rKZHbh{A=UurVZd0xNrz& z3eu@&*ZM{plNu&Z^9&v@d1|yU%+Z(Vrp7TxZ}p%+i%PkxM{)CL?7D2YC`c1CFQ9u~ z&E~=h8z(fS_6paY&d!j%wWOnw-j^}dohQ?J>Vdw&QOG?5I{x720;%+jJJlJ${jR2G zMW{k_dz`lM=%sK8N>>_aVf>nB*iKneU2P^*oNemd!}TI9u1QscJ0B%C@`e<6e?BFi zDwjdU9D&T>U*4zMK4u&$n@bbICFTFbVNBn+=Y`JG;vTI0)+Z#v|A$=N7Z-{0d4c0EFP`7$kH=Nfmk#?ZkcMG4oAfddb(!frkhguL z{$wFbuASE2Ku>U=aYym$hiUp`TDAghHZX$z(3T@lO2i{ufdEn^`yG*ip=;`NV=}ZO z45yo%I5sCU)%HUG_F-=H^N!&*N-NBWl>JYL%+0t@>zYVWL@h+G?Kun-j{Sd^c46=`mOz)B0`* z3g%rX4UElMMvc!9)2KWR&1NTfin@{8t8}4!SWSI&^C4)fd@+ao#Mh|*^5jO*gnK_z zqi5serPB04Z z0%K#8I%{j-2)Pt15-JQCo-7gF0M>-}JjyR&C_|u4J2UA=*#rGbM(X;!M0WeBG3QGa z#-)6F#*Z;4o2k`tMx8dr3ih^%B*yxAeKPk4+?rK(SD*T07p{tr(V;KzD+*^B^|qT7 z8Ixa-d9_Mu%XBLV5)B9)5yS}>mKidSCDP>WYKkRgzvAT5F{>7UIj5*XwBMqzuE}2x*Y?eF{)5sdW>?F53%89Pwi-&sbjyg!RrBCo; zw%G}NR{E~-%3s0b*;ka!Ww9fElkpyiXqs24P^Rai>axfV*?klIqLL)R!@L8pHyO2> zZE?9iUyUSajb5EKle*YTE>AY51vdmE*#AI%S(@pY7lHEZsf&t1fEuEOdcyWV2h4ke zs)A~kM1JWfQ)Gu%5$9_3(yJHx+vWY@CiaPTFd5v+7!Jp*B9v8Q9qIhM|7G}%uKR=fOs$D~9ja(7<{#R66ZYNg zk=?pd5`+qhe>f-Ql;#kOef4DozgP>sb%SsO!ag%tR4%T)NjR`v!3uq8a9BYdu})Xi zPo}Bahp%Rl`H}5X`V--K19l0%4;E`KMR9~|hXZ^beO6U3@#c2si=xOBGIFHotxNg* zR)we!p33TdN!SpZE_5tZAyQrAv9pLkwwMFF_JT$tjC(U)ZBLZ8ni`cAdgAokKE+>b zm-2qjc%l+kGaw5KuB0;)k%9xB{-9W>AZEa&_a-xUR^57UTK4tpJEPVY$y)Z7({?h+|wM@yvdRNiemZd|O$YY zAY}_xh0?>w_>-m;;}o14x1}FC($V>%>-JHS^GMlD_grS?D2H$}`#B%qZ)9whF&ur` zdke75=zd307Ae$F4j^^R$*4+wPuZqbO~N(gW=MF?xUcC^Y`B*n%eTmn778lJ^YzIg zD{iZrpBfvVifGUvyVB1>r}3-$sc=@mI~e9TIoXe3de0=*GlzeUvu2{%5R8gc6{21r zzR*%m*QhT(Kq5MFoQ0 zjga_-`(tEw72@YVX1Taog0E8w1Kzzns?KOuY36MqRitCu=ujd9d{@61ZP-;SS-rr` zkYfI%U68;jS#)->b2XgRlQKmv*vA!zj+yoe9rCh^hrHu))M7>orVykgFC0HE1Xj0< z$@KR7^ogSYzXqK$>KVSiSt*}I%K(e>QwQVV;E2ylu7FS3g^a6iAp5=X51;OTX$>AU+B9t*Hlj6g@J&{>-QqP~NIv^bFG_f*^7 z0T-6#^-Y_YvM%{Jo>HxRb1(m%f%LpKz5vuMvAu!@dmg`e@(E+y0n+<-jh51%;#Y5; zZ=3YLvgbP(9-78Gic((oOJzOa%YRto&6@J2N9CmjRop4sqkf4=UkTK%s=Y9sg0@zR zPIZqy^#F&RHanK~XZbue937Nav?#}){YWq`?}un$cc2a^e)HpUQ}!!N43}KONmOn62*k)N*_ylKyN>6zApY_7&oii&2lvdm23X$+;M4w zIP$Yy6E}WtSlr9xkHL1KK}FuRK`RSa_NPt`w7R^A5)FwxljI(L8`F;+b=q z_Ae{GXCrXjp7^mU0DCx26qo)sR zEbx46JRVvpUR04P_TFm|9BcI|UPPOl&RSfr@M=eC9no5b@zVwFkD*W$$Ee%6jW>{Y zEt6FNHWW<_CmyJL70S}tsd*VGBr2m-3be^x1Z%Qd!ImeV*4E-QZs%^lLj7z#Jza%4 zIGjD$%`9Eat=KJGoH%^UTsc6Ajsp;t@NqS>aIo^EGPkm^a~7l7?RZN=WoIcyW5B1z zspcwUWoxJC=WeCrr><+^=U^dZNh2XnCF&#W3ARnj-a?^md-7T$!wPof1)CJGPX#NcH$&)ASPk7i}+-*3x zgoK1RIJr5vx$lD>_dR@_J=ifte za{Z5H|J%9$b+okj4?kBgcgJ6yTUu~fIa)bcIeU75apJn0j+3jfnv12KwXdw1ra_RnkbBdLd2i%Z*H#|!VVGDOFGfx-yKeN@ba{GfE?Zkh-U?s|NH)!yb z>NooB!ttM~{&M-ZdH(eUgLeo2<0^<#{qIiyT1QsS;Np1#u9Dkr;DM&Ci>Hf+t&8ig zx6K5lmDJ$x9w-0+H5n)?f+{T;6dm2tpFd7K&bzvoq~^Vz%kqjo4>{n9^et+5TQsAWE21u4U{%Dv42UM z;Ls4je^5|)2jx>7cm!N(0FeuiMhZy_8PrbA2&COmLI~-2w3E&A?zz{|^U8D+F@(Y< zzV4y&$?90-?=$l2dI;*(gDrvq{ng{&4#5Wt@K6K@BDe(}{8Slyb^yJb9Kv0P-~${q z2owi^qvnFgmC`~ma|^+vNzOy$uIt{L_=-;}t-X&#VD26Y_6*Cfm!ap?c{j;mk+R|u zcJQB-*25iySnI85ElGnQH_wJ{q;9%U!GeLBu&GJ|Ui(v)S6w?OD{n%7x+8ts@4q)w z>{yNh$uUujM~e+`oG=d6=k92wjOb3Nv*=AWEF*n5C8ci7=#pLw0=tcEt3&I|2b^diLXZ3MfxL~Tg*XacydPa z8^)uwO|?tN@&rp*^26Y_K=f)Rw%)s7az#4`m(o3cgdi_KVh@Qz7#7U}(WpZE(IhAI zWs>vDJgb3y1D_(a!*Q?I9iPxWsgAC^E$MX}(^EB%<|u}-vyQdzC3-1#(LV)h>kO>O zf)#I8yZ1M8?tMgsrK95e>1HeFJ#ohjS&`yV{V>EX>4X$O+}XlK1;bXNf|2?yOj6Q3 zhY6Af+DE+=t<(R~RuHdSk3bp=)itc3P2R575IqnkrdObe=ssOr@0FjRTB&)Ydw=BB z@#Z{gxLJNBiMVcPZ+Be!TYQPwiv62w-hMf0e%Q8bhSs2gHdYM$CusHg#`PNEFw6Z% zsXsBoTaZj>sOe?lGlOQP{7yRex*4OUtzX=%lfFyqAVV!at9Ljr-z=0eEcrQ)&%|=1 z=@0AgHKaQ9I<0`=>qbJ~aEwM21gwrWHcTZ^y%OFo$}N@Pdd<>mp+9PuN!v{^5$HU2 z{&w#jmRDuWcR2zU{yv3Rm)gC6{=r+I59y`vc4xcY`8FPddDoC}i}Njz-AA#~_*lq7 zUQvZ*uy0)L6M-p(LTI4R_kp#v6F5`-#;HNC|BDRGWefHeKM%0>MaDAY~l zG-o?$;L*AT#LQB0TTd#63YlEBP8|g-`UfGe4`l}SryT9ptVm5vbaAJRLYl~+?9p#; z0h@szQ1fWdsTVbyKPGAH1MOWVN1QTAR#mt1v!elR`5K&}_LD5K@p`0`KtEsjEor|Z zBNdYvHe`u@QOZp5pxDg}9wwQ|ObV0xn{c`%I*@N$V_F}6Xw28?@0xgNQB5sd$>|as zy>`MCx!+3!7lXP~M&|zGpwM${^8{wrn_@Vq&3zc6>N;eS_l%UVxO7-wBRNmUB z5cFA`CWG&)e%oOj!|yOw$xi>?voa}htEt&dHMmDB{Em-z3@jIGU0l>FpW4TycUCQ>r1~E(n zui+{28~FUp!nhb0nCAO-?JiSHB~F8CKUjxTlvF45I2EzY8a(Fs(j~e-{ah4_WtieB zA0_ozF`tpK;9+$tX6cJ27_12ySaV0d z@gs4QVQmr$3NtacK`%_&JajT>e)HBKEP3(Al&zlePLN%E_#8Dd!GWkL+0~J;_98-x z9dB_eOQ;WhmkRRRJCH5)mwzl%U-;G{*^=W-#m+R3zPTvNBj@R#AMF;QD`TAl=$5O@zf#DEK|4(0>n%T zHgVka!iM2(3+#*-^t|ELn5a^2zAPS2zaSQzD=(qsxW~fXi=x_S85as6u#BNPU-Qoq z^Cgqlh@KGs61M3bgn$?J`?pAImUNuM8C{!v|%N2nJ<^0^7lOe#Zl4Y3=cv@R_A1bAw{L3 zDn8L3%L5@R>FB}oqibFZ|7?70ALvh4jDU8GqWCBCUY;i0W5P1AW)O1fGY!)Shj~kDc%fZwPeL4^c@a6ZP z?f=5Pk@Owm4Q2K|9<^MIf~oU@UM9V8YHPoPqAs8p?cU|A`6!VJvUVLUu~DgB?bLl7 zGf^xOb9OR+3lJPQS0rW^a>1jfsLYm}W9&i)c2l-5<((?}u#;uO5x%?{wupbrtMsis zyh-upiy0NXOI=P(#WziZtG7T$_u&MAC?VsHjCNClEVi;#)I%mMb3>rSgBm?-jCLjR zOw@l?lUO#yR&!DPLw72!W2nL<6pJ=HR5=x3NDrMTbGR0`1teVOUXWU|AlK3{hHT?6 zA!R=?@m<}fEdQF35z9UN8UZ1dbftCQJRUOQh24-*`ZO@`0kxcOXw9YP^)g!uZ_{}j zO@EmC>o#22;}8_cs~2#}NSSXl>GsDX(3jyZ94(4i>4^%g<`qRJ?gc9DA!+KHH~TFv z>~5pe!@XBNM9bs~VEMWDYFBZMm{w~ysSffTjUZ4WdCh0pfT7=%m^`3xAl$ZrG*?uA z$G4t!*J~P9)PZ-d_STS8hwI}7PoRg`avn?)DknFuw!45w?KkH$}RAO!ViTiNwOx;G$$S-uFbu8 z+Es1)&10*97mAYFmBX(agRw(`-+Vss-D{G~N$~4_S&#FhQc_zmUZ5q`)GNuS)2Cp3 zDB6(jMw^?7DDx+2`s(JToDGj=Z^#Gdb0N%fqj?}tiVBmsa!;Xazw3NcUB7yK03~FS z(vYn?YN_DK^^8Gp0`jKUsCk#*m!nNY*@EX>LOLHy_FFdLl&Yepd*Rq+2&uKA=;lx{ z64V4Fej<=;I%XIZyH2T~1KfG3HKLZhRlKZ7~dn?v*KZDGR^fifb8tZ7u zM9ccqga_Xz#4RjrcjT+muEphI4{_}_$gG~AC%+n{Jg_WF=$+2sfDf{EA*YQMF`czq zSRi6l50#iod64ay!Yn1Cc(tlfPt&z%CO;XhbR0!CVZk+3=b?f1HBDmr4MKLoq11!k zxM*frBB6OO^tj29Xy$=6VZHqtX~~IrVvOp1wd(bIK|cZ7_rYUw>gzT(&>$}D>TdpQ0i=1QM# zB^AD%%D=3$d*I77R{2$YK!9wV087nm ztU6gF0-7rq2$%V`<1~el76}$f^4<9ClZBX$d&oCFEA6Ot(dqf2na)DjZw;S^b3OJg z`_M9FsupK)9fXlSFTFr}O54C?>b^rCdbMrwXvODSMc#tZJCLlxFC<)Np|Q-V4Uf&o z`n!tyA4#mhmi$PJCEh&Lu}zX4QK4+Ws-(&i=g?YD$WKsd9+3amCXziCDhN>c6c~(a z+xKxBzg~}ZpWr`{ZkAfp+;Bk};kXPtdsdpxM{cUH=^Q{^qyitByW4=#bWId1wnE%= z)$AU?RHVmZWn^)b&dKCDgaiwElHiX8C^ab+e#W(m!Y3tB`Q)foXkR;X-4Zk=txoNM zk_YE9wghj9pV}VN{^t8kE8`1n(To24Ix@HO=lV1UTobg6=`b0_7!;gCof?rGC0SN`$~nqc>9F@ma#{B-k>N>pfc-6~h*3w=83bWpbdS zrnusPqZjj}2LXIsVM35rxAuEG0rN_C=Pt5)nyoq&j}F(6Nm*$0Y31q)!QL4ZO=dR=!G>8HA{AHvaBPJJQCyzpzQ(Wba;m{ z!-^1Aol+7)4~_0Oxd=*hmQ+ukP`^b>$m~*0Bqi$U?3HQojHgPAUYi{(Sa}UN41Sl1 zryW2loaAm}%6d{qm#oVyhjryYvkz2m%U3ZMHwG^96cHFEdNvquc_MqGjL0JzpOKWQ5Z? zEzV6O@3qsFQPuRUi{p0CTA|g*xrOL2qPGYgqk`kMn*%<4B-!e`*};NK*?1qvW^Baj zxcf#iKAk`W&y8Yx+hCc4z*`dW;+-@D2R8=RqX$#ln~n%OIL#%| zpMMQCPcIL%F4?YGC=`iB_Y>T@Mus+dP5my~&`8>H!u#?;r}ZbDmqwJE*2yK^ zz8=j=b|JQ$)F!ON;6pX~j6zCYW5WZ%mE>~UcKr+ybaXOff^suVPV~N1G!Mtw*9i}Y zU|1njv0X~LTk&Nn%h-62!YTIvpt0BJ90gEvZ#`6PvW)BZBs9`BVF)+a4Ck z7qVjrQ?xH16bBn!t8G!>D(m9fue`ho3tD0m%s{@BN-7{Is;6J%P)C)780A+vgrenp`^E?Ww$(^G1=rA(rwy z#W)y>M{6R!q_{t)#A;^UR4b339P)Prb_Al6>My5+3Mng<9vcP253U9ksoofMt{yg` zF<7DZxK9-%Yt7Fe1Ymly#TZO4IzCWFAQB+-0r1w`<&pxi)ba;VS{>J)J1kZtx8l7f zp%3}?8Y92_!ty@bF2?S;wAN$;zURv; zQ^AVI;17^Of+PZ8*A9)!`36pJ7n#$W$&9WZTr-b+jSvpkTnf>@-?oBI(MktH`F66H zn9WgqpJwoBHwN)1Wh#mcagGt+gTR@Ql);`(NPOT#L-r4ZndzLiruDkl9o!P)Q;dU=J261c|3NoDAC}u?*TQD}NkPDr|m$o$;4EG|u2SP~mhLM%O8PH_2_s8)Btz!-WI^f(zc7(z)C zweH+~ehVPg&;|cQ32M<8Go%`k?SPb3Ps0bMZe!Hdn^)^qDT>f)_C-?y6SaXttG%8} zh{>U;2xGP7q417Md-&NHklsU^vBCA~INYJd?_XZ_NHG)8>3mTZ`jUN>n+v@NEG#8r z^&>5IS8GD702WP=!p0OY2uykA?L=cC;{ACg`%+E?f%}3c zeb2zot3XjBnMM~8D|=^(#qd{4Ust`i!(s>n7rl|lqSA?A^ty&K=J76{?uBca;tSqL zjOm%8e=vNn+FM2UO;4zaqDSOSkYdxyV>;#c!}vDMKapzdD1F>eRg!Y?6J#!vVER_K zz&a`6?8uS!ssz4zp>%PzIYjOP`~68luV|aCMza0Mz3mGr zlz3*wx!StZeYs!>+A~UqE6f+Y@q$%l&9j%|6W1kUgKt~n-;yJ%a`&ei9Ht!Zz9#2} z))%5R==bHsJ^r4T3N3j`NJU^aC?51Bli}ullG69my|f}s@3UNE+$|Mfnl^A$2NM07 zx}O^*LUUSdA1e=Ajt3l5CJvEz7u3;(&lAVTQgH@iNmy)yqg1FC#pY%^Cz^Qrq{o{3RP&8oAgBAaDqlPz@-1MX z*>4_2>oVNuPX4Bcd_iil`;2UVy1$*5z+9cZgo8f$A-asQq4s)LGqit<-+t^tv%qRK zBpe+w?JT)6sOSh*(Ex+1}|D)Cm*6X zdHx__KKqI7r`j)=d&VS_bY>w`{=#|tkf1Tf6t9mzLe8c_EbvoN<_Pn< zR6SD)kn*Z~3k-Vwx%z4)GbWW3%d|z8y_hjY3Z**m%WU5%;%i?x_Co3%B5D%fW(!q^ z!Ek3=)ASz9E3^iQe{48e-97v`aivViY?4?qyVpyVuK0w$x%KMjV~fPi0WvM?`joFT|n69mH^E);ily@P`)p%HWnh)BT$BN%%78V|Nz*?V+wdTnpBa*AEfc zhzRDF&x_BH#*$AfHvL=Y(Ao+fYKPcS{CLt;(<-rjb^iUGSBT9mKv=Ty8bw>XL|LK6 z;ril&BWp%4eVkdH2%$EoCG60&*OXA)FFtms2w^0KW9Qe3CAC=iE3LBzuPa=)d42x0_i!3A#{mmw~r$ z<)x={apeN|gR38`mnV4TAsvk4jl@MrS|%?ogn|D7P)rA?m{SD$)V#!_Rszz{ku90y zU#mQ>(?;4pTMir3k%nocf62*`)TL-MI*++|+MP4K@{9ytxOv9VvdOQmn=$2Z4ZO$S z;++n#d0-$v*GANoWcz6&_C^g`zvid$a((#u4FryfnYuqnqi>yzD+>z-G8h^VU%^n%bc!t7j4LXi`VLdQ0o8;4mNm?Wit zc*2O!pFDyw+l>^#a6>N~bu^bXM4o@oj2ab%wJkAorSo`Wn{2ae7l&Dk!eV#IR{bJd zu2yvl-)V=XuBJ&5{5nctg$3R zvc&6iGECv&Po)nyQ=dhs983aP;(Cv<2|t&-NAzYwqPqo>*uT5oIPuHt{@iwd7m}Wl zZ(h2@9(lfp6c&J7W;0ykGG_ZC9qLhfTIS$+`fSdqTdaz15+ch|2T`PR>gYH?I)F&L zGkzt*K$JCQfV}E}5LJI&kwwNN?(;2C^x3yjZImI_@q_JY8Qirr#9Z>1^VJXMp#d@^ z5~}Ui%3Dt3mh7U6y5v0w4F=|I606yf{*`2*wQ)`jgEW3zeet|=AF!GQ2ORh%m(lnI zMUQZ}IG!{A&<-ppa+*ZP6S5};HlI*eJqn;AR}qk$46vMWFX$hR4vptPF<^WUmT2eJ zX5MEuD3Rfra#^*nXiF?P_plC=?o+$7J@7je5jtwrTVvW% ziA1LwPeY6=WM$GB+jYQo&X2GNF~0%-NE`LSyZ7#vKqS78<3W+&4;2PZa+VVlUZ?5> zyUy4VMc{}|_DqS1*qMS#35)*5FJ1d<*(sSxP1cgv7}XCKP9rQo&=~T-ke9-oIF_2Q6KUAe zoO;P{13R6kY z0x|N!Gama6?kL>?ED@Bc)=`7}x^DMkJqFBu`LU&wC4&P4mPCEXP|pXtF=*mtgDbUW z+}1hkI(6#^M!QwFT*?B6N^i}qNHHDU0vpa%) z(-LVUW~JBFhftBs^F1XRUO3l!sBSoi5(;bMgt&67Xo~T5)E4f#eQ&<9mc{yxVhyWD z%O-}q*?Zk28AKjsas&Suc$I#{O4D0_BV~-7-DfQUJAj&t>*r+!5Li@?4f+jarr%kZ7GfLnwScJ(;jnbXwvA z?1k#0Y{+;!#8Os=5~$Wm*A)y1xM*$4qvBmE6-bURbRYJ^jevXbsNwMLd9+y&pEju2 z8JAJW#j;2>b#j!!mqEG?5v$s41Fj3^-mhy}KHqrY^k_U=k(;21bWdh*DEgrpV<_aF zx47h?mqIT5f#kY%Qu|o~QQb#wMGc6cIP_ffoG$=9O+{NjwXO(m_WR1~L9Q4zwJqY$ z9`~w*1I(NyheuHB-*d&QHJZB&_ZYgDZc3lL`fNzpgYAD5DNan=njdPbkU`*%o|O`x z+k~Lq#YCZYPN0yhHrg1@#`VqN|R}ixisGUJ^ns_yx`f zi^`3P48aY9blGg4OkwH?PmV2cBOhy1>NX5N1+1YNKNf9*Z6|V(G*J~HT~A35o)kr_ zy!k;a9fO=|dT3!sprGLw?rr`SwWy|6<bQOiZKl%xoqD9>ftp4aN`YNK1 za|>TaiDiO(B)u^@)GI@69Eg^ce7=h^d6>1FOU7Qg(W%*{91C5`h7y_fPw(=n2J{rC2l$ zPrtQ4&eZoD?DURArBRU=fQZ2Cm~a8c&j6v)nYb|ePfgS!Z~L2v4-b5-^~qpq(~y~? zO|{N_w<+D&ET`MpM`OYkGy;P{g!J#ql52t&5;N3yHt#39KBWPW;&n4wf?ZO z9*ZDR(q}ua!?4POsUeawc#-VJL}?>PDC>FT5({g6IQEX?U6|?yI03~ z=3|Gb#>tl#NfPKzhPq|8C^BN0iTXdZ`<*iPCkz>^(YrXz;)lKkZI3m^YuvJ8HV3v-zt8i+%cChtD zFKQl&cX^M9%f7v=-I6T`aY(=l2@vZY{8T!5VM#&47x@&*?4%JRv7FLfpiBIm+sH=E zdoE-1`}WguY${e6W>vYio98wlx#e(UG(dkpC0)ocgTAb#{}_uG13C?V+wy3+m`C{W?JJWZ*1Y5oInSbSt{b9 z_LhBVBHES?ioyS6*PL{7iKIUbe5P7oJt=_a>2uhTwP9E5uv)AlK7)`JrANimwzy3d zELG=?B;b#;l4!WEU8{>^z@e7)aPx=akQOsrMhMI=tN?c!-ouBTEI-WF93`NqvAk?K z0p%P%L9!a*dRTUlwQbNmChJqrI$HSJzMiLCc0Rt2B$HnfQY+T+Hm))RUnOZiRE-y3 zjAZO1xw*9>fLrJAkfH+EmP!w=o*29N9J?IpW+T%IkAO@i%d9Dn^4MjJHwUrx2g=LB zVYV5kbH4TfJ6zmR^M*szAND50Xx~M;_XiB7(5!jU>#z*`w6D_5){N>_g9ASry^yZ1 z-0O!`Z8gdZ=vTZcWz)h}yK>sHcAz6zC{cfRWJau7gsVvKv3D`P?}AJCH8G++7j-wk zN~s;C{b7fzIHVdQSYmLsc)|**7w+WMKw4{r(vf?Dgy53cR`)I6;A>p}Bg<_+ii>M= z2)!kPp_4Jj(U;DS_sAm+!i{lKpMQ|h%&qypjin^>71xmK*-7moD53Q+hvQ39B+FLI zp~AW`zLHdARub;eDG->ddR!(wAwB(hO8IowWT25JRN;ZXd~)&$#&oxB%*Kw?##La%!uSEL%83DG|*^m7iqqW^8*4p*CMfGtg zn##}zoj&J4a`)SWmu42M_4&2YDwkxf;06LRv>Wjojxll^9vv?Aw|&K_m$LP15R?jc z!s`p|@f~!c6986JKREzlvQ0khrYq(5{nm9L>=KI~-KHzZ&CDLBBELNUrGIcOd2s(^ zOWICGpmf^?Loqm&fhr9ue6pebd>wP;s}jzu-2H~7pyo&dgE3K1K6WlA|60nL+LLG- zNqjokyn0+j1&ud&2bIIhAl)d(igJs7{@x#3bol5 zWJrKEe2yq{=lJ>Y)C0J*I7POliz;zzjUdT2W8r*N1G}hV`1cIqX(t_tLOEs+*nHiX z*1{u%z~b@h2*FEK%Y3OMXakqZJDLcP_l}YZ#|}PrK?8TO0>DT&?cG zAa{+LX5F+>+Va=I0Qm>pI@a+x%vL^ci;G(3Il9V~wHex*d236?!G)0{11ly1S|z7k zi2=dffIa?|hVec`h6Zd5q9Z91nG_ZPkQgXa?E;6jNi+>#j*N}-7%Y=UxQhT#NtN-` zvWDXJD{$O~0;uy~j<6-IO7RF_1$H(L!@bR`tQCTiGZ5aUy}{_h7)J<-FwZn2w|544MF-C%zddLk)h z8w$q*#!{7iW@n5G0SCF5fk%->ypjOu$z=zWi*H z#Z5_;LUE==^#wCyvtvcbQo)p?vtNK@ARhpm={Ih!s(W)2KL}*DpQuflm5y}{GF3^z z)N@%0g_GN8V`Mu=wa|v-b#I23j6{V6N+E8OO;b?x6-cA&Qb~&WiNpT@5FJh`A2pAZ zi`Ow?b^uTaY}%yQ`4^jn-k>3)c!R9CpbI|TrtBcCiq%5i`Rj?Z^y!DMyCwk&-0EQy zNhn>!vqbR#0J{_k2aVPN>oZnVp)GHiYQ)!OYxC%JiKaxv5VWPxeR+0%LG0#&3Rw)4 z^Gyi-7H}38%q3Y#UH0g!V1Y!FXZ9MthZE!@ov9B`?V3 zMG7=L048*r7K8HIW>ZAwXN6i*kU%AidW8E=$*^n_V2-?;SXO70jD&ou1QJ*s4p-(9 zH)zUb8EFACl$8c90tn|^sXni>?gSE~5lJjjE*z*#F+Lles&=dH-WG@!c&)<4gYaT& zy5h)AHmy5uHXxfNq>?fpfEGeQ9ytKt@Y z6TI z^O|WPS+uz1^<1P&i=3h4Wl##P{w~1w6T6QeeW!+hs61X;ktY=?6GMRMbSk!`L+EH2 zv);PaJK&xkQfA>Ns#(5O`O+<@^D_qp)Z!Sy-g->W>B|moJd18bh_0jl?b``A$lwl0 z@=2gdYnnu=H)dl-N`dKQE8|F;uZ^Tq{0l#G*6o4#>w{y0M8%mZxAOyk@&u1ov}*X@ zgt)#KmzE}v{{WWjrRoR@9*0OWv1W`MXM%D4ry69L2egafsQtY72CJdx#g$)ifJbav z{m2Df1G|!Z55p4@A^ns8W!Rce>4fd9y&R4-_+b= zKC6aS3{>qS_Y?fl=WPxcblO&why6?|H39s*zTH3($E=bNWk69)E4ToV1%gk5$v5Z6 zkB*~~XjH4mP2oV0jHg08~nVtQty?la$kFSthE;gZ_r~ zqCrva9!(R$J~;T~@J}nUHHha9v-*2MC7La)WH-j*+yY6fJaKj87!~CXEUhq~KrHS~Az!BCO&M1PKcetE8z zRM0>uuiDRcx8uQ+D3J3h)$47m`OXyPcMN#76l%`Q0WMgvkTX%>*B5nb&%o&>M|I6C zmSZl4iwDSNV`Oe&Q~>ersulivT4pgQ@{s-MrFubS;f&T*05r9Fa{T6Dbp6z*L{Y{7 zu&yL^iPDH*M}oJw@#EY6-3J!8o2bgT(JZf(mF-M?INo_5XeNTHmUBQJ2ZDU~WfhB3 zz#2A{BdtX}UKo{zGbRaSIT}~&?c8bHB7wV(|*aC@x?C50xM|A6I=%&!B}_Z;iYZht(`^aXZ`RaSS})$AWqLo}=3$ z5m3Xv6LFS1R0aag9sxF{&;I=ss09L)xuyQyJ?jEF$w*met*h5}=e$I^ipH#DaQhT0 zvMJitxQiF$6X%W;pN>>cvt-I%NSfVOQ(GywvE91Yy_T>)!U@!*lx!}Cba zQat5PqnB;A^)CwNhInL)(}m;M)DS-6Km=|)P!<=GYmxFVpk$xcmLZmp7?D_Waft^2 zf28nvyZLcv5kdK`|H!sH^9XGm*^qtsL;w)^}ZMSNHQ{{R3Sj8!)8gSmq484n?qZ9Dssr6keo^~BHJ@cki-7~PAK32EsESh;=Bt3pSMyZ zIJ2M;z>l0W>6%GT|qis@0=G8EwT`bUL zoFH?)NA&m?WYsq{N9OqB&se5AGBi$*$V>W-`lz0%B9`n1qgS+mX>Z3^Apt=yI}U}x z2B(+n5efw7mKcf((Ee^8oHUCSq}l5T5*H`Z+}6x2aEJ*28|Jy8{{0r%7?C^rWVIV> zj6)drP~@>ZT~!_cnGcmlq}6V_QdI4u&qvE#x$J7t_1&9cUAOXtz{^>v=G5j1WA!m#%99lsx)B_p->Dpm;=U9p z`<^V&@y{oqWyp5&f#uK*3MAlSqEtb5-`Pq2d4(1q0r`v^VzY8Cy(3a)+fz zAZ6rm8SPziD3P18m{{TG!k(UqzEZ%}kLZGlEVnc0Gc~B^F zd9m}>Q8HBtZoixBSYBWWB^FOcdp&7uiW+;N%+zrq^-P%sfv{B@X(WJHowNU8?`0^8pQKCo( zQbwJv)0|B*3*}g)b``bt{HUZW%I?-4plR38bRnSttTsFbYb`*lP#k}`Jy)jhLV^DP ze6CbF?K?MH0rTU)=fxrEbxlc8PzSK1`hAJk42(R*06-&p=vX~Hy`s(7J<+V|{qx#A zyE$zy6I<>KT^AyF)78jTob7iA^%0+;% zNXs&)RSrWjvlK*M9~IE>$;D#li4uVZny}KOhWyeb((vn8m_Q*Ri5k>UIWEE8wTt9G zP8C)ubzMbvdZs_gX^;pKhX-`dzBpb|F@JIAtNxeUx;~AJB-1qbvGRoe?3YhhID#EP z^;+CooA!`69~IW$fZ-Bws?Rh6x^xGS(Ek9+{*hHb8l|#jlb3UIV0NL{cQ9+V#M!vL zf<%RYAP!XDl4t;a;e2ohNn|axihwJFSGfNGHU9w9q2m54t5q-nHNQUw@m`RZq$kgb znJFmSfa(=a@TG|sZiVgn_^ar2b}%x@v5%*2t_e$FVULf2d=h#1^U#tKCL7!QHGO+D zXDBEN9HOPG113Exl?FN_gX*w8SbP!typBg&i?|U?Gcuq0WtAJ#=fbJG{r&)}ufLE= z7{C1@kyF!`ChhpnVO9ddO&z`Uuje??+T1H7k%y+*gcBnc1du^IF$0r)*V~@7{;iCU z4Ew@SQmaL_I0S+LG<=RccoZ+KCl<7&MqNmH1|O8utwdj8(vr(kLabf%qtokO(E0O^ zAd7GkSW~%{Pul+g_ir{&o(MN#kKB%$B$3EQ)%5L44gU7`9mPw4ECMV403eb6SV zEE$g4pTh+zDH$tG>ehB(?ptaeb%yZC;zDBIAlyvE6mUpt9Pm7o_M!X^nd3W=yen9Y zkjQsNMFU{`)zyB|NTJ1aWUg*wEkCEB-qfz!!9=-i0=W<_T8>zfH2kzWgqY=cgG{VJ zP=#0-wvs~72DlvXX!$kM%v`w>YBi7T8pd5VZUp5KqX1N%2juo(j*Z{O*V?dgZAx+5rSnX1cSu-IV~9S9|eJi{%has*oL#XgvfTWug6nyy}JOv>C01a`o2ylf- zaMTC@us2i<-5S0=Nfd908P36V4Qp+H4T-M9>$iSov>Jq;>}(!rpN=LbmkC*?U3zKNpnd{=bbuR` zG^o+e+@2a?n51t<)d-*st;?#}Ex_Oq7(4Y@l zNm)yw?X|yh`nSpwz2$i zaY%ax7+?#ceo;6K^ zkfj6tMUaczGMIGA34z=~o^mZLTb6aCf^_*`ZQ|a&&#cHK{{ZIe0kl+GlN!|B8rrH&fkAz?1&g}J`lR_X z13sfROp(!q4BVN|gYH#Vpnr7$03(XK>X#kyhabm)KZ#NhqCBWbLUf~sJic#Ni(DVV z+zSYNRN?b1H=1Yj3*G$ApJ2tU2Lm6c#1!P6gEA6ijBeaP-DL8hR|nV+mA;CKdU#0R z67MmS0!Fd{R!=s`%Ge4o*})`VRA5b4nqpX&H)GGgGhbM`0I5D2Nh#0=U^%`iwx9fhfOrhot(HJ_`)%|B3?qnGkn8hmoCDHzcL$&xU(K{gDWSVddWMMPd5+d zVP_As!<=5*)uv6E5J!s%OZBxQ4hxlDY&iw1;Ym|uQs3_B<}YY8s}Yk?$H|!fnTHY_ zjY;Jeth82@nMm@sNupR16j@=oG}R=`#LNJJQF2C<4evo?v@Wb}9VDVs3e^7q(w76O z%O&s4`9+L&t|kmFq~+s!YEpBT1UgE@K&`~c?|e5Q*+?9k_W@GYd;930X~kOS)SstX zWT_wq4Bq;~)U!ZPzQ|yXWiCJ~U?=V*4UU zl~qHxxcN0K&&OBM{6&@>C$)Z~Yr#p1Wo$@^JU@#}mg}D>D%mNTMgCt9 ztSXxcY~jd_!KZ#U{+jAhh&7JQ?@ckxpt8X(pWTsTsUgt<$38o^B#JRmBljEP?FZr~ z=q9X)lXondLo|cbI=^JN&U;Iv%HHFXH8uzLaJeJCtV+_zugO4oaFf>3h zF)9F{$w%xw9+u{4nwB%PQ{m$kSoetk0H&)(Kp^i>Wws;%z}iR+U{w?+@Vrd6n4d6v zkj=PpLc*f8V9{$Y8z8U3N{R{oobC?AmIxNZ_D0LQkA z?Fv}l;kxTuZEe98 z)K>&o{k)OqsVY#NS>Wf?f^9)v6=8i1?HNc+fXPS+7H0M?0PSssV6hA;i6Dr=Wwe(e z4061LZT+G#y03uB8i}F&a~7eUhjL?QY7jE9j3hY>n-|FTIr62rq;7dU9t|rQJBF{u zz|K+>G()728&uHu1-9LJ*nB?_0Ar;gX%;GC-Nv8rSK5aReysfYq%0I5OH2l*7r)!1f*hqz#1rU{j|KISTx z4&m-3o-5{u^VAKjMJZG^%eKk}EDr8L;Mc|1^YPbBmX!gOK>Kp%`L*Lg{zz;=dJdSz!zLv|Z$lm9jTc1o4L?oTO zh2#0>$Db#jf^iBCrIFZv5u{8>Nnj7JLFoX^sxHz5sTkUVw4Al93RhZbd07^cRE{3e%lyJnV0DXdBS6bQ|+2J z46R&H1IRz^&x6n{s6e)pNU`y`H`HQcLFAg_`)pDDqUdzDjFkCF0jczU+U(SWB@TeB zu6}>-f2d{+^vDUJq zqED=iA;_0`u&m1!26BCCMw8mPMJo%e5H) z08K$8io2RHI}bwbZrAPfjp4xc^JB67Q$ACdnHzkF{l1(lWd8uuMf+|bUruB=wiRUF z;1cCzRooQ*+Vl6T98mMmTV5VU8wDUp!;GL`QhAzO{tc-o;wDd-;!hls0P=wL7B{~1 zco6D7m`_$!PYNBA&@Q6TH}`$3;_in49g|i#cD0U_kk=^T#}OF^LLE z2qA-7k56x~fp}rc(Qco6FnuElH5^d&1gJO)8Rt?M?c$Vz3s^om@CA~3U6CwgF!ckJ zQL!sxC}BhbPd_{xp;h4ZlZYiQgH6r!eqOhUB|uR7TT9lSrW0pRi)!)DAdpCDOq-%_ zCwA{6l6|xX@_GgHot!&J>hEjB#-s%E{LnkSwdDT*w@NN(K_NE{w!;4a{{U?}!6nHH zKPU~?{Q8%xy($cv%!?RUm-7!KdqDKVNiie^1Sup}H&y52tDv$q7LhK*Y-8L|$Uuzk zTYnx!FD+Gf;Pkn~Oj!+M`)^vorO03uUH*>E({9?r`L#(PM{H2@&aA9ukq}10>4Jq? z01yCUN0VMUPWrxM9g8|6vE20)-R+~fg`Q1c+%LuT1xzSVV)~n3_NMOyMi{+wdey0C zf3sRLUgDVnEUJ!CeMgP`H43{xCa!_69CE*JFfOx`GoNZgREPBnbDW-4aA!Xkcq}pdLZoN3>VZ290sZ=!piSFQ_y$tv>ytGcu)lSfyO3 z?AB&_-t^iL%x8(+>fc2?QGO zd=I^Z%~}p%OZV;3nw>R*2{HgGQbl#6(EU0wu92H+lb2v8lY4ST&_3SxNgvpi^K@HrW@#=Zf18kRO zATxuzY-kFG_Sdw0**p{D`SN-h%=>~gQUPOY9u*B)DnHnb$M^%sLn|fJDZk@-x85Wr zkyTf((0;!06p_e7$t0mo6k{xVQ2+pkqG$of2l)f4_Ij2jgrav?rjC6c9q=8u!f z27#gSB%n}$9nRHm;Is%CU}jJNZ%xBhiRoCWQ78`G3?@Xpi1*NBBWA*%hsD&~l zNh69nVD|6oMxl!{1I1VXSoaTu;0oz3P$G7S=3qrTMhi6AD5TfDUXM4x9D)7A9%#tGRzjUo6qe?+Z?{%2RbgB9OG8QTaD~SDtT+Jpgqa z3^=ZQggHBzy%X=AW3`XK8;|bu#TM{79&nNm^qSeWarwB3J&qy?YR7z$CJ5-Ugww&0~6}%=qQ;^f-dh3zt4K*~(q@5RT?^W^)LJg(cV2vbs zM$$?m)4Xv+jlE@DkfFyjGN5Yr04kW1xQ(oQ5zogyI8CGMNFL$Rx3#2;6w!5?6}z^U!lL#q5bN@yo?#SR5E^3M@h8tbs$0 z5AnbzEE3@$ep1vClz5p!M8*O10D6)6N=2vX_MnUPGwHj;eQ3YqjUp$OX53IoosAcg z#@Lq}4mkq4_X|jfHYzv)na1Z~d#nJUZK~#h{%^_StF8bO{CQ9pK<{6(Ht|Qq0TVx) zS|@!oYtq&GLtMDY*%3tmmyHv_pb51n$3MsZ!>^Uqu{J3zu_+?|0Gc7lBEN7vapt}{ z+-MD}6~!r0PMZBaH-%Xev}mjXtdA|Su?1DQ;Q7A;gU2=JfgGSlNe#5K09cT_Xdmb8 zV2|gl5~ne8mU0f|aa8=@w}N>80Nc;|^vMeT#X#XDBuBe%p>zi22gu}$=jM-8 zvZtJ+JD#P^?m%bTO$)(tBRiobjp?l!vl@=#&|Db|zOf)$pk2xa=OLNB{BQ|V#eDeb z)Kjxa#ED1*DS9lCf_Wm1Sp)X9T_5MEiHP|SYLM0X4bLYn1y}z7tC}uo8T~;N9KjV2 zYQub4#K&uuMN%v~1SW%30!o44o_zlRB(;I!GaHhiHUi_FDE!OAh;kUUw$dmu zB`e0|6@K#TtXC#)`O42f_X^3;h-kQRs3 zSEZh}y-hzzcZwyF_QZ@8Kw?Ran2^LVurL1rB=f-lj-TSkywP7(fhf^Ucz0AW)Zf{XTM?fVhZG5|tICn+sZ#jAPz=m93&>y6J$pjes6NEhM-S@xGf>AAIxXCpOI@9r- ze~s}~J|_@DMRJcSPfVZ!92%GB8#WVx@XQL5sS*L02h65gnw#ch(YZnJ6%y14poCE% ziZ(78e`O7zfP4$T_Z}Dk8YE!x;-3LofSvA`uxl6deDh|n$5k0hf0|A~qXSxjvvc

RrZi=NZ({|KaQAsm{F>3o-&j- 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 z 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 z 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 +--FILE-- + +Done +--EXPECT-- +Test +int(76) +Done diff --git a/ext/exif/tests/bug62523_3.jpg b/ext/exif/tests/bug62523_3.jpg new file mode 100644 index 0000000000000..3ee91368ceb86 --- /dev/null +++ b/ext/exif/tests/bug62523_3.jpg @@ -0,0 +1,12 @@ + + Found + +

Found

+

The resource was found at http://dl.dropboxusercontent.com/u/7562584/Bugs/Php/bad_exif.jpeg; +you should be redirected automatically. + +

+
+
WSGI Server
+ + diff --git a/ext/exif/tests/bug62523_3.phpt b/ext/exif/tests/bug62523_3.phpt new file mode 100644 index 0000000000000..6e11354c5a725 --- /dev/null +++ b/ext/exif/tests/bug62523_3.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug 62523 (php crashes with segfault when exif_read_data called) +--SKIPIF-- + +--FILE-- + +Done +--EXPECTF-- +Test + +Warning: exif_read_data(bug62523_3.jpg): File not supported in %sbug62523_3.php on line %d +int(1) +Done From 5cc797d119bb3936a8acce48ede04fa29a3219c6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 22:44:37 +0200 Subject: [PATCH 0209/1256] exif NEWS --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 6f3c00caea886..9439136ef6e16 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding). (Felipe) +- Exif: + . Fixed crash on unknown encoding. (Draal) + - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) From b6ceea4a25f667bfed6c26899dd55a274a3270d3 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 21 Oct 2013 14:20:35 -0700 Subject: [PATCH 0210/1256] Fixed bug #65939 (Space before ";" breaks php.ini parsing). (brainstorm at nopcode dot org) --- NEWS | 2 ++ php.ini-development | 2 +- php.ini-production | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 69b1658158db8..b51b8b23eb3cf 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: + . Fixed bug #65939 (Space before ";" breaks php.ini parsing). + (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) diff --git a/php.ini-development b/php.ini-development index 630f9e94e574a..2ef47a40a2448 100644 --- a/php.ini-development +++ b/php.ini-development @@ -1907,7 +1907,7 @@ ldap.max_links = -1 ;opcache.revalidate_path=0 ; If disabled, all PHPDoc comments are dropped from the code to reduce the - ;size of the optimized code. +; size of the optimized code. ;opcache.save_comments=1 ; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments" diff --git a/php.ini-production b/php.ini-production index ba30f90880f45..c39de742db8b1 100644 --- a/php.ini-production +++ b/php.ini-production @@ -1907,7 +1907,7 @@ ldap.max_links = -1 ;opcache.revalidate_path=0 ; If disabled, all PHPDoc comments are dropped from the code to reduce the - ;size of the optimized code. +; size of the optimized code. ;opcache.save_comments=1 ; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments" From 1f5b1cfb2b238b282c48adb663aaa084e28290c0 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 22 Oct 2013 12:27:18 +0900 Subject: [PATCH 0211/1256] Fix Coverity issue reporting wrong sizeof() --- ext/pgsql/pgsql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index f4c4cb37e785c..c8f7d3d4326e6 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2639,7 +2639,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, Bucket *p; fci.param_count = 0; - fci.params = safe_emalloc(sizeof(zval*), ht->nNumOfElements, 0); + fci.params = safe_emalloc(sizeof(zval***), ht->nNumOfElements, 0); p = ht->pListHead; while (p != NULL) { fci.params[fci.param_count++] = (zval**)p->pData; From e68c1ef2ec3d890d958126cfa9f5330e9bfe1b31 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 22 Oct 2013 11:03:09 -0700 Subject: [PATCH 0212/1256] Added a LICENSE file to make it easier for PECL binary distributions to conform with the license. --- ext/oci8/LICENSE | 68 ++++++++++++++++++++++++++++++++++++++++++++ ext/oci8/package.xml | 34 ++++++++++++++++------ ext/oci8/php_oci8.h | 2 +- 3 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 ext/oci8/LICENSE diff --git a/ext/oci8/LICENSE b/ext/oci8/LICENSE new file mode 100644 index 0000000000000..42536af320686 --- /dev/null +++ b/ext/oci8/LICENSE @@ -0,0 +1,68 @@ +-------------------------------------------------------------------- + The PHP License, version 3.01 +Copyright (c) 1999 - 2012 The PHP Group. All rights reserved. +-------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, is permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. The name "PHP" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact group@php.net. + + 4. Products derived from this software may not be called "PHP", nor + may "PHP" appear in their name, without prior written permission + from group@php.net. You may indicate that your software works in + conjunction with PHP by saying "Foo for PHP" instead of calling + it "PHP Foo" or "phpfoo" + + 5. The PHP Group may publish revised and/or new versions of the + license from time to time. Each version will be given a + distinguishing version number. + Once covered code has been published under a particular version + of the license, you may always continue to use it under the terms + of that version. You may also choose to use such covered code + under the terms of any subsequent version of the license + published by the PHP Group. No one other than the PHP Group has + the right to modify the terms applicable to covered code created + under this License. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes PHP software, freely available from + ". + +THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND +ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP +DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------- + +This software consists of voluntary contributions made by many +individuals on behalf of the PHP Group. + +The PHP Group can be contacted via Email at group@php.net. + +For more information on the PHP Group and the PHP project, +please see . + +PHP includes the Zend Engine, freely available at +. diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index b180b0d5f0bdc..7be825b895b39 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -45,12 +45,12 @@ libraries are available. no - 2013-10-17 + 2013-10-22 - 2.0.5 - 2.0.5 + 2.0.6 + 2.0.6 stable @@ -58,12 +58,8 @@ libraries are available. PHP -Bump PHP OCI8 2.0 mininum requirements to PHP 5.2 and Oracle client -library 10.2. (Use OCI8 1.4 for older PHP version support or if only -Oracle 9.2 client libraries are available.) - -Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL -links work in the new Windows PECL infrastructure. +Added a LICENSE file to make it easier for PECL binary distributions +to conform with the license. @@ -462,6 +458,26 @@ links work in the new Windows PECL infrastructure. + + + 2.0.5 + 2.0.5 + + + stable + stable + + PHP + +Bump PHP OCI8 2.0 mininum requirements to PHP 5.2 and Oracle client +library 10.2. (Use OCI8 1.4 for older PHP version support or if only +Oracle 9.2 client libraries are available.) + +Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL +links work in the new Windows PECL infrastructure. + + + 2.0.4 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index ee8d83122114f..751041554982f 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -45,7 +45,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.5" +#define PHP_OCI8_VERSION "2.0.6" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From 0adba0abb9df1493c8b38299d4139d7bf0ecc4f5 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 23 Oct 2013 19:26:24 +0800 Subject: [PATCH 0213/1256] Added Zend Debugger to the note about the load order (by trash4you at online dot de) --- ext/opcache/README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/opcache/README b/ext/opcache/README index 6c3cc746e77c0..46521587fa719 100644 --- a/ext/opcache/README +++ b/ext/opcache/README @@ -31,8 +31,8 @@ Quick Install zend_extension=/...full path.../opcache.so -NOTE: In case you are going to use Zend OPcache together with Xdebug, -be sure that Xdebug is loaded after OPcache. "php -v" must show Xdebug +NOTE: In case you are going to use Zend OPcache together with Xdebug or Zend Debugger, +be sure that the debugger is loaded after OPcache. "php -v" must show the debugger after OPcache. - Restart PHP From 70c3a722e2561cb33d408f3c65e58f9468d2f667 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 23 Oct 2013 12:36:27 -0700 Subject: [PATCH 0214/1256] Increment version number, since this will be 5.5.6. --- configure.in | 2 +- main/php_version.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.in b/configure.in index 40130626cb9f9..7e444b0ac4a03 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=5 -PHP_RELEASE_VERSION=5 +PHP_RELEASE_VERSION=6 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index d9ea4aab3cd61..2d98a3f80789a 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 5 -#define PHP_RELEASE_VERSION 5 +#define PHP_RELEASE_VERSION 6 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.5.5-dev" -#define PHP_VERSION_ID 50505 +#define PHP_VERSION "5.5.6-dev" +#define PHP_VERSION_ID 50506 From 9cb3a759a78f26c5af3e20ef9b3143fa0809db52 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 23 Oct 2013 22:33:53 +0100 Subject: [PATCH 0215/1256] - Updated to version 2013.7 (2013g) --- ext/date/lib/timezonedb.h | 1180 +++++++++++++++++++------------------ 1 file changed, 591 insertions(+), 589 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 8142aab565eb0..99280062b22a7 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -14,573 +14,573 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[579] = { { "Africa/Bujumbura" , 0x000571 }, { "Africa/Cairo" , 0x0005B5 }, { "Africa/Casablanca" , 0x000878 }, - { "Africa/Ceuta" , 0x000ABC }, - { "Africa/Conakry" , 0x000DC3 }, - { "Africa/Dakar" , 0x000E2E }, - { "Africa/Dar_es_Salaam" , 0x000E94 }, - { "Africa/Djibouti" , 0x000F01 }, - { "Africa/Douala" , 0x000F56 }, - { "Africa/El_Aaiun" , 0x000FAB }, - { "Africa/Freetown" , 0x001011 }, - { "Africa/Gaborone" , 0x001120 }, - { "Africa/Harare" , 0x00118D }, - { "Africa/Johannesburg" , 0x0011E2 }, - { "Africa/Juba" , 0x001250 }, - { "Africa/Kampala" , 0x001363 }, - { "Africa/Khartoum" , 0x0013E2 }, - { "Africa/Kigali" , 0x0014F5 }, - { "Africa/Kinshasa" , 0x00154A }, - { "Africa/Lagos" , 0x0015A5 }, - { "Africa/Libreville" , 0x0015FA }, - { "Africa/Lome" , 0x00164F }, - { "Africa/Luanda" , 0x001693 }, - { "Africa/Lubumbashi" , 0x0016E8 }, - { "Africa/Lusaka" , 0x001743 }, - { "Africa/Malabo" , 0x001798 }, - { "Africa/Maputo" , 0x0017FE }, - { "Africa/Maseru" , 0x001853 }, - { "Africa/Mbabane" , 0x0018BB }, - { "Africa/Mogadishu" , 0x001911 }, - { "Africa/Monrovia" , 0x00196C }, - { "Africa/Nairobi" , 0x0019D2 }, - { "Africa/Ndjamena" , 0x001A51 }, - { "Africa/Niamey" , 0x001ABD }, - { "Africa/Nouakchott" , 0x001B30 }, - { "Africa/Ouagadougou" , 0x001B9B }, - { "Africa/Porto-Novo" , 0x001BF0 }, - { "Africa/Sao_Tome" , 0x001C56 }, - { "Africa/Timbuktu" , 0x001CAB }, - { "Africa/Tripoli" , 0x001D16 }, - { "Africa/Tunis" , 0x001F0F }, - { "Africa/Windhoek" , 0x002021 }, - { "America/Adak" , 0x002268 }, - { "America/Anchorage" , 0x0025DE }, - { "America/Anguilla" , 0x002952 }, - { "America/Antigua" , 0x0029A7 }, - { "America/Araguaina" , 0x002A0D }, - { "America/Argentina/Buenos_Aires" , 0x002B72 }, - { "America/Argentina/Catamarca" , 0x002D20 }, - { "America/Argentina/ComodRivadavia" , 0x002EE1 }, - { "America/Argentina/Cordoba" , 0x003087 }, - { "America/Argentina/Jujuy" , 0x00325C }, - { "America/Argentina/La_Rioja" , 0x003410 }, - { "America/Argentina/Mendoza" , 0x0035C8 }, - { "America/Argentina/Rio_Gallegos" , 0x003788 }, - { "America/Argentina/Salta" , 0x00393D }, - { "America/Argentina/San_Juan" , 0x003AE9 }, - { "America/Argentina/San_Luis" , 0x003CA1 }, - { "America/Argentina/Tucuman" , 0x003E67 }, - { "America/Argentina/Ushuaia" , 0x004023 }, - { "America/Aruba" , 0x0041DE }, - { "America/Asuncion" , 0x004244 }, - { "America/Atikokan" , 0x004529 }, - { "America/Atka" , 0x0045FF }, - { "America/Bahia" , 0x004965 }, - { "America/Bahia_Banderas" , 0x004AF8 }, - { "America/Barbados" , 0x004D71 }, - { "America/Belem" , 0x004E0B }, - { "America/Belize" , 0x004F06 }, - { "America/Blanc-Sablon" , 0x005082 }, - { "America/Boa_Vista" , 0x005136 }, - { "America/Bogota" , 0x00523F }, - { "America/Boise" , 0x0052AB }, - { "America/Buenos_Aires" , 0x005642 }, - { "America/Cambridge_Bay" , 0x0057DB }, - { "America/Campo_Grande" , 0x005B03 }, - { "America/Cancun" , 0x005DF2 }, - { "America/Caracas" , 0x006034 }, - { "America/Catamarca" , 0x00609B }, - { "America/Cayenne" , 0x006241 }, - { "America/Cayman" , 0x0062A3 }, - { "America/Chicago" , 0x0062F8 }, - { "America/Chihuahua" , 0x00680F }, - { "America/Coral_Harbour" , 0x006A7A }, - { "America/Cordoba" , 0x006B0C }, - { "America/Costa_Rica" , 0x006CB2 }, - { "America/Creston" , 0x006D3C }, - { "America/Cuiaba" , 0x006DC8 }, - { "America/Curacao" , 0x0070A6 }, - { "America/Danmarkshavn" , 0x00710C }, - { "America/Dawson" , 0x007250 }, - { "America/Dawson_Creek" , 0x00756D }, - { "America/Denver" , 0x007747 }, - { "America/Detroit" , 0x007ACD }, - { "America/Dominica" , 0x007E2C }, - { "America/Edmonton" , 0x007E81 }, - { "America/Eirunepe" , 0x008239 }, - { "America/El_Salvador" , 0x00834C }, - { "America/Ensenada" , 0x0083C1 }, - { "America/Fort_Wayne" , 0x008868 }, - { "America/Fortaleza" , 0x00872A }, - { "America/Glace_Bay" , 0x008AD2 }, - { "America/Godthab" , 0x008E49 }, - { "America/Goose_Bay" , 0x00910D }, - { "America/Grand_Turk" , 0x0095CA }, - { "America/Grenada" , 0x009879 }, - { "America/Guadeloupe" , 0x0098CE }, - { "America/Guatemala" , 0x009923 }, - { "America/Guayaquil" , 0x0099AC }, - { "America/Guyana" , 0x009A09 }, - { "America/Halifax" , 0x009A8A }, - { "America/Havana" , 0x009FA0 }, - { "America/Hermosillo" , 0x00A313 }, - { "America/Indiana/Indianapolis" , 0x00A3F1 }, - { "America/Indiana/Knox" , 0x00A682 }, - { "America/Indiana/Marengo" , 0x00AA19 }, - { "America/Indiana/Petersburg" , 0x00ACBF }, - { "America/Indiana/Tell_City" , 0x00B20C }, - { "America/Indiana/Vevay" , 0x00B4A5 }, - { "America/Indiana/Vincennes" , 0x00B6E0 }, - { "America/Indiana/Winamac" , 0x00B994 }, - { "America/Indianapolis" , 0x00AFA2 }, - { "America/Inuvik" , 0x00BC4D }, - { "America/Iqaluit" , 0x00BF44 }, - { "America/Jamaica" , 0x00C266 }, - { "America/Jujuy" , 0x00C32B }, - { "America/Juneau" , 0x00C4D5 }, - { "America/Kentucky/Louisville" , 0x00C853 }, - { "America/Kentucky/Monticello" , 0x00CC71 }, - { "America/Knox_IN" , 0x00CFF6 }, - { "America/Kralendijk" , 0x00D367 }, - { "America/La_Paz" , 0x00D3CD }, - { "America/Lima" , 0x00D434 }, - { "America/Los_Angeles" , 0x00D4DC }, - { "America/Louisville" , 0x00D8ED }, - { "America/Lower_Princes" , 0x00DCE2 }, - { "America/Maceio" , 0x00DD48 }, - { "America/Managua" , 0x00DE82 }, - { "America/Manaus" , 0x00DF35 }, - { "America/Marigot" , 0x00E037 }, - { "America/Martinique" , 0x00E08C }, - { "America/Matamoros" , 0x00E0F8 }, - { "America/Mazatlan" , 0x00E351 }, - { "America/Mendoza" , 0x00E5BE }, - { "America/Menominee" , 0x00E772 }, - { "America/Merida" , 0x00EAF3 }, - { "America/Metlakatla" , 0x00ED2E }, - { "America/Mexico_City" , 0x00EE68 }, - { "America/Miquelon" , 0x00F0E3 }, - { "America/Moncton" , 0x00F355 }, - { "America/Monterrey" , 0x00F7EC }, - { "America/Montevideo" , 0x00FA4F }, - { "America/Montreal" , 0x00FD61 }, - { "America/Montserrat" , 0x010251 }, - { "America/Nassau" , 0x0102A6 }, - { "America/New_York" , 0x0105EB }, - { "America/Nipigon" , 0x010AF6 }, - { "America/Nome" , 0x010E47 }, - { "America/Noronha" , 0x0111C5 }, - { "America/North_Dakota/Beulah" , 0x0112F5 }, - { "America/North_Dakota/Center" , 0x011689 }, - { "America/North_Dakota/New_Salem" , 0x011A1D }, - { "America/Ojinaga" , 0x011DC6 }, - { "America/Panama" , 0x012027 }, - { "America/Pangnirtung" , 0x01207C }, - { "America/Paramaribo" , 0x0123B2 }, - { "America/Phoenix" , 0x012444 }, - { "America/Port-au-Prince" , 0x012502 }, - { "America/Port_of_Spain" , 0x012821 }, - { "America/Porto_Acre" , 0x012722 }, - { "America/Porto_Velho" , 0x012876 }, - { "America/Puerto_Rico" , 0x01296C }, - { "America/Rainy_River" , 0x0129D7 }, - { "America/Rankin_Inlet" , 0x012D0F }, - { "America/Recife" , 0x012FF5 }, - { "America/Regina" , 0x01311F }, - { "America/Resolute" , 0x0132DD }, - { "America/Rio_Branco" , 0x0135CE }, - { "America/Rosario" , 0x0136D1 }, - { "America/Santa_Isabel" , 0x013877 }, - { "America/Santarem" , 0x013C1A }, - { "America/Santiago" , 0x013D1F }, - { "America/Santo_Domingo" , 0x0140C8 }, - { "America/Sao_Paulo" , 0x01418E }, - { "America/Scoresbysund" , 0x01449D }, - { "America/Shiprock" , 0x01478B }, - { "America/Sitka" , 0x014B04 }, - { "America/St_Barthelemy" , 0x014E8C }, - { "America/St_Johns" , 0x014EE1 }, - { "America/St_Kitts" , 0x015434 }, - { "America/St_Lucia" , 0x015489 }, - { "America/St_Thomas" , 0x0154DE }, - { "America/St_Vincent" , 0x015533 }, - { "America/Swift_Current" , 0x015588 }, - { "America/Tegucigalpa" , 0x0156A9 }, - { "America/Thule" , 0x015728 }, - { "America/Thunder_Bay" , 0x01596F }, - { "America/Tijuana" , 0x015CB8 }, - { "America/Toronto" , 0x016051 }, - { "America/Tortola" , 0x016571 }, - { "America/Vancouver" , 0x0165C6 }, - { "America/Virgin" , 0x016A03 }, - { "America/Whitehorse" , 0x016A58 }, - { "America/Winnipeg" , 0x016D75 }, - { "America/Yakutat" , 0x0171B5 }, - { "America/Yellowknife" , 0x017520 }, - { "Antarctica/Casey" , 0x017830 }, - { "Antarctica/Davis" , 0x0178CD }, - { "Antarctica/DumontDUrville" , 0x01796E }, - { "Antarctica/Macquarie" , 0x017A00 }, - { "Antarctica/Mawson" , 0x017C47 }, - { "Antarctica/McMurdo" , 0x017CC3 }, - { "Antarctica/Palmer" , 0x01806E }, - { "Antarctica/Rothera" , 0x01838A }, - { "Antarctica/South_Pole" , 0x018400 }, - { "Antarctica/Syowa" , 0x01877E }, - { "Antarctica/Vostok" , 0x0187EC }, - { "Arctic/Longyearbyen" , 0x01885D }, - { "Asia/Aden" , 0x018B8F }, - { "Asia/Almaty" , 0x018BE4 }, - { "Asia/Amman" , 0x018D63 }, - { "Asia/Anadyr" , 0x018F35 }, - { "Asia/Aqtau" , 0x01911A }, - { "Asia/Aqtobe" , 0x019319 }, - { "Asia/Ashgabat" , 0x0194D1 }, - { "Asia/Ashkhabad" , 0x0195EE }, - { "Asia/Baghdad" , 0x01970B }, - { "Asia/Bahrain" , 0x019880 }, - { "Asia/Baku" , 0x0198E6 }, - { "Asia/Bangkok" , 0x019BCE }, - { "Asia/Beirut" , 0x019C23 }, - { "Asia/Bishkek" , 0x019F30 }, - { "Asia/Brunei" , 0x01A0DC }, - { "Asia/Calcutta" , 0x01A13E }, - { "Asia/Choibalsan" , 0x01A1B7 }, - { "Asia/Chongqing" , 0x01A330 }, - { "Asia/Chungking" , 0x01A41F }, - { "Asia/Colombo" , 0x01A4CE }, - { "Asia/Dacca" , 0x01A56A }, - { "Asia/Damascus" , 0x01A610 }, - { "Asia/Dhaka" , 0x01A960 }, - { "Asia/Dili" , 0x01AA06 }, - { "Asia/Dubai" , 0x01AA90 }, - { "Asia/Dushanbe" , 0x01AAE5 }, - { "Asia/Gaza" , 0x01ABE8 }, - { "Asia/Harbin" , 0x01AF3B }, - { "Asia/Hebron" , 0x01B022 }, - { "Asia/Ho_Chi_Minh" , 0x01B37E }, - { "Asia/Hong_Kong" , 0x01B3F6 }, - { "Asia/Hovd" , 0x01B5B8 }, - { "Asia/Irkutsk" , 0x01B730 }, - { "Asia/Istanbul" , 0x01B916 }, - { "Asia/Jakarta" , 0x01BD03 }, - { "Asia/Jayapura" , 0x01BDAD }, - { "Asia/Jerusalem" , 0x01BE49 }, - { "Asia/Kabul" , 0x01C178 }, - { "Asia/Kamchatka" , 0x01C1C9 }, - { "Asia/Karachi" , 0x01C3A5 }, - { "Asia/Kashgar" , 0x01C45A }, - { "Asia/Kathmandu" , 0x01C52B }, - { "Asia/Katmandu" , 0x01C591 }, - { "Asia/Khandyga" , 0x01C5F7 }, - { "Asia/Kolkata" , 0x01C81C }, - { "Asia/Krasnoyarsk" , 0x01C895 }, - { "Asia/Kuala_Lumpur" , 0x01CA7D }, - { "Asia/Kuching" , 0x01CB3A }, - { "Asia/Kuwait" , 0x01CC28 }, - { "Asia/Macao" , 0x01CC7D }, - { "Asia/Macau" , 0x01CDB8 }, - { "Asia/Magadan" , 0x01CEF3 }, - { "Asia/Makassar" , 0x01D0D5 }, - { "Asia/Manila" , 0x01D19A }, - { "Asia/Muscat" , 0x01D21F }, - { "Asia/Nicosia" , 0x01D274 }, - { "Asia/Novokuznetsk" , 0x01D55C }, - { "Asia/Novosibirsk" , 0x01D75E }, - { "Asia/Omsk" , 0x01D949 }, - { "Asia/Oral" , 0x01DB30 }, - { "Asia/Phnom_Penh" , 0x01DD00 }, - { "Asia/Pontianak" , 0x01DD78 }, - { "Asia/Pyongyang" , 0x01DE3A }, - { "Asia/Qatar" , 0x01DEA7 }, - { "Asia/Qyzylorda" , 0x01DF0D }, - { "Asia/Rangoon" , 0x01E0E3 }, - { "Asia/Riyadh" , 0x01E15B }, - { "Asia/Saigon" , 0x01E1B0 }, - { "Asia/Sakhalin" , 0x01E228 }, - { "Asia/Samarkand" , 0x01E41F }, - { "Asia/Seoul" , 0x01E555 }, - { "Asia/Shanghai" , 0x01E5F9 }, - { "Asia/Singapore" , 0x01E6D9 }, - { "Asia/Taipei" , 0x01E790 }, - { "Asia/Tashkent" , 0x01E8A8 }, - { "Asia/Tbilisi" , 0x01E9D9 }, - { "Asia/Tehran" , 0x01EB93 }, - { "Asia/Tel_Aviv" , 0x01EE01 }, - { "Asia/Thimbu" , 0x01F130 }, - { "Asia/Thimphu" , 0x01F196 }, - { "Asia/Tokyo" , 0x01F1FC }, - { "Asia/Ujung_Pandang" , 0x01F285 }, - { "Asia/Ulaanbaatar" , 0x01F302 }, - { "Asia/Ulan_Bator" , 0x01F45D }, - { "Asia/Urumqi" , 0x01F5AA }, - { "Asia/Ust-Nera" , 0x01F671 }, - { "Asia/Vientiane" , 0x01F876 }, - { "Asia/Vladivostok" , 0x01F8EE }, - { "Asia/Yakutsk" , 0x01FADA }, - { "Asia/Yekaterinburg" , 0x01FCBF }, - { "Asia/Yerevan" , 0x01FECA }, - { "Atlantic/Azores" , 0x0200CA }, - { "Atlantic/Bermuda" , 0x0205CD }, - { "Atlantic/Canary" , 0x0208AE }, - { "Atlantic/Cape_Verde" , 0x020B84 }, - { "Atlantic/Faeroe" , 0x020BFD }, - { "Atlantic/Faroe" , 0x020EA1 }, - { "Atlantic/Jan_Mayen" , 0x021145 }, - { "Atlantic/Madeira" , 0x021477 }, - { "Atlantic/Reykjavik" , 0x021980 }, - { "Atlantic/South_Georgia" , 0x021B39 }, - { "Atlantic/St_Helena" , 0x021D4B }, - { "Atlantic/Stanley" , 0x021B7D }, - { "Australia/ACT" , 0x021DA0 }, - { "Australia/Adelaide" , 0x0220BD }, - { "Australia/Brisbane" , 0x0223E9 }, - { "Australia/Broken_Hill" , 0x0224B0 }, - { "Australia/Canberra" , 0x0227EE }, - { "Australia/Currie" , 0x022B0B }, - { "Australia/Darwin" , 0x022E3E }, - { "Australia/Eucla" , 0x022EC4 }, - { "Australia/Hobart" , 0x022F99 }, - { "Australia/LHI" , 0x0232F7 }, - { "Australia/Lindeman" , 0x023592 }, - { "Australia/Lord_Howe" , 0x023673 }, - { "Australia/Melbourne" , 0x02391E }, - { "Australia/North" , 0x023C43 }, - { "Australia/NSW" , 0x023CB7 }, - { "Australia/Perth" , 0x023FD4 }, - { "Australia/Queensland" , 0x0240AC }, - { "Australia/South" , 0x024158 }, - { "Australia/Sydney" , 0x024475 }, - { "Australia/Tasmania" , 0x0247B2 }, - { "Australia/Victoria" , 0x024AF7 }, - { "Australia/West" , 0x024E14 }, - { "Australia/Yancowinna" , 0x024ECA }, - { "Brazil/Acre" , 0x0251EC }, - { "Brazil/DeNoronha" , 0x0252EB }, - { "Brazil/East" , 0x02540B }, - { "Brazil/West" , 0x0256E8 }, - { "Canada/Atlantic" , 0x0257E0 }, - { "Canada/Central" , 0x025CC8 }, - { "Canada/East-Saskatchewan" , 0x0265D2 }, - { "Canada/Eastern" , 0x0260E2 }, - { "Canada/Mountain" , 0x02675B }, - { "Canada/Newfoundland" , 0x026AD1 }, - { "Canada/Pacific" , 0x026FFC }, - { "Canada/Saskatchewan" , 0x027415 }, - { "Canada/Yukon" , 0x02759E }, - { "CET" , 0x0278A1 }, - { "Chile/Continental" , 0x027BAA }, - { "Chile/EasterIsland" , 0x027F45 }, - { "CST6CDT" , 0x028287 }, - { "Cuba" , 0x0285D8 }, - { "EET" , 0x02894B }, - { "Egypt" , 0x028BFE }, - { "Eire" , 0x028EC1 }, - { "EST" , 0x0293D2 }, - { "EST5EDT" , 0x029416 }, - { "Etc/GMT" , 0x029767 }, - { "Etc/GMT+0" , 0x029833 }, - { "Etc/GMT+1" , 0x0298BD }, - { "Etc/GMT+10" , 0x02994A }, - { "Etc/GMT+11" , 0x0299D8 }, - { "Etc/GMT+12" , 0x029A66 }, - { "Etc/GMT+2" , 0x029B81 }, - { "Etc/GMT+3" , 0x029C0D }, - { "Etc/GMT+4" , 0x029C99 }, - { "Etc/GMT+5" , 0x029D25 }, - { "Etc/GMT+6" , 0x029DB1 }, - { "Etc/GMT+7" , 0x029E3D }, - { "Etc/GMT+8" , 0x029EC9 }, - { "Etc/GMT+9" , 0x029F55 }, - { "Etc/GMT-0" , 0x0297EF }, - { "Etc/GMT-1" , 0x029877 }, - { "Etc/GMT-10" , 0x029903 }, - { "Etc/GMT-11" , 0x029991 }, - { "Etc/GMT-12" , 0x029A1F }, - { "Etc/GMT-13" , 0x029AAD }, - { "Etc/GMT-14" , 0x029AF4 }, - { "Etc/GMT-2" , 0x029B3B }, - { "Etc/GMT-3" , 0x029BC7 }, - { "Etc/GMT-4" , 0x029C53 }, - { "Etc/GMT-5" , 0x029CDF }, - { "Etc/GMT-6" , 0x029D6B }, - { "Etc/GMT-7" , 0x029DF7 }, - { "Etc/GMT-8" , 0x029E83 }, - { "Etc/GMT-9" , 0x029F0F }, - { "Etc/GMT0" , 0x0297AB }, - { "Etc/Greenwich" , 0x029F9B }, - { "Etc/UCT" , 0x029FDF }, - { "Etc/Universal" , 0x02A023 }, - { "Etc/UTC" , 0x02A067 }, - { "Etc/Zulu" , 0x02A0AB }, - { "Europe/Amsterdam" , 0x02A0EF }, - { "Europe/Andorra" , 0x02A52D }, - { "Europe/Athens" , 0x02A7A9 }, - { "Europe/Belfast" , 0x02AAEC }, - { "Europe/Belgrade" , 0x02B023 }, - { "Europe/Berlin" , 0x02B2EC }, - { "Europe/Bratislava" , 0x02B650 }, - { "Europe/Brussels" , 0x02B982 }, - { "Europe/Bucharest" , 0x02BDB9 }, - { "Europe/Budapest" , 0x02C0E3 }, - { "Europe/Busingen" , 0x02C456 }, - { "Europe/Chisinau" , 0x02C70D }, - { "Europe/Copenhagen" , 0x02CA9B }, - { "Europe/Dublin" , 0x02CDA5 }, - { "Europe/Gibraltar" , 0x02D2B6 }, - { "Europe/Guernsey" , 0x02D70D }, - { "Europe/Helsinki" , 0x02DC44 }, - { "Europe/Isle_of_Man" , 0x02DEFA }, - { "Europe/Istanbul" , 0x02E431 }, - { "Europe/Jersey" , 0x02E81E }, - { "Europe/Kaliningrad" , 0x02ED55 }, - { "Europe/Kiev" , 0x02EFBB }, - { "Europe/Lisbon" , 0x02F2D2 }, - { "Europe/Ljubljana" , 0x02F7D6 }, - { "Europe/London" , 0x02FA9F }, - { "Europe/Luxembourg" , 0x02FFD6 }, - { "Europe/Madrid" , 0x03042C }, - { "Europe/Malta" , 0x0307F2 }, - { "Europe/Mariehamn" , 0x030BAB }, - { "Europe/Minsk" , 0x030E61 }, - { "Europe/Monaco" , 0x03106F }, - { "Europe/Moscow" , 0x0314AA }, - { "Europe/Nicosia" , 0x0316FB }, - { "Europe/Oslo" , 0x0319E3 }, - { "Europe/Paris" , 0x031D15 }, - { "Europe/Podgorica" , 0x03215B }, - { "Europe/Prague" , 0x032424 }, - { "Europe/Riga" , 0x032756 }, - { "Europe/Rome" , 0x032A9B }, - { "Europe/Samara" , 0x032E5E }, - { "Europe/San_Marino" , 0x033091 }, - { "Europe/Sarajevo" , 0x033454 }, - { "Europe/Simferopol" , 0x03371D }, - { "Europe/Skopje" , 0x033A48 }, - { "Europe/Sofia" , 0x033D11 }, - { "Europe/Stockholm" , 0x034019 }, - { "Europe/Tallinn" , 0x0342C8 }, - { "Europe/Tirane" , 0x034602 }, - { "Europe/Tiraspol" , 0x034908 }, - { "Europe/Uzhgorod" , 0x034C96 }, - { "Europe/Vaduz" , 0x034FAD }, - { "Europe/Vatican" , 0x03525C }, - { "Europe/Vienna" , 0x03561F }, - { "Europe/Vilnius" , 0x03594C }, - { "Europe/Volgograd" , 0x035C8B }, - { "Europe/Warsaw" , 0x035E8B }, - { "Europe/Zagreb" , 0x03626C }, - { "Europe/Zaporozhye" , 0x036535 }, - { "Europe/Zurich" , 0x036876 }, - { "Factory" , 0x036B25 }, - { "GB" , 0x036B96 }, - { "GB-Eire" , 0x0370CD }, - { "GMT" , 0x037604 }, - { "GMT+0" , 0x0376D0 }, - { "GMT-0" , 0x03768C }, - { "GMT0" , 0x037648 }, - { "Greenwich" , 0x037714 }, - { "Hongkong" , 0x037758 }, - { "HST" , 0x03791A }, - { "Iceland" , 0x03795E }, - { "Indian/Antananarivo" , 0x037B17 }, - { "Indian/Chagos" , 0x037B8B }, - { "Indian/Christmas" , 0x037BED }, - { "Indian/Cocos" , 0x037C31 }, - { "Indian/Comoro" , 0x037C75 }, - { "Indian/Kerguelen" , 0x037CCA }, - { "Indian/Mahe" , 0x037D1F }, - { "Indian/Maldives" , 0x037D74 }, - { "Indian/Mauritius" , 0x037DC9 }, - { "Indian/Mayotte" , 0x037E3F }, - { "Indian/Reunion" , 0x037E94 }, - { "Iran" , 0x037EE9 }, - { "Israel" , 0x038157 }, - { "Jamaica" , 0x038486 }, - { "Japan" , 0x03854B }, - { "Kwajalein" , 0x0385D4 }, - { "Libya" , 0x038637 }, - { "MET" , 0x038830 }, - { "Mexico/BajaNorte" , 0x038B39 }, - { "Mexico/BajaSur" , 0x038EA2 }, - { "Mexico/General" , 0x0390E7 }, - { "MST" , 0x039345 }, - { "MST7MDT" , 0x039389 }, - { "Navajo" , 0x0396DA }, - { "NZ" , 0x039A53 }, - { "NZ-CHAT" , 0x039DD1 }, - { "Pacific/Apia" , 0x03A0B9 }, - { "Pacific/Auckland" , 0x03A255 }, - { "Pacific/Chatham" , 0x03A5E1 }, - { "Pacific/Chuuk" , 0x03A8D8 }, - { "Pacific/Easter" , 0x03A931 }, - { "Pacific/Efate" , 0x03AC8F }, - { "Pacific/Enderbury" , 0x03AD55 }, - { "Pacific/Fakaofo" , 0x03ADC3 }, - { "Pacific/Fiji" , 0x03AE14 }, - { "Pacific/Funafuti" , 0x03AFA7 }, - { "Pacific/Galapagos" , 0x03AFEB }, - { "Pacific/Gambier" , 0x03B063 }, - { "Pacific/Guadalcanal" , 0x03B0C8 }, - { "Pacific/Guam" , 0x03B11D }, - { "Pacific/Honolulu" , 0x03B173 }, - { "Pacific/Johnston" , 0x03B1EA }, - { "Pacific/Kiritimati" , 0x03B269 }, - { "Pacific/Kosrae" , 0x03B2D4 }, - { "Pacific/Kwajalein" , 0x03B331 }, - { "Pacific/Majuro" , 0x03B39D }, - { "Pacific/Marquesas" , 0x03B3FC }, - { "Pacific/Midway" , 0x03B463 }, - { "Pacific/Nauru" , 0x03B4ED }, - { "Pacific/Niue" , 0x03B565 }, - { "Pacific/Norfolk" , 0x03B5C3 }, - { "Pacific/Noumea" , 0x03B618 }, - { "Pacific/Pago_Pago" , 0x03B6A8 }, - { "Pacific/Palau" , 0x03B731 }, - { "Pacific/Pitcairn" , 0x03B775 }, - { "Pacific/Pohnpei" , 0x03B7CA }, - { "Pacific/Ponape" , 0x03B81F }, - { "Pacific/Port_Moresby" , 0x03B864 }, - { "Pacific/Rarotonga" , 0x03B8A8 }, - { "Pacific/Saipan" , 0x03B984 }, - { "Pacific/Samoa" , 0x03B9E7 }, - { "Pacific/Tahiti" , 0x03BA70 }, - { "Pacific/Tarawa" , 0x03BAD5 }, - { "Pacific/Tongatapu" , 0x03BB29 }, - { "Pacific/Truk" , 0x03BBB5 }, - { "Pacific/Wake" , 0x03BBFA }, - { "Pacific/Wallis" , 0x03BC4A }, - { "Pacific/Yap" , 0x03BC8E }, - { "Poland" , 0x03BCD3 }, - { "Portugal" , 0x03C0B4 }, - { "PRC" , 0x03C5B0 }, - { "PST8PDT" , 0x03C661 }, - { "ROC" , 0x03C9B2 }, - { "ROK" , 0x03CACA }, - { "Singapore" , 0x03CB6E }, - { "Turkey" , 0x03CC25 }, - { "UCT" , 0x03D012 }, - { "Universal" , 0x03D056 }, - { "US/Alaska" , 0x03D09A }, - { "US/Aleutian" , 0x03D403 }, - { "US/Arizona" , 0x03D769 }, - { "US/Central" , 0x03D7F7 }, - { "US/East-Indiana" , 0x03E201 }, - { "US/Eastern" , 0x03DD02 }, - { "US/Hawaii" , 0x03E46B }, - { "US/Indiana-Starke" , 0x03E4DC }, - { "US/Michigan" , 0x03E84D }, - { "US/Mountain" , 0x03EB84 }, - { "US/Pacific" , 0x03EEFD }, - { "US/Pacific-New" , 0x03F302 }, - { "US/Samoa" , 0x03F707 }, - { "UTC" , 0x03F790 }, - { "W-SU" , 0x03FA87 }, - { "WET" , 0x03F7D4 }, - { "Zulu" , 0x03FCC1 }, + { "Africa/Ceuta" , 0x000ADA }, + { "Africa/Conakry" , 0x000DE1 }, + { "Africa/Dakar" , 0x000E4C }, + { "Africa/Dar_es_Salaam" , 0x000EB2 }, + { "Africa/Djibouti" , 0x000F1F }, + { "Africa/Douala" , 0x000F74 }, + { "Africa/El_Aaiun" , 0x000FC9 }, + { "Africa/Freetown" , 0x00102F }, + { "Africa/Gaborone" , 0x00113E }, + { "Africa/Harare" , 0x0011AB }, + { "Africa/Johannesburg" , 0x001200 }, + { "Africa/Juba" , 0x00126E }, + { "Africa/Kampala" , 0x001381 }, + { "Africa/Khartoum" , 0x001400 }, + { "Africa/Kigali" , 0x001513 }, + { "Africa/Kinshasa" , 0x001568 }, + { "Africa/Lagos" , 0x0015C3 }, + { "Africa/Libreville" , 0x001618 }, + { "Africa/Lome" , 0x00166D }, + { "Africa/Luanda" , 0x0016B1 }, + { "Africa/Lubumbashi" , 0x001706 }, + { "Africa/Lusaka" , 0x001761 }, + { "Africa/Malabo" , 0x0017B6 }, + { "Africa/Maputo" , 0x00181C }, + { "Africa/Maseru" , 0x001871 }, + { "Africa/Mbabane" , 0x0018D9 }, + { "Africa/Mogadishu" , 0x00192F }, + { "Africa/Monrovia" , 0x00198A }, + { "Africa/Nairobi" , 0x0019F0 }, + { "Africa/Ndjamena" , 0x001A6F }, + { "Africa/Niamey" , 0x001ADB }, + { "Africa/Nouakchott" , 0x001B4E }, + { "Africa/Ouagadougou" , 0x001BB9 }, + { "Africa/Porto-Novo" , 0x001C0E }, + { "Africa/Sao_Tome" , 0x001C74 }, + { "Africa/Timbuktu" , 0x001CC9 }, + { "Africa/Tripoli" , 0x001D34 }, + { "Africa/Tunis" , 0x001F2D }, + { "Africa/Windhoek" , 0x00203F }, + { "America/Adak" , 0x002286 }, + { "America/Anchorage" , 0x0025FC }, + { "America/Anguilla" , 0x002970 }, + { "America/Antigua" , 0x0029C5 }, + { "America/Araguaina" , 0x002A2B }, + { "America/Argentina/Buenos_Aires" , 0x002B90 }, + { "America/Argentina/Catamarca" , 0x002D3E }, + { "America/Argentina/ComodRivadavia" , 0x002EFF }, + { "America/Argentina/Cordoba" , 0x0030A5 }, + { "America/Argentina/Jujuy" , 0x00327A }, + { "America/Argentina/La_Rioja" , 0x00342E }, + { "America/Argentina/Mendoza" , 0x0035E6 }, + { "America/Argentina/Rio_Gallegos" , 0x0037A6 }, + { "America/Argentina/Salta" , 0x00395B }, + { "America/Argentina/San_Juan" , 0x003B07 }, + { "America/Argentina/San_Luis" , 0x003CBF }, + { "America/Argentina/Tucuman" , 0x003E85 }, + { "America/Argentina/Ushuaia" , 0x004041 }, + { "America/Aruba" , 0x0041FC }, + { "America/Asuncion" , 0x004262 }, + { "America/Atikokan" , 0x004547 }, + { "America/Atka" , 0x00461D }, + { "America/Bahia" , 0x004983 }, + { "America/Bahia_Banderas" , 0x004B16 }, + { "America/Barbados" , 0x004D8F }, + { "America/Belem" , 0x004E29 }, + { "America/Belize" , 0x004F24 }, + { "America/Blanc-Sablon" , 0x0050A0 }, + { "America/Boa_Vista" , 0x005154 }, + { "America/Bogota" , 0x00525D }, + { "America/Boise" , 0x0052C9 }, + { "America/Buenos_Aires" , 0x005660 }, + { "America/Cambridge_Bay" , 0x0057F9 }, + { "America/Campo_Grande" , 0x005B21 }, + { "America/Cancun" , 0x005E10 }, + { "America/Caracas" , 0x006052 }, + { "America/Catamarca" , 0x0060B9 }, + { "America/Cayenne" , 0x00625F }, + { "America/Cayman" , 0x0062C1 }, + { "America/Chicago" , 0x006316 }, + { "America/Chihuahua" , 0x00682D }, + { "America/Coral_Harbour" , 0x006A98 }, + { "America/Cordoba" , 0x006B2A }, + { "America/Costa_Rica" , 0x006CD0 }, + { "America/Creston" , 0x006D5A }, + { "America/Cuiaba" , 0x006DE6 }, + { "America/Curacao" , 0x0070C4 }, + { "America/Danmarkshavn" , 0x00712A }, + { "America/Dawson" , 0x00726E }, + { "America/Dawson_Creek" , 0x00758B }, + { "America/Denver" , 0x007765 }, + { "America/Detroit" , 0x007AEB }, + { "America/Dominica" , 0x007E4A }, + { "America/Edmonton" , 0x007E9F }, + { "America/Eirunepe" , 0x008257 }, + { "America/El_Salvador" , 0x00836A }, + { "America/Ensenada" , 0x0083DF }, + { "America/Fort_Wayne" , 0x008886 }, + { "America/Fortaleza" , 0x008748 }, + { "America/Glace_Bay" , 0x008AF0 }, + { "America/Godthab" , 0x008E67 }, + { "America/Goose_Bay" , 0x00912B }, + { "America/Grand_Turk" , 0x0095E8 }, + { "America/Grenada" , 0x009897 }, + { "America/Guadeloupe" , 0x0098EC }, + { "America/Guatemala" , 0x009941 }, + { "America/Guayaquil" , 0x0099CA }, + { "America/Guyana" , 0x009A27 }, + { "America/Halifax" , 0x009AA8 }, + { "America/Havana" , 0x009FBE }, + { "America/Hermosillo" , 0x00A331 }, + { "America/Indiana/Indianapolis" , 0x00A40F }, + { "America/Indiana/Knox" , 0x00A6A0 }, + { "America/Indiana/Marengo" , 0x00AA37 }, + { "America/Indiana/Petersburg" , 0x00ACDD }, + { "America/Indiana/Tell_City" , 0x00B22A }, + { "America/Indiana/Vevay" , 0x00B4C3 }, + { "America/Indiana/Vincennes" , 0x00B6FE }, + { "America/Indiana/Winamac" , 0x00B9B2 }, + { "America/Indianapolis" , 0x00AFC0 }, + { "America/Inuvik" , 0x00BC6B }, + { "America/Iqaluit" , 0x00BF62 }, + { "America/Jamaica" , 0x00C284 }, + { "America/Jujuy" , 0x00C349 }, + { "America/Juneau" , 0x00C4F3 }, + { "America/Kentucky/Louisville" , 0x00C871 }, + { "America/Kentucky/Monticello" , 0x00CC8F }, + { "America/Knox_IN" , 0x00D014 }, + { "America/Kralendijk" , 0x00D385 }, + { "America/La_Paz" , 0x00D3EB }, + { "America/Lima" , 0x00D452 }, + { "America/Los_Angeles" , 0x00D4FA }, + { "America/Louisville" , 0x00D90B }, + { "America/Lower_Princes" , 0x00DD00 }, + { "America/Maceio" , 0x00DD66 }, + { "America/Managua" , 0x00DEA0 }, + { "America/Manaus" , 0x00DF53 }, + { "America/Marigot" , 0x00E055 }, + { "America/Martinique" , 0x00E0AA }, + { "America/Matamoros" , 0x00E116 }, + { "America/Mazatlan" , 0x00E36F }, + { "America/Mendoza" , 0x00E5DC }, + { "America/Menominee" , 0x00E790 }, + { "America/Merida" , 0x00EB11 }, + { "America/Metlakatla" , 0x00ED4C }, + { "America/Mexico_City" , 0x00EE86 }, + { "America/Miquelon" , 0x00F101 }, + { "America/Moncton" , 0x00F373 }, + { "America/Monterrey" , 0x00F80A }, + { "America/Montevideo" , 0x00FA6D }, + { "America/Montreal" , 0x00FD7F }, + { "America/Montserrat" , 0x01026F }, + { "America/Nassau" , 0x0102C4 }, + { "America/New_York" , 0x010609 }, + { "America/Nipigon" , 0x010B14 }, + { "America/Nome" , 0x010E65 }, + { "America/Noronha" , 0x0111E3 }, + { "America/North_Dakota/Beulah" , 0x011313 }, + { "America/North_Dakota/Center" , 0x0116A7 }, + { "America/North_Dakota/New_Salem" , 0x011A3B }, + { "America/Ojinaga" , 0x011DE4 }, + { "America/Panama" , 0x012045 }, + { "America/Pangnirtung" , 0x01209A }, + { "America/Paramaribo" , 0x0123D0 }, + { "America/Phoenix" , 0x012462 }, + { "America/Port-au-Prince" , 0x012520 }, + { "America/Port_of_Spain" , 0x01283F }, + { "America/Porto_Acre" , 0x012740 }, + { "America/Porto_Velho" , 0x012894 }, + { "America/Puerto_Rico" , 0x01298A }, + { "America/Rainy_River" , 0x0129F5 }, + { "America/Rankin_Inlet" , 0x012D2D }, + { "America/Recife" , 0x013013 }, + { "America/Regina" , 0x01313D }, + { "America/Resolute" , 0x0132FB }, + { "America/Rio_Branco" , 0x0135EC }, + { "America/Rosario" , 0x0136EF }, + { "America/Santa_Isabel" , 0x013895 }, + { "America/Santarem" , 0x013C38 }, + { "America/Santiago" , 0x013D3D }, + { "America/Santo_Domingo" , 0x0140E6 }, + { "America/Sao_Paulo" , 0x0141AC }, + { "America/Scoresbysund" , 0x0144BB }, + { "America/Shiprock" , 0x0147A9 }, + { "America/Sitka" , 0x014B22 }, + { "America/St_Barthelemy" , 0x014EAA }, + { "America/St_Johns" , 0x014EFF }, + { "America/St_Kitts" , 0x015452 }, + { "America/St_Lucia" , 0x0154A7 }, + { "America/St_Thomas" , 0x0154FC }, + { "America/St_Vincent" , 0x015551 }, + { "America/Swift_Current" , 0x0155A6 }, + { "America/Tegucigalpa" , 0x0156C7 }, + { "America/Thule" , 0x015746 }, + { "America/Thunder_Bay" , 0x01598D }, + { "America/Tijuana" , 0x015CD6 }, + { "America/Toronto" , 0x01606F }, + { "America/Tortola" , 0x01658F }, + { "America/Vancouver" , 0x0165E4 }, + { "America/Virgin" , 0x016A21 }, + { "America/Whitehorse" , 0x016A76 }, + { "America/Winnipeg" , 0x016D93 }, + { "America/Yakutat" , 0x0171D3 }, + { "America/Yellowknife" , 0x01753E }, + { "Antarctica/Casey" , 0x01784E }, + { "Antarctica/Davis" , 0x0178EB }, + { "Antarctica/DumontDUrville" , 0x01798C }, + { "Antarctica/Macquarie" , 0x017A1E }, + { "Antarctica/Mawson" , 0x017C65 }, + { "Antarctica/McMurdo" , 0x017CE1 }, + { "Antarctica/Palmer" , 0x01808C }, + { "Antarctica/Rothera" , 0x0183A8 }, + { "Antarctica/South_Pole" , 0x01841E }, + { "Antarctica/Syowa" , 0x01879C }, + { "Antarctica/Vostok" , 0x01880A }, + { "Arctic/Longyearbyen" , 0x01887B }, + { "Asia/Aden" , 0x018BAD }, + { "Asia/Almaty" , 0x018C02 }, + { "Asia/Amman" , 0x018D81 }, + { "Asia/Anadyr" , 0x018F53 }, + { "Asia/Aqtau" , 0x019138 }, + { "Asia/Aqtobe" , 0x019337 }, + { "Asia/Ashgabat" , 0x0194EF }, + { "Asia/Ashkhabad" , 0x01960C }, + { "Asia/Baghdad" , 0x019729 }, + { "Asia/Bahrain" , 0x01989E }, + { "Asia/Baku" , 0x019904 }, + { "Asia/Bangkok" , 0x019BEC }, + { "Asia/Beirut" , 0x019C41 }, + { "Asia/Bishkek" , 0x019F4E }, + { "Asia/Brunei" , 0x01A0FA }, + { "Asia/Calcutta" , 0x01A15C }, + { "Asia/Choibalsan" , 0x01A1D5 }, + { "Asia/Chongqing" , 0x01A34E }, + { "Asia/Chungking" , 0x01A43D }, + { "Asia/Colombo" , 0x01A4EC }, + { "Asia/Dacca" , 0x01A588 }, + { "Asia/Damascus" , 0x01A62E }, + { "Asia/Dhaka" , 0x01A97E }, + { "Asia/Dili" , 0x01AA24 }, + { "Asia/Dubai" , 0x01AAAE }, + { "Asia/Dushanbe" , 0x01AB03 }, + { "Asia/Gaza" , 0x01AC06 }, + { "Asia/Harbin" , 0x01AF59 }, + { "Asia/Hebron" , 0x01B040 }, + { "Asia/Ho_Chi_Minh" , 0x01B39C }, + { "Asia/Hong_Kong" , 0x01B414 }, + { "Asia/Hovd" , 0x01B5D6 }, + { "Asia/Irkutsk" , 0x01B74E }, + { "Asia/Istanbul" , 0x01B934 }, + { "Asia/Jakarta" , 0x01BD21 }, + { "Asia/Jayapura" , 0x01BDCB }, + { "Asia/Jerusalem" , 0x01BE67 }, + { "Asia/Kabul" , 0x01C196 }, + { "Asia/Kamchatka" , 0x01C1E7 }, + { "Asia/Karachi" , 0x01C3C3 }, + { "Asia/Kashgar" , 0x01C478 }, + { "Asia/Kathmandu" , 0x01C549 }, + { "Asia/Katmandu" , 0x01C5AF }, + { "Asia/Khandyga" , 0x01C615 }, + { "Asia/Kolkata" , 0x01C83A }, + { "Asia/Krasnoyarsk" , 0x01C8B3 }, + { "Asia/Kuala_Lumpur" , 0x01CA9B }, + { "Asia/Kuching" , 0x01CB58 }, + { "Asia/Kuwait" , 0x01CC46 }, + { "Asia/Macao" , 0x01CC9B }, + { "Asia/Macau" , 0x01CDD6 }, + { "Asia/Magadan" , 0x01CF11 }, + { "Asia/Makassar" , 0x01D0F3 }, + { "Asia/Manila" , 0x01D1B8 }, + { "Asia/Muscat" , 0x01D23D }, + { "Asia/Nicosia" , 0x01D292 }, + { "Asia/Novokuznetsk" , 0x01D57A }, + { "Asia/Novosibirsk" , 0x01D77C }, + { "Asia/Omsk" , 0x01D967 }, + { "Asia/Oral" , 0x01DB4E }, + { "Asia/Phnom_Penh" , 0x01DD1E }, + { "Asia/Pontianak" , 0x01DD96 }, + { "Asia/Pyongyang" , 0x01DE58 }, + { "Asia/Qatar" , 0x01DEC5 }, + { "Asia/Qyzylorda" , 0x01DF2B }, + { "Asia/Rangoon" , 0x01E101 }, + { "Asia/Riyadh" , 0x01E179 }, + { "Asia/Saigon" , 0x01E1CE }, + { "Asia/Sakhalin" , 0x01E246 }, + { "Asia/Samarkand" , 0x01E43D }, + { "Asia/Seoul" , 0x01E573 }, + { "Asia/Shanghai" , 0x01E617 }, + { "Asia/Singapore" , 0x01E6F7 }, + { "Asia/Taipei" , 0x01E7AE }, + { "Asia/Tashkent" , 0x01E8C6 }, + { "Asia/Tbilisi" , 0x01E9F7 }, + { "Asia/Tehran" , 0x01EBB1 }, + { "Asia/Tel_Aviv" , 0x01EE1F }, + { "Asia/Thimbu" , 0x01F14E }, + { "Asia/Thimphu" , 0x01F1B4 }, + { "Asia/Tokyo" , 0x01F21A }, + { "Asia/Ujung_Pandang" , 0x01F2A3 }, + { "Asia/Ulaanbaatar" , 0x01F320 }, + { "Asia/Ulan_Bator" , 0x01F47B }, + { "Asia/Urumqi" , 0x01F5C8 }, + { "Asia/Ust-Nera" , 0x01F68F }, + { "Asia/Vientiane" , 0x01F894 }, + { "Asia/Vladivostok" , 0x01F90C }, + { "Asia/Yakutsk" , 0x01FAF8 }, + { "Asia/Yekaterinburg" , 0x01FCDD }, + { "Asia/Yerevan" , 0x01FEE8 }, + { "Atlantic/Azores" , 0x0200E8 }, + { "Atlantic/Bermuda" , 0x0205EB }, + { "Atlantic/Canary" , 0x0208CC }, + { "Atlantic/Cape_Verde" , 0x020BA2 }, + { "Atlantic/Faeroe" , 0x020C1B }, + { "Atlantic/Faroe" , 0x020EBF }, + { "Atlantic/Jan_Mayen" , 0x021163 }, + { "Atlantic/Madeira" , 0x021495 }, + { "Atlantic/Reykjavik" , 0x02199E }, + { "Atlantic/South_Georgia" , 0x021B57 }, + { "Atlantic/St_Helena" , 0x021D69 }, + { "Atlantic/Stanley" , 0x021B9B }, + { "Australia/ACT" , 0x021DBE }, + { "Australia/Adelaide" , 0x0220DB }, + { "Australia/Brisbane" , 0x022407 }, + { "Australia/Broken_Hill" , 0x0224CE }, + { "Australia/Canberra" , 0x02280C }, + { "Australia/Currie" , 0x022B29 }, + { "Australia/Darwin" , 0x022E5C }, + { "Australia/Eucla" , 0x022EE2 }, + { "Australia/Hobart" , 0x022FB7 }, + { "Australia/LHI" , 0x023315 }, + { "Australia/Lindeman" , 0x0235B0 }, + { "Australia/Lord_Howe" , 0x023691 }, + { "Australia/Melbourne" , 0x02393C }, + { "Australia/North" , 0x023C61 }, + { "Australia/NSW" , 0x023CD5 }, + { "Australia/Perth" , 0x023FF2 }, + { "Australia/Queensland" , 0x0240CA }, + { "Australia/South" , 0x024176 }, + { "Australia/Sydney" , 0x024493 }, + { "Australia/Tasmania" , 0x0247D0 }, + { "Australia/Victoria" , 0x024B15 }, + { "Australia/West" , 0x024E32 }, + { "Australia/Yancowinna" , 0x024EE8 }, + { "Brazil/Acre" , 0x02520A }, + { "Brazil/DeNoronha" , 0x025309 }, + { "Brazil/East" , 0x025429 }, + { "Brazil/West" , 0x025706 }, + { "Canada/Atlantic" , 0x0257FE }, + { "Canada/Central" , 0x025CE6 }, + { "Canada/East-Saskatchewan" , 0x0265F0 }, + { "Canada/Eastern" , 0x026100 }, + { "Canada/Mountain" , 0x026779 }, + { "Canada/Newfoundland" , 0x026AEF }, + { "Canada/Pacific" , 0x02701A }, + { "Canada/Saskatchewan" , 0x027433 }, + { "Canada/Yukon" , 0x0275BC }, + { "CET" , 0x0278BF }, + { "Chile/Continental" , 0x027BC8 }, + { "Chile/EasterIsland" , 0x027F63 }, + { "CST6CDT" , 0x0282A5 }, + { "Cuba" , 0x0285F6 }, + { "EET" , 0x028969 }, + { "Egypt" , 0x028C1C }, + { "Eire" , 0x028EDF }, + { "EST" , 0x0293F0 }, + { "EST5EDT" , 0x029434 }, + { "Etc/GMT" , 0x029785 }, + { "Etc/GMT+0" , 0x029851 }, + { "Etc/GMT+1" , 0x0298DB }, + { "Etc/GMT+10" , 0x029968 }, + { "Etc/GMT+11" , 0x0299F6 }, + { "Etc/GMT+12" , 0x029A84 }, + { "Etc/GMT+2" , 0x029B9F }, + { "Etc/GMT+3" , 0x029C2B }, + { "Etc/GMT+4" , 0x029CB7 }, + { "Etc/GMT+5" , 0x029D43 }, + { "Etc/GMT+6" , 0x029DCF }, + { "Etc/GMT+7" , 0x029E5B }, + { "Etc/GMT+8" , 0x029EE7 }, + { "Etc/GMT+9" , 0x029F73 }, + { "Etc/GMT-0" , 0x02980D }, + { "Etc/GMT-1" , 0x029895 }, + { "Etc/GMT-10" , 0x029921 }, + { "Etc/GMT-11" , 0x0299AF }, + { "Etc/GMT-12" , 0x029A3D }, + { "Etc/GMT-13" , 0x029ACB }, + { "Etc/GMT-14" , 0x029B12 }, + { "Etc/GMT-2" , 0x029B59 }, + { "Etc/GMT-3" , 0x029BE5 }, + { "Etc/GMT-4" , 0x029C71 }, + { "Etc/GMT-5" , 0x029CFD }, + { "Etc/GMT-6" , 0x029D89 }, + { "Etc/GMT-7" , 0x029E15 }, + { "Etc/GMT-8" , 0x029EA1 }, + { "Etc/GMT-9" , 0x029F2D }, + { "Etc/GMT0" , 0x0297C9 }, + { "Etc/Greenwich" , 0x029FB9 }, + { "Etc/UCT" , 0x029FFD }, + { "Etc/Universal" , 0x02A041 }, + { "Etc/UTC" , 0x02A085 }, + { "Etc/Zulu" , 0x02A0C9 }, + { "Europe/Amsterdam" , 0x02A10D }, + { "Europe/Andorra" , 0x02A54B }, + { "Europe/Athens" , 0x02A7C7 }, + { "Europe/Belfast" , 0x02AB0A }, + { "Europe/Belgrade" , 0x02B041 }, + { "Europe/Berlin" , 0x02B30A }, + { "Europe/Bratislava" , 0x02B66E }, + { "Europe/Brussels" , 0x02B9A0 }, + { "Europe/Bucharest" , 0x02BDD7 }, + { "Europe/Budapest" , 0x02C101 }, + { "Europe/Busingen" , 0x02C474 }, + { "Europe/Chisinau" , 0x02C72B }, + { "Europe/Copenhagen" , 0x02CAB9 }, + { "Europe/Dublin" , 0x02CDC3 }, + { "Europe/Gibraltar" , 0x02D2D4 }, + { "Europe/Guernsey" , 0x02D72B }, + { "Europe/Helsinki" , 0x02DC62 }, + { "Europe/Isle_of_Man" , 0x02DF18 }, + { "Europe/Istanbul" , 0x02E44F }, + { "Europe/Jersey" , 0x02E83C }, + { "Europe/Kaliningrad" , 0x02ED73 }, + { "Europe/Kiev" , 0x02EFD9 }, + { "Europe/Lisbon" , 0x02F2F0 }, + { "Europe/Ljubljana" , 0x02F7F4 }, + { "Europe/London" , 0x02FABD }, + { "Europe/Luxembourg" , 0x02FFF4 }, + { "Europe/Madrid" , 0x03044A }, + { "Europe/Malta" , 0x030810 }, + { "Europe/Mariehamn" , 0x030BC9 }, + { "Europe/Minsk" , 0x030E7F }, + { "Europe/Monaco" , 0x03108D }, + { "Europe/Moscow" , 0x0314C8 }, + { "Europe/Nicosia" , 0x031719 }, + { "Europe/Oslo" , 0x031A01 }, + { "Europe/Paris" , 0x031D33 }, + { "Europe/Podgorica" , 0x032179 }, + { "Europe/Prague" , 0x032442 }, + { "Europe/Riga" , 0x032774 }, + { "Europe/Rome" , 0x032AB9 }, + { "Europe/Samara" , 0x032E7C }, + { "Europe/San_Marino" , 0x0330AF }, + { "Europe/Sarajevo" , 0x033472 }, + { "Europe/Simferopol" , 0x03373B }, + { "Europe/Skopje" , 0x033A66 }, + { "Europe/Sofia" , 0x033D2F }, + { "Europe/Stockholm" , 0x034037 }, + { "Europe/Tallinn" , 0x0342E6 }, + { "Europe/Tirane" , 0x034620 }, + { "Europe/Tiraspol" , 0x034926 }, + { "Europe/Uzhgorod" , 0x034CB4 }, + { "Europe/Vaduz" , 0x034FCB }, + { "Europe/Vatican" , 0x03527A }, + { "Europe/Vienna" , 0x03563D }, + { "Europe/Vilnius" , 0x03596A }, + { "Europe/Volgograd" , 0x035CA9 }, + { "Europe/Warsaw" , 0x035EA9 }, + { "Europe/Zagreb" , 0x03628A }, + { "Europe/Zaporozhye" , 0x036553 }, + { "Europe/Zurich" , 0x036894 }, + { "Factory" , 0x036B43 }, + { "GB" , 0x036BB4 }, + { "GB-Eire" , 0x0370EB }, + { "GMT" , 0x037622 }, + { "GMT+0" , 0x0376EE }, + { "GMT-0" , 0x0376AA }, + { "GMT0" , 0x037666 }, + { "Greenwich" , 0x037732 }, + { "Hongkong" , 0x037776 }, + { "HST" , 0x037938 }, + { "Iceland" , 0x03797C }, + { "Indian/Antananarivo" , 0x037B35 }, + { "Indian/Chagos" , 0x037BA9 }, + { "Indian/Christmas" , 0x037C0B }, + { "Indian/Cocos" , 0x037C4F }, + { "Indian/Comoro" , 0x037C93 }, + { "Indian/Kerguelen" , 0x037CE8 }, + { "Indian/Mahe" , 0x037D3D }, + { "Indian/Maldives" , 0x037D92 }, + { "Indian/Mauritius" , 0x037DE7 }, + { "Indian/Mayotte" , 0x037E5D }, + { "Indian/Reunion" , 0x037EB2 }, + { "Iran" , 0x037F07 }, + { "Israel" , 0x038175 }, + { "Jamaica" , 0x0384A4 }, + { "Japan" , 0x038569 }, + { "Kwajalein" , 0x0385F2 }, + { "Libya" , 0x038655 }, + { "MET" , 0x03884E }, + { "Mexico/BajaNorte" , 0x038B57 }, + { "Mexico/BajaSur" , 0x038EC0 }, + { "Mexico/General" , 0x039105 }, + { "MST" , 0x039363 }, + { "MST7MDT" , 0x0393A7 }, + { "Navajo" , 0x0396F8 }, + { "NZ" , 0x039A71 }, + { "NZ-CHAT" , 0x039DEF }, + { "Pacific/Apia" , 0x03A0D7 }, + { "Pacific/Auckland" , 0x03A273 }, + { "Pacific/Chatham" , 0x03A5FF }, + { "Pacific/Chuuk" , 0x03A8F6 }, + { "Pacific/Easter" , 0x03A94F }, + { "Pacific/Efate" , 0x03ACAD }, + { "Pacific/Enderbury" , 0x03AD73 }, + { "Pacific/Fakaofo" , 0x03ADE1 }, + { "Pacific/Fiji" , 0x03AE32 }, + { "Pacific/Funafuti" , 0x03AFC5 }, + { "Pacific/Galapagos" , 0x03B009 }, + { "Pacific/Gambier" , 0x03B081 }, + { "Pacific/Guadalcanal" , 0x03B0E6 }, + { "Pacific/Guam" , 0x03B13B }, + { "Pacific/Honolulu" , 0x03B191 }, + { "Pacific/Johnston" , 0x03B208 }, + { "Pacific/Kiritimati" , 0x03B287 }, + { "Pacific/Kosrae" , 0x03B2F2 }, + { "Pacific/Kwajalein" , 0x03B34F }, + { "Pacific/Majuro" , 0x03B3BB }, + { "Pacific/Marquesas" , 0x03B41A }, + { "Pacific/Midway" , 0x03B481 }, + { "Pacific/Nauru" , 0x03B50B }, + { "Pacific/Niue" , 0x03B583 }, + { "Pacific/Norfolk" , 0x03B5E1 }, + { "Pacific/Noumea" , 0x03B636 }, + { "Pacific/Pago_Pago" , 0x03B6C6 }, + { "Pacific/Palau" , 0x03B74F }, + { "Pacific/Pitcairn" , 0x03B793 }, + { "Pacific/Pohnpei" , 0x03B7E8 }, + { "Pacific/Ponape" , 0x03B83D }, + { "Pacific/Port_Moresby" , 0x03B882 }, + { "Pacific/Rarotonga" , 0x03B8C6 }, + { "Pacific/Saipan" , 0x03B9A2 }, + { "Pacific/Samoa" , 0x03BA05 }, + { "Pacific/Tahiti" , 0x03BA8E }, + { "Pacific/Tarawa" , 0x03BAF3 }, + { "Pacific/Tongatapu" , 0x03BB47 }, + { "Pacific/Truk" , 0x03BBD3 }, + { "Pacific/Wake" , 0x03BC18 }, + { "Pacific/Wallis" , 0x03BC68 }, + { "Pacific/Yap" , 0x03BCAC }, + { "Poland" , 0x03BCF1 }, + { "Portugal" , 0x03C0D2 }, + { "PRC" , 0x03C5CE }, + { "PST8PDT" , 0x03C67F }, + { "ROC" , 0x03C9D0 }, + { "ROK" , 0x03CAE8 }, + { "Singapore" , 0x03CB8C }, + { "Turkey" , 0x03CC43 }, + { "UCT" , 0x03D030 }, + { "Universal" , 0x03D074 }, + { "US/Alaska" , 0x03D0B8 }, + { "US/Aleutian" , 0x03D421 }, + { "US/Arizona" , 0x03D787 }, + { "US/Central" , 0x03D815 }, + { "US/East-Indiana" , 0x03E21F }, + { "US/Eastern" , 0x03DD20 }, + { "US/Hawaii" , 0x03E489 }, + { "US/Indiana-Starke" , 0x03E4FA }, + { "US/Michigan" , 0x03E86B }, + { "US/Mountain" , 0x03EBA2 }, + { "US/Pacific" , 0x03EF1B }, + { "US/Pacific-New" , 0x03F320 }, + { "US/Samoa" , 0x03F725 }, + { "UTC" , 0x03F7AE }, + { "W-SU" , 0x03FAA5 }, + { "WET" , 0x03F7F2 }, + { "Zulu" , 0x03FCDF }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[261381] = { +const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Africa/Abidjan */ @@ -758,7 +758,7 @@ const unsigned char timelib_timezone_db_data_builtin[261381] = { /* Africa/Casablanca */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0x51, 0xF9, 0x9C, +0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0x51, 0xF9, 0x9C, 0xC6, 0xFF, 0x14, 0x80, 0xC7, 0x58, 0xAC, 0x70, 0xC7, 0xD9, 0xED, 0x80, 0xD2, 0xA1, 0x32, 0xF0, 0xDB, 0x35, 0xA4, 0x00, 0xDB, 0xEE, 0x27, 0xF0, 0xFB, 0x25, 0x72, 0x40, 0xFB, 0xC2, 0xEF, 0x70, 0x08, 0x6B, 0x84, 0x80, 0x08, 0xC6, 0x6D, 0xF0, 0x0B, 0xE8, 0x0C, 0x00, 0x0C, 0x61, 0x47, 0xF0, @@ -767,32 +767,34 @@ const unsigned char timelib_timezone_db_data_builtin[261381] = { 0x4A, 0x23, 0x1A, 0x00, 0x4A, 0x8D, 0xD5, 0x70, 0x4B, 0xDC, 0xC0, 0x80, 0x4C, 0x5D, 0xE5, 0x70, 0x4D, 0x97, 0xB8, 0x80, 0x4E, 0x34, 0x8C, 0xF0, 0x4F, 0x9C, 0xA0, 0xA0, 0x50, 0x08, 0xBB, 0xA0, 0x50, 0x31, 0x9A, 0x20, 0x50, 0x67, 0xA7, 0xA0, 0x51, 0x7C, 0x82, 0xA0, 0x51, 0xD8, 0xCB, 0xA0, -0x52, 0x05, 0x9E, 0xA0, 0x52, 0x47, 0x89, 0xA0, 0x53, 0x5C, 0x64, 0xA0, 0x53, 0xAF, 0x73, 0x20, -0x53, 0xD7, 0x00, 0x20, 0x54, 0x27, 0x6B, 0xA0, 0x55, 0x3C, 0x46, 0xA0, 0x55, 0x82, 0x26, 0x20, -0x55, 0xA9, 0xB3, 0x20, 0x56, 0x07, 0x4D, 0xA0, 0x57, 0x1C, 0x28, 0xA0, 0x57, 0x56, 0x2A, 0xA0, -0x57, 0x7D, 0xB7, 0xA0, 0x57, 0xE7, 0x2F, 0xA0, 0x59, 0x05, 0x45, 0x20, 0x59, 0x28, 0xDD, 0xA0, -0x59, 0x50, 0x6A, 0xA0, 0x59, 0xC7, 0x11, 0xA0, 0x5A, 0xE5, 0x27, 0x20, 0x5A, 0xFB, 0x90, 0xA0, -0x5B, 0x23, 0x1D, 0xA0, 0x5B, 0xB0, 0x2E, 0x20, 0x5C, 0xC5, 0x09, 0x20, 0x5C, 0xCF, 0x95, 0x20, -0x5C, 0xF7, 0x22, 0x20, 0x5D, 0x90, 0x10, 0x20, 0x5E, 0xC9, 0xD5, 0x20, 0x5F, 0x6F, 0xF2, 0x20, -0x60, 0x9C, 0x88, 0x20, 0x61, 0x4F, 0xD4, 0x20, 0x62, 0x70, 0x8C, 0xA0, 0x63, 0x2F, 0xB6, 0x20, -0x64, 0x4D, 0xCB, 0xA0, 0x65, 0x0F, 0x98, 0x20, 0x66, 0x2D, 0xAD, 0xA0, 0x66, 0xF8, 0xB4, 0xA0, -0x68, 0x0D, 0x8F, 0xA0, 0x68, 0xD8, 0x96, 0xA0, 0x69, 0xED, 0x71, 0xA0, 0x6A, 0xB8, 0x78, 0xA0, -0x6B, 0xCD, 0x53, 0xA0, 0x6C, 0x98, 0x5A, 0xA0, 0x6D, 0xB6, 0x70, 0x20, 0x6E, 0x78, 0x3C, 0xA0, -0x6F, 0x96, 0x52, 0x20, 0x70, 0x61, 0x59, 0x20, 0x71, 0x76, 0x34, 0x20, 0x72, 0x41, 0x3B, 0x20, -0x73, 0x56, 0x16, 0x20, 0x74, 0x21, 0x1D, 0x20, 0x75, 0x35, 0xF8, 0x20, 0x76, 0x00, 0xFF, 0x20, -0x77, 0x15, 0xDA, 0x20, 0x77, 0xE0, 0xE1, 0x20, 0x78, 0xFE, 0xF6, 0xA0, 0x79, 0xC0, 0xC3, 0x20, -0x7A, 0xDE, 0xD8, 0xA0, 0x7B, 0xA9, 0xDF, 0xA0, 0x7C, 0xBE, 0xBA, 0xA0, 0x7D, 0x89, 0xC1, 0xA0, -0x7E, 0x9E, 0x9C, 0xA0, 0x7F, 0x69, 0xA3, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x52, 0x05, 0x9E, 0xA0, 0x52, 0x6C, 0x73, 0xA0, 0x53, 0x37, 0x7A, 0xA0, 0x53, 0xAF, 0x73, 0x20, +0x53, 0xD7, 0x00, 0x20, 0x54, 0x4C, 0x55, 0xA0, 0x55, 0x17, 0x5C, 0xA0, 0x55, 0x82, 0x26, 0x20, +0x55, 0xA9, 0xB3, 0x20, 0x56, 0x2C, 0x37, 0xA0, 0x56, 0xF7, 0x3E, 0xA0, 0x57, 0x56, 0x2A, 0xA0, +0x57, 0x7D, 0xB7, 0xA0, 0x58, 0x15, 0x54, 0x20, 0x58, 0xD7, 0x20, 0xA0, 0x59, 0x28, 0xDD, 0xA0, +0x59, 0x50, 0x6A, 0xA0, 0x59, 0xF5, 0x36, 0x20, 0x5A, 0xB7, 0x02, 0xA0, 0x5A, 0xFB, 0x90, 0xA0, +0x5B, 0x23, 0x1D, 0xA0, 0x5B, 0xD5, 0x18, 0x20, 0x5C, 0xA0, 0x1F, 0x20, 0x5C, 0xCF, 0x95, 0x20, +0x5C, 0xF7, 0x22, 0x20, 0x5D, 0xB4, 0xFA, 0x20, 0x5E, 0x80, 0x01, 0x20, 0x5E, 0xA2, 0x48, 0x20, +0x5E, 0xC9, 0xD5, 0x20, 0x5F, 0x94, 0xDC, 0x20, 0x60, 0x5F, 0xE3, 0x20, 0x60, 0x74, 0xFB, 0x20, +0x60, 0x9C, 0x88, 0x20, 0x61, 0x7D, 0xF8, 0xA0, 0x62, 0x3F, 0xC5, 0x20, 0x62, 0x48, 0xFF, 0xA0, +0x62, 0x70, 0x8C, 0xA0, 0x63, 0x5D, 0xDA, 0xA0, 0x64, 0x43, 0x3F, 0xA0, 0x65, 0x3D, 0xBC, 0xA0, +0x66, 0x15, 0xF2, 0xA0, 0x67, 0x1D, 0x9E, 0xA0, 0x67, 0xE9, 0xF7, 0x20, 0x68, 0xFD, 0x80, 0xA0, +0x69, 0xC8, 0x87, 0xA0, 0x6A, 0xDD, 0x62, 0xA0, 0x6B, 0xA8, 0x69, 0xA0, 0x6C, 0xC6, 0x7F, 0x20, +0x6D, 0x88, 0x4B, 0xA0, 0x6E, 0xA6, 0x61, 0x20, 0x6F, 0x68, 0x2D, 0xA0, 0x70, 0x86, 0x43, 0x20, +0x71, 0x51, 0x4A, 0x20, 0x72, 0x66, 0x25, 0x20, 0x73, 0x31, 0x2C, 0x20, 0x74, 0x46, 0x07, 0x20, +0x75, 0x11, 0x0E, 0x20, 0x76, 0x2F, 0x23, 0xA0, 0x76, 0xF0, 0xF0, 0x20, 0x78, 0x0F, 0x05, 0xA0, +0x78, 0xD0, 0xD2, 0x20, 0x79, 0xEE, 0xE7, 0xA0, 0x7A, 0xB0, 0xB4, 0x20, 0x7B, 0xCE, 0xC9, 0xA0, +0x7C, 0x99, 0xD0, 0xA0, 0x7D, 0xA8, 0x14, 0x20, 0x7E, 0x79, 0xB2, 0xA0, 0x7F, 0x7C, 0x18, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xF8, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x0E, -0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x0D, 0x4C, -0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xAC, 0xC8, 0x01, 0x07, 0x16, 0x42, -0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xF8, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x0D, 0x4C, 0x4D, 0x54, +0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xAC, 0xC8, 0x01, 0x07, 0x16, 0x42, 0x00, 0x00, +0x00, 0x00, /* Africa/Ceuta */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x45, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18400,4 +18402,4 @@ const unsigned char timelib_timezone_db_data_builtin[261381] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2013.6", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2013.7", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From dfe4b15b8e8932ce3c49b670ca2e59e70ebc0055 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 24 Oct 2013 10:36:44 +0200 Subject: [PATCH 0216/1256] ldap_escape() notes --- UPGRADING | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UPGRADING b/UPGRADING index b19c3dd5410e5..d2133338a3486 100755 --- a/UPGRADING +++ b/UPGRADING @@ -79,6 +79,9 @@ PHP X.Y UPGRADE NOTES - Openssl: Added string openssl_x509_fingerprint($x509, $type, $binary). +- LDAP: + Added ldap_escape($value, $ignore = "", $flags = 0). + ======================================== 6. New Classes and Interfaces ======================================== @@ -113,6 +116,9 @@ PHP X.Y UPGRADE NOTES 9. New Global Constants ======================================== +- LDAP: + LDAP_ESCAPE_FILTER int(1) + LDAP_ESCAPE_DN int(2) ======================================== 10. Changes to INI File Handling From 08f6a76b925cbd74a594ea4fd55e1e2de8ed0a44 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 24 Oct 2013 05:12:37 -0700 Subject: [PATCH 0217/1256] moved to do_alloca() usage where appropriate --- Zend/zend_virtual_cwd.c | 58 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index f94227f99d9a7..48aff01bd4ae9 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -225,6 +225,7 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){ HINSTANCE kernel32; HANDLE hFile; DWORD dwRet; + ALLOCA_FLAG(use_heap) typedef BOOL (WINAPI *gfpnh_func)(HANDLE, LPTSTR, DWORD, DWORD); gfpnh_func pGetFinalPathNameByHandle; @@ -345,9 +346,9 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); + pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap); if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); CloseHandle(hLink); return -1; } @@ -364,7 +365,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ buf->st_mode |=; } #endif - efree(pbuffer); + free_alloca(pbuffer); } else { buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG; buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6)); @@ -774,11 +775,13 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #ifdef TSRM_WIN32 WIN32_FIND_DATA data; HANDLE hFind; + ALLOCA_FLAG(use_heap_large) #else struct stat st; #endif realpath_cache_bucket *bucket; char *tmp; + ALLOCA_FLAG(use_heap) while (1) { if (len <= start) { @@ -878,7 +881,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i FindClose(hFind); } - tmp = emalloc(len+1); + tmp = do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); if(save && @@ -905,12 +908,12 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); + pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); if (pbuffer == NULL) { return -1; } if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); CloseHandle(hLink); return -1; } @@ -926,7 +929,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; printname_len = pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR); @@ -938,7 +941,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; substitutename[substitutename_len] = 0; @@ -952,7 +955,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; printname[pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR)] = 0; @@ -963,7 +966,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; substitutename[substitutename_len] = 0; @@ -973,7 +976,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i memcpy(substitutename, path, len + 1); substitutename_len = len; } else { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; } @@ -1017,21 +1020,21 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i fprintf(stderr, "sub: %s ", substitutename); fprintf(stderr, "resolved: %s ", path); #endif - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); if(isabsolute == 1) { if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) { /* use_realpath is 0 in the call below coz path is absolute*/ j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC); if(j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } } else { if(i + j >= MAXPATHLEN - 1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } @@ -1040,7 +1043,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if(j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } @@ -1061,7 +1064,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #elif defined(NETWARE) save = 0; - tmp = emalloc(len+1); + tmp = do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); #else if (save && php_sys_lstat(path, &st) < 0) { @@ -1073,25 +1076,25 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i save = 0; } - tmp = emalloc(len+1); + tmp = do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); if (save && S_ISLNK(st.st_mode)) { if (++(*ll) > LINK_MAX || (j = php_sys_readlink(tmp, path, MAXPATHLEN)) < 0) { /* too many links or broken symlinks */ - efree(tmp); + free_alloca(tmp, use_heap); return -1; } path[j] = 0; if (IS_ABSOLUTE_PATH(path, j)) { j = tsrm_realpath_r(path, 1, j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } else { if (i + j >= MAXPATHLEN-1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; /* buffer overflow */ } memmove(path+i, path, j+1); @@ -1099,7 +1102,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } @@ -1114,7 +1117,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } if (is_dir && !directory) { /* not a directory */ - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } @@ -1130,7 +1133,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #ifdef TSRM_WIN32 if (j < 0 || j + len - i >= MAXPATHLEN-1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } if (save) { @@ -1145,7 +1148,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #else if (j < 0 || j + len - i >= MAXPATHLEN-1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } memcpy(path+j, tmp+i, len-i+1); @@ -1158,7 +1161,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i realpath_cache_add(tmp, len, path, j, directory, *t TSRMLS_CC); } - efree(tmp); + free_alloca(tmp, use_heap); return j; } } @@ -1385,6 +1388,7 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path int length = strlen(path); char *temp; int retval; + ALLOCA_FLAG(use_heap) if (length == 0) { return 1; /* Can't cd to empty string */ @@ -1401,14 +1405,14 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path if (length == COPY_WHEN_ABSOLUTE(path) && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */ length++; } - temp = (char *) emalloc(length+1); + temp = (char *) do_alloca(length+1, use_heap); memcpy(temp, path, length); temp[length] = 0; #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Changing directory to %s\n", temp); #endif retval = p_chdir(temp TSRMLS_CC); - efree(temp); + free_alloca(temp, use_heap); return retval; } /* }}} */ From 25dc4af3920d40c4dbec203485c15922a29e08c3 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 24 Oct 2013 08:48:09 -0700 Subject: [PATCH 0218/1256] enabled windows to use stack in both ts/nts mode, some more fixes --- Zend/zend.h | 2 +- Zend/zend_virtual_cwd.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index acbb6acaf76ce..5ac884455d4d0 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -193,7 +193,7 @@ char *alloca (); #endif #define restrict __restrict__ -#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(ZEND_WIN32)) && !(defined(ZTS) && defined(NETWARE)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN) +#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(NETWARE)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN) # define ZEND_ALLOCA_MAX_SIZE (32 * 1024) # define ALLOCA_FLAG(name) \ zend_bool name; diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 48aff01bd4ae9..75bf3d252280d 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -225,7 +225,6 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){ HINSTANCE kernel32; HANDLE hFile; DWORD dwRet; - ALLOCA_FLAG(use_heap) typedef BOOL (WINAPI *gfpnh_func)(HANDLE, LPTSTR, DWORD, DWORD); gfpnh_func pGetFinalPathNameByHandle; @@ -289,6 +288,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ WIN32_FILE_ATTRIBUTE_DATA data; __int64 t; const size_t path_len = strlen(path); + ALLOCA_FLAG(use_heap_large); if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) { return stat(path, buf); @@ -346,7 +346,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap); + pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { free_alloca(pbuffer, use_heap_large); CloseHandle(hLink); @@ -365,7 +365,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ buf->st_mode |=; } #endif - free_alloca(pbuffer); + free_alloca(pbuffer, use_heap_large); } else { buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG; buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6)); From e53afaafcd9db9b3115df73024612fdbbc13ad50 Mon Sep 17 00:00:00 2001 From: Sascha Date: Fri, 25 Oct 2013 21:04:45 +0200 Subject: [PATCH 0219/1256] - test commit1 --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 57c2938bbf967..d8cd59c9eaef7 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 201?, PHP 5.6.0 + - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) . Implemented internal operator overloading From bf087d85afc7351f4d9312977824eb002fbbf5d8 Mon Sep 17 00:00:00 2001 From: Sascha Date: Fri, 25 Oct 2013 21:26:58 +0200 Subject: [PATCH 0220/1256] - test commit 2 --- NEWS | 1 - 1 file changed, 1 deletion(-) diff --git a/NEWS b/NEWS index d8cd59c9eaef7..57c2938bbf967 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 201?, PHP 5.6.0 - - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) . Implemented internal operator overloading From 8cef677dc36015b1ebd37187ea3ec19bfed50b3a Mon Sep 17 00:00:00 2001 From: Sascha Schumann Date: Fri, 25 Oct 2013 21:34:28 +0200 Subject: [PATCH 0221/1256] - test3 --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 57c2938bbf967..d84b1edfc2a35 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 201?, PHP 5.6.0 +?? ??? 201?, PHP 5.6.0 - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) From e50eb1ce3408d15cd26fd88203c68f52e59f6b0b Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Sat, 26 Oct 2013 10:31:21 +0900 Subject: [PATCH 0222/1256] Fixed bug #65950 Field name truncation if the field name is bigger than 32 characters --- NEWS | 4 ++++ ext/odbc/php_odbc_includes.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9439136ef6e16..26a9aa9ff42c5 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,10 @@ PHP NEWS - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) +- ODBC + . Fixed bug #65950 (Field name truncation if the field name is bigger than + 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h index ca237c0537bf7..c00583b16a215 100644 --- a/ext/odbc/php_odbc_includes.h +++ b/ext/odbc/php_odbc_includes.h @@ -232,7 +232,7 @@ typedef struct odbc_connection { } odbc_connection; typedef struct odbc_result_value { - char name[32]; + char name[256]; char *value; SQLLEN vallen; SQLLEN coltype; From 66fe7fabadd0b908828c865273d1fe3db2b7159b Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Sat, 26 Oct 2013 10:42:55 +0900 Subject: [PATCH 0223/1256] Update NEWS --- NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS b/NEWS index b51b8b23eb3cf..4020a446acdb1 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,11 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) +- ODBC + . Fixed bug #65950 (Field name truncation if the field name is bigger than + 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) + + 17 Oct 2013, PHP 5.5.5 - Core: From e18e7a598305ac0472dcaae0226bc72ab22039ba Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sun, 27 Oct 2013 16:52:43 +0800 Subject: [PATCH 0224/1256] remove "PHP 6" staff --- ext/phar/dirstream.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index 277d058ea6ce8..a48cde2f9762a 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -168,11 +168,7 @@ static int phar_compare_dir_name(const void *a, const void *b TSRMLS_DC) /* {{{ f = *((Bucket **) a); s = *((Bucket **) b); -#if (PHP_MAJOR_VERSION < 6) result = zend_binary_strcmp(f->arKey, f->nKeyLength, s->arKey, s->nKeyLength); -#else - result = zend_binary_strcmp(f->key.arKey.s, f->nKeyLength, s->key.arKey.s, s->nKeyLength); -#endif if (result < 0) { return -1; From 9765763413526d641b98c0a1e40d57b5ba1cceb3 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Sun, 27 Oct 2013 22:54:47 +0400 Subject: [PATCH 0225/1256] increase backlog to the highest value everywhere It makes no sense to use -1 for *BSD (which is the highest value there) and still use 128 for Linux. Lets raise it right to up the limit and let the people lower it if they think that 3.5Mb is too much for a process. IMO this is better than silently dropping connections. --- sapi/fpm/fpm/fpm_sockets.h | 2 +- sapi/fpm/php-fpm.conf.in | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index cce5712b8cfbf..121c016a7b89b 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -19,7 +19,7 @@ #if (__FreeBSD__) || (__OpenBSD__) #define FPM_BACKLOG_DEFAULT -1 #else -#define FPM_BACKLOG_DEFAULT 128 +#define FPM_BACKLOG_DEFAULT 65535 #endif enum fpm_address_domain fpm_sockets_domain_from_address(char *addr); diff --git a/sapi/fpm/php-fpm.conf.in b/sapi/fpm/php-fpm.conf.in index af4f2fa325a3f..9002a2933bb26 100644 --- a/sapi/fpm/php-fpm.conf.in +++ b/sapi/fpm/php-fpm.conf.in @@ -159,8 +159,8 @@ group = @php_fpm_group@ listen = 127.0.0.1:9000 ; Set listen(2) backlog. -; Default Value: 128 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 128 +; Default Value: 65535 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 65535 ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many From 8da5734cf57f895bb8d27599fd139f343bc6bec2 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 27 Oct 2013 15:21:21 -0700 Subject: [PATCH 0226/1256] test commit --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d84b1edfc2a35..0c45a234697c4 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 201?, PHP 5.6.0 +?? ??? 20??, PHP 5.6.0 - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) From f8f643b4f71482be0e587c176ce4ffb2d6d2d92b Mon Sep 17 00:00:00 2001 From: Hannes Magnusson Date: Sun, 27 Oct 2013 16:40:37 -0700 Subject: [PATCH 0227/1256] Link to more readmes --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 51973854db86f..09e70e6a39f99 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ See https://wiki.php.net/rfc and https://wiki.php.net/rfc/voting for more information on the process. Bug fixes **do not** require an RFC, but require a bugtracker ticket. Always -open a ticket at http://bugs.php.net and reference the bug id using #NNNNNN. +open a ticket at https://bugs.php.net and reference the bug id using #NNNNNN. Fix #55371: get_magic_quotes_gpc() throws deprecation warning @@ -28,3 +28,12 @@ open a ticket at http://bugs.php.net and reference the bug id using #NNNNNN. We do not merge pull requests directly on github. All PRs will be pulled and pushed through http://git.php.net. + + +Guidelines for contributors +=========================== +- [CODING_STANDARDS](/CODING_STANDARDS) +- [README.GIT-RULES](/README.GIT-RULES) +- [README.MAILINGLIST_RULES](/README.MAILINGLIST_RULES) +- [README.RELEASE_PROCESS](/README.RELEASE_PROCESS) + From 8962f3ff0c76c5710f5e14d6f342f44498ff882b Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 25 Oct 2013 09:42:54 +0200 Subject: [PATCH 0228/1256] fix limitation of upload size == (U)INT_MAX in CGI --- sapi/cgi/cgi_main.c | 5 ++++- sapi/fpm/fpm/fpm_main.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 221b0021756dc..43816d4d13a9b 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -524,8 +524,11 @@ static int sapi_fcgi_read_post(char *buffer, uint count_bytes TSRMLS_DC) uint read_bytes = 0; int tmp_read_bytes; fcgi_request *request = (fcgi_request*) SG(server_context); + size_t remaining = SG(request_info).content_length - SG(read_post_bytes); - count_bytes = MIN(count_bytes, (uint) SG(request_info).content_length - SG(read_post_bytes)); + if (remaining < count_bytes) { + count_bytes = remaining; + } while (read_bytes < count_bytes) { tmp_read_bytes = fcgi_read(request, buffer + read_bytes, count_bytes - read_bytes); if (tmp_read_bytes <= 0) { diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 4b20e632dd361..91abfea959f3a 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -498,8 +498,11 @@ static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC) { uint read_bytes = 0; int tmp_read_bytes; + size_t remaining = SG(request_info).content_length - SG(read_post_bytes); - count_bytes = MIN(count_bytes, (uint) SG(request_info).content_length - SG(read_post_bytes)); + if (remaining < count_bytes) { + count_bytes = remaining; + } while (read_bytes < count_bytes) { fcgi_request *request = (fcgi_request*) SG(server_context); if (request_body_fd == -1) { From 91b8a6752e2d987ff7b1ee10c343dcba13c94914 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 13:17:55 +0400 Subject: [PATCH 0229/1256] Improved performance of func_get_args() by eliminating useless copying --- NEWS | 2 ++ Zend/zend_builtin_functions.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index b51b8b23eb3cf..57066f9796942 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: + . Improved performance of func_get_args by eliminating useless copying. + (Dmitry) . Fixed bug #65939 (Space before ";" breaks php.ini parsing). (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 1ad64e74eaf47..6cbe0bc6872a5 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -461,12 +461,17 @@ ZEND_FUNCTION(func_get_args) array_init_size(return_value, arg_count); for (i=0; ivalue.ht, &element, sizeof(zval *), NULL); } } From 5c0890ba8a442c4e88abaa1eacf2db100cb9d4d8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 13:31:44 +0400 Subject: [PATCH 0230/1256] Improved performance of array_merge() by eliminating useless copying --- NEWS | 4 ++-- ext/standard/array.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index 57066f9796942..0ab8a40588478 100644 --- a/NEWS +++ b/NEWS @@ -3,8 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: - . Improved performance of func_get_args by eliminating useless copying. - (Dmitry) + . Improved performance of array_merge() and func_get_args() by eliminating + useless copying. (Dmitry) . Fixed bug #65939 (Space before ";" breaks php.ini parsing). (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). diff --git a/ext/standard/array.c b/ext/standard/array.c index 51972033ee711..360a691d38d76 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2222,13 +2222,14 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS case HASH_KEY_IS_STRING: if (recursive && zend_hash_find(dest, string_key, string_key_len, (void **)&dest_entry) == SUCCESS) { HashTable *thash = Z_TYPE_PP(dest_entry) == IS_ARRAY ? Z_ARRVAL_PP(dest_entry) : NULL; + zval *src_zval; + zval *tmp = NULL; if ((thash && thash->nApplyCount > 1) || (*src_entry == *dest_entry && Z_ISREF_PP(dest_entry) && (Z_REFCOUNT_PP(dest_entry) % 2))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected"); return 0; } SEPARATE_ZVAL(dest_entry); - SEPARATE_ZVAL(src_entry); if (Z_TYPE_PP(dest_entry) == IS_NULL) { convert_to_array_ex(dest_entry); @@ -2236,23 +2237,34 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS } else { convert_to_array_ex(dest_entry); } - if (Z_TYPE_PP(src_entry) == IS_NULL) { - convert_to_array_ex(src_entry); - add_next_index_null(*src_entry); + if (Z_TYPE_PP(src_entry) == IS_OBJECT) { + ALLOC_ZVAL(src_zval); + INIT_PZVAL_COPY(src_zval, *src_entry); + zval_copy_ctor(src_zval); + convert_to_array(src_zval); + tmp = src_zval; } else { - convert_to_array_ex(src_entry); + src_zval = *src_entry; } - if (thash) { - thash->nApplyCount++; - } - if (!php_array_merge(Z_ARRVAL_PP(dest_entry), Z_ARRVAL_PP(src_entry), recursive TSRMLS_CC)) { + if (Z_TYPE_P(src_zval) == IS_ARRAY) { + if (thash) { + thash->nApplyCount++; + } + if (!php_array_merge(Z_ARRVAL_PP(dest_entry), Z_ARRVAL_P(src_zval), recursive TSRMLS_CC)) { + if (thash) { + thash->nApplyCount--; + } + return 0; + } if (thash) { thash->nApplyCount--; } - return 0; + } else { + Z_ADDREF_PP(src_entry); + zend_hash_next_index_insert(Z_ARRVAL_PP(dest_entry), &src_zval, sizeof(zval *), NULL); } - if (thash) { - thash->nApplyCount--; + if (tmp) { + zval_ptr_dtor(&tmp); } } else { Z_ADDREF_PP(src_entry); @@ -2356,7 +2368,6 @@ static void php_array_merge_or_replace_wrapper(INTERNAL_FUNCTION_PARAMETERS, int array_init_size(return_value, init_size); for (i = 0; i < argc; i++) { - SEPARATE_ZVAL(args[i]); if (!replace) { php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_PP(args[i]), recursive TSRMLS_CC); } else if (recursive && i > 0) { /* First array will be copied directly instead */ From eb22041ffe70d5ff206d62c6cb12fc38c23475ce Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 14:19:40 +0400 Subject: [PATCH 0231/1256] Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) --- NEWS | 3 +++ ext/opcache/README | 4 ++-- ext/opcache/zend_accelerator_module.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 81b2811617310..9fe5fc463895f 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) +-OPcache + . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) + - ODBC . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) diff --git a/ext/opcache/README b/ext/opcache/README index 46521587fa719..2e30d92c001e1 100644 --- a/ext/opcache/README +++ b/ext/opcache/README @@ -80,8 +80,8 @@ opcache.max_accelerated_files (default "2000") The maximum number of keys (scripts) in the OPcache hash table. The number is actually the first one in the following set of prime numbers that is bigger than the one supplied: { 223, 463, 983, 1979, 3907, - 7963, 16229, 32531, 65407, 130987 }. Only numbers between 200 and 100000 - are allowed. + 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 }. Only numbers + between 200 and 1000000 are allowed. opcache.max_wasted_percentage (default "5") The maximum percentage of "wasted" memory until a restart is scheduled. diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index dedb7215c1df3..0914fb68dd936 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -34,7 +34,7 @@ #define STRING_NOT_NULL(s) (NULL == (s)?"":s) #define MIN_ACCEL_FILES 200 -#define MAX_ACCEL_FILES 100000 +#define MAX_ACCEL_FILES 1000000 #define TOKENTOSTR(X) #X static void (*orig_file_exists)(INTERNAL_FUNCTION_PARAMETERS) = NULL; From 2d14cc2a4986a3a2afd94c79283ab1dc8a3fe157 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 14:44:07 +0400 Subject: [PATCH 0232/1256] Use zval* instead of zval** --- Zend/zend_vm_def.h | 28 ++-- Zend/zend_vm_execute.h | 336 +++++++++++++++++++---------------------- 2 files changed, 169 insertions(+), 195 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 201ae49e05a68..c2c3ae52195fb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4453,22 +4453,22 @@ ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, VAR|UNUSED|CV, CONST| { USE_OPLINE zend_free_op free_op1, free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_IS); + container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS); offset = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -4487,9 +4487,7 @@ ZEND_VM_C_LABEL(num_index_prop): if (OP2_TYPE == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_prop)); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_prop)); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -4524,20 +4522,20 @@ ZEND_VM_C_LABEL(num_index_prop): } } FREE_OP2(); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (IS_OP2_TMP_FREE()) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -4548,7 +4546,7 @@ ZEND_VM_C_LABEL(num_index_prop): } else { FREE_OP2(); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -4566,11 +4564,11 @@ ZEND_VM_C_LABEL(num_index_prop): } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 74a8c12d400e4..b21f6bf895101 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -16074,22 +16074,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( { USE_OPLINE zend_free_op free_op1; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = opline->op2.zv; - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -16108,9 +16108,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( if (IS_CONST == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -16145,20 +16143,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -16169,7 +16167,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -16187,11 +16185,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -18168,22 +18166,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in { USE_OPLINE zend_free_op free_op1, free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -18202,9 +18200,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in if (IS_TMP_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -18239,20 +18235,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in } } zval_dtor(free_op2.var); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (1) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -18263,7 +18259,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in } else { zval_dtor(free_op2.var); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -18281,11 +18277,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -20644,22 +20640,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in { USE_OPLINE zend_free_op free_op1, free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -20678,9 +20674,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in if (IS_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -20715,20 +20709,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } } if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -20739,7 +20733,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } else { if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -20757,11 +20751,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -23936,22 +23930,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int { USE_OPLINE zend_free_op free_op1; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -23970,9 +23964,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int if (IS_CV == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -24007,20 +23999,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -24031,7 +24023,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -24049,11 +24041,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -25440,22 +25432,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = opline->op2.zv; - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -25474,9 +25466,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON if (IS_CONST == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -25511,20 +25501,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -25535,7 +25525,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -25553,11 +25543,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -26756,22 +26746,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -26790,9 +26780,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP if (IS_TMP_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -26827,20 +26815,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP } } zval_dtor(free_op2.var); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (1) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -26851,7 +26839,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP } else { zval_dtor(free_op2.var); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -26869,11 +26857,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -28072,22 +28060,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -28106,9 +28094,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR if (IS_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -28143,20 +28129,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } } if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -28167,7 +28153,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } else { if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -28185,11 +28171,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -29808,22 +29794,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -29842,9 +29828,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( if (IS_CV == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -29879,20 +29863,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -29903,7 +29887,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -29921,11 +29905,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -33302,22 +33286,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = opline->op2.zv; - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -33336,9 +33320,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i if (IS_CONST == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -33373,20 +33355,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -33397,7 +33379,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -33415,11 +33397,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -35258,22 +35240,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -35292,9 +35274,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int if (IS_TMP_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -35329,20 +35309,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int } } zval_dtor(free_op2.var); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (1) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -35353,7 +35333,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int } else { zval_dtor(free_op2.var); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -35371,11 +35351,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -37595,22 +37575,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -37629,9 +37609,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int if (IS_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -37666,20 +37644,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } } if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -37690,7 +37668,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } else { if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -37708,11 +37686,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -40600,22 +40578,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -40634,9 +40612,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int if (IS_CV == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -40671,20 +40647,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -40695,7 +40671,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -40713,11 +40689,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } From ab6481993eb302cd70599cec35d4ac486ca3d1f8 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Mon, 28 Oct 2013 15:12:30 +0100 Subject: [PATCH 0233/1256] - Updated to version 2013.8 (2013h) --- ext/date/lib/timezonedb.h | 1256 ++++++++++++++++++------------------- 1 file changed, 628 insertions(+), 628 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 99280062b22a7..91884a935f567 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -21,566 +21,566 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[579] = { { "Africa/Djibouti" , 0x000F1F }, { "Africa/Douala" , 0x000F74 }, { "Africa/El_Aaiun" , 0x000FC9 }, - { "Africa/Freetown" , 0x00102F }, - { "Africa/Gaborone" , 0x00113E }, - { "Africa/Harare" , 0x0011AB }, - { "Africa/Johannesburg" , 0x001200 }, - { "Africa/Juba" , 0x00126E }, - { "Africa/Kampala" , 0x001381 }, - { "Africa/Khartoum" , 0x001400 }, - { "Africa/Kigali" , 0x001513 }, - { "Africa/Kinshasa" , 0x001568 }, - { "Africa/Lagos" , 0x0015C3 }, - { "Africa/Libreville" , 0x001618 }, - { "Africa/Lome" , 0x00166D }, - { "Africa/Luanda" , 0x0016B1 }, - { "Africa/Lubumbashi" , 0x001706 }, - { "Africa/Lusaka" , 0x001761 }, - { "Africa/Malabo" , 0x0017B6 }, - { "Africa/Maputo" , 0x00181C }, - { "Africa/Maseru" , 0x001871 }, - { "Africa/Mbabane" , 0x0018D9 }, - { "Africa/Mogadishu" , 0x00192F }, - { "Africa/Monrovia" , 0x00198A }, - { "Africa/Nairobi" , 0x0019F0 }, - { "Africa/Ndjamena" , 0x001A6F }, - { "Africa/Niamey" , 0x001ADB }, - { "Africa/Nouakchott" , 0x001B4E }, - { "Africa/Ouagadougou" , 0x001BB9 }, - { "Africa/Porto-Novo" , 0x001C0E }, - { "Africa/Sao_Tome" , 0x001C74 }, - { "Africa/Timbuktu" , 0x001CC9 }, - { "Africa/Tripoli" , 0x001D34 }, - { "Africa/Tunis" , 0x001F2D }, - { "Africa/Windhoek" , 0x00203F }, - { "America/Adak" , 0x002286 }, - { "America/Anchorage" , 0x0025FC }, - { "America/Anguilla" , 0x002970 }, - { "America/Antigua" , 0x0029C5 }, - { "America/Araguaina" , 0x002A2B }, - { "America/Argentina/Buenos_Aires" , 0x002B90 }, - { "America/Argentina/Catamarca" , 0x002D3E }, - { "America/Argentina/ComodRivadavia" , 0x002EFF }, - { "America/Argentina/Cordoba" , 0x0030A5 }, - { "America/Argentina/Jujuy" , 0x00327A }, - { "America/Argentina/La_Rioja" , 0x00342E }, - { "America/Argentina/Mendoza" , 0x0035E6 }, - { "America/Argentina/Rio_Gallegos" , 0x0037A6 }, - { "America/Argentina/Salta" , 0x00395B }, - { "America/Argentina/San_Juan" , 0x003B07 }, - { "America/Argentina/San_Luis" , 0x003CBF }, - { "America/Argentina/Tucuman" , 0x003E85 }, - { "America/Argentina/Ushuaia" , 0x004041 }, - { "America/Aruba" , 0x0041FC }, - { "America/Asuncion" , 0x004262 }, - { "America/Atikokan" , 0x004547 }, - { "America/Atka" , 0x00461D }, - { "America/Bahia" , 0x004983 }, - { "America/Bahia_Banderas" , 0x004B16 }, - { "America/Barbados" , 0x004D8F }, - { "America/Belem" , 0x004E29 }, - { "America/Belize" , 0x004F24 }, - { "America/Blanc-Sablon" , 0x0050A0 }, - { "America/Boa_Vista" , 0x005154 }, - { "America/Bogota" , 0x00525D }, - { "America/Boise" , 0x0052C9 }, - { "America/Buenos_Aires" , 0x005660 }, - { "America/Cambridge_Bay" , 0x0057F9 }, - { "America/Campo_Grande" , 0x005B21 }, - { "America/Cancun" , 0x005E10 }, - { "America/Caracas" , 0x006052 }, - { "America/Catamarca" , 0x0060B9 }, - { "America/Cayenne" , 0x00625F }, - { "America/Cayman" , 0x0062C1 }, - { "America/Chicago" , 0x006316 }, - { "America/Chihuahua" , 0x00682D }, - { "America/Coral_Harbour" , 0x006A98 }, - { "America/Cordoba" , 0x006B2A }, - { "America/Costa_Rica" , 0x006CD0 }, - { "America/Creston" , 0x006D5A }, - { "America/Cuiaba" , 0x006DE6 }, - { "America/Curacao" , 0x0070C4 }, - { "America/Danmarkshavn" , 0x00712A }, - { "America/Dawson" , 0x00726E }, - { "America/Dawson_Creek" , 0x00758B }, - { "America/Denver" , 0x007765 }, - { "America/Detroit" , 0x007AEB }, - { "America/Dominica" , 0x007E4A }, - { "America/Edmonton" , 0x007E9F }, - { "America/Eirunepe" , 0x008257 }, - { "America/El_Salvador" , 0x00836A }, - { "America/Ensenada" , 0x0083DF }, - { "America/Fort_Wayne" , 0x008886 }, - { "America/Fortaleza" , 0x008748 }, - { "America/Glace_Bay" , 0x008AF0 }, - { "America/Godthab" , 0x008E67 }, - { "America/Goose_Bay" , 0x00912B }, - { "America/Grand_Turk" , 0x0095E8 }, - { "America/Grenada" , 0x009897 }, - { "America/Guadeloupe" , 0x0098EC }, - { "America/Guatemala" , 0x009941 }, - { "America/Guayaquil" , 0x0099CA }, - { "America/Guyana" , 0x009A27 }, - { "America/Halifax" , 0x009AA8 }, - { "America/Havana" , 0x009FBE }, - { "America/Hermosillo" , 0x00A331 }, - { "America/Indiana/Indianapolis" , 0x00A40F }, - { "America/Indiana/Knox" , 0x00A6A0 }, - { "America/Indiana/Marengo" , 0x00AA37 }, - { "America/Indiana/Petersburg" , 0x00ACDD }, - { "America/Indiana/Tell_City" , 0x00B22A }, - { "America/Indiana/Vevay" , 0x00B4C3 }, - { "America/Indiana/Vincennes" , 0x00B6FE }, - { "America/Indiana/Winamac" , 0x00B9B2 }, - { "America/Indianapolis" , 0x00AFC0 }, - { "America/Inuvik" , 0x00BC6B }, - { "America/Iqaluit" , 0x00BF62 }, - { "America/Jamaica" , 0x00C284 }, - { "America/Jujuy" , 0x00C349 }, - { "America/Juneau" , 0x00C4F3 }, - { "America/Kentucky/Louisville" , 0x00C871 }, - { "America/Kentucky/Monticello" , 0x00CC8F }, - { "America/Knox_IN" , 0x00D014 }, - { "America/Kralendijk" , 0x00D385 }, - { "America/La_Paz" , 0x00D3EB }, - { "America/Lima" , 0x00D452 }, - { "America/Los_Angeles" , 0x00D4FA }, - { "America/Louisville" , 0x00D90B }, - { "America/Lower_Princes" , 0x00DD00 }, - { "America/Maceio" , 0x00DD66 }, - { "America/Managua" , 0x00DEA0 }, - { "America/Manaus" , 0x00DF53 }, - { "America/Marigot" , 0x00E055 }, - { "America/Martinique" , 0x00E0AA }, - { "America/Matamoros" , 0x00E116 }, - { "America/Mazatlan" , 0x00E36F }, - { "America/Mendoza" , 0x00E5DC }, - { "America/Menominee" , 0x00E790 }, - { "America/Merida" , 0x00EB11 }, - { "America/Metlakatla" , 0x00ED4C }, - { "America/Mexico_City" , 0x00EE86 }, - { "America/Miquelon" , 0x00F101 }, - { "America/Moncton" , 0x00F373 }, - { "America/Monterrey" , 0x00F80A }, - { "America/Montevideo" , 0x00FA6D }, - { "America/Montreal" , 0x00FD7F }, - { "America/Montserrat" , 0x01026F }, - { "America/Nassau" , 0x0102C4 }, - { "America/New_York" , 0x010609 }, - { "America/Nipigon" , 0x010B14 }, - { "America/Nome" , 0x010E65 }, - { "America/Noronha" , 0x0111E3 }, - { "America/North_Dakota/Beulah" , 0x011313 }, - { "America/North_Dakota/Center" , 0x0116A7 }, - { "America/North_Dakota/New_Salem" , 0x011A3B }, - { "America/Ojinaga" , 0x011DE4 }, - { "America/Panama" , 0x012045 }, - { "America/Pangnirtung" , 0x01209A }, - { "America/Paramaribo" , 0x0123D0 }, - { "America/Phoenix" , 0x012462 }, - { "America/Port-au-Prince" , 0x012520 }, - { "America/Port_of_Spain" , 0x01283F }, - { "America/Porto_Acre" , 0x012740 }, - { "America/Porto_Velho" , 0x012894 }, - { "America/Puerto_Rico" , 0x01298A }, - { "America/Rainy_River" , 0x0129F5 }, - { "America/Rankin_Inlet" , 0x012D2D }, - { "America/Recife" , 0x013013 }, - { "America/Regina" , 0x01313D }, - { "America/Resolute" , 0x0132FB }, - { "America/Rio_Branco" , 0x0135EC }, - { "America/Rosario" , 0x0136EF }, - { "America/Santa_Isabel" , 0x013895 }, - { "America/Santarem" , 0x013C38 }, - { "America/Santiago" , 0x013D3D }, - { "America/Santo_Domingo" , 0x0140E6 }, - { "America/Sao_Paulo" , 0x0141AC }, - { "America/Scoresbysund" , 0x0144BB }, - { "America/Shiprock" , 0x0147A9 }, - { "America/Sitka" , 0x014B22 }, - { "America/St_Barthelemy" , 0x014EAA }, - { "America/St_Johns" , 0x014EFF }, - { "America/St_Kitts" , 0x015452 }, - { "America/St_Lucia" , 0x0154A7 }, - { "America/St_Thomas" , 0x0154FC }, - { "America/St_Vincent" , 0x015551 }, - { "America/Swift_Current" , 0x0155A6 }, - { "America/Tegucigalpa" , 0x0156C7 }, - { "America/Thule" , 0x015746 }, - { "America/Thunder_Bay" , 0x01598D }, - { "America/Tijuana" , 0x015CD6 }, - { "America/Toronto" , 0x01606F }, - { "America/Tortola" , 0x01658F }, - { "America/Vancouver" , 0x0165E4 }, - { "America/Virgin" , 0x016A21 }, - { "America/Whitehorse" , 0x016A76 }, - { "America/Winnipeg" , 0x016D93 }, - { "America/Yakutat" , 0x0171D3 }, - { "America/Yellowknife" , 0x01753E }, - { "Antarctica/Casey" , 0x01784E }, - { "Antarctica/Davis" , 0x0178EB }, - { "Antarctica/DumontDUrville" , 0x01798C }, - { "Antarctica/Macquarie" , 0x017A1E }, - { "Antarctica/Mawson" , 0x017C65 }, - { "Antarctica/McMurdo" , 0x017CE1 }, - { "Antarctica/Palmer" , 0x01808C }, - { "Antarctica/Rothera" , 0x0183A8 }, - { "Antarctica/South_Pole" , 0x01841E }, - { "Antarctica/Syowa" , 0x01879C }, - { "Antarctica/Vostok" , 0x01880A }, - { "Arctic/Longyearbyen" , 0x01887B }, - { "Asia/Aden" , 0x018BAD }, - { "Asia/Almaty" , 0x018C02 }, - { "Asia/Amman" , 0x018D81 }, - { "Asia/Anadyr" , 0x018F53 }, - { "Asia/Aqtau" , 0x019138 }, - { "Asia/Aqtobe" , 0x019337 }, - { "Asia/Ashgabat" , 0x0194EF }, - { "Asia/Ashkhabad" , 0x01960C }, - { "Asia/Baghdad" , 0x019729 }, - { "Asia/Bahrain" , 0x01989E }, - { "Asia/Baku" , 0x019904 }, - { "Asia/Bangkok" , 0x019BEC }, - { "Asia/Beirut" , 0x019C41 }, - { "Asia/Bishkek" , 0x019F4E }, - { "Asia/Brunei" , 0x01A0FA }, - { "Asia/Calcutta" , 0x01A15C }, - { "Asia/Choibalsan" , 0x01A1D5 }, - { "Asia/Chongqing" , 0x01A34E }, - { "Asia/Chungking" , 0x01A43D }, - { "Asia/Colombo" , 0x01A4EC }, - { "Asia/Dacca" , 0x01A588 }, - { "Asia/Damascus" , 0x01A62E }, - { "Asia/Dhaka" , 0x01A97E }, - { "Asia/Dili" , 0x01AA24 }, - { "Asia/Dubai" , 0x01AAAE }, - { "Asia/Dushanbe" , 0x01AB03 }, - { "Asia/Gaza" , 0x01AC06 }, - { "Asia/Harbin" , 0x01AF59 }, - { "Asia/Hebron" , 0x01B040 }, - { "Asia/Ho_Chi_Minh" , 0x01B39C }, - { "Asia/Hong_Kong" , 0x01B414 }, - { "Asia/Hovd" , 0x01B5D6 }, - { "Asia/Irkutsk" , 0x01B74E }, - { "Asia/Istanbul" , 0x01B934 }, - { "Asia/Jakarta" , 0x01BD21 }, - { "Asia/Jayapura" , 0x01BDCB }, - { "Asia/Jerusalem" , 0x01BE67 }, - { "Asia/Kabul" , 0x01C196 }, - { "Asia/Kamchatka" , 0x01C1E7 }, - { "Asia/Karachi" , 0x01C3C3 }, - { "Asia/Kashgar" , 0x01C478 }, - { "Asia/Kathmandu" , 0x01C549 }, - { "Asia/Katmandu" , 0x01C5AF }, - { "Asia/Khandyga" , 0x01C615 }, - { "Asia/Kolkata" , 0x01C83A }, - { "Asia/Krasnoyarsk" , 0x01C8B3 }, - { "Asia/Kuala_Lumpur" , 0x01CA9B }, - { "Asia/Kuching" , 0x01CB58 }, - { "Asia/Kuwait" , 0x01CC46 }, - { "Asia/Macao" , 0x01CC9B }, - { "Asia/Macau" , 0x01CDD6 }, - { "Asia/Magadan" , 0x01CF11 }, - { "Asia/Makassar" , 0x01D0F3 }, - { "Asia/Manila" , 0x01D1B8 }, - { "Asia/Muscat" , 0x01D23D }, - { "Asia/Nicosia" , 0x01D292 }, - { "Asia/Novokuznetsk" , 0x01D57A }, - { "Asia/Novosibirsk" , 0x01D77C }, - { "Asia/Omsk" , 0x01D967 }, - { "Asia/Oral" , 0x01DB4E }, - { "Asia/Phnom_Penh" , 0x01DD1E }, - { "Asia/Pontianak" , 0x01DD96 }, - { "Asia/Pyongyang" , 0x01DE58 }, - { "Asia/Qatar" , 0x01DEC5 }, - { "Asia/Qyzylorda" , 0x01DF2B }, - { "Asia/Rangoon" , 0x01E101 }, - { "Asia/Riyadh" , 0x01E179 }, - { "Asia/Saigon" , 0x01E1CE }, - { "Asia/Sakhalin" , 0x01E246 }, - { "Asia/Samarkand" , 0x01E43D }, - { "Asia/Seoul" , 0x01E573 }, - { "Asia/Shanghai" , 0x01E617 }, - { "Asia/Singapore" , 0x01E6F7 }, - { "Asia/Taipei" , 0x01E7AE }, - { "Asia/Tashkent" , 0x01E8C6 }, - { "Asia/Tbilisi" , 0x01E9F7 }, - { "Asia/Tehran" , 0x01EBB1 }, - { "Asia/Tel_Aviv" , 0x01EE1F }, - { "Asia/Thimbu" , 0x01F14E }, - { "Asia/Thimphu" , 0x01F1B4 }, - { "Asia/Tokyo" , 0x01F21A }, - { "Asia/Ujung_Pandang" , 0x01F2A3 }, - { "Asia/Ulaanbaatar" , 0x01F320 }, - { "Asia/Ulan_Bator" , 0x01F47B }, - { "Asia/Urumqi" , 0x01F5C8 }, - { "Asia/Ust-Nera" , 0x01F68F }, - { "Asia/Vientiane" , 0x01F894 }, - { "Asia/Vladivostok" , 0x01F90C }, - { "Asia/Yakutsk" , 0x01FAF8 }, - { "Asia/Yekaterinburg" , 0x01FCDD }, - { "Asia/Yerevan" , 0x01FEE8 }, - { "Atlantic/Azores" , 0x0200E8 }, - { "Atlantic/Bermuda" , 0x0205EB }, - { "Atlantic/Canary" , 0x0208CC }, - { "Atlantic/Cape_Verde" , 0x020BA2 }, - { "Atlantic/Faeroe" , 0x020C1B }, - { "Atlantic/Faroe" , 0x020EBF }, - { "Atlantic/Jan_Mayen" , 0x021163 }, - { "Atlantic/Madeira" , 0x021495 }, - { "Atlantic/Reykjavik" , 0x02199E }, - { "Atlantic/South_Georgia" , 0x021B57 }, - { "Atlantic/St_Helena" , 0x021D69 }, - { "Atlantic/Stanley" , 0x021B9B }, - { "Australia/ACT" , 0x021DBE }, - { "Australia/Adelaide" , 0x0220DB }, - { "Australia/Brisbane" , 0x022407 }, - { "Australia/Broken_Hill" , 0x0224CE }, - { "Australia/Canberra" , 0x02280C }, - { "Australia/Currie" , 0x022B29 }, - { "Australia/Darwin" , 0x022E5C }, - { "Australia/Eucla" , 0x022EE2 }, - { "Australia/Hobart" , 0x022FB7 }, - { "Australia/LHI" , 0x023315 }, - { "Australia/Lindeman" , 0x0235B0 }, - { "Australia/Lord_Howe" , 0x023691 }, - { "Australia/Melbourne" , 0x02393C }, - { "Australia/North" , 0x023C61 }, - { "Australia/NSW" , 0x023CD5 }, - { "Australia/Perth" , 0x023FF2 }, - { "Australia/Queensland" , 0x0240CA }, - { "Australia/South" , 0x024176 }, - { "Australia/Sydney" , 0x024493 }, - { "Australia/Tasmania" , 0x0247D0 }, - { "Australia/Victoria" , 0x024B15 }, - { "Australia/West" , 0x024E32 }, - { "Australia/Yancowinna" , 0x024EE8 }, - { "Brazil/Acre" , 0x02520A }, - { "Brazil/DeNoronha" , 0x025309 }, - { "Brazil/East" , 0x025429 }, - { "Brazil/West" , 0x025706 }, - { "Canada/Atlantic" , 0x0257FE }, - { "Canada/Central" , 0x025CE6 }, - { "Canada/East-Saskatchewan" , 0x0265F0 }, - { "Canada/Eastern" , 0x026100 }, - { "Canada/Mountain" , 0x026779 }, - { "Canada/Newfoundland" , 0x026AEF }, - { "Canada/Pacific" , 0x02701A }, - { "Canada/Saskatchewan" , 0x027433 }, - { "Canada/Yukon" , 0x0275BC }, - { "CET" , 0x0278BF }, - { "Chile/Continental" , 0x027BC8 }, - { "Chile/EasterIsland" , 0x027F63 }, - { "CST6CDT" , 0x0282A5 }, - { "Cuba" , 0x0285F6 }, - { "EET" , 0x028969 }, - { "Egypt" , 0x028C1C }, - { "Eire" , 0x028EDF }, - { "EST" , 0x0293F0 }, - { "EST5EDT" , 0x029434 }, - { "Etc/GMT" , 0x029785 }, - { "Etc/GMT+0" , 0x029851 }, - { "Etc/GMT+1" , 0x0298DB }, - { "Etc/GMT+10" , 0x029968 }, - { "Etc/GMT+11" , 0x0299F6 }, - { "Etc/GMT+12" , 0x029A84 }, - { "Etc/GMT+2" , 0x029B9F }, - { "Etc/GMT+3" , 0x029C2B }, - { "Etc/GMT+4" , 0x029CB7 }, - { "Etc/GMT+5" , 0x029D43 }, - { "Etc/GMT+6" , 0x029DCF }, - { "Etc/GMT+7" , 0x029E5B }, - { "Etc/GMT+8" , 0x029EE7 }, - { "Etc/GMT+9" , 0x029F73 }, - { "Etc/GMT-0" , 0x02980D }, - { "Etc/GMT-1" , 0x029895 }, - { "Etc/GMT-10" , 0x029921 }, - { "Etc/GMT-11" , 0x0299AF }, - { "Etc/GMT-12" , 0x029A3D }, - { "Etc/GMT-13" , 0x029ACB }, - { "Etc/GMT-14" , 0x029B12 }, - { "Etc/GMT-2" , 0x029B59 }, - { "Etc/GMT-3" , 0x029BE5 }, - { "Etc/GMT-4" , 0x029C71 }, - { "Etc/GMT-5" , 0x029CFD }, - { "Etc/GMT-6" , 0x029D89 }, - { "Etc/GMT-7" , 0x029E15 }, - { "Etc/GMT-8" , 0x029EA1 }, - { "Etc/GMT-9" , 0x029F2D }, - { "Etc/GMT0" , 0x0297C9 }, - { "Etc/Greenwich" , 0x029FB9 }, - { "Etc/UCT" , 0x029FFD }, - { "Etc/Universal" , 0x02A041 }, - { "Etc/UTC" , 0x02A085 }, - { "Etc/Zulu" , 0x02A0C9 }, - { "Europe/Amsterdam" , 0x02A10D }, - { "Europe/Andorra" , 0x02A54B }, - { "Europe/Athens" , 0x02A7C7 }, - { "Europe/Belfast" , 0x02AB0A }, - { "Europe/Belgrade" , 0x02B041 }, - { "Europe/Berlin" , 0x02B30A }, - { "Europe/Bratislava" , 0x02B66E }, - { "Europe/Brussels" , 0x02B9A0 }, - { "Europe/Bucharest" , 0x02BDD7 }, - { "Europe/Budapest" , 0x02C101 }, - { "Europe/Busingen" , 0x02C474 }, - { "Europe/Chisinau" , 0x02C72B }, - { "Europe/Copenhagen" , 0x02CAB9 }, - { "Europe/Dublin" , 0x02CDC3 }, - { "Europe/Gibraltar" , 0x02D2D4 }, - { "Europe/Guernsey" , 0x02D72B }, - { "Europe/Helsinki" , 0x02DC62 }, - { "Europe/Isle_of_Man" , 0x02DF18 }, - { "Europe/Istanbul" , 0x02E44F }, - { "Europe/Jersey" , 0x02E83C }, - { "Europe/Kaliningrad" , 0x02ED73 }, - { "Europe/Kiev" , 0x02EFD9 }, - { "Europe/Lisbon" , 0x02F2F0 }, - { "Europe/Ljubljana" , 0x02F7F4 }, - { "Europe/London" , 0x02FABD }, - { "Europe/Luxembourg" , 0x02FFF4 }, - { "Europe/Madrid" , 0x03044A }, - { "Europe/Malta" , 0x030810 }, - { "Europe/Mariehamn" , 0x030BC9 }, - { "Europe/Minsk" , 0x030E7F }, - { "Europe/Monaco" , 0x03108D }, - { "Europe/Moscow" , 0x0314C8 }, - { "Europe/Nicosia" , 0x031719 }, - { "Europe/Oslo" , 0x031A01 }, - { "Europe/Paris" , 0x031D33 }, - { "Europe/Podgorica" , 0x032179 }, - { "Europe/Prague" , 0x032442 }, - { "Europe/Riga" , 0x032774 }, - { "Europe/Rome" , 0x032AB9 }, - { "Europe/Samara" , 0x032E7C }, - { "Europe/San_Marino" , 0x0330AF }, - { "Europe/Sarajevo" , 0x033472 }, - { "Europe/Simferopol" , 0x03373B }, - { "Europe/Skopje" , 0x033A66 }, - { "Europe/Sofia" , 0x033D2F }, - { "Europe/Stockholm" , 0x034037 }, - { "Europe/Tallinn" , 0x0342E6 }, - { "Europe/Tirane" , 0x034620 }, - { "Europe/Tiraspol" , 0x034926 }, - { "Europe/Uzhgorod" , 0x034CB4 }, - { "Europe/Vaduz" , 0x034FCB }, - { "Europe/Vatican" , 0x03527A }, - { "Europe/Vienna" , 0x03563D }, - { "Europe/Vilnius" , 0x03596A }, - { "Europe/Volgograd" , 0x035CA9 }, - { "Europe/Warsaw" , 0x035EA9 }, - { "Europe/Zagreb" , 0x03628A }, - { "Europe/Zaporozhye" , 0x036553 }, - { "Europe/Zurich" , 0x036894 }, - { "Factory" , 0x036B43 }, - { "GB" , 0x036BB4 }, - { "GB-Eire" , 0x0370EB }, - { "GMT" , 0x037622 }, - { "GMT+0" , 0x0376EE }, - { "GMT-0" , 0x0376AA }, - { "GMT0" , 0x037666 }, - { "Greenwich" , 0x037732 }, - { "Hongkong" , 0x037776 }, - { "HST" , 0x037938 }, - { "Iceland" , 0x03797C }, - { "Indian/Antananarivo" , 0x037B35 }, - { "Indian/Chagos" , 0x037BA9 }, - { "Indian/Christmas" , 0x037C0B }, - { "Indian/Cocos" , 0x037C4F }, - { "Indian/Comoro" , 0x037C93 }, - { "Indian/Kerguelen" , 0x037CE8 }, - { "Indian/Mahe" , 0x037D3D }, - { "Indian/Maldives" , 0x037D92 }, - { "Indian/Mauritius" , 0x037DE7 }, - { "Indian/Mayotte" , 0x037E5D }, - { "Indian/Reunion" , 0x037EB2 }, - { "Iran" , 0x037F07 }, - { "Israel" , 0x038175 }, - { "Jamaica" , 0x0384A4 }, - { "Japan" , 0x038569 }, - { "Kwajalein" , 0x0385F2 }, - { "Libya" , 0x038655 }, - { "MET" , 0x03884E }, - { "Mexico/BajaNorte" , 0x038B57 }, - { "Mexico/BajaSur" , 0x038EC0 }, - { "Mexico/General" , 0x039105 }, - { "MST" , 0x039363 }, - { "MST7MDT" , 0x0393A7 }, - { "Navajo" , 0x0396F8 }, - { "NZ" , 0x039A71 }, - { "NZ-CHAT" , 0x039DEF }, - { "Pacific/Apia" , 0x03A0D7 }, - { "Pacific/Auckland" , 0x03A273 }, - { "Pacific/Chatham" , 0x03A5FF }, - { "Pacific/Chuuk" , 0x03A8F6 }, - { "Pacific/Easter" , 0x03A94F }, - { "Pacific/Efate" , 0x03ACAD }, - { "Pacific/Enderbury" , 0x03AD73 }, - { "Pacific/Fakaofo" , 0x03ADE1 }, - { "Pacific/Fiji" , 0x03AE32 }, - { "Pacific/Funafuti" , 0x03AFC5 }, - { "Pacific/Galapagos" , 0x03B009 }, - { "Pacific/Gambier" , 0x03B081 }, - { "Pacific/Guadalcanal" , 0x03B0E6 }, - { "Pacific/Guam" , 0x03B13B }, - { "Pacific/Honolulu" , 0x03B191 }, - { "Pacific/Johnston" , 0x03B208 }, - { "Pacific/Kiritimati" , 0x03B287 }, - { "Pacific/Kosrae" , 0x03B2F2 }, - { "Pacific/Kwajalein" , 0x03B34F }, - { "Pacific/Majuro" , 0x03B3BB }, - { "Pacific/Marquesas" , 0x03B41A }, - { "Pacific/Midway" , 0x03B481 }, - { "Pacific/Nauru" , 0x03B50B }, - { "Pacific/Niue" , 0x03B583 }, - { "Pacific/Norfolk" , 0x03B5E1 }, - { "Pacific/Noumea" , 0x03B636 }, - { "Pacific/Pago_Pago" , 0x03B6C6 }, - { "Pacific/Palau" , 0x03B74F }, - { "Pacific/Pitcairn" , 0x03B793 }, - { "Pacific/Pohnpei" , 0x03B7E8 }, - { "Pacific/Ponape" , 0x03B83D }, - { "Pacific/Port_Moresby" , 0x03B882 }, - { "Pacific/Rarotonga" , 0x03B8C6 }, - { "Pacific/Saipan" , 0x03B9A2 }, - { "Pacific/Samoa" , 0x03BA05 }, - { "Pacific/Tahiti" , 0x03BA8E }, - { "Pacific/Tarawa" , 0x03BAF3 }, - { "Pacific/Tongatapu" , 0x03BB47 }, - { "Pacific/Truk" , 0x03BBD3 }, - { "Pacific/Wake" , 0x03BC18 }, - { "Pacific/Wallis" , 0x03BC68 }, - { "Pacific/Yap" , 0x03BCAC }, - { "Poland" , 0x03BCF1 }, - { "Portugal" , 0x03C0D2 }, - { "PRC" , 0x03C5CE }, - { "PST8PDT" , 0x03C67F }, - { "ROC" , 0x03C9D0 }, - { "ROK" , 0x03CAE8 }, - { "Singapore" , 0x03CB8C }, - { "Turkey" , 0x03CC43 }, - { "UCT" , 0x03D030 }, - { "Universal" , 0x03D074 }, - { "US/Alaska" , 0x03D0B8 }, - { "US/Aleutian" , 0x03D421 }, - { "US/Arizona" , 0x03D787 }, - { "US/Central" , 0x03D815 }, - { "US/East-Indiana" , 0x03E21F }, - { "US/Eastern" , 0x03DD20 }, - { "US/Hawaii" , 0x03E489 }, - { "US/Indiana-Starke" , 0x03E4FA }, - { "US/Michigan" , 0x03E86B }, - { "US/Mountain" , 0x03EBA2 }, - { "US/Pacific" , 0x03EF1B }, - { "US/Pacific-New" , 0x03F320 }, - { "US/Samoa" , 0x03F725 }, - { "UTC" , 0x03F7AE }, - { "W-SU" , 0x03FAA5 }, - { "WET" , 0x03F7F2 }, - { "Zulu" , 0x03FCDF }, + { "Africa/Freetown" , 0x0011F4 }, + { "Africa/Gaborone" , 0x001303 }, + { "Africa/Harare" , 0x001370 }, + { "Africa/Johannesburg" , 0x0013C5 }, + { "Africa/Juba" , 0x001433 }, + { "Africa/Kampala" , 0x001546 }, + { "Africa/Khartoum" , 0x0015C5 }, + { "Africa/Kigali" , 0x0016D8 }, + { "Africa/Kinshasa" , 0x00172D }, + { "Africa/Lagos" , 0x001788 }, + { "Africa/Libreville" , 0x0017DD }, + { "Africa/Lome" , 0x001832 }, + { "Africa/Luanda" , 0x001876 }, + { "Africa/Lubumbashi" , 0x0018CB }, + { "Africa/Lusaka" , 0x001926 }, + { "Africa/Malabo" , 0x00197B }, + { "Africa/Maputo" , 0x0019E1 }, + { "Africa/Maseru" , 0x001A36 }, + { "Africa/Mbabane" , 0x001A9E }, + { "Africa/Mogadishu" , 0x001AF4 }, + { "Africa/Monrovia" , 0x001B4F }, + { "Africa/Nairobi" , 0x001BB5 }, + { "Africa/Ndjamena" , 0x001C34 }, + { "Africa/Niamey" , 0x001CA0 }, + { "Africa/Nouakchott" , 0x001D13 }, + { "Africa/Ouagadougou" , 0x001D7E }, + { "Africa/Porto-Novo" , 0x001DD3 }, + { "Africa/Sao_Tome" , 0x001E39 }, + { "Africa/Timbuktu" , 0x001E8E }, + { "Africa/Tripoli" , 0x001EF9 }, + { "Africa/Tunis" , 0x002002 }, + { "Africa/Windhoek" , 0x002114 }, + { "America/Adak" , 0x00235B }, + { "America/Anchorage" , 0x0026D1 }, + { "America/Anguilla" , 0x002A45 }, + { "America/Antigua" , 0x002A9A }, + { "America/Araguaina" , 0x002B00 }, + { "America/Argentina/Buenos_Aires" , 0x002C65 }, + { "America/Argentina/Catamarca" , 0x002E13 }, + { "America/Argentina/ComodRivadavia" , 0x002FD4 }, + { "America/Argentina/Cordoba" , 0x00317A }, + { "America/Argentina/Jujuy" , 0x00334F }, + { "America/Argentina/La_Rioja" , 0x003503 }, + { "America/Argentina/Mendoza" , 0x0036BB }, + { "America/Argentina/Rio_Gallegos" , 0x00387B }, + { "America/Argentina/Salta" , 0x003A30 }, + { "America/Argentina/San_Juan" , 0x003BDC }, + { "America/Argentina/San_Luis" , 0x003D94 }, + { "America/Argentina/Tucuman" , 0x003F5A }, + { "America/Argentina/Ushuaia" , 0x004116 }, + { "America/Aruba" , 0x0042D1 }, + { "America/Asuncion" , 0x004337 }, + { "America/Atikokan" , 0x00461C }, + { "America/Atka" , 0x0046F2 }, + { "America/Bahia" , 0x004A58 }, + { "America/Bahia_Banderas" , 0x004BEB }, + { "America/Barbados" , 0x004E64 }, + { "America/Belem" , 0x004EFE }, + { "America/Belize" , 0x004FF9 }, + { "America/Blanc-Sablon" , 0x005175 }, + { "America/Boa_Vista" , 0x005229 }, + { "America/Bogota" , 0x005332 }, + { "America/Boise" , 0x00539E }, + { "America/Buenos_Aires" , 0x005735 }, + { "America/Cambridge_Bay" , 0x0058CE }, + { "America/Campo_Grande" , 0x005BF6 }, + { "America/Cancun" , 0x005EE5 }, + { "America/Caracas" , 0x006127 }, + { "America/Catamarca" , 0x00618E }, + { "America/Cayenne" , 0x006334 }, + { "America/Cayman" , 0x006396 }, + { "America/Chicago" , 0x0063EB }, + { "America/Chihuahua" , 0x006902 }, + { "America/Coral_Harbour" , 0x006B6D }, + { "America/Cordoba" , 0x006BFF }, + { "America/Costa_Rica" , 0x006DA5 }, + { "America/Creston" , 0x006E2F }, + { "America/Cuiaba" , 0x006EBB }, + { "America/Curacao" , 0x007199 }, + { "America/Danmarkshavn" , 0x0071FF }, + { "America/Dawson" , 0x007343 }, + { "America/Dawson_Creek" , 0x007660 }, + { "America/Denver" , 0x00783A }, + { "America/Detroit" , 0x007BC0 }, + { "America/Dominica" , 0x007F1F }, + { "America/Edmonton" , 0x007F74 }, + { "America/Eirunepe" , 0x00832C }, + { "America/El_Salvador" , 0x008444 }, + { "America/Ensenada" , 0x0084B9 }, + { "America/Fort_Wayne" , 0x008960 }, + { "America/Fortaleza" , 0x008822 }, + { "America/Glace_Bay" , 0x008BCA }, + { "America/Godthab" , 0x008F41 }, + { "America/Goose_Bay" , 0x009205 }, + { "America/Grand_Turk" , 0x0096C2 }, + { "America/Grenada" , 0x009971 }, + { "America/Guadeloupe" , 0x0099C6 }, + { "America/Guatemala" , 0x009A1B }, + { "America/Guayaquil" , 0x009AA4 }, + { "America/Guyana" , 0x009B01 }, + { "America/Halifax" , 0x009B82 }, + { "America/Havana" , 0x00A098 }, + { "America/Hermosillo" , 0x00A40B }, + { "America/Indiana/Indianapolis" , 0x00A4E9 }, + { "America/Indiana/Knox" , 0x00A77A }, + { "America/Indiana/Marengo" , 0x00AB11 }, + { "America/Indiana/Petersburg" , 0x00ADB7 }, + { "America/Indiana/Tell_City" , 0x00B304 }, + { "America/Indiana/Vevay" , 0x00B59D }, + { "America/Indiana/Vincennes" , 0x00B7D8 }, + { "America/Indiana/Winamac" , 0x00BA8C }, + { "America/Indianapolis" , 0x00B09A }, + { "America/Inuvik" , 0x00BD45 }, + { "America/Iqaluit" , 0x00C03C }, + { "America/Jamaica" , 0x00C35E }, + { "America/Jujuy" , 0x00C423 }, + { "America/Juneau" , 0x00C5CD }, + { "America/Kentucky/Louisville" , 0x00C94B }, + { "America/Kentucky/Monticello" , 0x00CD69 }, + { "America/Knox_IN" , 0x00D0EE }, + { "America/Kralendijk" , 0x00D45F }, + { "America/La_Paz" , 0x00D4C5 }, + { "America/Lima" , 0x00D52C }, + { "America/Los_Angeles" , 0x00D5D4 }, + { "America/Louisville" , 0x00D9E5 }, + { "America/Lower_Princes" , 0x00DDDA }, + { "America/Maceio" , 0x00DE40 }, + { "America/Managua" , 0x00DF7A }, + { "America/Manaus" , 0x00E02D }, + { "America/Marigot" , 0x00E12F }, + { "America/Martinique" , 0x00E184 }, + { "America/Matamoros" , 0x00E1F0 }, + { "America/Mazatlan" , 0x00E449 }, + { "America/Mendoza" , 0x00E6B6 }, + { "America/Menominee" , 0x00E86A }, + { "America/Merida" , 0x00EBEB }, + { "America/Metlakatla" , 0x00EE26 }, + { "America/Mexico_City" , 0x00EF60 }, + { "America/Miquelon" , 0x00F1DB }, + { "America/Moncton" , 0x00F44D }, + { "America/Monterrey" , 0x00F8E4 }, + { "America/Montevideo" , 0x00FB47 }, + { "America/Montreal" , 0x00FE59 }, + { "America/Montserrat" , 0x010349 }, + { "America/Nassau" , 0x01039E }, + { "America/New_York" , 0x0106E3 }, + { "America/Nipigon" , 0x010BEE }, + { "America/Nome" , 0x010F3F }, + { "America/Noronha" , 0x0112BD }, + { "America/North_Dakota/Beulah" , 0x0113ED }, + { "America/North_Dakota/Center" , 0x011781 }, + { "America/North_Dakota/New_Salem" , 0x011B15 }, + { "America/Ojinaga" , 0x011EBE }, + { "America/Panama" , 0x01211F }, + { "America/Pangnirtung" , 0x012174 }, + { "America/Paramaribo" , 0x0124AA }, + { "America/Phoenix" , 0x01253C }, + { "America/Port-au-Prince" , 0x0125FA }, + { "America/Port_of_Spain" , 0x01291E }, + { "America/Porto_Acre" , 0x01281A }, + { "America/Porto_Velho" , 0x012973 }, + { "America/Puerto_Rico" , 0x012A69 }, + { "America/Rainy_River" , 0x012AD4 }, + { "America/Rankin_Inlet" , 0x012E0C }, + { "America/Recife" , 0x0130F2 }, + { "America/Regina" , 0x01321C }, + { "America/Resolute" , 0x0133DA }, + { "America/Rio_Branco" , 0x0136CB }, + { "America/Rosario" , 0x0137D3 }, + { "America/Santa_Isabel" , 0x013979 }, + { "America/Santarem" , 0x013D1C }, + { "America/Santiago" , 0x013E21 }, + { "America/Santo_Domingo" , 0x0141CA }, + { "America/Sao_Paulo" , 0x014290 }, + { "America/Scoresbysund" , 0x01459F }, + { "America/Shiprock" , 0x01488D }, + { "America/Sitka" , 0x014C06 }, + { "America/St_Barthelemy" , 0x014F8E }, + { "America/St_Johns" , 0x014FE3 }, + { "America/St_Kitts" , 0x015536 }, + { "America/St_Lucia" , 0x01558B }, + { "America/St_Thomas" , 0x0155E0 }, + { "America/St_Vincent" , 0x015635 }, + { "America/Swift_Current" , 0x01568A }, + { "America/Tegucigalpa" , 0x0157AB }, + { "America/Thule" , 0x01582A }, + { "America/Thunder_Bay" , 0x015A71 }, + { "America/Tijuana" , 0x015DBA }, + { "America/Toronto" , 0x016153 }, + { "America/Tortola" , 0x016673 }, + { "America/Vancouver" , 0x0166C8 }, + { "America/Virgin" , 0x016B05 }, + { "America/Whitehorse" , 0x016B5A }, + { "America/Winnipeg" , 0x016E77 }, + { "America/Yakutat" , 0x0172B7 }, + { "America/Yellowknife" , 0x017622 }, + { "Antarctica/Casey" , 0x017932 }, + { "Antarctica/Davis" , 0x0179CF }, + { "Antarctica/DumontDUrville" , 0x017A70 }, + { "Antarctica/Macquarie" , 0x017B02 }, + { "Antarctica/Mawson" , 0x017D49 }, + { "Antarctica/McMurdo" , 0x017DC5 }, + { "Antarctica/Palmer" , 0x018170 }, + { "Antarctica/Rothera" , 0x01848C }, + { "Antarctica/South_Pole" , 0x018502 }, + { "Antarctica/Syowa" , 0x018880 }, + { "Antarctica/Vostok" , 0x0188EE }, + { "Arctic/Longyearbyen" , 0x01895F }, + { "Asia/Aden" , 0x018C91 }, + { "Asia/Almaty" , 0x018CE6 }, + { "Asia/Amman" , 0x018E65 }, + { "Asia/Anadyr" , 0x019037 }, + { "Asia/Aqtau" , 0x01921C }, + { "Asia/Aqtobe" , 0x01941B }, + { "Asia/Ashgabat" , 0x0195D3 }, + { "Asia/Ashkhabad" , 0x0196F0 }, + { "Asia/Baghdad" , 0x01980D }, + { "Asia/Bahrain" , 0x019982 }, + { "Asia/Baku" , 0x0199E8 }, + { "Asia/Bangkok" , 0x019CD0 }, + { "Asia/Beirut" , 0x019D25 }, + { "Asia/Bishkek" , 0x01A032 }, + { "Asia/Brunei" , 0x01A1DE }, + { "Asia/Calcutta" , 0x01A240 }, + { "Asia/Choibalsan" , 0x01A2B9 }, + { "Asia/Chongqing" , 0x01A432 }, + { "Asia/Chungking" , 0x01A521 }, + { "Asia/Colombo" , 0x01A5D0 }, + { "Asia/Dacca" , 0x01A66C }, + { "Asia/Damascus" , 0x01A712 }, + { "Asia/Dhaka" , 0x01AA62 }, + { "Asia/Dili" , 0x01AB08 }, + { "Asia/Dubai" , 0x01AB92 }, + { "Asia/Dushanbe" , 0x01ABE7 }, + { "Asia/Gaza" , 0x01ACEA }, + { "Asia/Harbin" , 0x01B03D }, + { "Asia/Hebron" , 0x01B124 }, + { "Asia/Ho_Chi_Minh" , 0x01B480 }, + { "Asia/Hong_Kong" , 0x01B4F8 }, + { "Asia/Hovd" , 0x01B6BA }, + { "Asia/Irkutsk" , 0x01B832 }, + { "Asia/Istanbul" , 0x01BA18 }, + { "Asia/Jakarta" , 0x01BE05 }, + { "Asia/Jayapura" , 0x01BEAF }, + { "Asia/Jerusalem" , 0x01BF4B }, + { "Asia/Kabul" , 0x01C27A }, + { "Asia/Kamchatka" , 0x01C2CB }, + { "Asia/Karachi" , 0x01C4A7 }, + { "Asia/Kashgar" , 0x01C55C }, + { "Asia/Kathmandu" , 0x01C62D }, + { "Asia/Katmandu" , 0x01C693 }, + { "Asia/Khandyga" , 0x01C6F9 }, + { "Asia/Kolkata" , 0x01C91E }, + { "Asia/Krasnoyarsk" , 0x01C997 }, + { "Asia/Kuala_Lumpur" , 0x01CB7F }, + { "Asia/Kuching" , 0x01CC3C }, + { "Asia/Kuwait" , 0x01CD2A }, + { "Asia/Macao" , 0x01CD7F }, + { "Asia/Macau" , 0x01CEBA }, + { "Asia/Magadan" , 0x01CFF5 }, + { "Asia/Makassar" , 0x01D1D7 }, + { "Asia/Manila" , 0x01D29C }, + { "Asia/Muscat" , 0x01D321 }, + { "Asia/Nicosia" , 0x01D376 }, + { "Asia/Novokuznetsk" , 0x01D65E }, + { "Asia/Novosibirsk" , 0x01D860 }, + { "Asia/Omsk" , 0x01DA4B }, + { "Asia/Oral" , 0x01DC32 }, + { "Asia/Phnom_Penh" , 0x01DE02 }, + { "Asia/Pontianak" , 0x01DE7A }, + { "Asia/Pyongyang" , 0x01DF3C }, + { "Asia/Qatar" , 0x01DFA9 }, + { "Asia/Qyzylorda" , 0x01E00F }, + { "Asia/Rangoon" , 0x01E1E5 }, + { "Asia/Riyadh" , 0x01E25D }, + { "Asia/Saigon" , 0x01E2B2 }, + { "Asia/Sakhalin" , 0x01E32A }, + { "Asia/Samarkand" , 0x01E521 }, + { "Asia/Seoul" , 0x01E657 }, + { "Asia/Shanghai" , 0x01E6FB }, + { "Asia/Singapore" , 0x01E7DB }, + { "Asia/Taipei" , 0x01E892 }, + { "Asia/Tashkent" , 0x01E9AA }, + { "Asia/Tbilisi" , 0x01EADB }, + { "Asia/Tehran" , 0x01EC95 }, + { "Asia/Tel_Aviv" , 0x01EF03 }, + { "Asia/Thimbu" , 0x01F232 }, + { "Asia/Thimphu" , 0x01F298 }, + { "Asia/Tokyo" , 0x01F2FE }, + { "Asia/Ujung_Pandang" , 0x01F387 }, + { "Asia/Ulaanbaatar" , 0x01F404 }, + { "Asia/Ulan_Bator" , 0x01F55F }, + { "Asia/Urumqi" , 0x01F6AC }, + { "Asia/Ust-Nera" , 0x01F773 }, + { "Asia/Vientiane" , 0x01F978 }, + { "Asia/Vladivostok" , 0x01F9F0 }, + { "Asia/Yakutsk" , 0x01FBDC }, + { "Asia/Yekaterinburg" , 0x01FDC1 }, + { "Asia/Yerevan" , 0x01FFCC }, + { "Atlantic/Azores" , 0x0201CC }, + { "Atlantic/Bermuda" , 0x0206CF }, + { "Atlantic/Canary" , 0x0209B0 }, + { "Atlantic/Cape_Verde" , 0x020C86 }, + { "Atlantic/Faeroe" , 0x020CFF }, + { "Atlantic/Faroe" , 0x020FA3 }, + { "Atlantic/Jan_Mayen" , 0x021247 }, + { "Atlantic/Madeira" , 0x021579 }, + { "Atlantic/Reykjavik" , 0x021A82 }, + { "Atlantic/South_Georgia" , 0x021C3B }, + { "Atlantic/St_Helena" , 0x021E4D }, + { "Atlantic/Stanley" , 0x021C7F }, + { "Australia/ACT" , 0x021EA2 }, + { "Australia/Adelaide" , 0x0221BF }, + { "Australia/Brisbane" , 0x0224EB }, + { "Australia/Broken_Hill" , 0x0225B2 }, + { "Australia/Canberra" , 0x0228F0 }, + { "Australia/Currie" , 0x022C0D }, + { "Australia/Darwin" , 0x022F40 }, + { "Australia/Eucla" , 0x022FC6 }, + { "Australia/Hobart" , 0x02309B }, + { "Australia/LHI" , 0x0233F9 }, + { "Australia/Lindeman" , 0x023694 }, + { "Australia/Lord_Howe" , 0x023775 }, + { "Australia/Melbourne" , 0x023A20 }, + { "Australia/North" , 0x023D45 }, + { "Australia/NSW" , 0x023DB9 }, + { "Australia/Perth" , 0x0240D6 }, + { "Australia/Queensland" , 0x0241AE }, + { "Australia/South" , 0x02425A }, + { "Australia/Sydney" , 0x024577 }, + { "Australia/Tasmania" , 0x0248B4 }, + { "Australia/Victoria" , 0x024BF9 }, + { "Australia/West" , 0x024F16 }, + { "Australia/Yancowinna" , 0x024FCC }, + { "Brazil/Acre" , 0x0252EE }, + { "Brazil/DeNoronha" , 0x0253F2 }, + { "Brazil/East" , 0x025512 }, + { "Brazil/West" , 0x0257EF }, + { "Canada/Atlantic" , 0x0258E7 }, + { "Canada/Central" , 0x025DCF }, + { "Canada/East-Saskatchewan" , 0x0266D9 }, + { "Canada/Eastern" , 0x0261E9 }, + { "Canada/Mountain" , 0x026862 }, + { "Canada/Newfoundland" , 0x026BD8 }, + { "Canada/Pacific" , 0x027103 }, + { "Canada/Saskatchewan" , 0x02751C }, + { "Canada/Yukon" , 0x0276A5 }, + { "CET" , 0x0279A8 }, + { "Chile/Continental" , 0x027CB1 }, + { "Chile/EasterIsland" , 0x02804C }, + { "CST6CDT" , 0x02838E }, + { "Cuba" , 0x0286DF }, + { "EET" , 0x028A52 }, + { "Egypt" , 0x028D05 }, + { "Eire" , 0x028FC8 }, + { "EST" , 0x0294D9 }, + { "EST5EDT" , 0x02951D }, + { "Etc/GMT" , 0x02986E }, + { "Etc/GMT+0" , 0x02993A }, + { "Etc/GMT+1" , 0x0299C4 }, + { "Etc/GMT+10" , 0x029A51 }, + { "Etc/GMT+11" , 0x029ADF }, + { "Etc/GMT+12" , 0x029B6D }, + { "Etc/GMT+2" , 0x029C88 }, + { "Etc/GMT+3" , 0x029D14 }, + { "Etc/GMT+4" , 0x029DA0 }, + { "Etc/GMT+5" , 0x029E2C }, + { "Etc/GMT+6" , 0x029EB8 }, + { "Etc/GMT+7" , 0x029F44 }, + { "Etc/GMT+8" , 0x029FD0 }, + { "Etc/GMT+9" , 0x02A05C }, + { "Etc/GMT-0" , 0x0298F6 }, + { "Etc/GMT-1" , 0x02997E }, + { "Etc/GMT-10" , 0x029A0A }, + { "Etc/GMT-11" , 0x029A98 }, + { "Etc/GMT-12" , 0x029B26 }, + { "Etc/GMT-13" , 0x029BB4 }, + { "Etc/GMT-14" , 0x029BFB }, + { "Etc/GMT-2" , 0x029C42 }, + { "Etc/GMT-3" , 0x029CCE }, + { "Etc/GMT-4" , 0x029D5A }, + { "Etc/GMT-5" , 0x029DE6 }, + { "Etc/GMT-6" , 0x029E72 }, + { "Etc/GMT-7" , 0x029EFE }, + { "Etc/GMT-8" , 0x029F8A }, + { "Etc/GMT-9" , 0x02A016 }, + { "Etc/GMT0" , 0x0298B2 }, + { "Etc/Greenwich" , 0x02A0A2 }, + { "Etc/UCT" , 0x02A0E6 }, + { "Etc/Universal" , 0x02A12A }, + { "Etc/UTC" , 0x02A16E }, + { "Etc/Zulu" , 0x02A1B2 }, + { "Europe/Amsterdam" , 0x02A1F6 }, + { "Europe/Andorra" , 0x02A634 }, + { "Europe/Athens" , 0x02A8B0 }, + { "Europe/Belfast" , 0x02ABF3 }, + { "Europe/Belgrade" , 0x02B12A }, + { "Europe/Berlin" , 0x02B3F3 }, + { "Europe/Bratislava" , 0x02B757 }, + { "Europe/Brussels" , 0x02BA89 }, + { "Europe/Bucharest" , 0x02BEC0 }, + { "Europe/Budapest" , 0x02C1EA }, + { "Europe/Busingen" , 0x02C55D }, + { "Europe/Chisinau" , 0x02C814 }, + { "Europe/Copenhagen" , 0x02CBA2 }, + { "Europe/Dublin" , 0x02CEAC }, + { "Europe/Gibraltar" , 0x02D3BD }, + { "Europe/Guernsey" , 0x02D814 }, + { "Europe/Helsinki" , 0x02DD4B }, + { "Europe/Isle_of_Man" , 0x02E001 }, + { "Europe/Istanbul" , 0x02E538 }, + { "Europe/Jersey" , 0x02E925 }, + { "Europe/Kaliningrad" , 0x02EE5C }, + { "Europe/Kiev" , 0x02F0C2 }, + { "Europe/Lisbon" , 0x02F3D9 }, + { "Europe/Ljubljana" , 0x02F8DD }, + { "Europe/London" , 0x02FBA6 }, + { "Europe/Luxembourg" , 0x0300DD }, + { "Europe/Madrid" , 0x030533 }, + { "Europe/Malta" , 0x0308F9 }, + { "Europe/Mariehamn" , 0x030CB2 }, + { "Europe/Minsk" , 0x030F68 }, + { "Europe/Monaco" , 0x031176 }, + { "Europe/Moscow" , 0x0315B1 }, + { "Europe/Nicosia" , 0x031802 }, + { "Europe/Oslo" , 0x031AEA }, + { "Europe/Paris" , 0x031E1C }, + { "Europe/Podgorica" , 0x032262 }, + { "Europe/Prague" , 0x03252B }, + { "Europe/Riga" , 0x03285D }, + { "Europe/Rome" , 0x032BA2 }, + { "Europe/Samara" , 0x032F65 }, + { "Europe/San_Marino" , 0x033198 }, + { "Europe/Sarajevo" , 0x03355B }, + { "Europe/Simferopol" , 0x033824 }, + { "Europe/Skopje" , 0x033B4F }, + { "Europe/Sofia" , 0x033E18 }, + { "Europe/Stockholm" , 0x034120 }, + { "Europe/Tallinn" , 0x0343CF }, + { "Europe/Tirane" , 0x034709 }, + { "Europe/Tiraspol" , 0x034A0F }, + { "Europe/Uzhgorod" , 0x034D9D }, + { "Europe/Vaduz" , 0x0350B4 }, + { "Europe/Vatican" , 0x035363 }, + { "Europe/Vienna" , 0x035726 }, + { "Europe/Vilnius" , 0x035A53 }, + { "Europe/Volgograd" , 0x035D92 }, + { "Europe/Warsaw" , 0x035F92 }, + { "Europe/Zagreb" , 0x036373 }, + { "Europe/Zaporozhye" , 0x03663C }, + { "Europe/Zurich" , 0x03697D }, + { "Factory" , 0x036C2C }, + { "GB" , 0x036C9D }, + { "GB-Eire" , 0x0371D4 }, + { "GMT" , 0x03770B }, + { "GMT+0" , 0x0377D7 }, + { "GMT-0" , 0x037793 }, + { "GMT0" , 0x03774F }, + { "Greenwich" , 0x03781B }, + { "Hongkong" , 0x03785F }, + { "HST" , 0x037A21 }, + { "Iceland" , 0x037A65 }, + { "Indian/Antananarivo" , 0x037C1E }, + { "Indian/Chagos" , 0x037C92 }, + { "Indian/Christmas" , 0x037CF4 }, + { "Indian/Cocos" , 0x037D38 }, + { "Indian/Comoro" , 0x037D7C }, + { "Indian/Kerguelen" , 0x037DD1 }, + { "Indian/Mahe" , 0x037E26 }, + { "Indian/Maldives" , 0x037E7B }, + { "Indian/Mauritius" , 0x037ED0 }, + { "Indian/Mayotte" , 0x037F46 }, + { "Indian/Reunion" , 0x037F9B }, + { "Iran" , 0x037FF0 }, + { "Israel" , 0x03825E }, + { "Jamaica" , 0x03858D }, + { "Japan" , 0x038652 }, + { "Kwajalein" , 0x0386DB }, + { "Libya" , 0x03873E }, + { "MET" , 0x038847 }, + { "Mexico/BajaNorte" , 0x038B50 }, + { "Mexico/BajaSur" , 0x038EB9 }, + { "Mexico/General" , 0x0390FE }, + { "MST" , 0x03935C }, + { "MST7MDT" , 0x0393A0 }, + { "Navajo" , 0x0396F1 }, + { "NZ" , 0x039A6A }, + { "NZ-CHAT" , 0x039DE8 }, + { "Pacific/Apia" , 0x03A0D0 }, + { "Pacific/Auckland" , 0x03A26C }, + { "Pacific/Chatham" , 0x03A5F8 }, + { "Pacific/Chuuk" , 0x03A8EF }, + { "Pacific/Easter" , 0x03A948 }, + { "Pacific/Efate" , 0x03ACA6 }, + { "Pacific/Enderbury" , 0x03AD6C }, + { "Pacific/Fakaofo" , 0x03ADDA }, + { "Pacific/Fiji" , 0x03AE2B }, + { "Pacific/Funafuti" , 0x03AFBE }, + { "Pacific/Galapagos" , 0x03B002 }, + { "Pacific/Gambier" , 0x03B07A }, + { "Pacific/Guadalcanal" , 0x03B0DF }, + { "Pacific/Guam" , 0x03B134 }, + { "Pacific/Honolulu" , 0x03B18A }, + { "Pacific/Johnston" , 0x03B201 }, + { "Pacific/Kiritimati" , 0x03B280 }, + { "Pacific/Kosrae" , 0x03B2EB }, + { "Pacific/Kwajalein" , 0x03B348 }, + { "Pacific/Majuro" , 0x03B3B4 }, + { "Pacific/Marquesas" , 0x03B413 }, + { "Pacific/Midway" , 0x03B47A }, + { "Pacific/Nauru" , 0x03B504 }, + { "Pacific/Niue" , 0x03B57C }, + { "Pacific/Norfolk" , 0x03B5DA }, + { "Pacific/Noumea" , 0x03B62F }, + { "Pacific/Pago_Pago" , 0x03B6BF }, + { "Pacific/Palau" , 0x03B748 }, + { "Pacific/Pitcairn" , 0x03B78C }, + { "Pacific/Pohnpei" , 0x03B7E1 }, + { "Pacific/Ponape" , 0x03B836 }, + { "Pacific/Port_Moresby" , 0x03B87B }, + { "Pacific/Rarotonga" , 0x03B8BF }, + { "Pacific/Saipan" , 0x03B99B }, + { "Pacific/Samoa" , 0x03B9FE }, + { "Pacific/Tahiti" , 0x03BA87 }, + { "Pacific/Tarawa" , 0x03BAEC }, + { "Pacific/Tongatapu" , 0x03BB40 }, + { "Pacific/Truk" , 0x03BBCC }, + { "Pacific/Wake" , 0x03BC11 }, + { "Pacific/Wallis" , 0x03BC61 }, + { "Pacific/Yap" , 0x03BCA5 }, + { "Poland" , 0x03BCEA }, + { "Portugal" , 0x03C0CB }, + { "PRC" , 0x03C5C7 }, + { "PST8PDT" , 0x03C678 }, + { "ROC" , 0x03C9C9 }, + { "ROK" , 0x03CAE1 }, + { "Singapore" , 0x03CB85 }, + { "Turkey" , 0x03CC3C }, + { "UCT" , 0x03D029 }, + { "Universal" , 0x03D06D }, + { "US/Alaska" , 0x03D0B1 }, + { "US/Aleutian" , 0x03D41A }, + { "US/Arizona" , 0x03D780 }, + { "US/Central" , 0x03D80E }, + { "US/East-Indiana" , 0x03E218 }, + { "US/Eastern" , 0x03DD19 }, + { "US/Hawaii" , 0x03E482 }, + { "US/Indiana-Starke" , 0x03E4F3 }, + { "US/Michigan" , 0x03E864 }, + { "US/Mountain" , 0x03EB9B }, + { "US/Pacific" , 0x03EF14 }, + { "US/Pacific-New" , 0x03F319 }, + { "US/Samoa" , 0x03F71E }, + { "UTC" , 0x03F7A7 }, + { "W-SU" , 0x03FA9E }, + { "WET" , 0x03F7EB }, + { "Zulu" , 0x03FCD8 }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[261411] = { +const unsigned char timelib_timezone_db_data_builtin[261404] = { /* Africa/Abidjan */ @@ -892,12 +892,40 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Africa/El_Aaiun */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x45, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xBC, 0x48, 0xF0, 0xE0, -0x0B, 0xD1, 0xB0, 0x90, 0x01, 0x02, 0xFF, 0xFF, 0xF3, 0xA0, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, -0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x41, 0x54, 0x00, -0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0xFE, -0x84, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xBC, 0x48, 0xF0, 0xE0, +0x0B, 0xD1, 0xB0, 0x90, 0x0B, 0xE8, 0x0C, 0x00, 0x0C, 0x61, 0x47, 0xF0, 0x0D, 0xC9, 0x3F, 0x80, +0x0E, 0x8E, 0xF2, 0x70, 0x0F, 0xD3, 0x51, 0x80, 0x10, 0x27, 0xA3, 0x70, 0x48, 0x41, 0xE6, 0x80, +0x48, 0xBB, 0x22, 0x70, 0x4A, 0x23, 0x1A, 0x00, 0x4A, 0x8D, 0xD5, 0x70, 0x4B, 0xDC, 0xC0, 0x80, +0x4C, 0x5D, 0xE5, 0x70, 0x4D, 0x97, 0xB8, 0x80, 0x4E, 0x34, 0x8C, 0xF0, 0x4F, 0x9C, 0xA0, 0xA0, +0x50, 0x08, 0xBB, 0xA0, 0x50, 0x31, 0x9A, 0x20, 0x50, 0x67, 0xA7, 0xA0, 0x51, 0x7C, 0x82, 0xA0, +0x51, 0xD8, 0xCB, 0xA0, 0x52, 0x05, 0x9E, 0xA0, 0x52, 0x6C, 0x73, 0xA0, 0x53, 0x37, 0x7A, 0xA0, +0x53, 0xAF, 0x73, 0x20, 0x53, 0xD7, 0x00, 0x20, 0x54, 0x4C, 0x55, 0xA0, 0x55, 0x17, 0x5C, 0xA0, +0x55, 0x82, 0x26, 0x20, 0x55, 0xA9, 0xB3, 0x20, 0x56, 0x2C, 0x37, 0xA0, 0x56, 0xF7, 0x3E, 0xA0, +0x57, 0x56, 0x2A, 0xA0, 0x57, 0x7D, 0xB7, 0xA0, 0x58, 0x15, 0x54, 0x20, 0x58, 0xD7, 0x20, 0xA0, +0x59, 0x28, 0xDD, 0xA0, 0x59, 0x50, 0x6A, 0xA0, 0x59, 0xF5, 0x36, 0x20, 0x5A, 0xB7, 0x02, 0xA0, +0x5A, 0xFB, 0x90, 0xA0, 0x5B, 0x23, 0x1D, 0xA0, 0x5B, 0xD5, 0x18, 0x20, 0x5C, 0xA0, 0x1F, 0x20, +0x5C, 0xCF, 0x95, 0x20, 0x5C, 0xF7, 0x22, 0x20, 0x5D, 0xB4, 0xFA, 0x20, 0x5E, 0x80, 0x01, 0x20, +0x5E, 0xA2, 0x48, 0x20, 0x5E, 0xC9, 0xD5, 0x20, 0x5F, 0x94, 0xDC, 0x20, 0x60, 0x5F, 0xE3, 0x20, +0x60, 0x74, 0xFB, 0x20, 0x60, 0x9C, 0x88, 0x20, 0x61, 0x7D, 0xF8, 0xA0, 0x62, 0x3F, 0xC5, 0x20, +0x62, 0x48, 0xFF, 0xA0, 0x62, 0x70, 0x8C, 0xA0, 0x63, 0x5D, 0xDA, 0xA0, 0x64, 0x43, 0x3F, 0xA0, +0x65, 0x3D, 0xBC, 0xA0, 0x66, 0x15, 0xF2, 0xA0, 0x67, 0x1D, 0x9E, 0xA0, 0x67, 0xE9, 0xF7, 0x20, +0x68, 0xFD, 0x80, 0xA0, 0x69, 0xC8, 0x87, 0xA0, 0x6A, 0xDD, 0x62, 0xA0, 0x6B, 0xA8, 0x69, 0xA0, +0x6C, 0xC6, 0x7F, 0x20, 0x6D, 0x88, 0x4B, 0xA0, 0x6E, 0xA6, 0x61, 0x20, 0x6F, 0x68, 0x2D, 0xA0, +0x70, 0x86, 0x43, 0x20, 0x71, 0x51, 0x4A, 0x20, 0x72, 0x66, 0x25, 0x20, 0x73, 0x31, 0x2C, 0x20, +0x74, 0x46, 0x07, 0x20, 0x75, 0x11, 0x0E, 0x20, 0x76, 0x2F, 0x23, 0xA0, 0x76, 0xF0, 0xF0, 0x20, +0x78, 0x0F, 0x05, 0xA0, 0x78, 0xD0, 0xD2, 0x20, 0x79, 0xEE, 0xE7, 0xA0, 0x7A, 0xB0, 0xB4, 0x20, +0x7B, 0xCE, 0xC9, 0xA0, 0x7C, 0x99, 0xD0, 0xA0, 0x7D, 0xA8, 0x14, 0x20, 0x7E, 0x79, 0xB2, 0xA0, +0x7F, 0x7C, 0x18, 0xA0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, +0xF3, 0xA0, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x41, 0x54, 0x00, 0x57, 0x45, +0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xB2, 0xC1, 0xB8, 0x00, 0xFE, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, /* Africa/Freetown */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1183,7 +1211,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Africa/Tripoli */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, 0xDD, 0xBB, 0xB1, 0x10, 0xDE, 0x23, 0xAD, 0x60, 0xE1, 0x78, 0xD2, 0x10, 0xE1, 0xE7, 0x65, 0xE0, 0xE5, 0x2F, 0x3F, 0x70, 0xE5, 0xA9, 0xCC, 0xE0, 0xEB, 0x4E, 0xC6, 0xF0, 0x16, 0x92, 0x42, 0x60, 0x17, 0x08, 0xF7, 0x70, 0x17, 0xFA, 0x2B, 0xE0, 0x18, 0xEA, 0x2A, 0xF0, 0x19, 0xDB, 0x5F, 0x60, @@ -1191,24 +1219,9 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0x1E, 0x93, 0x0B, 0x70, 0x1F, 0x82, 0xEE, 0x60, 0x20, 0x70, 0x4A, 0x70, 0x21, 0x61, 0x7E, 0xE0, 0x22, 0x52, 0xCF, 0x70, 0x23, 0x44, 0x03, 0xE0, 0x24, 0x34, 0x02, 0xF0, 0x25, 0x25, 0x37, 0x60, 0x26, 0x40, 0xB7, 0xF0, 0x32, 0x4E, 0xF1, 0x60, 0x33, 0x44, 0x36, 0x70, 0x34, 0x35, 0x6A, 0xE0, -0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x53, 0x34, 0xBB, 0x80, -0x54, 0x52, 0xD1, 0x00, 0x55, 0x14, 0x9D, 0x80, 0x56, 0x32, 0xB3, 0x00, 0x56, 0xF4, 0x7F, 0x80, -0x58, 0x12, 0x95, 0x00, 0x58, 0xDD, 0x9C, 0x00, 0x59, 0xF2, 0x77, 0x00, 0x5A, 0xBD, 0x7E, 0x00, -0x5B, 0xD2, 0x59, 0x00, 0x5C, 0x9D, 0x60, 0x00, 0x5D, 0xB2, 0x3B, 0x00, 0x5E, 0x7D, 0x42, 0x00, -0x5F, 0x9B, 0x57, 0x80, 0x60, 0x5D, 0x24, 0x00, 0x61, 0x7B, 0x39, 0x80, 0x62, 0x3D, 0x06, 0x00, -0x63, 0x5B, 0x1B, 0x80, 0x64, 0x26, 0x22, 0x80, 0x65, 0x3A, 0xFD, 0x80, 0x66, 0x06, 0x04, 0x80, -0x67, 0x1A, 0xDF, 0x80, 0x67, 0xE5, 0xE6, 0x80, 0x69, 0x03, 0xFC, 0x00, 0x69, 0xC5, 0xC8, 0x80, -0x6A, 0xE3, 0xDE, 0x00, 0x6B, 0xA5, 0xAA, 0x80, 0x6C, 0xC3, 0xC0, 0x00, 0x6D, 0x8E, 0xC7, 0x00, -0x6E, 0xA3, 0xA2, 0x00, 0x6F, 0x6E, 0xA9, 0x00, 0x70, 0x83, 0x84, 0x00, 0x71, 0x4E, 0x8B, 0x00, -0x72, 0x63, 0x66, 0x00, 0x73, 0x2E, 0x6D, 0x00, 0x74, 0x4C, 0x82, 0x80, 0x75, 0x0E, 0x4F, 0x00, -0x76, 0x2C, 0x64, 0x80, 0x76, 0xEE, 0x31, 0x00, 0x78, 0x0C, 0x46, 0x80, 0x78, 0xD7, 0x4D, 0x80, -0x79, 0xEC, 0x28, 0x80, 0x7A, 0xB7, 0x2F, 0x80, 0x7B, 0xCC, 0x0A, 0x80, 0x7C, 0x97, 0x11, 0x80, -0x7D, 0xB5, 0x27, 0x00, 0x7E, 0x76, 0xF3, 0x80, 0x7F, 0x95, 0x09, 0x00, 0x02, 0x01, 0x02, 0x01, +0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x0C, 0x5C, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x03, 0x00, 0x00, 0x0C, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x87, @@ -2946,7 +2959,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* America/Eirunepe */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x88, 0x80, +0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x88, 0x80, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -2954,14 +2967,14 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x2C, 0xC0, 0xD1, 0x50, 0x2D, 0x66, 0xE0, 0x40, 0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, +0x2C, 0xC0, 0xD1, 0x50, 0x2D, 0x66, 0xE0, 0x40, 0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0xBE, 0x80, -0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, -0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x28, -0x15, 0x00, 0xA8, 0x0C, 0xD5, 0x00, 0x00, 0x00, 0x0A, 0x57, 0x20, 0x41, 0x6D, 0x61, 0x7A, 0x6F, -0x6E, 0x61, 0x73, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, +0x02, 0xFF, 0xFF, 0xBE, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, +0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, +0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x28, 0x15, 0x00, 0xA8, 0x0C, 0xD5, 0x00, 0x00, 0x00, 0x0A, 0x57, 0x20, +0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x61, 0x73, /* America/El_Salvador */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5771,7 +5784,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* America/Porto_Acre */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -5779,12 +5792,13 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, -0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, +0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, +0x00, 0x00, 0x00, 0x00, /* America/Port_of_Spain */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6028,7 +6042,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* America/Rio_Branco */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -6036,13 +6050,13 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, -0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x05, 0x00, 0xAB, 0x34, 0x20, 0x00, 0x00, 0x00, 0x04, 0x41, -0x63, 0x72, 0x65, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, +0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x05, 0x00, 0xAB, 0x34, 0x20, +0x00, 0x00, 0x00, 0x04, 0x41, 0x63, 0x72, 0x65, /* America/Rosario */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -10996,7 +11010,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Brazil/Acre */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -11004,12 +11018,13 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, -0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, +0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, +0x00, 0x00, 0x00, 0x00, /* Brazil/DeNoronha */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -16303,7 +16318,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Libya */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, 0xDD, 0xBB, 0xB1, 0x10, 0xDE, 0x23, 0xAD, 0x60, 0xE1, 0x78, 0xD2, 0x10, 0xE1, 0xE7, 0x65, 0xE0, 0xE5, 0x2F, 0x3F, 0x70, 0xE5, 0xA9, 0xCC, 0xE0, 0xEB, 0x4E, 0xC6, 0xF0, 0x16, 0x92, 0x42, 0x60, 0x17, 0x08, 0xF7, 0x70, 0x17, 0xFA, 0x2B, 0xE0, 0x18, 0xEA, 0x2A, 0xF0, 0x19, 0xDB, 0x5F, 0x60, @@ -16311,24 +16326,9 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0x1E, 0x93, 0x0B, 0x70, 0x1F, 0x82, 0xEE, 0x60, 0x20, 0x70, 0x4A, 0x70, 0x21, 0x61, 0x7E, 0xE0, 0x22, 0x52, 0xCF, 0x70, 0x23, 0x44, 0x03, 0xE0, 0x24, 0x34, 0x02, 0xF0, 0x25, 0x25, 0x37, 0x60, 0x26, 0x40, 0xB7, 0xF0, 0x32, 0x4E, 0xF1, 0x60, 0x33, 0x44, 0x36, 0x70, 0x34, 0x35, 0x6A, 0xE0, -0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x53, 0x34, 0xBB, 0x80, -0x54, 0x52, 0xD1, 0x00, 0x55, 0x14, 0x9D, 0x80, 0x56, 0x32, 0xB3, 0x00, 0x56, 0xF4, 0x7F, 0x80, -0x58, 0x12, 0x95, 0x00, 0x58, 0xDD, 0x9C, 0x00, 0x59, 0xF2, 0x77, 0x00, 0x5A, 0xBD, 0x7E, 0x00, -0x5B, 0xD2, 0x59, 0x00, 0x5C, 0x9D, 0x60, 0x00, 0x5D, 0xB2, 0x3B, 0x00, 0x5E, 0x7D, 0x42, 0x00, -0x5F, 0x9B, 0x57, 0x80, 0x60, 0x5D, 0x24, 0x00, 0x61, 0x7B, 0x39, 0x80, 0x62, 0x3D, 0x06, 0x00, -0x63, 0x5B, 0x1B, 0x80, 0x64, 0x26, 0x22, 0x80, 0x65, 0x3A, 0xFD, 0x80, 0x66, 0x06, 0x04, 0x80, -0x67, 0x1A, 0xDF, 0x80, 0x67, 0xE5, 0xE6, 0x80, 0x69, 0x03, 0xFC, 0x00, 0x69, 0xC5, 0xC8, 0x80, -0x6A, 0xE3, 0xDE, 0x00, 0x6B, 0xA5, 0xAA, 0x80, 0x6C, 0xC3, 0xC0, 0x00, 0x6D, 0x8E, 0xC7, 0x00, -0x6E, 0xA3, 0xA2, 0x00, 0x6F, 0x6E, 0xA9, 0x00, 0x70, 0x83, 0x84, 0x00, 0x71, 0x4E, 0x8B, 0x00, -0x72, 0x63, 0x66, 0x00, 0x73, 0x2E, 0x6D, 0x00, 0x74, 0x4C, 0x82, 0x80, 0x75, 0x0E, 0x4F, 0x00, -0x76, 0x2C, 0x64, 0x80, 0x76, 0xEE, 0x31, 0x00, 0x78, 0x0C, 0x46, 0x80, 0x78, 0xD7, 0x4D, 0x80, -0x79, 0xEC, 0x28, 0x80, 0x7A, 0xB7, 0x2F, 0x80, 0x7B, 0xCC, 0x0A, 0x80, 0x7C, 0x97, 0x11, 0x80, -0x7D, 0xB5, 0x27, 0x00, 0x7E, 0x76, 0xF3, 0x80, 0x7F, 0x95, 0x09, 0x00, 0x02, 0x01, 0x02, 0x01, +0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x0C, 0x5C, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x03, 0x00, 0x00, 0x0C, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, @@ -18402,4 +18402,4 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2013.7", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2013.8", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From d86b5f01ac7089f46add60622260d6926c3977b8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 28 Oct 2013 19:51:31 +0100 Subject: [PATCH 0234/1256] Avoid copy in func_get_arg() Complements dmitry's change to func_get_args() --- Zend/zend_builtin_functions.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 2d2a865c10f1d..55e5f34e83aab 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -435,9 +435,7 @@ ZEND_FUNCTION(func_get_arg) } arg = *(p-(arg_count-requested_offset)); - *return_value = *arg; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + RETURN_ZVAL_FAST(arg); } /* }}} */ From e2c9f3983ac81478e73fa86b8d218795aa9ee201 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 29 Oct 2013 09:02:24 +0100 Subject: [PATCH 0235/1256] add bundled libzip LICENSE, as required by BSD License terms --- ext/zip/LICENSE_libzip | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 ext/zip/LICENSE_libzip diff --git a/ext/zip/LICENSE_libzip b/ext/zip/LICENSE_libzip new file mode 100644 index 0000000000000..9b2fda07b1054 --- /dev/null +++ b/ext/zip/LICENSE_libzip @@ -0,0 +1,27 @@ +Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner +The authors can be contacted at + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 4dc4302a30e225bcbf468b7ce01a4c5929f87a07 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 17:24:23 +0900 Subject: [PATCH 0236/1256] Fixed Bug 64760 var_export() does not use full precision for floating-point numbers --- .../general_functions/var_export-locale.phpt | 8 ++--- .../general_functions/var_export_basic3.phpt | 36 +++++++++---------- .../general_functions/var_export_basic5.phpt | 10 +++--- ext/standard/var.c | 2 +- tests/lang/bug24640.phpt | 16 ++++----- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/ext/standard/tests/general_functions/var_export-locale.phpt b/ext/standard/tests/general_functions/var_export-locale.phpt index 37142cf34c75a..3cbebe9c723d9 100644 --- a/ext/standard/tests/general_functions/var_export-locale.phpt +++ b/ext/standard/tests/general_functions/var_export-locale.phpt @@ -784,15 +784,15 @@ string(20) "array ( Iteration 13 array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) -string(34) "array ( +string(49) "array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, )" diff --git a/ext/standard/tests/general_functions/var_export_basic3.phpt b/ext/standard/tests/general_functions/var_export_basic3.phpt index 299721591071b..9e27d90425817 100644 --- a/ext/standard/tests/general_functions/var_export_basic3.phpt +++ b/ext/standard/tests/general_functions/var_export_basic3.phpt @@ -96,9 +96,9 @@ string(1) "0" -- Iteration: -0.1 -- --0.1 --0.1 -string(4) "-0.1" +-0.10000000000000001 +-0.10000000000000001 +string(20) "-0.10000000000000001" -- Iteration: 10.0000000000000000005 -- @@ -120,9 +120,9 @@ string(6) "100000" -- Iteration: 1e-5 -- -1.0E-5 -1.0E-5 -string(6) "1.0E-5" +1.0000000000000001E-5 +1.0000000000000001E-5 +string(21) "1.0000000000000001E-5" -- Iteration: 1e+5 -- @@ -144,9 +144,9 @@ string(6) "100000" -- Iteration: 1E-5 -- -1.0E-5 -1.0E-5 -string(6) "1.0E-5" +1.0000000000000001E-5 +1.0000000000000001E-5 +string(21) "1.0000000000000001E-5" -- Iteration: .5e+7 -- @@ -156,20 +156,20 @@ string(7) "5000000" -- Iteration: .6e-19 -- -6.0E-20 -6.0E-20 -string(7) "6.0E-20" +6.0000000000000006E-20 +6.0000000000000006E-20 +string(22) "6.0000000000000006E-20" -- Iteration: .05E+44 -- -5.0E+42 -5.0E+42 -string(7) "5.0E+42" +5.0000000000000001E+42 +5.0000000000000001E+42 +string(22) "5.0000000000000001E+42" -- Iteration: .0034E-30 -- -3.4E-33 -3.4E-33 -string(7) "3.4E-33" +3.4000000000000001E-33 +3.4000000000000001E-33 +string(22) "3.4000000000000001E-33" ===DONE=== diff --git a/ext/standard/tests/general_functions/var_export_basic5.phpt b/ext/standard/tests/general_functions/var_export_basic5.phpt index 96b3f54cc9e88..1512fa8377b01 100644 --- a/ext/standard/tests/general_functions/var_export_basic5.phpt +++ b/ext/standard/tests/general_functions/var_export_basic5.phpt @@ -233,15 +233,15 @@ string(20) "array ( --Iteration: array(10.5, 5.6) -- array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) -string(34) "array ( +string(49) "array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, )" @@ -274,4 +274,4 @@ string(41) "array ( 1 => 'test', )" -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/standard/var.c b/ext/standard/var.c index f71c4a4fdc3e8..2d0339a6a3d6f 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -436,7 +436,7 @@ PHPAPI void php_var_export_ex(zval **struc, int level, smart_str *buf TSRMLS_DC) smart_str_append_long(buf, Z_LVAL_PP(struc)); break; case IS_DOUBLE: - tmp_len = spprintf(&tmp_str, 0,"%.*H", (int) EG(precision), Z_DVAL_PP(struc)); + tmp_len = spprintf(&tmp_str, 0,"%.*H", PG(serialize_precision), Z_DVAL_PP(struc)); smart_str_appendl(buf, tmp_str, tmp_len); efree(tmp_str); break; diff --git a/tests/lang/bug24640.phpt b/tests/lang/bug24640.phpt index 919b38e29e44a..e41d0201b7795 100644 --- a/tests/lang/bug24640.phpt +++ b/tests/lang/bug24640.phpt @@ -36,22 +36,22 @@ test(1.7e-1000); ===DONE=== --EXPECTF-- -1.7E+300 +1.7000000000000001E+300 float(1.7E+300) 1.7E+300 1.7E+300 ------ -1.7E-300 +1.7000000000000001E-300 float(1.7E-300) 1.7E-300 1.7E-300 ------ -1.7E+79 +1.7000000000000002E+79 float(1.7E+79) 1.7E+79 1.7E+79 ------ -1.7E-79 +1.6999999999999999E-79 float(1.7E-79) 1.7E-79 1.7E-79 @@ -71,7 +71,7 @@ float(1.7E+81) 1.7E+81 1.7E+81 ------ -1.7E-81 +1.6999999999999999E-81 float(1.7E-81) 1.7E-81 1.7E-81 @@ -81,7 +81,7 @@ float(I%s) I%s I%s ------ -1.69998107421E-319 +1.6999810742105611E-319 float(1.69998107421E-319) 1.69998107421E-319 1.69998107421E-319 @@ -91,7 +91,7 @@ float(I%s) I%s I%s ------ -1.70007988734E-320 +1.7000798873397294E-320 float(1.70007988734E-320) 1.70007988734E-320 1.70007988734E-320 @@ -101,7 +101,7 @@ float(I%s) I%s I%s ------ -1.69958582169E-321 +1.6995858216938881E-321 float(1.69958582169E-321) 1.69958582169E-321 1.69958582169E-321 From 16a9fec8898677b96a0f22f0fdfac0dfc7126cf1 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 17:27:49 +0900 Subject: [PATCH 0237/1256] Update NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 26a9aa9ff42c5..55177746180a3 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,10 @@ PHP NEWS . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) +- Standard: + . Fixed bug #64760 (var_export() does not use full precision for floating-point + numbers) (Yasuo) + - XMLReader: . Fixed bug #51936 (Crash with clone XMLReader). (Mike) . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) From 4c45e95cfe064d76f0aedbee991ae1b217bb9990 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 17:29:53 +0900 Subject: [PATCH 0238/1256] Update NEWS --- NEWS | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9fe5fc463895f..2c784b8fbbcec 100644 --- a/NEWS +++ b/NEWS @@ -10,13 +10,17 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) --OPcache +- OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) - ODBC . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) +- Standard: + . Fixed bug #64760 (var_export() does not use full precision for floating-point + numbers) (Yasuo) + 17 Oct 2013, PHP 5.5.5 From 416f8fce5cebb7d5859c28aede2d1b3d793acec2 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 18:53:45 +0900 Subject: [PATCH 0239/1256] Implemented Change crypt() behavior w/o salt RFC --- NEWS | 2 ++ ext/standard/crypt.c | 2 ++ ext/standard/tests/strings/crypt.phpt | 2 ++ 3 files changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 0c45a234697c4..ed8bcc93b154f 100644 --- a/NEWS +++ b/NEWS @@ -63,6 +63,8 @@ PHP NEWS - Standard: . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version 1.1). (Adam) + . Implemented Change crypt() behavior w/o salt RFC. (Yasuo) + https://wiki.php.net/rfc/crypt_function_salt - XMLReader: . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 113a5bd0f516c..81c0bf3e0c536 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -272,6 +272,8 @@ PHP_FUNCTION(crypt) if (salt_in) { memcpy(salt, salt_in, MIN(PHP_MAX_SALT_LEN, salt_in_len)); + } else { + php_error_docref(NULL TSRMLS_C, E_NOTICE, "No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash."); } /* The automatic salt generation covers standard DES, md5-crypt and Blowfish (simple) */ diff --git a/ext/standard/tests/strings/crypt.phpt b/ext/standard/tests/strings/crypt.phpt index ce178f684e08e..3dcff2eaf2656 100644 --- a/ext/standard/tests/strings/crypt.phpt +++ b/ext/standard/tests/strings/crypt.phpt @@ -34,6 +34,8 @@ STD EXT MD5 BLO + +Notice: crypt(): No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash. in %s on line %d string(%d) "%s" Warning: crypt() expects at least 1 parameter, 0 given in %s on line %d From 5f1cbfacf9ed01bd97c315fc34f4ee87f0d119cc Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 29 Oct 2013 13:35:02 +0100 Subject: [PATCH 0240/1256] updated libs_versions.txt --- win32/build/libs_version.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/win32/build/libs_version.txt b/win32/build/libs_version.txt index 123a75d783090..44420ddec82da 100644 --- a/win32/build/libs_version.txt +++ b/win32/build/libs_version.txt @@ -1,12 +1,11 @@ bz2-1.0.6 cclient-2007f freetype-2.4.10 -icu-50.1.2 +icu-51.2 jpeglib-9 libcurl-7.30.0 libiconv-1.14 libmcrypt-2.5.8 -libmpir-2.5.1 libmpir-2.6.0 libpng-1.5.14 libpq-9.2.2 From 82eca388d201aa39984521694c92f1955d646838 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 29 Oct 2013 20:01:37 +0100 Subject: [PATCH 0241/1256] Fix ZTS build --- ext/standard/crypt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 81c0bf3e0c536..354c263afbd0c 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -273,7 +273,7 @@ PHP_FUNCTION(crypt) if (salt_in) { memcpy(salt, salt_in, MIN(PHP_MAX_SALT_LEN, salt_in_len)); } else { - php_error_docref(NULL TSRMLS_C, E_NOTICE, "No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash."); + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash."); } /* The automatic salt generation covers standard DES, md5-crypt and Blowfish (simple) */ From 647e0be64b4cdcc5c94aa245d4d876d193709287 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 29 Oct 2013 20:07:34 +0100 Subject: [PATCH 0242/1256] Fix compile warning in GMP --- ext/gmp/gmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 8b5c131e76060..6b3dadf40576f 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1363,7 +1363,7 @@ ZEND_FUNCTION(gmp_powm) zval *base_arg, *exp_arg, *mod_arg; mpz_ptr gmpnum_base, gmpnum_exp, gmpnum_mod, gmpnum_result; int use_ui = 0; - gmp_temp_t temp_base = {0}, temp_exp = {0}, temp_mod; + gmp_temp_t temp_base, temp_exp, temp_mod; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzz", &base_arg, &exp_arg, &mod_arg) == FAILURE){ return; From 4218e89f8df4ca3897e3aad595e0c2c9cf4c3aca Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 29 Oct 2013 20:58:30 +0100 Subject: [PATCH 0243/1256] Fix bug #65997 by switching to Serializable for GMP Rather than using get_properties and __wakeup for serialization the code now uses Serializable::serialize() and Serializable::unserialize(). The get_properties handler is switched to a get_debug_info handler. Thus get_gc will now return only the normal properties and not do any modifications, thus fixing the leak. This also avoids a $num property from being publicly visible after the object was dumped or serialized, so that's an extra plus. --- ext/gmp/gmp.c | 107 ++++++++++++++++++++++++++++------- ext/gmp/tests/bug659967.phpt | 15 +++++ ext/gmp/tests/serialize.phpt | 22 ++++++- 3 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 ext/gmp/tests/bug659967.phpt diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 6b3dadf40576f..af9c73afa2b0a 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -24,7 +24,10 @@ #include "php_ini.h" #include "php_gmp.h" #include "ext/standard/info.h" +#include "ext/standard/php_var.h" +#include "ext/standard/php_smart_str_public.h" #include "zend_exceptions.h" +#include "zend_interfaces.h" #if HAVE_GMP @@ -564,12 +567,17 @@ static int gmp_cast_object(zval *readobj, zval *writeobj, int type TSRMLS_DC) /* } /* }}} */ -static HashTable *gmp_get_properties(zval *obj TSRMLS_DC) /* {{{ */ +static HashTable *gmp_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{ */ { - HashTable *ht = zend_std_get_properties(obj TSRMLS_CC); + HashTable *ht, *props = zend_std_get_properties(obj TSRMLS_CC); mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(obj); zval *zv; + *is_temp = 1; + ALLOC_HASHTABLE(ht); + ZEND_INIT_SYMTABLE_EX(ht, zend_hash_num_elements(props) + 1, 0); + zend_hash_copy(ht, props, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); + MAKE_STD_ZVAL(zv); gmp_strval(zv, gmpnum, 10); zend_hash_update(ht, "num", sizeof("num"), &zv, sizeof(zval *), NULL); @@ -678,36 +686,96 @@ static int gmp_compare(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ } /* }}} */ -PHP_METHOD(GMP, __wakeup) /* {{{ */ +PHP_METHOD(GMP, serialize) /* {{{ */ { - HashTable *props; - zval **num_zv; + mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(getThis()); + smart_str buf = {0}; + php_serialize_data_t var_hash; + zval zv, *zv_ptr = &zv; if (zend_parse_parameters_none() == FAILURE) { return; } - props = zend_std_get_properties(getThis() TSRMLS_CC); - if (zend_hash_find(props, "num", sizeof("num"), (void **) &num_zv) == SUCCESS - && Z_TYPE_PP(num_zv) == IS_STRING && Z_STRLEN_PP(num_zv) > 0 + PHP_VAR_SERIALIZE_INIT(var_hash); + + INIT_PZVAL(zv_ptr); + + gmp_strval(zv_ptr, gmpnum, 10); + php_var_serialize(&buf, &zv_ptr, &var_hash TSRMLS_CC); + zval_dtor(zv_ptr); + + Z_ARRVAL_P(zv_ptr) = zend_std_get_properties(getThis() TSRMLS_CC); + Z_TYPE_P(zv_ptr) = IS_ARRAY; + php_var_serialize(&buf, &zv_ptr, &var_hash TSRMLS_CC); + + PHP_VAR_SERIALIZE_DESTROY(var_hash); + + if (buf.c) { + RETURN_STRINGL(buf.c, buf.len, 0); + } +} +/* }}} */ + +PHP_METHOD(GMP, unserialize) /* {{{ */ +{ + mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(getThis()); + char *str; + int str_len; + php_unserialize_data_t var_hash; + const unsigned char *p, *max; + zval zv, *zv_ptr = &zv; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) { + return; + } + + PHP_VAR_UNSERIALIZE_INIT(var_hash); + + p = (unsigned char *) str; + max = (unsigned char *) str + str_len; + + INIT_ZVAL(zv); + if (!php_var_unserialize(&zv_ptr, &p, max, &var_hash TSRMLS_CC) + || Z_TYPE_P(zv_ptr) != IS_STRING + || convert_to_gmp(gmpnum, zv_ptr, 10 TSRMLS_CC) == FAILURE ) { - mpz_ptr gmpnumber = GET_GMP_FROM_ZVAL(getThis()); - if (convert_to_gmp(gmpnumber, *num_zv, 10 TSRMLS_CC) == SUCCESS) { - return; - } + zend_throw_exception(NULL, "Could not unserialize number", 0 TSRMLS_CC); + goto exit; } + zval_dtor(&zv); - zend_throw_exception( - NULL, "Invalid serialization data", 0 TSRMLS_CC - ); + INIT_ZVAL(zv); + if (!php_var_unserialize(&zv_ptr, &p, max, &var_hash TSRMLS_CC) + || Z_TYPE_P(zv_ptr) != IS_ARRAY + ) { + zend_throw_exception(NULL, "Could not unserialize properties", 0 TSRMLS_CC); + goto exit; + } + + if (zend_hash_num_elements(Z_ARRVAL_P(zv_ptr)) != 0) { + zend_hash_copy( + zend_std_get_properties(getThis() TSRMLS_CC), Z_ARRVAL_P(zv_ptr), + (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *) + ); + } + +exit: + zval_dtor(&zv); + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } /* }}} */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_wakeup, 0, 0, 0) +ZEND_BEGIN_ARG_INFO_EX(arginfo_serialize, 0, 0, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_unserialize, 0, 0, 1) +ZEND_ARG_INFO(0, serialized) ZEND_END_ARG_INFO() const zend_function_entry gmp_methods[] = { - PHP_ME(GMP, __wakeup, arginfo_wakeup, ZEND_ACC_PUBLIC) + PHP_ME(GMP, serialize, arginfo_serialize, ZEND_ACC_PUBLIC) + PHP_ME(GMP, unserialize, arginfo_unserialize, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -724,13 +792,14 @@ static ZEND_GINIT_FUNCTION(gmp) ZEND_MINIT_FUNCTION(gmp) { zend_class_entry tmp_ce; - INIT_CLASS_ENTRY(tmp_ce, "GMP", gmp_methods); /* No methods on the class for now */ + INIT_CLASS_ENTRY(tmp_ce, "GMP", gmp_methods); gmp_ce = zend_register_internal_class(&tmp_ce TSRMLS_CC); + zend_class_implements(gmp_ce TSRMLS_CC, 1, zend_ce_serializable); gmp_ce->create_object = gmp_create_object; memcpy(&gmp_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); gmp_object_handlers.cast_object = gmp_cast_object; - gmp_object_handlers.get_properties = gmp_get_properties; + gmp_object_handlers.get_debug_info = gmp_get_debug_info; gmp_object_handlers.clone_obj = gmp_clone_obj; gmp_object_handlers.do_operation = gmp_do_operation; gmp_object_handlers.compare = gmp_compare; diff --git a/ext/gmp/tests/bug659967.phpt b/ext/gmp/tests/bug659967.phpt new file mode 100644 index 0000000000000..6ba220274c4f7 --- /dev/null +++ b/ext/gmp/tests/bug659967.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #65997: Leak when using gc_collect_cycles with new GMP implementation +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/gmp/tests/serialize.phpt b/ext/gmp/tests/serialize.phpt index 26716b659c368..208e0e98001e7 100644 --- a/ext/gmp/tests/serialize.phpt +++ b/ext/gmp/tests/serialize.phpt @@ -9,14 +9,34 @@ var_dump($n = gmp_init(42)); var_dump($s = serialize($n)); var_dump(unserialize($s)); +$n = gmp_init(13); +$n->foo = "bar"; +var_dump(unserialize(serialize($n))); + +try { + unserialize('C:3:"GMP":0:{}'); +} catch (Exception $e) { var_dump($e->getMessage()); } + +try { + unserialize('C:3:"GMP":8:{s:2:"42"}'); +} catch (Exception $e) { var_dump($e->getMessage()); } + ?> --EXPECTF-- object(GMP)#%d (1) { ["num"]=> string(2) "42" } -string(33) "O:3:"GMP":1:{s:3:"num";s:2:"42";}" +string(30) "C:3:"GMP":15:{s:2:"42";a:0:{}}" object(GMP)#%d (1) { ["num"]=> string(2) "42" } +object(GMP)#%d (2) { + ["foo"]=> + string(3) "bar" + ["num"]=> + string(2) "13" +} +string(28) "Could not unserialize number" +string(32) "Could not unserialize properties" From 4ded6ee971d7de3b3f9f2fdf747f5dfcb82cc691 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 29 Oct 2013 18:11:02 -0700 Subject: [PATCH 0244/1256] 5.4.23-dev --- NEWS | 2 ++ configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 55177746180a3..e5b79ec7bfafb 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2013, PHP 5.4.23 + ?? ??? 2013, PHP 5.4.22 - Core: diff --git a/configure.in b/configure.in index aa58df613b6c2..af2de7fce9407 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=4 -PHP_RELEASE_VERSION=22 +PHP_RELEASE_VERSION=23 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index 3058fef6132f0..523bda6743fff 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 4 -#define PHP_RELEASE_VERSION 22 +#define PHP_RELEASE_VERSION 23 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.4.22-dev" -#define PHP_VERSION_ID 50422 +#define PHP_VERSION "5.4.23-dev" +#define PHP_VERSION_ID 50423 From fc707a27ff1ede5494318e9d0eafd0ebb87d1d2e Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 30 Oct 2013 20:13:14 +0100 Subject: [PATCH 0245/1256] back to do_alloca(), reverted the wrong replacement --- main/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main/main.c b/main/main.c index 2d018a74670fb..bd5e91b230323 100644 --- a/main/main.c +++ b/main/main.c @@ -2412,13 +2412,14 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) volatile int old_cwd_fd = -1; #else char *old_cwd; + ALLOCA_FLAG(use_heap) #endif int retval = 0; EG(exit_status) = 0; #ifndef HAVE_BROKEN_GETCWD # define OLD_CWD_SIZE 4096 - old_cwd = emalloc(OLD_CWD_SIZE); + old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); old_cwd[0] = '\0'; #endif @@ -2499,7 +2500,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) if (old_cwd[0] != '\0') { php_ignore_value(VCWD_CHDIR(old_cwd)); } - efree(old_cwd); + do_alloca(old_cwd, use_heap); #endif return retval; } From abb962d54d8a4d22095975d94cda7ea5d2c56fa8 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 30 Oct 2013 20:46:08 +0100 Subject: [PATCH 0246/1256] compact the code to preserve the error info after state freeing --- Zend/zend_virtual_cwd.c | 284 ++++++---------------------------------- 1 file changed, 42 insertions(+), 242 deletions(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 75bf3d252280d..f281606f9d5e4 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -127,7 +127,6 @@ static int php_check_dots(const char *element, int n) #define TOKENIZER_STRING "/" #endif - /* default macros */ #ifndef IS_DIRECTORY_UP @@ -157,6 +156,16 @@ static int php_check_dots(const char *element, int n) efree((s)->cwd); \ (s)->cwd = NULL; +#ifdef TSRM_WIN32 +# define CWD_STATE_FREE_ERR(state) do { \ + DWORD last_error = GetLastError(); \ + CWD_STATE_FREE(state); \ + SetLastError(last_error); \ + } while (0) +#else +# define CWD_STATE_FREE_ERR(state) CWD_STATE_FREE(state) +#endif + #ifdef TSRM_WIN32 #ifdef CTL_CODE @@ -432,7 +441,6 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ static void cwd_globals_dtor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ { -/* CWD_STATE_FREE(&cwd_globals->cwd); */ realpath_cache_clean(TSRMLS_C); } /* }}} */ @@ -1488,9 +1496,6 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ { cwd_state new_state; FILE *f; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif if (path[0] == '\0') { /* Fail to open empty path */ return NULL; @@ -1498,25 +1503,14 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return NULL; } f = fopen(new_state.cwd, mode); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); + return f; } /* }}} */ @@ -1525,33 +1519,20 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } #if defined(TSRM_WIN32) ret = tsrm_win32_access(new_state.cwd, mode TSRMLS_CC); - last_error = GetLastError(); #else ret = access(new_state.cwd, mode); #endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } @@ -1611,33 +1592,20 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC) / { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } #ifdef TSRM_WIN32 ret = win32_utime(new_state.cwd, buf); - last_error = GetLastError(); #else ret = utime(new_state.cwd, buf); #endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } /* }}} */ @@ -1647,31 +1615,16 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } ret = chmod(new_state.cwd, mode); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } /* }}} */ @@ -1681,19 +1634,10 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } @@ -1707,13 +1651,7 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li ret = chown(new_state.cwd, owner, group); } -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } /* }}} */ @@ -1723,19 +1661,10 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ { cwd_state new_state; int f; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } @@ -1751,13 +1680,7 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ } else { f = open(new_state.cwd, flags); } -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return f; } /* }}} */ @@ -1766,31 +1689,16 @@ CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int f; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } f = creat(new_state.cwd, mode); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return f; } /* }}} */ @@ -1800,33 +1708,18 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / cwd_state old_state; cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&old_state, &CWDG(cwd)); if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&old_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&old_state); return -1; } oldname = old_state.cwd; CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, newname, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&old_state); - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&old_state); + CWD_STATE_FREE_ERR(&new_state); return -1; } newname = new_state.cwd; @@ -1836,17 +1729,12 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / #ifdef TSRM_WIN32 /* MoveFileEx returns 0 on failure, other way 'round for this function */ retval = (MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED) == 0) ? -1 : 0; - last_error = GetLastError(); #else retval = rename(oldname, newname); #endif - CWD_STATE_FREE(&old_state); - CWD_STATE_FREE(&new_state); - -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&old_state); + CWD_STATE_FREE_ERR(&new_state); return retval; } @@ -1856,31 +1744,16 @@ CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = php_sys_stat(new_state.cwd, buf); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1889,31 +1762,16 @@ CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ * { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = php_sys_lstat(new_state.cwd, buf); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1922,31 +1780,16 @@ CWD_API int virtual_unlink(const char *path TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = unlink(new_state.cwd); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1955,32 +1798,19 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_FILEPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } #ifdef TSRM_WIN32 retval = mkdir(new_state.cwd); - last_error = GetLastError(); #else retval = mkdir(new_state.cwd, mode); #endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1989,31 +1819,16 @@ CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = rmdir(new_state.cwd); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -2026,31 +1841,16 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; DIR *retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return NULL; } retval = opendir(new_state.cwd); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ From 832c82603f39dadf271222deddf7f4a183997c13 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Thu, 31 Oct 2013 07:28:43 +0900 Subject: [PATCH 0247/1256] Add crypt() change in UPGRADING --- UPGRADING | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UPGRADING b/UPGRADING index d2133338a3486..6e77f1d5b1ec0 100755 --- a/UPGRADING +++ b/UPGRADING @@ -68,6 +68,10 @@ PHP X.Y UPGRADE NOTES CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file do not work unless it is explicitly set to false. +- String: + crypt() is now raise E_NOTICE error if salt parameter is omitted. + See: https://wiki.php.net/rfc/crypt_function_salt + - XMLReader: XMLReader::getAttributeNs and XMLReader::getAttributeNo now return NULL if the attribute could not be found, just like XMLReader::getAttribute. From 3b2ca392f1df71364b07b1c1e522aed5f8c00795 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 31 Oct 2013 11:33:39 +0400 Subject: [PATCH 0248/1256] Removed unnecessary GC checks --- Zend/zend_execute.c | 8 +- Zend/zend_execute.h | 14 + Zend/zend_vm_execute.h | 994 ++++++++++++++++++++--------------------- Zend/zend_vm_gen.php | 20 +- 4 files changed, 525 insertions(+), 511 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9f78218d3de35..b5c35ca40f028 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -79,7 +79,6 @@ static zend_always_inline void zend_pzval_unlock_func(zval *z, zend_free_op *sho if (unref && Z_ISREF_P(z) && Z_REFCOUNT_P(z) == 1) { Z_UNSET_ISREF_P(z); } - GC_ZVAL_CHECK_POSSIBLE_ROOT(z); } } @@ -95,6 +94,7 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC) #undef zval_ptr_dtor #define zval_ptr_dtor(pzv) i_zval_ptr_dtor(*(pzv) ZEND_FILE_LINE_CC TSRMLS_CC) +#define zval_ptr_dtor_nogc(pzv) i_zval_ptr_dtor_nogc(*(pzv) ZEND_FILE_LINE_CC TSRMLS_CC) #define PZVAL_UNLOCK(z, f) zend_pzval_unlock_func(z, f, 1 TSRMLS_CC) #define PZVAL_UNLOCK_EX(z, f, u) zend_pzval_unlock_func(z, f, u TSRMLS_CC) @@ -125,18 +125,18 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC) if ((zend_uintptr_t)should_free.var & 1L) { \ zval_dtor((zval*)((zend_uintptr_t)should_free.var & ~1L)); \ } else { \ - zval_ptr_dtor(&should_free.var); \ + zval_ptr_dtor_nogc(&should_free.var); \ } \ } #define FREE_OP_IF_VAR(should_free) \ if (should_free.var != NULL && (((zend_uintptr_t)should_free.var & 1L) == 0)) { \ - zval_ptr_dtor(&should_free.var); \ + zval_ptr_dtor_nogc(&should_free.var); \ } #define FREE_OP_VAR_PTR(should_free) \ if (should_free.var) { \ - zval_ptr_dtor(&should_free.var); \ + zval_ptr_dtor_nogc(&should_free.var); \ } #define TMP_FREE(z) (zval*)(((zend_uintptr_t)(z)) | 1L) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index b68a82ef896e9..5c900e5ceced5 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -87,6 +87,20 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC } } +static zend_always_inline void i_zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) +{ + if (!Z_DELREF_P(zval_ptr)) { + ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); + GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); + zval_dtor(zval_ptr); + efree_rel(zval_ptr); + } else { + if (Z_REFCOUNT_P(zval_ptr) == 1) { + Z_UNSET_ISREF_P(zval_ptr); + } + } +} + static zend_always_inline int i_zend_is_true(zval *op) { int result; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 869bb199b2320..7ad7dcf463f51 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1754,7 +1754,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string"); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -1803,7 +1803,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval); } efree(lcname); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); call->object = NULL; call->called_scope = NULL; call->is_ctor_call = 0; @@ -1822,7 +1822,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H /* Delay closure destruction until its invocation */ call->fbc->common.prototype = (zend_function*)function_name; } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } call->is_ctor_call = 0; EX(call) = call; @@ -1893,7 +1893,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H } call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -4972,7 +4972,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -4987,7 +4987,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5002,7 +5002,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5017,7 +5017,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5032,7 +5032,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5047,7 +5047,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5062,7 +5062,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5077,7 +5077,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5092,7 +5092,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_H opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5109,7 +5109,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCO _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5125,7 +5125,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5141,7 +5141,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_H opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5157,7 +5157,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAN opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5173,7 +5173,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_O opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5188,7 +5188,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5203,7 +5203,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5218,7 +5218,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5233,7 +5233,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5411,12 +5411,12 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) { zval *container = opline->op1.zv; zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { container = NULL; zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { } @@ -5510,7 +5510,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE } } if (IS_VAR != IS_CONST) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { if (UNEXPECTED(ce->constructor == NULL)) { @@ -5559,7 +5559,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_A opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5634,7 +5634,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } @@ -5952,7 +5952,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -10194,7 +10194,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10209,7 +10209,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10224,7 +10224,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10239,7 +10239,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10254,7 +10254,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10269,7 +10269,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10284,7 +10284,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10299,7 +10299,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10314,7 +10314,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAN _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10331,7 +10331,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10347,7 +10347,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10363,7 +10363,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAN _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10379,7 +10379,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDL _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10395,7 +10395,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPC _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10410,7 +10410,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10425,7 +10425,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10440,7 +10440,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10455,7 +10455,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); zval_dtor(free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10633,12 +10633,12 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) { zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); zval_dtor(free_op1.var); } else { container = NULL; zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { } @@ -10687,7 +10687,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're * string offsets or overloaded objects */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10745,7 +10745,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -10767,7 +10767,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10783,7 +10783,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10858,7 +10858,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } @@ -11176,7 +11176,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -12474,7 +12474,7 @@ static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) SAVE_OPLINE(); bitwise_not_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12487,7 +12487,7 @@ static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG SAVE_OPLINE(); boolean_not_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12509,7 +12509,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12534,7 +12534,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12556,7 +12556,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12581,7 +12581,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12600,7 +12600,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) { ZVAL_NULL(&EX_T(opline->result.var).tmp_var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12624,7 +12624,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG fast_increment_function(*var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12643,7 +12643,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) { ZVAL_NULL(&EX_T(opline->result.var).tmp_var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12667,7 +12667,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG fast_decrement_function(*var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12686,7 +12686,7 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } zend_print_variable(z); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12713,7 +12713,7 @@ static int ZEND_FASTCALL ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) ret = Z_LVAL_P(val); } else { ret = i_zend_is_true(val); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12743,7 +12743,7 @@ static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) ret = Z_LVAL_P(val); } else { ret = i_zend_is_true(val); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12773,7 +12773,7 @@ static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) retval = Z_LVAL_P(val); } else { retval = i_zend_is_true(val); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12807,7 +12807,7 @@ static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS retval = Z_LVAL_P(val); } else { retval = i_zend_is_true(val); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12838,7 +12838,7 @@ static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG retval = Z_LVAL_P(val); } else { retval = i_zend_is_true(val); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12879,7 +12879,7 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (!EG(return_value_ptr_ptr)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR || @@ -12892,7 +12892,7 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zval_copy_ctor(ret); } *EG(return_value_ptr_ptr) = ret; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && retval_ptr == &EG(uninitialized_zval)) { zval *ret; @@ -12929,7 +12929,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (!EG(return_value_ptr_ptr)) { if (IS_VAR == IS_TMP_VAR) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } else if (!0) { /* Not a temp var */ zval *ret; @@ -12979,7 +12979,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE } } while (0); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); } @@ -13010,7 +13010,7 @@ static int ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_throw_exception_object(exception TSRMLS_CC); zend_exception_restore(TSRMLS_C); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } @@ -13034,7 +13034,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR ALLOC_ZVAL(varptr); INIT_PZVAL_COPY(varptr, original_var); zval_copy_ctor(varptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { Z_UNSET_ISREF_P(varptr); } @@ -13085,7 +13085,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND if (!0) { zval_copy_ctor(valptr); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zend_vm_stack_push(valptr TSRMLS_CC); } CHECK_EXCEPTION(); @@ -13124,7 +13124,7 @@ static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG Z_ADDREF_P(varptr); zend_vm_stack_push(varptr TSRMLS_CC); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13150,7 +13150,7 @@ static int ZEND_FASTCALL ZEND_BOOL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) SAVE_OPLINE(); /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */ ZVAL_BOOL(retval, i_zend_is_true(_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC))); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13227,7 +13227,7 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) AI_SET_PTR(&EX_T(opline->result.var), retval); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13269,7 +13269,7 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (use_copy) { ZVAL_COPY_VALUE(result, &var_copy); if (0) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } else { ZVAL_COPY_VALUE(result, expr); @@ -13286,7 +13286,7 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) convert_to_object(result); break; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13375,7 +13375,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND if (tmp_inc_filename) { zval_ptr_dtor(&tmp_inc_filename); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } else if (EXPECTED(new_op_array != NULL)) { @@ -13511,13 +13511,13 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC); if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (iter && EXPECTED(EG(exception) == NULL)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } if (!EG(exception)) { zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name); @@ -13536,7 +13536,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor(&array_ptr); if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } HANDLE_EXCEPTION(); } @@ -13545,7 +13545,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor(&array_ptr); if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } HANDLE_EXCEPTION(); } @@ -13577,7 +13577,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } if (is_empty) { ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num); @@ -13733,7 +13733,7 @@ static int ZEND_FASTCALL ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } else { zend_print_variable(ptr); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } #endif zend_bailout(); @@ -13754,14 +13754,14 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS if (!0) { zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.opline_num); #endif ZEND_VM_JMP(opline->op2.jmp_addr); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13789,14 +13789,14 @@ static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ zval_copy_ctor(EX_T(opline->result.var).var.ptr); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.opline_num); #endif ZEND_VM_JMP(opline->op2.jmp_addr); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13814,7 +13814,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR if (!0) { zval_copy_ctor(&EX_T(opline->result.var).tmp_var); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13842,7 +13842,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13863,7 +13863,7 @@ static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A result = 0; } ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, result); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13877,7 +13877,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR fast_add_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13892,7 +13892,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR fast_sub_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13907,7 +13907,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR fast_mul_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13922,7 +13922,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR fast_div_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13937,7 +13937,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR fast_mod_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13952,7 +13952,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG shift_left_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13967,7 +13967,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG shift_right_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13982,7 +13982,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER concat_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13997,7 +13997,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H is_identical_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14014,7 +14014,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14030,7 +14030,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL ZVAL_BOOL(result, fast_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14046,7 +14046,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H ZVAL_BOOL(result, fast_not_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14062,7 +14062,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN ZVAL_BOOL(result, fast_is_smaller_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14078,7 +14078,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_O ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14093,7 +14093,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ bitwise_or_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14108,7 +14108,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER bitwise_and_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14123,7 +14123,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER bitwise_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14138,7 +14138,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL boolean_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), opline->op2.zv TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14249,7 +14249,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -14304,7 +14304,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -14335,11 +14335,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -14429,7 +14429,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14489,7 +14489,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14530,7 +14530,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_ zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14591,7 +14591,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_ } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14640,7 +14640,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, if (IS_VAR != IS_CONST && varname == &tmp_varname) { zval_dtor(&tmp_varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14650,7 +14650,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, ce = EX_T(opline->op2.var).class_entry; } retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); /* @@ -14687,11 +14687,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { case ZEND_FETCH_GLOBAL: if (IS_VAR != IS_TMP_VAR) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } break; case ZEND_FETCH_LOCAL: - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); break; case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); @@ -14780,13 +14780,13 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC); if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -14811,7 +14811,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -14845,7 +14845,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14860,7 +14860,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14883,7 +14883,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_CONST == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -14891,7 +14891,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14919,7 +14919,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCOD if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -14976,7 +14976,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST( } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15013,7 +15013,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -15056,7 +15056,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15098,7 +15098,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15132,7 +15132,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -15171,7 +15171,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCOD if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -15206,7 +15206,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -15286,7 +15286,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -15340,7 +15340,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ @@ -15422,7 +15422,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -15693,7 +15693,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC INIT_PZVAL_COPY(new_expr, expr_ptr); expr_ptr = new_expr; zendi_zval_copy_ctor(*expr_ptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -15737,7 +15737,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -15806,7 +15806,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { zval_ptr_dtor(&varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } if (UNEXPECTED(ce == NULL)) { @@ -15830,7 +15830,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { zval_ptr_dtor(&varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15925,7 +15925,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -15966,7 +15966,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16036,7 +16036,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC if (IS_VAR != IS_CONST && varname == &tmp) { zval_dtor(&tmp); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (opline->extended_value & ZEND_ISSET) { @@ -16188,7 +16188,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16270,7 +16270,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -16290,7 +16290,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -16369,7 +16369,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_add_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16384,7 +16384,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_sub_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16399,7 +16399,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_mul_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16414,7 +16414,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_div_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16429,7 +16429,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_mod_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16444,7 +16444,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) shift_left_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16459,7 +16459,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) shift_right_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16474,7 +16474,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A concat_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16489,7 +16489,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN is_identical_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16506,7 +16506,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16522,7 +16522,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER ZVAL_BOOL(result, fast_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16538,7 +16538,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN ZVAL_BOOL(result, fast_not_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16554,7 +16554,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL ZVAL_BOOL(result, fast_is_smaller_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16570,7 +16570,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPC ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16585,7 +16585,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR bitwise_or_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16600,7 +16600,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A bitwise_and_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16615,7 +16615,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A bitwise_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16630,7 +16630,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER boolean_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16741,7 +16741,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -16796,7 +16796,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_ AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } zval_dtor(free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -16828,11 +16828,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_ if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -16922,7 +16922,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -16982,7 +16982,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17023,7 +17023,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); zval_dtor(free_op2.var); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17084,7 +17084,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17111,13 +17111,13 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC); zval_dtor(free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC); zval_dtor(free_op2.var); if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -17142,7 +17142,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -17176,7 +17176,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17191,7 +17191,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC); zval_dtor(free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17214,7 +17214,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } zval_dtor(free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_TMP_VAR == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -17222,7 +17222,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC); zval_dtor(free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -17250,7 +17250,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_ if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -17307,7 +17307,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZE } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17344,7 +17344,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -17387,7 +17387,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17429,7 +17429,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17463,7 +17463,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -17502,7 +17502,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_ if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -17537,7 +17537,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -17618,7 +17618,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -17672,7 +17672,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ @@ -17755,7 +17755,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE EX(call) = call; zval_dtor(free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -17930,7 +17930,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD INIT_PZVAL_COPY(new_expr, expr_ptr); expr_ptr = new_expr; zendi_zval_copy_ctor(*expr_ptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -17974,7 +17974,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18084,7 +18084,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18125,7 +18125,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18262,7 +18262,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18344,7 +18344,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -18364,7 +18364,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -18443,8 +18443,8 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_add_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18458,8 +18458,8 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_sub_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18473,8 +18473,8 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_mul_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18488,8 +18488,8 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_div_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18503,8 +18503,8 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS fast_mod_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18518,8 +18518,8 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) shift_left_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18533,8 +18533,8 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) shift_right_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18548,8 +18548,8 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A concat_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18563,8 +18563,8 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN is_identical_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18580,8 +18580,8 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18596,8 +18596,8 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER ZVAL_BOOL(result, fast_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18612,8 +18612,8 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN ZVAL_BOOL(result, fast_not_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18628,8 +18628,8 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL ZVAL_BOOL(result, fast_is_smaller_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18644,8 +18644,8 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPC ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18659,8 +18659,8 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR bitwise_or_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18674,8 +18674,8 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A bitwise_and_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18689,8 +18689,8 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A bitwise_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18704,8 +18704,8 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER boolean_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18729,7 +18729,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to assign property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); FREE_OP(free_op_data1); if (RETURN_VALUE_USED(opline)) { @@ -18810,12 +18810,12 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -18869,8 +18869,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_ PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - zval_ptr_dtor(&free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zval_ptr_dtor_nogc(&free_op2.var); + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -18897,16 +18897,16 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_ PZVAL_LOCK(*var_ptr); AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -18991,12 +18991,12 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19054,9 +19054,9 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19095,9 +19095,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19156,9 +19156,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19207,7 +19207,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE if (IS_VAR != IS_CONST && varname == &tmp_varname) { zval_dtor(&tmp_varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19217,7 +19217,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE ce = EX_T(opline->op2.var).class_entry; } retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); /* @@ -19254,11 +19254,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { case ZEND_FETCH_GLOBAL: if (IS_VAR != IS_TMP_VAR) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } break; case ZEND_FETCH_LOCAL: - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); break; case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); @@ -19346,14 +19346,14 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) { zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -19374,11 +19374,11 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -19408,11 +19408,11 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19426,8 +19426,8 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN SAVE_OPLINE(); container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19449,16 +19449,16 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - zval_ptr_dtor(&free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zval_ptr_dtor_nogc(&free_op2.var); + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_VAR == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); } container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -19482,11 +19482,11 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -19522,7 +19522,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE zend_error(E_NOTICE, "Trying to get property of non-object"); PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -19539,11 +19539,11 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19575,12 +19575,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -19618,12 +19618,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19644,7 +19644,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) { PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -19661,11 +19661,11 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19694,12 +19694,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -19733,12 +19733,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_ if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -19771,9 +19771,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -19803,7 +19803,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { zend_free_op free_op2, free_op_data1, free_op_data2; @@ -19812,7 +19812,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL zval **variable_ptr_ptr; zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R); variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC); @@ -19854,7 +19854,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -19908,10 +19908,10 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -19937,7 +19937,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL } zend_error(E_STRICT, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -19964,8 +19964,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20023,7 +20023,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -20045,8 +20045,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20136,7 +20136,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND } } if (IS_VAR != IS_CONST) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { if (UNEXPECTED(ce->constructor == NULL)) { @@ -20185,7 +20185,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -20221,7 +20221,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD INIT_PZVAL_COPY(new_expr, expr_ptr); expr_ptr = new_expr; zendi_zval_copy_ctor(*expr_ptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -20260,12 +20260,12 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20334,7 +20334,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { zval_ptr_dtor(&varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } if (UNEXPECTED(ce == NULL)) { @@ -20358,7 +20358,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { zval_ptr_dtor(&varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -20426,7 +20426,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE zend_error(E_WARNING, "Illegal offset type in unset"); break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } case IS_OBJECT: @@ -20440,20 +20440,20 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } break; case IS_STRING: zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_CONTINUE(); /* bailed out before */ default: - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20486,15 +20486,15 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20564,7 +20564,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD if (IS_VAR != IS_CONST && varname == &tmp) { zval_dtor(&tmp); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (opline->extended_value & ZEND_ISSET) { @@ -20652,7 +20652,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in result = 1; } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); @@ -20675,7 +20675,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; @@ -20704,9 +20704,9 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL; @@ -20716,7 +20716,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20798,7 +20798,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -20818,7 +20818,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -20863,7 +20863,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -20994,7 +20994,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (* FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -21049,7 +21049,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -21080,11 +21080,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -21179,7 +21179,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, if (IS_VAR != IS_CONST && varname == &tmp_varname) { zval_dtor(&tmp_varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -21189,7 +21189,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, ce = EX_T(opline->op2.var).class_entry; } retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); /* @@ -21226,11 +21226,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { case ZEND_FETCH_GLOBAL: if (IS_VAR != IS_TMP_VAR) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } break; case ZEND_FETCH_LOCAL: - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); break; case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); @@ -21324,7 +21324,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_H if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -21358,7 +21358,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_ if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -21381,7 +21381,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_UNUSED == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -21389,7 +21389,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -21468,7 +21468,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -21629,7 +21629,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP INIT_PZVAL_COPY(new_expr, expr_ptr); expr_ptr = new_expr; zendi_zval_copy_ctor(*expr_ptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -21673,7 +21673,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -21742,7 +21742,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { zval_ptr_dtor(&varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } if (UNEXPECTED(ce == NULL)) { @@ -21766,7 +21766,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { zval_ptr_dtor(&varname); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -21835,7 +21835,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP if (IS_VAR != IS_CONST && varname == &tmp) { zval_dtor(&tmp); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (opline->extended_value & ZEND_ISSET) { @@ -21943,7 +21943,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -21963,7 +21963,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -22042,7 +22042,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) fast_add_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22057,7 +22057,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) fast_sub_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22072,7 +22072,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) fast_mul_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22087,7 +22087,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) fast_div_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22102,7 +22102,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) fast_mod_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22117,7 +22117,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) shift_left_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22132,7 +22132,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) shift_right_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22147,7 +22147,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR concat_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22162,7 +22162,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND is_identical_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22179,7 +22179,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22195,7 +22195,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_BOOL(result, fast_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22211,7 +22211,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND ZVAL_BOOL(result, fast_not_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22227,7 +22227,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE ZVAL_BOOL(result, fast_is_smaller_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22243,7 +22243,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCO ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22258,7 +22258,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG bitwise_or_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22273,7 +22273,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR bitwise_and_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22288,7 +22288,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR bitwise_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22303,7 +22303,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ boolean_xor_function(&EX_T(opline->result.var).tmp_var, _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC), _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22414,7 +22414,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -22469,7 +22469,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -22500,11 +22500,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -22594,7 +22594,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22654,7 +22654,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22695,7 +22695,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22756,7 +22756,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22783,13 +22783,13 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC); if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -22814,7 +22814,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -22848,7 +22848,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22863,7 +22863,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22886,7 +22886,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_CV == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -22894,7 +22894,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22922,7 +22922,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_H if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -22979,7 +22979,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEN } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -23016,7 +23016,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -23059,7 +23059,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -23101,7 +23101,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -23135,7 +23135,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -23174,7 +23174,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_H if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -23209,7 +23209,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -23289,7 +23289,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -23343,7 +23343,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ @@ -23398,7 +23398,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23478,7 +23478,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23652,7 +23652,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE INIT_PZVAL_COPY(new_expr, expr_ptr); expr_ptr = new_expr; zendi_zval_copy_ctor(*expr_ptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -23696,7 +23696,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23806,7 +23806,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23847,7 +23847,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23984,7 +23984,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -24066,7 +24066,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -24086,7 +24086,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -26973,7 +26973,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (* if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to assign property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); FREE_OP(free_op_data1); if (RETURN_VALUE_USED(opline)) { @@ -27054,7 +27054,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (* if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } FREE_OP(free_op_data1); } @@ -27112,7 +27112,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { @@ -27140,7 +27140,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina PZVAL_LOCK(*var_ptr); AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); @@ -27234,7 +27234,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); @@ -27297,7 +27297,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_ if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -27338,7 +27338,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); ZVAL_NULL(retval); CHECK_EXCEPTION(); @@ -27399,7 +27399,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -27433,7 +27433,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR zend_error(E_NOTICE, "Trying to get property of non-object"); PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -27450,7 +27450,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -27485,7 +27485,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27527,7 +27527,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27553,7 +27553,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) { PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -27570,7 +27570,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -27602,7 +27602,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_O if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27641,7 +27641,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCO if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27678,7 +27678,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HA if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } /* assign_obj has two opcodes! */ @@ -27726,7 +27726,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're * string offsets or overloaded objects */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -27784,7 +27784,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -27806,7 +27806,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -27889,7 +27889,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN zend_error(E_WARNING, "Illegal offset type in unset"); break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } case IS_OBJECT: @@ -27903,18 +27903,18 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } break; case IS_STRING: zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_CONTINUE(); /* bailed out before */ default: - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -27948,13 +27948,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -28028,7 +28028,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR result = 1; } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); @@ -28051,7 +28051,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; @@ -28080,9 +28080,9 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL; @@ -28236,7 +28236,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -35431,7 +35431,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35446,7 +35446,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35461,7 +35461,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35476,7 +35476,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35491,7 +35491,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35506,7 +35506,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35521,7 +35521,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35536,7 +35536,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35551,7 +35551,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35568,7 +35568,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); Z_LVAL_P(result) = !Z_LVAL_P(result); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35584,7 +35584,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35600,7 +35600,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35616,7 +35616,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35632,7 +35632,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCO _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35647,7 +35647,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35662,7 +35662,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35677,7 +35677,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35692,7 +35692,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35716,7 +35716,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to assign property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); FREE_OP(free_op_data1); if (RETURN_VALUE_USED(opline)) { @@ -35797,7 +35797,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } FREE_OP(free_op_data1); } @@ -35855,7 +35855,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { @@ -35883,7 +35883,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o PZVAL_LOCK(*var_ptr); AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); @@ -35977,7 +35977,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); @@ -36040,7 +36040,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -36081,7 +36081,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); ZVAL_NULL(retval); CHECK_EXCEPTION(); @@ -36142,7 +36142,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -36332,12 +36332,12 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) { zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { } @@ -36360,7 +36360,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } @@ -36393,7 +36393,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } @@ -36411,7 +36411,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND SAVE_OPLINE(); container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36434,7 +36434,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { if (IS_VAR == IS_UNUSED) { @@ -36442,7 +36442,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD } container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -36467,7 +36467,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } @@ -36507,7 +36507,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN zend_error(E_NOTICE, "Trying to get property of non-object"); PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -36524,7 +36524,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -36559,7 +36559,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36601,7 +36601,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36627,7 +36627,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) { PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -36644,7 +36644,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -36676,7 +36676,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36715,7 +36715,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36752,7 +36752,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } /* assign_obj has two opcodes! */ @@ -36784,7 +36784,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { zend_free_op free_op2, free_op_data1, free_op_data2; @@ -36793,7 +36793,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE zval **variable_ptr_ptr; zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R); variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC); @@ -36890,7 +36890,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR } /* zend_assign_to_variable() always takes care of op2, never free it! */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36916,7 +36916,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE } zend_error(E_STRICT, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -36943,7 +36943,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr); } - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -37001,7 +37001,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -37023,7 +37023,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -37039,7 +37039,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC), _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -37114,7 +37114,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } @@ -37280,7 +37280,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER zend_error(E_WARNING, "Illegal offset type in unset"); break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } case IS_OBJECT: @@ -37294,18 +37294,18 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } break; case IS_STRING: zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_CONTINUE(); /* bailed out before */ default: - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -37339,13 +37339,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -37504,7 +37504,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int result = 1; } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); @@ -37527,7 +37527,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; @@ -37556,9 +37556,9 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL; @@ -37712,7 +37712,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index a65349c4ed63d..a0546460d0e44 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -218,7 +218,7 @@ $op1_free_op = array( "ANY" => "FREE_OP(free_op1)", "TMP" => "zval_dtor(free_op1.var)", - "VAR" => "zval_ptr_dtor(&free_op1.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op1.var)", "CONST" => "", "UNUSED" => "", "CV" => "", @@ -227,7 +227,7 @@ $op2_free_op = array( "ANY" => "FREE_OP(free_op2)", "TMP" => "zval_dtor(free_op2.var)", - "VAR" => "zval_ptr_dtor(&free_op2.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op2.var)", "CONST" => "", "UNUSED" => "", "CV" => "", @@ -236,7 +236,7 @@ $op1_free_op_if_var = array( "ANY" => "FREE_OP_IF_VAR(free_op1)", "TMP" => "", - "VAR" => "zval_ptr_dtor(&free_op1.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op1.var)", "CONST" => "", "UNUSED" => "", "CV" => "", @@ -245,33 +245,33 @@ $op2_free_op_if_var = array( "ANY" => "FREE_OP_IF_VAR(free_op2)", "TMP" => "", - "VAR" => "zval_ptr_dtor(&free_op2.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op2.var)", "CONST" => "", "UNUSED" => "", "CV" => "", ); $op1_free_op_var_ptr = array( - "ANY" => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}", + "ANY" => "if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}", "TMP" => "", - "VAR" => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}", + "VAR" => "if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}", "CONST" => "", "UNUSED" => "", "CV" => "", ); $op1_free_op_var_ptr_fast = $op1_free_op_var_ptr; -$op1_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor(&free_op1.var)"; +$op1_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor_nogc(&free_op1.var)"; $op2_free_op_var_ptr = array( - "ANY" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}", + "ANY" => "if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}", "TMP" => "", - "VAR" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}", + "VAR" => "if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}", "CONST" => "", "UNUSED" => "", "CV" => "", ); $op2_free_op_var_ptr_fast = $op2_free_op_var_ptr; -$op2_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor(&free_op2.var)"; +$op2_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor_nogc(&free_op2.var)"; $list = array(); // list of opcode handlers and helpers in original order $opcodes = array(); // opcode handlers by code From 2361745806553db9099542d9237ade00dcee799b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 31 Oct 2013 08:57:12 +0100 Subject: [PATCH 0249/1256] Working commit for constant scalar expressions (with constants). Tests will follow. --- Zend/Makefile.am | 3 +- Zend/Zend.dsp | 4 + Zend/ZendTS.dsp | 4 + Zend/zend.h | 23 ++- Zend/zend_API.c | 57 +++--- Zend/zend_ast.c | 128 ++++++++++++ Zend/zend_ast.h | 60 ++++++ Zend/zend_builtin_functions.c | 7 +- Zend/zend_compile.c | 25 ++- Zend/zend_compile.h | 1 + Zend/zend_execute_API.c | 334 +++++++++++++++++--------------- Zend/zend_language_parser.y | 34 +++- Zend/zend_operators.h | 3 + Zend/zend_variables.c | 10 + Zend/zend_vm_def.h | 64 +++--- Zend/zend_vm_execute.h | 92 +++++---- configure.in | 4 +- ext/reflection/php_reflection.c | 18 +- win32/build/config.w32 | 4 +- 19 files changed, 599 insertions(+), 276 deletions(-) create mode 100644 Zend/zend_ast.c create mode 100644 Zend/zend_ast.h diff --git a/Zend/Makefile.am b/Zend/Makefile.am index 6417f3eb141ed..d0316083b0c7b 100644 --- a/Zend/Makefile.am +++ b/Zend/Makefile.am @@ -18,7 +18,8 @@ libZend_la_SOURCES=\ zend_default_classes.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c \ zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \ - zend_generators.c + zend_generators.c \ + zend_ast.c libZend_la_LDFLAGS = libZend_la_LIBADD = @ZEND_EXTRA_LIBS@ diff --git a/Zend/Zend.dsp b/Zend/Zend.dsp index 23ebd4532b5e7..9baf628b84ae9 100644 --- a/Zend/Zend.dsp +++ b/Zend/Zend.dsp @@ -119,6 +119,10 @@ SOURCE=.\zend_API.c # End Source File # Begin Source File +SOURCE=.\zend_ast.c +# End Source File +# Begin Source File + SOURCE=.\zend_builtin_functions.c # End Source File # Begin Source File diff --git a/Zend/ZendTS.dsp b/Zend/ZendTS.dsp index 3be2c58bed6fa..5dfa24d5b98f4 100644 --- a/Zend/ZendTS.dsp +++ b/Zend/ZendTS.dsp @@ -140,6 +140,10 @@ SOURCE=.\zend_alloc.c # End Source File # Begin Source File +SOURCE=.\zend_ast.c +# End Source File +# Begin Source File + SOURCE=.\zend_API.c # End Source File # Begin Source File diff --git a/Zend/zend.h b/Zend/zend.h index acbb6acaf76ce..7ccd0814e0f5b 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -317,6 +317,7 @@ typedef struct _zend_object { } zend_object; #include "zend_object_handlers.h" +#include "zend_ast.h" typedef union _zvalue_value { long lval; /* long value */ @@ -327,6 +328,7 @@ typedef union _zvalue_value { } str; HashTable *ht; /* hash table value */ zend_object_value obj; + zend_ast *ast; } zvalue_value; struct _zval_struct { @@ -577,17 +579,18 @@ typedef int (*zend_write_func_t)(const char *str, uint str_length); /* data types */ /* All data types <= IS_BOOL have their constructor/destructors skipped */ -#define IS_NULL 0 -#define IS_LONG 1 -#define IS_DOUBLE 2 -#define IS_BOOL 3 -#define IS_ARRAY 4 -#define IS_OBJECT 5 -#define IS_STRING 6 -#define IS_RESOURCE 7 -#define IS_CONSTANT 8 +#define IS_NULL 0 +#define IS_LONG 1 +#define IS_DOUBLE 2 +#define IS_BOOL 3 +#define IS_ARRAY 4 +#define IS_OBJECT 5 +#define IS_STRING 6 +#define IS_RESOURCE 7 +#define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9 -#define IS_CALLABLE 10 +#define IS_CONSTANT_AST 10 +#define IS_CALLABLE 11 /* Ugly hack to support constants as static array indices */ #define IS_CONSTANT_TYPE_MASK 0x00f diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5fa7fb908e500..3051d19729751 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1053,34 +1053,37 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destro static int zval_update_class_constant(zval **pp, int is_static, int offset TSRMLS_DC) /* {{{ */ { - if ((Z_TYPE_PP(pp) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || - (Z_TYPE_PP(pp) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT_ARRAY) { - zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry); - - if ((*scope)->parent) { - zend_class_entry *ce = *scope; - HashPosition pos; - zend_property_info *prop_info; - - do { - for (zend_hash_internal_pointer_reset_ex(&ce->properties_info, &pos); - zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop_info, &pos) == SUCCESS; - zend_hash_move_forward_ex(&ce->properties_info, &pos)) { - if (is_static == ((prop_info->flags & ZEND_ACC_STATIC) != 0) && - offset == prop_info->offset) { - int ret; - zend_class_entry *old_scope = *scope; - *scope = prop_info->ce; - ret = zval_update_constant(pp, (void*)1 TSRMLS_CC); - *scope = old_scope; - return ret; - } - } - ce = ce->parent; - } while (ce); - + switch (Z_TYPE_PP(pp) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry); + + if ((*scope)->parent) { + zend_class_entry *ce = *scope; + HashPosition pos; + zend_property_info *prop_info; + + do { + for (zend_hash_internal_pointer_reset_ex(&ce->properties_info, &pos); + zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop_info, &pos) == SUCCESS; + zend_hash_move_forward_ex(&ce->properties_info, &pos)) { + if (is_static == ((prop_info->flags & ZEND_ACC_STATIC) != 0) && + offset == prop_info->offset) { + int ret; + zend_class_entry *old_scope = *scope; + *scope = prop_info->ce; + ret = zval_update_constant(pp, (void*)1 TSRMLS_CC); + *scope = old_scope; + return ret; + } + } + ce = ce->parent; + } while (ce); + + } + return zval_update_constant(pp, (void*)1 TSRMLS_CC); } - return zval_update_constant(pp, (void*)1 TSRMLS_CC); } return 0; } diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c new file mode 100644 index 0000000000000..705c4df465b3f --- /dev/null +++ b/Zend/zend_ast.c @@ -0,0 +1,128 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Bob Weinand | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include "zend_ast.h" +#include "zend_execute.h" + +#define OP_IS_CONST_THEN(op, do_code) \ + switch (Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK) { \ + case IS_CONSTANT: \ + case IS_CONSTANT_ARRAY: \ + case IS_CONSTANT_AST: { \ + do_code \ + } \ + } + +#define OP_IS_NOT_CONST_THEN(op, do_code) \ + switch (Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK) { \ + case IS_CONSTANT: \ + case IS_CONSTANT_ARRAY: \ + case IS_CONSTANT_AST: \ + break; \ +\ + default: { \ + do_code \ + } \ + } + +#define COPY_ZVAL_TO_OP(nr) \ + Z_AST_P(result)->ops[nr] = emalloc(sizeof(zval)); \ + *Z_AST_P(result)->ops[nr] = *op##nr; + +void zend_ast_add(zval *result, intermediary_ast_function_type func, char op_count) { + zend_ast *ast = emalloc(sizeof(zend_ast)); + ast->op_count = op_count; + ast->ops = emalloc(op_count * sizeof(zval *)); + ast->refcount = 1; + ast->func = func; + Z_AST_P(result) = ast; + Z_TYPE_P(result) = IS_CONSTANT_AST; +} + +/* Do operations on constant operators at compile time (AST building time) */ + +void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0) { + OP_IS_NOT_CONST_THEN(op0, + func(result, op0); + return; + ) + + zend_ast_add(result, (intermediary_ast_function_type)func, 1); + COPY_ZVAL_TO_OP(0) +} + +void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1) { + OP_IS_NOT_CONST_THEN(op0, OP_IS_NOT_CONST_THEN(op1, + func(result, op0, op1); + return; + )) + + zend_ast_add(result, (intermediary_ast_function_type)func, 2); + COPY_ZVAL_TO_OP(0) + COPY_ZVAL_TO_OP(1) +} + +void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2) { + OP_IS_NOT_CONST_THEN(op0, OP_IS_NOT_CONST_THEN(op1, OP_IS_NOT_CONST_THEN(op2, + func(result, op0, op1, op2); + return; + ))) + + zend_ast_add(result, (intermediary_ast_function_type)func, 3); + COPY_ZVAL_TO_OP(0) + COPY_ZVAL_TO_OP(1) + COPY_ZVAL_TO_OP(2) +} + +void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) { + int i; + + for (i = ast->op_count; i--;) { + OP_IS_CONST_THEN(ast->ops[i], + zval_update_constant_ex(&ast->ops[i], (void *)1, NULL TSRMLS_CC); + ) + } + + switch (ast->op_count) { + case 1: + ((unary_ast_func)ast->func)(result, ast->ops[0]); + break; + case 2: + ((binary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1]); + break; + case 3: + ((ternary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1], ast->ops[2]); + break; + } +} + +void zend_ast_destroy(zend_ast *ast TSRMLS_DC) { + int i; + + for (i = ast->op_count; i--;) { + if (!Z_DELREF_P(ast->ops[i])) { + zval_dtor(ast->ops[i]); + efree(ast->ops[i]); + } + } + + efree(ast->ops); + efree(ast); +} diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h new file mode 100644 index 0000000000000..9841c3463e480 --- /dev/null +++ b/Zend/zend_ast.h @@ -0,0 +1,60 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Bob Weinand | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifndef ZEND_AST_H +#define ZEND_AST_H + +typedef struct _zend_ast zend_ast; + +#include "zend.h" + +typedef void(*intermediary_ast_function_type)(zval *, ...); +typedef int(*unary_ast_func)(zval *result, zval *op0); +typedef int(*binary_ast_func)(zval *result, zval *op0, zval *op1); +typedef int(*ternary_ast_func)(zval *result, zval *op0, zval *op1, zval *op2); + +struct _zend_ast { + char op_count; + zval **ops; + intermediary_ast_function_type func; + int refcount; +}; + +void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0); +void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1); +void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2); + +void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC); + +void zend_ast_destroy(zend_ast *ast TSRMLS_DC); + +#define ZEND_AST_ADD_REF(ast) ++ast->refcount + +static inline int ZEND_AST_DEL_REF(zend_ast *ast) { + if (ast->refcount == 1) { + TSRMLS_FETCH(); + + zend_ast_destroy(ast TSRMLS_CC); + return 0; + } + return --ast->refcount; +} + +#endif diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 55e5f34e83aab..b3b7529d9ba13 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -946,8 +946,11 @@ static void add_class_vars(zend_class_entry *ce, int statics, zval *return_value /* this is necessary to make it able to work with default array * properties, returned to user */ - if (Z_TYPE_P(prop_copy) == IS_CONSTANT_ARRAY || (Z_TYPE_P(prop_copy) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zval_update_constant(&prop_copy, 0 TSRMLS_CC); + switch (Z_TYPE_P(prop_copy) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: + zval_update_constant(&prop_copy, 0 TSRMLS_CC); } add_assoc_zval(return_value, key, prop_copy); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7ee8dd1e74db3..f3bf5be3806c2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1891,7 +1891,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (class_type->u.constant.type == IS_ARRAY) { cur_arg_info->type_hint = IS_ARRAY; if (op == ZEND_RECV_INIT) { - if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { + if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) { cur_arg_info->allow_null = 1; } else if (Z_TYPE(initialization->u.constant) != IS_ARRAY && Z_TYPE(initialization->u.constant) != IS_CONSTANT_ARRAY) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL"); @@ -1900,7 +1900,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ } else if (class_type->u.constant.type == IS_CALLABLE) { cur_arg_info->type_hint = IS_CALLABLE; if (op == ZEND_RECV_INIT) { - if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { + if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) { cur_arg_info->allow_null = 1; } else { zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with callable type hint can only be NULL"); @@ -1915,7 +1915,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ cur_arg_info->class_name = Z_STRVAL(class_type->u.constant); cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant); if (op == ZEND_RECV_INIT) { - if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { + if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) { cur_arg_info->allow_null = 1; } else { zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); @@ -5530,7 +5530,8 @@ static zend_constant* zend_get_ct_const(const zval *const_name, int all_internal (c->flags & CONST_PERSISTENT) && !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION) && Z_TYPE(c->value) != IS_CONSTANT && - Z_TYPE(c->value) != IS_CONSTANT_ARRAY) { + Z_TYPE(c->value) != IS_CONSTANT_ARRAY && + Z_TYPE(c->value) != IS_CONSTANT_AST) { return c; } return NULL; @@ -5772,7 +5773,7 @@ void zend_do_add_static_array_element(znode *result, znode *offset, const znode ALLOC_ZVAL(element); *element = expr->u.constant; if (offset) { - switch (offset->u.constant.type & IS_CONSTANT_TYPE_MASK) { + switch (Z_TYPE(offset->u.constant) & IS_CONSTANT_TYPE_MASK) { case IS_CONSTANT: /* Ugly hack to denote that this value has a constant index */ Z_TYPE_P(element) |= IS_CONSTANT_INDEX; @@ -5782,6 +5783,20 @@ void zend_do_add_static_array_element(znode *result, znode *offset, const znode zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; + case IS_CONSTANT_AST: { + /* Another ugly hack to store the data about the AST in the array */ + char* key; + int len = sizeof(zend_ast *); + Z_TYPE_P(element) |= IS_CONSTANT_INDEX; + + key = emalloc(len + 2); + *(zend_ast **)key = Z_AST(offset->u.constant); + key[len] = Z_TYPE(offset->u.constant); + key[len + 1] = 0; + zend_symtable_update(Z_ARRVAL(result->u.constant), key, len + 2, &element, sizeof(zval *), NULL); + efree(key); + } + break; case IS_STRING: zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+1, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f9520c98eacf2..bbc6e4738379c 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -23,6 +23,7 @@ #define ZEND_COMPILE_H #include "zend.h" +#include "zend_ast.h" #ifdef HAVE_STDARG_H # include diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 779e6d886fa4d..eabebacce465c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -478,188 +478,208 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco if (IS_CONSTANT_VISITED(p)) { zend_error(E_ERROR, "Cannot declare self-referencing constant '%s'", Z_STRVAL_P(p)); - } else if ((Z_TYPE_P(p) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - int refcount; - zend_uchar is_ref; + return FAILURE; + } + switch (Z_TYPE_P(p) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: { + int refcount; + zend_uchar is_ref; - SEPARATE_ZVAL_IF_NOT_REF(pp); - p = *pp; + SEPARATE_ZVAL_IF_NOT_REF(pp); + p = *pp; - MARK_CONSTANT_VISITED(p); + MARK_CONSTANT_VISITED(p); - refcount = Z_REFCOUNT_P(p); - is_ref = Z_ISREF_P(p); + refcount = Z_REFCOUNT_P(p); + is_ref = Z_ISREF_P(p); - if (!zend_get_constant_ex(p->value.str.val, p->value.str.len, &const_value, scope, Z_REAL_TYPE_P(p) TSRMLS_CC)) { - char *actual = Z_STRVAL_P(p); + if (!zend_get_constant_ex(p->value.str.val, p->value.str.len, &const_value, scope, Z_REAL_TYPE_P(p) TSRMLS_CC)) { + char *actual = Z_STRVAL_P(p); - if ((colon = (char*)zend_memrchr(Z_STRVAL_P(p), ':', Z_STRLEN_P(p)))) { - zend_error(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(p)); - Z_STRLEN_P(p) -= ((colon - Z_STRVAL_P(p)) + 1); - if (inline_change) { - colon = estrndup(colon, Z_STRLEN_P(p)); - str_efree(Z_STRVAL_P(p)); - Z_STRVAL_P(p) = colon; - } else { - Z_STRVAL_P(p) = colon + 1; - } - } else { - char *save = actual, *slash; - int actual_len = Z_STRLEN_P(p); - if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) && (slash = (char *)zend_memrchr(actual, '\\', actual_len))) { - actual = slash + 1; - actual_len -= (actual - Z_STRVAL_P(p)); + if ((colon = (char*)zend_memrchr(Z_STRVAL_P(p), ':', Z_STRLEN_P(p)))) { + zend_error(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(p)); + Z_STRLEN_P(p) -= ((colon - Z_STRVAL_P(p)) + 1); if (inline_change) { - actual = estrndup(actual, actual_len); - Z_STRVAL_P(p) = actual; - Z_STRLEN_P(p) = actual_len; - } - } - if (actual[0] == '\\') { - if (inline_change) { - memmove(Z_STRVAL_P(p), Z_STRVAL_P(p)+1, Z_STRLEN_P(p)); - --Z_STRLEN_P(p); + colon = estrndup(colon, Z_STRLEN_P(p)); + str_efree(Z_STRVAL_P(p)); + Z_STRVAL_P(p) = colon; } else { - ++actual; + Z_STRVAL_P(p) = colon + 1; } - --actual_len; - } - if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) == 0) { - int fix_save = 0; - if (save[0] == '\\') { - save++; - fix_save = 1; + } else { + char *save = actual, *slash; + int actual_len = Z_STRLEN_P(p); + if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) && (slash = (char *)zend_memrchr(actual, '\\', actual_len))) { + actual = slash + 1; + actual_len -= (actual - Z_STRVAL_P(p)); + if (inline_change) { + actual = estrndup(actual, actual_len); + Z_STRVAL_P(p) = actual; + Z_STRLEN_P(p) = actual_len; + } } - zend_error(E_ERROR, "Undefined constant '%s'", save); - if (fix_save) { - save--; + if (actual[0] == '\\') { + if (inline_change) { + memmove(Z_STRVAL_P(p), Z_STRVAL_P(p)+1, Z_STRLEN_P(p)); + --Z_STRLEN_P(p); + } else { + ++actual; + } + --actual_len; } - if (inline_change) { + if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) == 0) { + int fix_save = 0; + if (save[0] == '\\') { + save++; + fix_save = 1; + } + zend_error(E_ERROR, "Undefined constant '%s'", save); + if (fix_save) { + save--; + } + if (inline_change) { + str_efree(save); + } + save = NULL; + } + if (inline_change && save && save != actual) { str_efree(save); } - save = NULL; - } - if (inline_change && save && save != actual) { - str_efree(save); + zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual); + p->type = IS_STRING; + if (!inline_change) { + Z_STRVAL_P(p) = actual; + Z_STRLEN_P(p) = actual_len; + zval_copy_ctor(p); + } } - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual); - p->type = IS_STRING; - if (!inline_change) { - Z_STRVAL_P(p) = actual; - Z_STRLEN_P(p) = actual_len; - zval_copy_ctor(p); + } else { + if (inline_change) { + str_efree(Z_STRVAL_P(p)); } + *p = const_value; } - } else { - if (inline_change) { - str_efree(Z_STRVAL_P(p)); - } - *p = const_value; - } - Z_SET_REFCOUNT_P(p, refcount); - Z_SET_ISREF_TO_P(p, is_ref); - } else if (Z_TYPE_P(p) == IS_CONSTANT_ARRAY) { - zval **element, *new_val; - char *str_index; - uint str_index_len; - ulong num_index; - int ret; - - SEPARATE_ZVAL_IF_NOT_REF(pp); - p = *pp; - Z_TYPE_P(p) = IS_ARRAY; - - if (!inline_change) { - zval *tmp; - HashTable *tmp_ht = NULL; - - ALLOC_HASHTABLE(tmp_ht); - zend_hash_init(tmp_ht, zend_hash_num_elements(Z_ARRVAL_P(p)), NULL, ZVAL_PTR_DTOR, 0); - zend_hash_copy(tmp_ht, Z_ARRVAL_P(p), (copy_ctor_func_t) zval_deep_copy, (void *) &tmp, sizeof(zval *)); - Z_ARRVAL_P(p) = tmp_ht; + Z_SET_REFCOUNT_P(p, refcount); + Z_SET_ISREF_TO_P(p, is_ref); } - - /* First go over the array and see if there are any constant indices */ - zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); - while (zend_hash_get_current_data(Z_ARRVAL_P(p), (void **) &element) == SUCCESS) { - if (!(Z_TYPE_PP(element) & IS_CONSTANT_INDEX)) { - zend_hash_move_forward(Z_ARRVAL_P(p)); - continue; + break; + + case IS_CONSTANT_ARRAY: { + zval **element, *new_val; + char *str_index; + uint str_index_len; + ulong num_index; + int ret; + + SEPARATE_ZVAL_IF_NOT_REF(pp); + p = *pp; + Z_TYPE_P(p) = IS_ARRAY; + + if (!inline_change) { + zval *tmp; + HashTable *tmp_ht = NULL; + + ALLOC_HASHTABLE(tmp_ht); + zend_hash_init(tmp_ht, zend_hash_num_elements(Z_ARRVAL_P(p)), NULL, ZVAL_PTR_DTOR, 0); + zend_hash_copy(tmp_ht, Z_ARRVAL_P(p), (copy_ctor_func_t) zval_deep_copy, (void *) &tmp, sizeof(zval *)); + Z_ARRVAL_P(p) = tmp_ht; } - Z_TYPE_PP(element) &= ~IS_CONSTANT_INDEX; - if (zend_hash_get_current_key_ex(Z_ARRVAL_P(p), &str_index, &str_index_len, &num_index, 0, NULL) != HASH_KEY_IS_STRING) { - zend_hash_move_forward(Z_ARRVAL_P(p)); - continue; - } - if (!zend_get_constant_ex(str_index, str_index_len - 3, &const_value, scope, str_index[str_index_len - 2] TSRMLS_CC)) { - char *actual; - const char *save = str_index; - if ((colon = (char*)zend_memrchr(str_index, ':', str_index_len - 3))) { - zend_error(E_ERROR, "Undefined class constant '%s'", str_index); - str_index_len -= ((colon - str_index) + 1); - str_index = colon; - } else { - if (str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) { - if ((actual = (char *)zend_memrchr(str_index, '\\', str_index_len - 3))) { - actual++; - str_index_len -= (actual - str_index); - str_index = actual; + + /* First go over the array and see if there are any constant indices */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); + while (zend_hash_get_current_data(Z_ARRVAL_P(p), (void **) &element) == SUCCESS) { + if (!(Z_TYPE_PP(element) & IS_CONSTANT_INDEX)) { + zend_hash_move_forward(Z_ARRVAL_P(p)); + continue; + } + Z_TYPE_PP(element) &= ~IS_CONSTANT_INDEX; + if (zend_hash_get_current_key_ex(Z_ARRVAL_P(p), &str_index, &str_index_len, &num_index, 0, NULL) != HASH_KEY_IS_STRING) { + zend_hash_move_forward(Z_ARRVAL_P(p)); + continue; + } + if (str_index[str_index_len - 2] == IS_CONSTANT_AST) { + zend_ast_evaluate(&const_value, *(zend_ast **)str_index); + ZEND_AST_DEL_REF(*(zend_ast **)str_index); + } else if (!zend_get_constant_ex(str_index, str_index_len - 3, &const_value, scope, str_index[str_index_len - 2] TSRMLS_CC)) { + char *actual; + const char *save = str_index; + if ((colon = (char*)zend_memrchr(str_index, ':', str_index_len - 3))) { + zend_error(E_ERROR, "Undefined class constant '%s'", str_index); + str_index_len -= ((colon - str_index) + 1); + str_index = colon; + } else { + if (str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) { + if ((actual = (char *)zend_memrchr(str_index, '\\', str_index_len - 3))) { + actual++; + str_index_len -= (actual - str_index); + str_index = actual; + } } + if (str_index[0] == '\\') { + ++str_index; + --str_index_len; + } + if (save[0] == '\\') { + ++save; + } + if ((str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) == 0) { + zend_error(E_ERROR, "Undefined constant '%s'", save); + } + zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", str_index, str_index); } - if (str_index[0] == '\\') { - ++str_index; - --str_index_len; - } - if (save[0] == '\\') { - ++save; - } - if ((str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) == 0) { - zend_error(E_ERROR, "Undefined constant '%s'", save); - } - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", str_index, str_index); + ZVAL_STRINGL(&const_value, str_index, str_index_len-3, 1); } - ZVAL_STRINGL(&const_value, str_index, str_index_len-3, 1); - } - if (Z_REFCOUNT_PP(element) > 1) { - ALLOC_ZVAL(new_val); - *new_val = **element; - zval_copy_ctor(new_val); - Z_SET_REFCOUNT_P(new_val, 1); - Z_UNSET_ISREF_P(new_val); - - /* preserve this bit for inheritance */ - Z_TYPE_PP(element) |= IS_CONSTANT_INDEX; - zval_ptr_dtor(element); - *element = new_val; - } + if (Z_REFCOUNT_PP(element) > 1) { + ALLOC_ZVAL(new_val); + *new_val = **element; + zval_copy_ctor(new_val); + Z_SET_REFCOUNT_P(new_val, 1); + Z_UNSET_ISREF_P(new_val); + + /* preserve this bit for inheritance */ + Z_TYPE_PP(element) |= IS_CONSTANT_INDEX; + zval_ptr_dtor(element); + *element = new_val; + } - switch (Z_TYPE(const_value)) { - case IS_STRING: - ret = zend_symtable_update_current_key(Z_ARRVAL_P(p), Z_STRVAL(const_value), Z_STRLEN(const_value) + 1, HASH_UPDATE_KEY_IF_BEFORE); - break; - case IS_BOOL: - case IS_LONG: - ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, Z_LVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL); - break; - case IS_DOUBLE: - ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, zend_dval_to_lval(Z_DVAL(const_value)), HASH_UPDATE_KEY_IF_BEFORE, NULL); - break; - case IS_NULL: - ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_STRING, "", 1, 0, HASH_UPDATE_KEY_IF_BEFORE, NULL); - break; - default: - ret = SUCCESS; - break; - } - if (ret == SUCCESS) { - zend_hash_move_forward(Z_ARRVAL_P(p)); + switch (Z_TYPE(const_value)) { + case IS_STRING: + ret = zend_symtable_update_current_key(Z_ARRVAL_P(p), Z_STRVAL(const_value), Z_STRLEN(const_value) + 1, HASH_UPDATE_KEY_IF_BEFORE); + break; + case IS_BOOL: + case IS_LONG: + ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, Z_LVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL); + break; + case IS_DOUBLE: + ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, zend_dval_to_lval(Z_DVAL(const_value)), HASH_UPDATE_KEY_IF_BEFORE, NULL); + break; + case IS_NULL: + ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_STRING, "", 1, 0, HASH_UPDATE_KEY_IF_BEFORE, NULL); + break; + default: + ret = SUCCESS; + break; + } + if (ret == SUCCESS) { + zend_hash_move_forward(Z_ARRVAL_P(p)); + } + zval_dtor(&const_value); } - zval_dtor(&const_value); + zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant_inline_change, (void *) scope TSRMLS_CC); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); + } + break; + + case IS_CONSTANT_AST: { + zend_ast *ast = Z_AST_P(p); + + MARK_CONSTANT_VISITED(p); + + zend_ast_evaluate(p, ast TSRMLS_CC); + ZEND_AST_DEL_REF(ast); } - zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant_inline_change, (void *) scope TSRMLS_CC); - zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); } return 0; } diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index f76b77b555274..517ae56e41e9b 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -947,24 +947,46 @@ common_scalar: | T_START_HEREDOC T_END_HEREDOC { ZVAL_EMPTY_STRING(&$$.u.constant); INIT_PZVAL(&$$.u.constant); $$.op_type = IS_CONST; } ; +static_class_constant: + class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_CT, 0 TSRMLS_CC); } +; static_scalar: /* compile-time evaluated scalars */ - common_scalar { $$ = $1; } + static_scalar_value { $$ = $1; } +; + +static_scalar_value: + common_scalar { $$ = $1; } | static_class_name_scalar { $$ = $1; } | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); } | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); } | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); } - | '+' static_scalar { ZVAL_LONG(&$1.u.constant, 0); add_function(&$2.u.constant, &$1.u.constant, &$2.u.constant TSRMLS_CC); $$ = $2; } - | '-' static_scalar { ZVAL_LONG(&$1.u.constant, 0); sub_function(&$2.u.constant, &$1.u.constant, &$2.u.constant TSRMLS_CC); $$ = $2; } | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } | static_class_constant { $$ = $1; } | T_CLASS_C { $$ = $1; } + | static_operation { $$ = $1; } +; + +static_operation: + static_scalar_value '+' static_scalar_value { zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '-' static_scalar_value { zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '*' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mul_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '/' static_scalar_value { zend_ast_add_binary(&$$.u.constant, div_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '%' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mod_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | '!' static_scalar_value { zend_ast_add_unary(&$$.u.constant, boolean_not_function, &$2.u.constant TSRMLS_CC); } + | '~' static_scalar_value { zend_ast_add_unary(&$$.u.constant, bitwise_not_function, &$2.u.constant TSRMLS_CC); } + | static_scalar_value '|' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '&' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '^' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_xor_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_SL static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_left_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_SR static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_right_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '.' static_scalar_value { zend_ast_add_binary(&$$.u.constant, concat_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | '+' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } + | '-' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } + | '(' static_scalar_value ')' { $$ = $2; } ; -static_class_constant: - class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_CT, 0 TSRMLS_CC); } -; scalar: T_STRING_VARNAME { $$ = $1; } diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 15ad79e4dbfc5..ce21af3d2e755 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -443,6 +443,7 @@ END_EXTERN_C() #define Z_STRVAL(zval) (zval).value.str.val #define Z_STRLEN(zval) (zval).value.str.len #define Z_ARRVAL(zval) (zval).value.ht +#define Z_AST(zval) (zval).value.ast #define Z_OBJVAL(zval) (zval).value.obj #define Z_OBJ_HANDLE(zval) Z_OBJVAL(zval).handle #define Z_OBJ_HT(zval) Z_OBJVAL(zval).handlers @@ -458,6 +459,7 @@ END_EXTERN_C() #define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p) #define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) #define Z_ARRVAL_P(zval_p) Z_ARRVAL(*zval_p) +#define Z_AST_P(zval_p) Z_AST(*zval_p) #define Z_OBJPROP_P(zval_p) Z_OBJPROP(*zval_p) #define Z_OBJCE_P(zval_p) Z_OBJCE(*zval_p) #define Z_RESVAL_P(zval_p) Z_RESVAL(*zval_p) @@ -473,6 +475,7 @@ END_EXTERN_C() #define Z_STRVAL_PP(zval_pp) Z_STRVAL(**zval_pp) #define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) #define Z_ARRVAL_PP(zval_pp) Z_ARRVAL(**zval_pp) +#define Z_AST_PP(zval_p) Z_AST(**zval_p) #define Z_OBJPROP_PP(zval_pp) Z_OBJPROP(**zval_pp) #define Z_OBJCE_PP(zval_pp) Z_OBJCE(**zval_pp) #define Z_RESVAL_PP(zval_pp) Z_RESVAL(**zval_pp) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index d82e1642e78b0..095c16ca9142a 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -22,6 +22,7 @@ #include #include "zend.h" #include "zend_API.h" +#include "zend_ast.h" #include "zend_globals.h" #include "zend_constants.h" #include "zend_list.h" @@ -47,6 +48,9 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) } } break; + case IS_CONSTANT_AST: + ZEND_AST_DEL_REF(Z_AST_P(zvalue)); + break; case IS_OBJECT: { TSRMLS_FETCH(); @@ -81,6 +85,9 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) CHECK_ZVAL_STRING_REL(zvalue); str_free(zvalue->value.str.val); break; + case IS_CONSTANT_AST: + ZEND_AST_DEL_REF(Z_AST_P(zvalue)); + break; case IS_ARRAY: case IS_CONSTANT_ARRAY: case IS_OBJECT: @@ -139,6 +146,9 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) zvalue->value.ht = tmp_ht; } break; + case IS_CONSTANT_AST: + ZEND_AST_ADD_REF(Z_AST_P(zvalue)); + break; case IS_OBJECT: { TSRMLS_FETCH(); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 572aac5a20706..4ee5a99c7b953 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3252,12 +3252,16 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST) if (param == NULL) { ALLOC_ZVAL(assignment_value); *assignment_value = *opline->op2.zv; - if ((Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || - Z_TYPE_P(assignment_value)==IS_CONSTANT_ARRAY) { - Z_SET_REFCOUNT_P(assignment_value, 1); - zval_update_constant(&assignment_value, 0 TSRMLS_CC); - } else { - zval_copy_ctor(assignment_value); + switch (Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: + Z_SET_REFCOUNT_P(assignment_value, 1); + zval_update_constant(&assignment_value, 0 TSRMLS_CC); + break; + default: + zval_copy_ctor(assignment_value); + break; } INIT_PZVAL(assignment_value); } else { @@ -3580,13 +3584,16 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zend_class_entry *old_scope = EG(scope); - - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; + switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zend_class_entry *old_scope = EG(scope); + + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; + } } if (OP1_TYPE == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); @@ -5187,20 +5194,27 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST) name = GET_OP1_ZVAL_PTR(BP_VAR_R); val = GET_OP2_ZVAL_PTR(BP_VAR_R); - if ((Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { - zval tmp; - zval *tmp_ptr = &tmp; + switch (Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zval tmp; + zval *tmp_ptr = &tmp; - ZVAL_COPY_VALUE(&tmp, val); - if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { - zval_copy_ctor(&tmp); + ZVAL_COPY_VALUE(&tmp, val); + if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { + zval_copy_ctor(&tmp); + } + INIT_PZVAL(&tmp); + zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); + c.value = *tmp_ptr; } - INIT_PZVAL(&tmp); - zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); - c.value = *tmp_ptr; - } else { - INIT_PZVAL_COPY(&c.value, val); - zval_copy_ctor(&c.value); + break; + + default: + INIT_PZVAL_COPY(&c.value, val); + zval_copy_ctor(&c.value); + break; } c.flags = CONST_CS; /* non persistent, case sensetive */ c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 869bb199b2320..a90f187fef215 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1435,12 +1435,16 @@ static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ if (param == NULL) { ALLOC_ZVAL(assignment_value); *assignment_value = *opline->op2.zv; - if ((Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || - Z_TYPE_P(assignment_value)==IS_CONSTANT_ARRAY) { - Z_SET_REFCOUNT_P(assignment_value, 1); - zval_update_constant(&assignment_value, 0 TSRMLS_CC); - } else { - zval_copy_ctor(assignment_value); + switch (Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: + Z_SET_REFCOUNT_P(assignment_value, 1); + zval_update_constant(&assignment_value, 0 TSRMLS_CC); + break; + default: + zval_copy_ctor(assignment_value); + break; } INIT_PZVAL(assignment_value); } else { @@ -3792,13 +3796,16 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCO } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zend_class_entry *old_scope = EG(scope); + switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zend_class_entry *old_scope = EG(scope); - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; + } } if (IS_CONST == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); @@ -4089,20 +4096,27 @@ static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCOD name = opline->op1.zv; val = opline->op2.zv; - if ((Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { - zval tmp; - zval *tmp_ptr = &tmp; + switch (Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zval tmp; + zval *tmp_ptr = &tmp; - ZVAL_COPY_VALUE(&tmp, val); - if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { - zval_copy_ctor(&tmp); + ZVAL_COPY_VALUE(&tmp, val); + if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { + zval_copy_ctor(&tmp); + } + INIT_PZVAL(&tmp); + zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); + c.value = *tmp_ptr; } - INIT_PZVAL(&tmp); - zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); - c.value = *tmp_ptr; - } else { - INIT_PZVAL_COPY(&c.value, val); - zval_copy_ctor(&c.value); + break; + + default: + INIT_PZVAL_COPY(&c.value, val); + zval_copy_ctor(&c.value); + break; } c.flags = CONST_CS; /* non persistent, case sensetive */ c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); @@ -15635,13 +15649,16 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zend_class_entry *old_scope = EG(scope); + switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zend_class_entry *old_scope = EG(scope); - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; + } } if (IS_VAR == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); @@ -25171,13 +25188,16 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPC } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zend_class_entry *old_scope = EG(scope); + switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: { + zend_class_entry *old_scope = EG(scope); - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; + } } if (IS_UNUSED == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); diff --git a/configure.in b/configure.in index 16738fe30ab67..97fd68ec3a289 100644 --- a/configure.in +++ b/configure.in @@ -1475,7 +1475,9 @@ PHP_ADD_SOURCES(Zend, \ zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \ zend_ini.c zend_qsort.c zend_multibyte.c zend_ts_hash.c zend_stream.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \ - zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c) + zend_closures.c zend_float.c zend_string.c zend_signal.c \ + zend_generators.c \ + zend_ast.c) if test -r "$abs_srcdir/Zend/zend_objects.c"; then PHP_ADD_SOURCES(Zend, zend_objects.c zend_object_handlers.c zend_objects_API.c zend_default_classes.c) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index cc148b39c5663..abebc216c3328 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2599,9 +2599,14 @@ ZEND_METHOD(reflection_parameter, getDefaultValue) *return_value = *precv->op2.zv; INIT_PZVAL(return_value); - if ((Z_TYPE_P(return_value) & IS_CONSTANT_TYPE_MASK) != IS_CONSTANT - && (Z_TYPE_P(return_value) & IS_CONSTANT_TYPE_MASK) != IS_CONSTANT_ARRAY) { - zval_copy_ctor(return_value); + switch (Z_TYPE_P(return_value) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: + break; + + default: + zval_copy_ctor(return_value); } zval_update_constant_ex(&return_value, (void*)0, param->fptr->common.scope TSRMLS_CC); } @@ -3414,8 +3419,11 @@ static void add_class_vars(zend_class_entry *ce, int statics, zval *return_value /* this is necessary to make it able to work with default array * properties, returned to user */ - if (Z_TYPE_P(prop_copy) == IS_CONSTANT_ARRAY || (Z_TYPE_P(prop_copy) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zval_update_constant(&prop_copy, (void *) 1 TSRMLS_CC); + switch (Z_TYPE_P(prop_copy) & IS_CONSTANT_TYPE_MASK) { + case IS_CONSTANT: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: + zval_update_constant(&prop_copy, (void *) 1 TSRMLS_CC); } add_assoc_zval(return_value, key, prop_copy); diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 3401205c8fc1e..d9bbc7e7940cd 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -364,7 +364,9 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \ zend_stream.c zend_iterators.c zend_interfaces.c zend_objects.c \ zend_object_handlers.c zend_objects_API.c \ zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c \ - zend_float.c zend_string.c zend_generators.c"); + zend_float.c zend_string.c \ + zend_generators.c \ + zend_ast.c"); if (VCVERS == 1200) { AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1); From b4bed6fde09d1737fc118253d2cba03ff10fcaff Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 31 Oct 2013 03:06:35 -0700 Subject: [PATCH 0250/1256] Fix bug #66008 --- sapi/fpm/fpm/fpm_sockets.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 145b2550c3bad..e056565ea4119 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -487,6 +487,7 @@ int fpm_socket_unix_test_connect(struct sockaddr_un *sock, size_t socklen) /* {{ } if (connect(fd, (struct sockaddr *)sock, socklen) == -1) { + close(fd); return -1; } From 812dfbc4315d38a4ee6669e8b7de50493a8bb3bd Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 31 Oct 2013 03:18:07 -0700 Subject: [PATCH 0251/1256] Fix bug #66008 --- sapi/fpm/fpm/fpm_sockets.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 145b2550c3bad..e056565ea4119 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -487,6 +487,7 @@ int fpm_socket_unix_test_connect(struct sockaddr_un *sock, size_t socklen) /* {{ } if (connect(fd, (struct sockaddr *)sock, socklen) == -1) { + close(fd); return -1; } From 7cd5ae6fabd5763c1ea35150b0451e14bd1c9b00 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Thu, 31 Oct 2013 15:04:33 +0400 Subject: [PATCH 0252/1256] add news entry about FPM backlog change and move the other entry to its proper place --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 2c784b8fbbcec..0c8a15a5f9175 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,10 @@ PHP NEWS (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) + . Fixed bug #65936 (dangling context pointer causes crash). (Tony) + +- FPM: + . Changed default listen() backlog to 65535. (Tony) - OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) @@ -30,7 +34,6 @@ PHP NEWS . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) . Fixed bug #65821 (By-ref foreach on property access of string offset segfaults). (Nikita) - . Fixed bug #65936 (dangling context pointer causes crash). (Tony) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as From 4d430ecb02447f3a94571216b800dfef0e48b400 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 31 Oct 2013 17:39:17 +0100 Subject: [PATCH 0253/1256] simplify the state free macros --- Zend/zend_virtual_cwd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index f281606f9d5e4..4478cd380932e 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -153,8 +153,7 @@ static int php_check_dots(const char *element, int n) memcpy((d)->cwd, (s)->cwd, (s)->cwd_length+1); #define CWD_STATE_FREE(s) \ - efree((s)->cwd); \ - (s)->cwd = NULL; + efree((s)->cwd); #ifdef TSRM_WIN32 # define CWD_STATE_FREE_ERR(state) do { \ @@ -514,6 +513,7 @@ CWD_API int virtual_cwd_deactivate(TSRMLS_D) /* {{{ */ { if (CWDG(cwd).cwd != NULL) { CWD_STATE_FREE(&CWDG(cwd)); + CWDG(cwd).cwd = NULL; } return 0; } From 466c5dd1fe194ab3d1634695e2dc96240f951f50 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 31 Oct 2013 18:21:37 +0100 Subject: [PATCH 0254/1256] Fixed mem leaks, added tests and ternary operator --- Zend/tests/class_properties_dynamic.phpt | 13 +++++ Zend/tests/class_properties_static.phpt | 20 +++++++ Zend/tests/constant_expressions.phpt | 49 ++++++++++++++++ Zend/tests/constant_expressions_dynamic.phpt | 11 ++++ Zend/tests/function_arguments_003.phpt | 17 ++++++ Zend/tests/static_variable.phpt | 29 ++++++++++ Zend/zend_ast.c | 61 ++++++++++++-------- Zend/zend_ast.h | 12 ++-- Zend/zend_execute_API.c | 2 +- Zend/zend_language_parser.y | 2 + Zend/zend_operators.c | 22 +++++++ Zend/zend_operators.h | 2 + 12 files changed, 210 insertions(+), 30 deletions(-) create mode 100644 Zend/tests/class_properties_dynamic.phpt create mode 100644 Zend/tests/class_properties_static.phpt create mode 100644 Zend/tests/constant_expressions.phpt create mode 100644 Zend/tests/constant_expressions_dynamic.phpt create mode 100644 Zend/tests/function_arguments_003.phpt create mode 100644 Zend/tests/static_variable.phpt diff --git a/Zend/tests/class_properties_dynamic.phpt b/Zend/tests/class_properties_dynamic.phpt new file mode 100644 index 0000000000000..8a1fc6f0297bc --- /dev/null +++ b/Zend/tests/class_properties_dynamic.phpt @@ -0,0 +1,13 @@ +--TEST-- +Class Property Expressions +--FILE-- +bar; +?> +--EXPECTF-- +3 diff --git a/Zend/tests/class_properties_static.phpt b/Zend/tests/class_properties_static.phpt new file mode 100644 index 0000000000000..9a56466340c11 --- /dev/null +++ b/Zend/tests/class_properties_static.phpt @@ -0,0 +1,20 @@ +--TEST-- +Static Class Property Expressions +--FILE-- +b1, + $f->b2, + $f->b3 +); +?> +--EXPECT-- +int(2) +int(4) +string(13) "foo bar baz" diff --git a/Zend/tests/constant_expressions.phpt b/Zend/tests/constant_expressions.phpt new file mode 100644 index 0000000000000..441b9a6f2a88c --- /dev/null +++ b/Zend/tests/constant_expressions.phpt @@ -0,0 +1,49 @@ +--TEST-- +Constant Expressions +--FILE-- + +--EXPECT-- +int(2) +float(0.5) +float(3) +string(6) "foobar" +float(6) +string(6) "foo234" +int(8) +string(21) "This is a test string" +int(0) +int(2) +int(7) +int(6) diff --git a/Zend/tests/constant_expressions_dynamic.phpt b/Zend/tests/constant_expressions_dynamic.phpt new file mode 100644 index 0000000000000..21c9216cc1927 --- /dev/null +++ b/Zend/tests/constant_expressions_dynamic.phpt @@ -0,0 +1,11 @@ +--TEST-- +Dynamic Constant Expressions +--FILE-- + +--EXPECTF-- +3 diff --git a/Zend/tests/function_arguments_003.phpt b/Zend/tests/function_arguments_003.phpt new file mode 100644 index 0000000000000..b882476d1d906 --- /dev/null +++ b/Zend/tests/function_arguments_003.phpt @@ -0,0 +1,17 @@ +--TEST-- +Function Argument Parsing #003 +--FILE-- + +--EXPECT-- +int(2) +int(4) +string(6) "foobar" +int(100) diff --git a/Zend/tests/static_variable.phpt b/Zend/tests/static_variable.phpt new file mode 100644 index 0000000000000..ea69a8f86b0d2 --- /dev/null +++ b/Zend/tests/static_variable.phpt @@ -0,0 +1,29 @@ +--TEST-- +Static Variable Expressions +--FILE-- + 1 + 1, baz * 2 => 1 << 2]; + static $c = [1 => bar] + [3 => baz]; + var_dump($a, $b, $c); +} + +foo(); +?> +--EXPECT-- +int(2) +array(2) { + [2]=> + int(2) + [6]=> + int(4) +} +array(2) { + [1]=> + int(2) + [3]=> + int(3) +} diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 705c4df465b3f..7d85e24106117 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -22,7 +22,8 @@ #include "zend_execute.h" #define OP_IS_CONST_THEN(op, do_code) \ - switch (Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK) { \ + switch (op?Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK:-1) { \ + case -1: \ case IS_CONSTANT: \ case IS_CONSTANT_ARRAY: \ case IS_CONSTANT_AST: { \ @@ -31,20 +32,26 @@ } #define OP_IS_NOT_CONST_THEN(op, do_code) \ - switch (Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK) { \ - case IS_CONSTANT: \ - case IS_CONSTANT_ARRAY: \ - case IS_CONSTANT_AST: \ - break; \ + if (op) { \ + switch (Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK) { \ + case IS_CONSTANT: \ + case IS_CONSTANT_ARRAY: \ + case IS_CONSTANT_AST: \ + break; \ \ - default: { \ - do_code \ + default: { \ + do_code \ + } \ } \ } #define COPY_ZVAL_TO_OP(nr) \ - Z_AST_P(result)->ops[nr] = emalloc(sizeof(zval)); \ - *Z_AST_P(result)->ops[nr] = *op##nr; + if (op##nr) { \ + Z_AST_P(result)->ops[nr] = emalloc(sizeof(zval)); \ + *Z_AST_P(result)->ops[nr] = *op##nr; \ + } else { \ + Z_AST_P(result)->ops[nr] = NULL; \ + } void zend_ast_add(zval *result, intermediary_ast_function_type func, char op_count) { zend_ast *ast = emalloc(sizeof(zend_ast)); @@ -58,9 +65,10 @@ void zend_ast_add(zval *result, intermediary_ast_function_type func, char op_cou /* Do operations on constant operators at compile time (AST building time) */ -void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0) { +void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0 TSRMLS_DC) { OP_IS_NOT_CONST_THEN(op0, - func(result, op0); + func(result, op0 TSRMLS_CC); + zval_dtor(op0); return; ) @@ -68,9 +76,11 @@ void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0) { COPY_ZVAL_TO_OP(0) } -void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1) { +void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1 TSRMLS_DC) { OP_IS_NOT_CONST_THEN(op0, OP_IS_NOT_CONST_THEN(op1, - func(result, op0, op1); + func(result, op0, op1 TSRMLS_CC); + zval_dtor(op0); + zval_dtor(op1); return; )) @@ -79,9 +89,12 @@ void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op COPY_ZVAL_TO_OP(1) } -void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2) { +void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2 TSRMLS_DC) { OP_IS_NOT_CONST_THEN(op0, OP_IS_NOT_CONST_THEN(op1, OP_IS_NOT_CONST_THEN(op2, - func(result, op0, op1, op2); + func(result, op0, op1, op2 TSRMLS_CC); + zval_dtor(op0); + zval_dtor(op1); + zval_dtor(op2); return; ))) @@ -95,20 +108,22 @@ void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) { int i; for (i = ast->op_count; i--;) { - OP_IS_CONST_THEN(ast->ops[i], - zval_update_constant_ex(&ast->ops[i], (void *)1, NULL TSRMLS_CC); - ) + if (ast->ops[i]) { + OP_IS_CONST_THEN(ast->ops[i], + zval_update_constant_ex(&ast->ops[i], (void *)1, NULL TSRMLS_CC); + ) + } } switch (ast->op_count) { case 1: - ((unary_ast_func)ast->func)(result, ast->ops[0]); + ((unary_ast_func)ast->func)(result, ast->ops[0] TSRMLS_CC); break; case 2: - ((binary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1]); + ((binary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1] TSRMLS_CC); break; case 3: - ((ternary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1], ast->ops[2]); + ((ternary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1], ast->ops[2] TSRMLS_CC); break; } } @@ -117,7 +132,7 @@ void zend_ast_destroy(zend_ast *ast TSRMLS_DC) { int i; for (i = ast->op_count; i--;) { - if (!Z_DELREF_P(ast->ops[i])) { + if (ast->ops[i] && !Z_DELREF_P(ast->ops[i])) { zval_dtor(ast->ops[i]); efree(ast->ops[i]); } diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 9841c3463e480..218f2c02e051f 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -26,9 +26,9 @@ typedef struct _zend_ast zend_ast; #include "zend.h" typedef void(*intermediary_ast_function_type)(zval *, ...); -typedef int(*unary_ast_func)(zval *result, zval *op0); -typedef int(*binary_ast_func)(zval *result, zval *op0, zval *op1); -typedef int(*ternary_ast_func)(zval *result, zval *op0, zval *op1, zval *op2); +typedef int(*unary_ast_func)(zval *result, zval *op0 TSRMLS_DC); +typedef int(*binary_ast_func)(zval *result, zval *op0, zval *op1 TSRMLS_DC); +typedef int(*ternary_ast_func)(zval *result, zval *op0, zval *op1, zval *op2 TSRMLS_DC); struct _zend_ast { char op_count; @@ -37,9 +37,9 @@ struct _zend_ast { int refcount; }; -void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0); -void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1); -void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2); +void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0 TSRMLS_DC); +void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1 TSRMLS_DC); +void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2 TSRMLS_DC); void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index eabebacce465c..a66cdeea92274 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -599,7 +599,7 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco continue; } if (str_index[str_index_len - 2] == IS_CONSTANT_AST) { - zend_ast_evaluate(&const_value, *(zend_ast **)str_index); + zend_ast_evaluate(&const_value, *(zend_ast **)str_index TSRMLS_CC); ZEND_AST_DEL_REF(*(zend_ast **)str_index); } else if (!zend_get_constant_ex(str_index, str_index_len - 3, &const_value, scope, str_index[str_index_len - 2] TSRMLS_CC)) { char *actual; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 517ae56e41e9b..af00f2ef4a89a 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -982,6 +982,8 @@ static_operation: | static_scalar_value T_SL static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_left_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } | static_scalar_value T_SR static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_right_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } | static_scalar_value '.' static_scalar_value { zend_ast_add_binary(&$$.u.constant, concat_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '?' ':' static_scalar_value { zend_ast_add_ternary(&$$.u.constant, ternary_function, &$1.u.constant, NULL, &$4.u.constant TSRMLS_CC); } + | static_scalar_value '?' static_scalar_value ':' static_scalar_value { zend_ast_add_ternary(&$$.u.constant, ternary_function, &$1.u.constant, &$3.u.constant, &$5.u.constant TSRMLS_CC); } | '+' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } | '-' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } | '(' static_scalar_value ')' { $$ = $2; } diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index e8629291e545a..53a84de155e62 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2323,6 +2323,28 @@ ZEND_API void zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC) /* {{{ */ } /* }}} */ +#define PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(var) \ + *result = *var; \ + if (Z_REFCOUNT_P(var) == 1) { \ + Z_TYPE_P(var) = IS_NULL; \ + } + +ZEND_API int ternary_function(zval *result, zval *condition, zval *then, zval *if_not TSRMLS_DC) /* {{{ */ +{ + if (i_zend_is_true(condition)) { + if (then) { + PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(then); + } else { + PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(condition); + } + } else { + PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(if_not); + } + + return SUCCESS; +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index ce21af3d2e755..79ede573205e8 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -376,6 +376,8 @@ ZEND_API int zend_atoi(const char *str, int str_len); ZEND_API long zend_atol(const char *str, int str_len); ZEND_API void zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC); + +ZEND_API int ternary_function(zval *result, zval *condition, zval *then, zval *if_not TSRMLS_DC); END_EXTERN_C() #define convert_to_ex_master(ppzv, lower_type, upper_type) \ From b56c1ca95e16ea1c2a3ce251b91297d0a81a9070 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 31 Oct 2013 19:05:29 +0100 Subject: [PATCH 0255/1256] Fatal error about self referencing constants fixed --- Zend/zend_execute_API.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index a66cdeea92274..e5b68c7de1e10 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -675,8 +675,6 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco case IS_CONSTANT_AST: { zend_ast *ast = Z_AST_P(p); - MARK_CONSTANT_VISITED(p); - zend_ast_evaluate(p, ast TSRMLS_CC); ZEND_AST_DEL_REF(ast); } From f1c2f8f9f17c063ac26aa5e3d0240bc6e0d07c39 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 31 Oct 2013 21:38:24 +0100 Subject: [PATCH 0256/1256] removed unnecessary call --- Zend/zend_virtual_cwd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 4478cd380932e..d9da5cf4c0c8e 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -434,7 +434,6 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ cwd_g->realpath_cache_size_limit = REALPATH_CACHE_SIZE; cwd_g->realpath_cache_ttl = REALPATH_CACHE_TTL; memset(cwd_g->realpath_cache, 0, sizeof(cwd_g->realpath_cache)); - virtual_cwd_activate(TSRMLS_C); } /* }}} */ From 39e7dcc3bbaa60a5e5cf15af1fed9a31bfb21b4f Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 31 Oct 2013 21:42:55 +0100 Subject: [PATCH 0257/1256] back to do_alloca() --- main/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main/main.c b/main/main.c index bd5e91b230323..f2bf878426cb0 100644 --- a/main/main.c +++ b/main/main.c @@ -2500,7 +2500,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) if (old_cwd[0] != '\0') { php_ignore_value(VCWD_CHDIR(old_cwd)); } - do_alloca(old_cwd, use_heap); + free_alloca(old_cwd, use_heap); #endif return retval; } @@ -2511,10 +2511,11 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC) { char *old_cwd; + ALLOCA_FLAG(use_heap) EG(exit_status) = 0; #define OLD_CWD_SIZE 4096 - old_cwd = emalloc(OLD_CWD_SIZE); + old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); old_cwd[0] = '\0'; zend_try { @@ -2537,7 +2538,7 @@ PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret php_ignore_value(VCWD_CHDIR(old_cwd)); } - efree(old_cwd); + free_alloca(old_cwd, use_heap); return EG(exit_status); } /* }}} */ From 55ee543e2f73c45c8fa2c51ebef9820a610f70b4 Mon Sep 17 00:00:00 2001 From: Martin Hujer Date: Thu, 31 Oct 2013 22:59:42 +0200 Subject: [PATCH 0258/1256] Typo fix: umknown -> unknown --- ext/mysqlnd/mysqlnd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index b41e5424f590e..169577ff97997 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -557,7 +557,7 @@ mysqlnd_run_authentication( if (!auth_plugin) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol); - SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method umknown to the client"); + SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client"); goto end; } DBG_INF("plugin found"); From d3fd163d2734a3b615eb76ca593b79590b3fd4ae Mon Sep 17 00:00:00 2001 From: Lior Kaplan Date: Thu, 31 Oct 2013 23:12:41 +0200 Subject: [PATCH 0259/1256] Typo fix: umknown -> unknown --- ext/mysqlnd/mysqlnd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 843e52d389adc..6eb34e40922b6 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -527,7 +527,7 @@ mysqlnd_connect_run_authentication( if (!auth_plugin) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol); - SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method umknown to the client"); + SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client"); break; } } @@ -2162,7 +2162,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn, if (!auth_plugin) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol); - SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method umknown to the client"); + SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client"); break; } } From 6aedfac7f765d2376b5c9febbb03962c98656f8e Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 1 Nov 2013 00:56:22 +0100 Subject: [PATCH 0260/1256] virtual_cwd_activate() should be called only in one place --- Zend/zend.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend.c b/Zend/zend.c index b98d264a3c050..b86eca477c74a 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -921,7 +921,6 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { - virtual_cwd_activate(TSRMLS_C); gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); From 9df78bf9fd18d82c6c5b4ce288d6d920a3a20676 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 1 Nov 2013 01:20:57 +0100 Subject: [PATCH 0261/1256] reverted the previous commit, both calls are needed in TS mode --- Zend/zend.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend.c b/Zend/zend.c index b86eca477c74a..b98d264a3c050 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -921,6 +921,7 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { + virtual_cwd_activate(TSRMLS_C); gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); From b45043a1b71c29a0c7b8de9e4929dde08bd61216 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 1 Nov 2013 16:16:58 +0100 Subject: [PATCH 0262/1256] converted several switches to ifs and made more opcache friendly --- Zend/zend.h | 2 + Zend/zend_API.c | 56 ++++++++++----------- Zend/zend_ast.c | 79 ++++++++++++----------------- Zend/zend_builtin_functions.c | 7 +-- Zend/zend_compile.c | 4 +- Zend/zend_execute_API.c | 7 ++- Zend/zend_vm_def.h | 63 +++++++++-------------- Zend/zend_vm_execute.h | 89 ++++++++++++--------------------- ext/reflection/php_reflection.c | 17 ++----- 9 files changed, 128 insertions(+), 196 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index 7ccd0814e0f5b..8154277cf1b8f 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -600,6 +600,8 @@ typedef int (*zend_write_func_t)(const char *str, uint str_length); #define IS_LEXICAL_REF 0x040 #define IS_CONSTANT_IN_NAMESPACE 0x100 +#define IS_CONSTANT_TYPE(type) (((type) & IS_CONSTANT_TYPE_MASK) >= IS_CONSTANT && ((type) & IS_CONSTANT_TYPE_MASK) <= IS_CONSTANT_AST) + /* overloaded elements data types */ #define OE_IS_ARRAY (1<<0) #define OE_IS_OBJECT (1<<1) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 3051d19729751..b414b52ecdcf7 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1053,37 +1053,33 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destro static int zval_update_class_constant(zval **pp, int is_static, int offset TSRMLS_DC) /* {{{ */ { - switch (Z_TYPE_PP(pp) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry); - - if ((*scope)->parent) { - zend_class_entry *ce = *scope; - HashPosition pos; - zend_property_info *prop_info; - - do { - for (zend_hash_internal_pointer_reset_ex(&ce->properties_info, &pos); - zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop_info, &pos) == SUCCESS; - zend_hash_move_forward_ex(&ce->properties_info, &pos)) { - if (is_static == ((prop_info->flags & ZEND_ACC_STATIC) != 0) && - offset == prop_info->offset) { - int ret; - zend_class_entry *old_scope = *scope; - *scope = prop_info->ce; - ret = zval_update_constant(pp, (void*)1 TSRMLS_CC); - *scope = old_scope; - return ret; - } - } - ce = ce->parent; - } while (ce); - + if (IS_CONSTANT_TYPE(Z_TYPE_PP(pp))) { + zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry); + + if ((*scope)->parent) { + zend_class_entry *ce = *scope; + HashPosition pos; + zend_property_info *prop_info; + + do { + for (zend_hash_internal_pointer_reset_ex(&ce->properties_info, &pos); + zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop_info, &pos) == SUCCESS; + zend_hash_move_forward_ex(&ce->properties_info, &pos)) { + if (is_static == ((prop_info->flags & ZEND_ACC_STATIC) != 0) && + offset == prop_info->offset) { + int ret; + zend_class_entry *old_scope = *scope; + *scope = prop_info->ce; + ret = zval_update_constant(pp, (void*)1 TSRMLS_CC); + *scope = old_scope; + return ret; + } + } + ce = ce->parent; + } while (ce); + } - return zval_update_constant(pp, (void*)1 TSRMLS_CC); - } + return zval_update_constant(pp, (void*)1 TSRMLS_CC); } return 0; } diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 7d85e24106117..21c08da51018b 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -21,30 +21,6 @@ #include "zend_ast.h" #include "zend_execute.h" -#define OP_IS_CONST_THEN(op, do_code) \ - switch (op?Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK:-1) { \ - case -1: \ - case IS_CONSTANT: \ - case IS_CONSTANT_ARRAY: \ - case IS_CONSTANT_AST: { \ - do_code \ - } \ - } - -#define OP_IS_NOT_CONST_THEN(op, do_code) \ - if (op) { \ - switch (Z_TYPE_P(op) & IS_CONSTANT_TYPE_MASK) { \ - case IS_CONSTANT: \ - case IS_CONSTANT_ARRAY: \ - case IS_CONSTANT_AST: \ - break; \ -\ - default: { \ - do_code \ - } \ - } \ - } - #define COPY_ZVAL_TO_OP(nr) \ if (op##nr) { \ Z_AST_P(result)->ops[nr] = emalloc(sizeof(zval)); \ @@ -54,9 +30,9 @@ } void zend_ast_add(zval *result, intermediary_ast_function_type func, char op_count) { - zend_ast *ast = emalloc(sizeof(zend_ast)); + zend_ast *ast = emalloc(sizeof(zend_ast) + op_count * sizeof(zval *)); ast->op_count = op_count; - ast->ops = emalloc(op_count * sizeof(zval *)); + ast->ops = (zval **)(ast + 1); ast->refcount = 1; ast->func = func; Z_AST_P(result) = ast; @@ -66,23 +42,23 @@ void zend_ast_add(zval *result, intermediary_ast_function_type func, char op_cou /* Do operations on constant operators at compile time (AST building time) */ void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0 TSRMLS_DC) { - OP_IS_NOT_CONST_THEN(op0, + if (!op0 || !IS_CONSTANT_TYPE(Z_TYPE_P(op0))) { func(result, op0 TSRMLS_CC); - zval_dtor(op0); + if (op0) zval_dtor(op0); return; - ) + } zend_ast_add(result, (intermediary_ast_function_type)func, 1); COPY_ZVAL_TO_OP(0) } void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1 TSRMLS_DC) { - OP_IS_NOT_CONST_THEN(op0, OP_IS_NOT_CONST_THEN(op1, + if ((!op0 || !IS_CONSTANT_TYPE(Z_TYPE_P(op0))) && (!op1 || !IS_CONSTANT_TYPE(Z_TYPE_P(op1)))) { func(result, op0, op1 TSRMLS_CC); - zval_dtor(op0); - zval_dtor(op1); + if (op0) zval_dtor(op0); + if (op1) zval_dtor(op1); return; - )) + } zend_ast_add(result, (intermediary_ast_function_type)func, 2); COPY_ZVAL_TO_OP(0) @@ -90,13 +66,13 @@ void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op } void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2 TSRMLS_DC) { - OP_IS_NOT_CONST_THEN(op0, OP_IS_NOT_CONST_THEN(op1, OP_IS_NOT_CONST_THEN(op2, + if ((!op0 || !IS_CONSTANT_TYPE(Z_TYPE_P(op0))) && (!op1 || !IS_CONSTANT_TYPE(Z_TYPE_P(op1))) && (!op2 || !IS_CONSTANT_TYPE(Z_TYPE_P(op2)))) { func(result, op0, op1, op2 TSRMLS_CC); - zval_dtor(op0); - zval_dtor(op1); - zval_dtor(op2); + if (op0) zval_dtor(op0); + if (op1) zval_dtor(op1); + if (op2) zval_dtor(op2); return; - ))) + } zend_ast_add(result, (intermediary_ast_function_type)func, 3); COPY_ZVAL_TO_OP(0) @@ -106,26 +82,38 @@ void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval * void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) { int i; + zval **ops = emalloc((sizeof(zval *) + sizeof(zval)) * ast->op_count); for (i = ast->op_count; i--;) { - if (ast->ops[i]) { - OP_IS_CONST_THEN(ast->ops[i], - zval_update_constant_ex(&ast->ops[i], (void *)1, NULL TSRMLS_CC); - ) + if (ast->ops[i] && IS_CONSTANT_TYPE(Z_TYPE_P(ast->ops[i]))) { + ops[i] = ((zval *)(ops + ast->op_count)) + i; + *ops[i] = *ast->ops[i]; + zval_copy_ctor(ops[i]); + zval_update_constant_ex(&ops[i], (void *)1, NULL TSRMLS_CC); + } else { + ops[i] = ast->ops[i]; } } switch (ast->op_count) { case 1: - ((unary_ast_func)ast->func)(result, ast->ops[0] TSRMLS_CC); + ((unary_ast_func)ast->func)(result, ops[0] TSRMLS_CC); break; case 2: - ((binary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1] TSRMLS_CC); + ((binary_ast_func)ast->func)(result, ops[0], ops[1] TSRMLS_CC); break; case 3: - ((ternary_ast_func)ast->func)(result, ast->ops[0], ast->ops[1], ast->ops[2] TSRMLS_CC); + ((ternary_ast_func)ast->func)(result, ops[0], ops[1], ops[2] TSRMLS_CC); break; } + + for (i = ast->op_count; i--;) { + if (ast->ops[i] != ops[i]) { + zval_dtor(ops[i]); + } + } + + efree(ops); } void zend_ast_destroy(zend_ast *ast TSRMLS_DC) { @@ -138,6 +126,5 @@ void zend_ast_destroy(zend_ast *ast TSRMLS_DC) { } } - efree(ast->ops); efree(ast); } diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index b3b7529d9ba13..049864c54a67e 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -946,11 +946,8 @@ static void add_class_vars(zend_class_entry *ce, int statics, zval *return_value /* this is necessary to make it able to work with default array * properties, returned to user */ - switch (Z_TYPE_P(prop_copy) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: - zval_update_constant(&prop_copy, 0 TSRMLS_CC); + switch (IS_CONSTANT_TYPE(Z_TYPE_P(prop_copy))) { + zval_update_constant(&prop_copy, 0 TSRMLS_CC); } add_assoc_zval(return_value, key, prop_copy); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f3bf5be3806c2..c51d17320e1b5 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5529,9 +5529,7 @@ static zend_constant* zend_get_ct_const(const zval *const_name, int all_internal if (all_internal_constants_substitution && (c->flags & CONST_PERSISTENT) && !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION) && - Z_TYPE(c->value) != IS_CONSTANT && - Z_TYPE(c->value) != IS_CONSTANT_ARRAY && - Z_TYPE(c->value) != IS_CONSTANT_AST) { + !IS_CONSTANT_TYPE(Z_TYPE(c->value))) { return c; } return NULL; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e5b68c7de1e10..12047f0518d55 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -520,8 +520,7 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco } if (actual[0] == '\\') { if (inline_change) { - memmove(Z_STRVAL_P(p), Z_STRVAL_P(p)+1, Z_STRLEN_P(p)); - --Z_STRLEN_P(p); + memmove(Z_STRVAL_P(p), Z_STRVAL_P(p)+1, Z_STRLEN_P(p)--); } else { ++actual; } @@ -626,7 +625,7 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco if ((str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) == 0) { zend_error(E_ERROR, "Undefined constant '%s'", save); } - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", str_index, str_index); + zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", str_index, str_index); } ZVAL_STRINGL(&const_value, str_index, str_index_len-3, 1); } @@ -640,7 +639,7 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco /* preserve this bit for inheritance */ Z_TYPE_PP(element) |= IS_CONSTANT_INDEX; - zval_ptr_dtor(element); + zval_ptr_dtor(element); *element = new_val; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4ee5a99c7b953..006f2ec729893 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3252,16 +3252,11 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST) if (param == NULL) { ALLOC_ZVAL(assignment_value); *assignment_value = *opline->op2.zv; - switch (Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: - Z_SET_REFCOUNT_P(assignment_value, 1); - zval_update_constant(&assignment_value, 0 TSRMLS_CC); - break; - default: - zval_copy_ctor(assignment_value); - break; + if (IS_CONSTANT_TYPE(Z_TYPE_P(assignment_value))) { + Z_SET_REFCOUNT_P(assignment_value, 1); + zval_update_constant(&assignment_value, 0 TSRMLS_CC); + } else { + zval_copy_ctor(assignment_value); } INIT_PZVAL(assignment_value); } else { @@ -3584,16 +3579,12 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zend_class_entry *old_scope = EG(scope); - - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; - } + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { + zend_class_entry *old_scope = EG(scope); + + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; } if (OP1_TYPE == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); @@ -5194,28 +5185,22 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST) name = GET_OP1_ZVAL_PTR(BP_VAR_R); val = GET_OP2_ZVAL_PTR(BP_VAR_R); - switch (Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zval tmp; - zval *tmp_ptr = &tmp; + if (IS_CONSTANT_TYPE(Z_TYPE_P(val))) { + zval tmp; + zval *tmp_ptr = &tmp; - ZVAL_COPY_VALUE(&tmp, val); - if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { - zval_copy_ctor(&tmp); - } - INIT_PZVAL(&tmp); - zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); - c.value = *tmp_ptr; + ZVAL_COPY_VALUE(&tmp, val); + if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { + zval_copy_ctor(&tmp); } - break; - - default: - INIT_PZVAL_COPY(&c.value, val); - zval_copy_ctor(&c.value); - break; + INIT_PZVAL(&tmp); + zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); + c.value = *tmp_ptr; + } else { + INIT_PZVAL_COPY(&c.value, val); + zval_copy_ctor(&c.value); } + c.flags = CONST_CS; /* non persistent, case sensetive */ c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); c.name_len = Z_STRLEN_P(name)+1; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a90f187fef215..d99bcd113ffaa 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1435,16 +1435,11 @@ static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ if (param == NULL) { ALLOC_ZVAL(assignment_value); *assignment_value = *opline->op2.zv; - switch (Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: - Z_SET_REFCOUNT_P(assignment_value, 1); - zval_update_constant(&assignment_value, 0 TSRMLS_CC); - break; - default: - zval_copy_ctor(assignment_value); - break; + if (IS_CONSTANT_TYPE(Z_TYPE_P(assignment_value))) { + Z_SET_REFCOUNT_P(assignment_value, 1); + zval_update_constant(&assignment_value, 0 TSRMLS_CC); + } else { + zval_copy_ctor(assignment_value); } INIT_PZVAL(assignment_value); } else { @@ -3796,16 +3791,12 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCO } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zend_class_entry *old_scope = EG(scope); + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { + zend_class_entry *old_scope = EG(scope); - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; - } + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; } if (IS_CONST == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); @@ -4096,28 +4087,22 @@ static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCOD name = opline->op1.zv; val = opline->op2.zv; - switch (Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zval tmp; - zval *tmp_ptr = &tmp; + if (IS_CONSTANT_TYPE(Z_TYPE_P(val))) { + zval tmp; + zval *tmp_ptr = &tmp; - ZVAL_COPY_VALUE(&tmp, val); - if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { - zval_copy_ctor(&tmp); - } - INIT_PZVAL(&tmp); - zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); - c.value = *tmp_ptr; + ZVAL_COPY_VALUE(&tmp, val); + if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) { + zval_copy_ctor(&tmp); } - break; - - default: - INIT_PZVAL_COPY(&c.value, val); - zval_copy_ctor(&c.value); - break; + INIT_PZVAL(&tmp); + zval_update_constant(&tmp_ptr, NULL TSRMLS_CC); + c.value = *tmp_ptr; + } else { + INIT_PZVAL_COPY(&c.value, val); + zval_copy_ctor(&c.value); } + c.flags = CONST_CS; /* non persistent, case sensetive */ c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); c.name_len = Z_STRLEN_P(name)+1; @@ -15649,16 +15634,12 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zend_class_entry *old_scope = EG(scope); + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { + zend_class_entry *old_scope = EG(scope); - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; - } + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; } if (IS_VAR == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); @@ -25188,16 +25169,12 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPC } if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - switch (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: { - zend_class_entry *old_scope = EG(scope); + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { + zend_class_entry *old_scope = EG(scope); - EG(scope) = ce; - zval_update_constant(value, (void *) 1 TSRMLS_CC); - EG(scope) = old_scope; - } + EG(scope) = ce; + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EG(scope) = old_scope; } if (IS_UNUSED == IS_CONST) { CACHE_PTR(opline->op2.literal->cache_slot, value); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index abebc216c3328..bff5e6647261f 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2599,14 +2599,8 @@ ZEND_METHOD(reflection_parameter, getDefaultValue) *return_value = *precv->op2.zv; INIT_PZVAL(return_value); - switch (Z_TYPE_P(return_value) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: - break; - - default: - zval_copy_ctor(return_value); + if (!IS_CONSTANT_TYPE(Z_TYPE_P(return_value))) { + zval_copy_ctor(return_value); } zval_update_constant_ex(&return_value, (void*)0, param->fptr->common.scope TSRMLS_CC); } @@ -3419,11 +3413,8 @@ static void add_class_vars(zend_class_entry *ce, int statics, zval *return_value /* this is necessary to make it able to work with default array * properties, returned to user */ - switch (Z_TYPE_P(prop_copy) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: - case IS_CONSTANT_ARRAY: - case IS_CONSTANT_AST: - zval_update_constant(&prop_copy, (void *) 1 TSRMLS_CC); + if (IS_CONSTANT_TYPE(Z_TYPE_P(prop_copy))) { + zval_update_constant(&prop_copy, (void *) 1 TSRMLS_CC); } add_assoc_zval(return_value, key, prop_copy); From 82cd3779f4644a903b6dbbc966e72ebc54c9d694 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 1 Nov 2013 16:49:23 +0100 Subject: [PATCH 0263/1256] Whitespace fix --- Zend/zend_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index b414b52ecdcf7..3687b6a67b225 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1066,7 +1066,7 @@ static int zval_update_class_constant(zval **pp, int is_static, int offset TSRML zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop_info, &pos) == SUCCESS; zend_hash_move_forward_ex(&ce->properties_info, &pos)) { if (is_static == ((prop_info->flags & ZEND_ACC_STATIC) != 0) && - offset == prop_info->offset) { + offset == prop_info->offset) { int ret; zend_class_entry *old_scope = *scope; *scope = prop_info->ce; @@ -1078,7 +1078,7 @@ static int zval_update_class_constant(zval **pp, int is_static, int offset TSRML ce = ce->parent; } while (ce); - } + } return zval_update_constant(pp, (void*)1 TSRMLS_CC); } return 0; From 699f07ba446c931af9480aba29a601df25c9490d Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 2 Nov 2013 13:32:31 +0100 Subject: [PATCH 0264/1256] limit virtual_cwd_activate() duplicated call to ZTS only --- Zend/zend.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend.c b/Zend/zend.c index b98d264a3c050..a5ed953cd0de0 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -921,7 +921,9 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { +#ifdef ZTS virtual_cwd_activate(TSRMLS_C); +#endif gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); From e5e25c43f476456f5b342d4cd289d0ce5f8bbac4 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 2 Nov 2013 10:46:37 -0700 Subject: [PATCH 0265/1256] Fix English here --- UPGRADING | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UPGRADING b/UPGRADING index 6e77f1d5b1ec0..ab05b3a8bff04 100755 --- a/UPGRADING +++ b/UPGRADING @@ -68,8 +68,8 @@ PHP X.Y UPGRADE NOTES CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file do not work unless it is explicitly set to false. -- String: - crypt() is now raise E_NOTICE error if salt parameter is omitted. +- Crypt: + crypt() will now raise an E_NOTICE error if the salt parameter is omitted. See: https://wiki.php.net/rfc/crypt_function_salt - XMLReader: From ad967e1329ce25e80f485f77be1478f3676b9a37 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 3 Nov 2013 01:58:39 +0100 Subject: [PATCH 0266/1256] Added a few more operators --- Zend/tests/constant_expressions.phpt | 46 ++++++++++++++++++++++++++-- Zend/zend_compile.h | 4 +++ Zend/zend_language_parser.y | 37 ++++++++++++++-------- Zend/zend_operators.c | 40 ++++++++++++++++++++++++ Zend/zend_operators.h | 2 ++ 5 files changed, 115 insertions(+), 14 deletions(-) diff --git a/Zend/tests/constant_expressions.phpt b/Zend/tests/constant_expressions.phpt index 441b9a6f2a88c..7dea0d83f7403 100644 --- a/Zend/tests/constant_expressions.phpt +++ b/Zend/tests/constant_expressions.phpt @@ -14,12 +14,26 @@ This is a test string ENDOFSTRING; const T_9 = ~-1; const T_10 = (-1?:1) + (0?2:3); +const T_11 = 1 && 0; +const T_12 = 1 and 1; +const T_13 = 0 || 0; +const T_14 = 1 or 0; +const T_15 = 1 xor 1; +const T_16 = 1 xor 0; +const T_17 = 1 < 0; +const T_18 = 0 <= 0; +const T_19 = 1 > 0; +const T_20 = 1 >= 0; +const T_21 = 1 === 1; +const T_22 = 1 !== 1; +const T_23 = 0 != "0"; +const T_24 = 1 == "1"; // Test order of operations -const T_11 = 1 + 2 * 3; +const T_25 = 1 + 2 * 3; // Test for memory leaks -const T_12 = "1" + 2 + "3"; +const T_26 = "1" + 2 + "3"; var_dump(T_1); var_dump(T_2); @@ -33,6 +47,20 @@ var_dump(T_9); var_dump(T_10); var_dump(T_11); var_dump(T_12); +var_dump(T_13); +var_dump(T_14); +var_dump(T_15); +var_dump(T_16); +var_dump(T_17); +var_dump(T_18); +var_dump(T_19); +var_dump(T_20); +var_dump(T_21); +var_dump(T_22); +var_dump(T_23); +var_dump(T_24); +var_dump(T_25); +var_dump(T_26); ?> --EXPECT-- int(2) @@ -45,5 +73,19 @@ int(8) string(21) "This is a test string" int(0) int(2) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(true) +bool(true) +bool(true) +bool(false) +bool(false) +bool(true) int(7) int(6) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index bbc6e4738379c..b80a7cb84fc6b 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -722,6 +722,10 @@ int zend_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC); #define ZEND_OP_DATA 137 +/* Pseudo-opcodes for internal object overloading */ +#define ZEND_BOOL_AND -1 +#define ZEND_BOOL_OR -2 + /* END: OPCODES */ /* class fetches */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index af00f2ef4a89a..65e3e0ce3c5df 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -970,23 +970,36 @@ static_scalar_value: static_operation: static_scalar_value '+' static_scalar_value { zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '-' static_scalar_value { zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '-' static_scalar_value { zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } | static_scalar_value '*' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mul_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '/' static_scalar_value { zend_ast_add_binary(&$$.u.constant, div_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '%' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mod_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | '!' static_scalar_value { zend_ast_add_unary(&$$.u.constant, boolean_not_function, &$2.u.constant TSRMLS_CC); } - | '~' static_scalar_value { zend_ast_add_unary(&$$.u.constant, bitwise_not_function, &$2.u.constant TSRMLS_CC); } - | static_scalar_value '|' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '&' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '^' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_xor_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_SL static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_left_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_SR static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_right_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '.' static_scalar_value { zend_ast_add_binary(&$$.u.constant, concat_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '/' static_scalar_value { zend_ast_add_binary(&$$.u.constant, div_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '%' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mod_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | '!' static_scalar_value { zend_ast_add_unary(&$$.u.constant, boolean_not_function, &$2.u.constant TSRMLS_CC); } + | '~' static_scalar_value { zend_ast_add_unary(&$$.u.constant, bitwise_not_function, &$2.u.constant TSRMLS_CC); } + | static_scalar_value '|' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '&' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '^' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_xor_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_SL static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_left_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_SR static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_right_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '.' static_scalar_value { zend_ast_add_binary(&$$.u.constant, concat_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_LOGICAL_XOR static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_xor_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_LOGICAL_AND static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_LOGICAL_OR static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_BOOLEAN_AND static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_BOOLEAN_OR static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_IS_IDENTICAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_identical_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_not_identical_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_IS_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_equal_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_IS_NOT_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_not_equal_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '<' static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value '>' static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_function, &$3.u.constant, &$1.u.constant TSRMLS_CC); } + | static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_or_equal_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } + | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_or_equal_function, &$3.u.constant, &$1.u.constant TSRMLS_CC); } | static_scalar_value '?' ':' static_scalar_value { zend_ast_add_ternary(&$$.u.constant, ternary_function, &$1.u.constant, NULL, &$4.u.constant TSRMLS_CC); } | static_scalar_value '?' static_scalar_value ':' static_scalar_value { zend_ast_add_ternary(&$$.u.constant, ternary_function, &$1.u.constant, &$3.u.constant, &$5.u.constant TSRMLS_CC); } | '+' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } | '-' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } - | '(' static_scalar_value ')' { $$ = $2; } + | '(' static_scalar_value ')' { $$ = $2; } ; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 53a84de155e62..8c083542f02f5 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1082,6 +1082,46 @@ ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) } /* }}} */ +ZEND_API int boolean_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ +{ + zval op1_copy, op2_copy; + long op1_lval; + + if (Z_TYPE_P(op1) != IS_BOOL || Z_TYPE_P(op2) != IS_BOOL) { + ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_AND); + + zendi_convert_to_boolean(op1, op1_copy, result); + op1_lval = Z_LVAL_P(op1); + zendi_convert_to_boolean(op2, op2_copy, result); + } else { + op1_lval = Z_LVAL_P(op1); + } + + ZVAL_BOOL(result, op1_lval & Z_LVAL_P(op2)); + return SUCCESS; +} +/* }}} */ + +ZEND_API int boolean_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ +{ + zval op1_copy, op2_copy; + long op1_lval; + + if (Z_TYPE_P(op1) != IS_BOOL || Z_TYPE_P(op2) != IS_BOOL) { + ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_OR); + + zendi_convert_to_boolean(op1, op1_copy, result); + op1_lval = Z_LVAL_P(op1); + zendi_convert_to_boolean(op2, op2_copy, result); + } else { + op1_lval = Z_LVAL_P(op1); + } + + ZVAL_BOOL(result, op1_lval | Z_LVAL_P(op2)); + return SUCCESS; +} +/* }}} */ + ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */ { zval op1_copy; diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 79ede573205e8..3f0fc2ef6a0c3 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -50,6 +50,8 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); +ZEND_API int boolean_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); +ZEND_API int boolean_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC); ZEND_API int bitwise_not_function(zval *result, zval *op1 TSRMLS_DC); ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); From 18e2b1a9a930d5ae15544c5a2beed6b20d58cdee Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 3 Nov 2013 12:28:00 +0100 Subject: [PATCH 0267/1256] Removed operations on constant arrays. They make no sense as constants are not allowed to be arrays. And as just properties are allowed to; no problem, we still don't need operations on any constant array. --- Zend/zend_language_parser.y | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 65e3e0ce3c5df..19d6d839a2463 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -952,7 +952,9 @@ static_class_constant: ; static_scalar: /* compile-time evaluated scalars */ - static_scalar_value { $$ = $1; } + static_scalar_value { $$ = $1; } + | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } + | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } ; static_scalar_value: @@ -961,8 +963,6 @@ static_scalar_value: | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); } | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); } | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); } - | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } - | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } | static_class_constant { $$ = $1; } | T_CLASS_C { $$ = $1; } | static_operation { $$ = $1; } From 3d4ef50dd7e00826ae8ab9fa572908283029dbd8 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 4 Nov 2013 14:42:54 +0800 Subject: [PATCH 0268/1256] Fixed coredump due to abnormal implemention of phar --- ext/phar/util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 97b70a9d95fc3..f2271dffd4d4a 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1187,7 +1187,8 @@ phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC) /* {{{ */ { phar_archive_data **fd_ptr; - if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { + if (PHAR_GLOBALS->phar_alias_map.arBuckets + && SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { *filename = (*fd_ptr)->fname; *filename_len = (*fd_ptr)->fname_len; return SUCCESS; From 5dc37b351085a7b8cdc30ef2ebb349c8e5df4e2c Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 4 Nov 2013 13:23:36 +0100 Subject: [PATCH 0269/1256] Sync ext/zip with pecl/zip version 1.3.2 - update libzip to version 1.11.1. We don't use any private symbol anymore - new method ZipArchive::setPassword($password) - add --with-libzip option to build with system libzip --- ext/zip/CREDITS | 2 +- ext/zip/config.m4 | 167 ++-- ext/zip/config.w32 | 46 +- ext/zip/examples/addglob.php | 14 + ext/zip/examples/addpattern.php | 13 + ext/zip/lib/mkstemp.c | 151 ++++ ext/zip/lib/php_zip_config.w32.h | 57 ++ ext/zip/lib/zip.h | 211 ++--- ext/zip/lib/zip_add.c | 12 +- ext/zip/lib/zip_add_dir.c | 49 +- ext/zip/lib/zip_add_entry.c | 66 ++ ext/zip/lib/zip_close.c | 499 ++++++------ ext/zip/lib/zip_delete.c | 4 +- .../lib/{zip_entry_new.c => zip_dir_add.c} | 75 +- ext/zip/lib/zip_dirent.c | 763 ++++++++++++++---- ext/zip/lib/{zip_free.c => zip_discard.c} | 19 +- ext/zip/lib/{zip_entry_free.c => zip_entry.c} | 30 +- ext/zip/lib/zip_error.c | 9 +- ext/zip/lib/zip_error_clear.c | 5 +- ext/zip/lib/zip_error_get.c | 2 +- ext/zip/lib/zip_error_get_sys_type.c | 2 +- ext/zip/lib/zip_error_to_str.c | 2 +- ext/zip/lib/zip_extra_field.c | 386 +++++++++ ext/zip/lib/zip_extra_field_api.c | 364 +++++++++ ext/zip/lib/zip_fclose.c | 19 +- ext/zip/lib/zip_fdopen.c | 19 +- ext/zip/lib/zip_file_add.c | 55 ++ ext/zip/lib/zip_file_error_clear.c | 5 +- ext/zip/lib/zip_file_error_get.c | 2 +- ...et_file_extra.c => zip_file_get_comment.c} | 42 +- ext/zip/lib/zip_file_get_offset.c | 28 +- ...zip_set_file_extra.c => zip_file_rename.c} | 46 +- ext/zip/lib/zip_file_replace.c | 111 +++ ext/zip/lib/zip_file_set_comment.c | 105 +++ ext/zip/lib/zip_file_strerror.c | 2 +- ext/zip/lib/zip_filerange_crc.c | 8 +- ext/zip/lib/zip_fopen.c | 8 +- ext/zip/lib/zip_fopen_encrypted.c | 9 +- ext/zip/lib/zip_fopen_index.c | 8 +- ext/zip/lib/zip_fopen_index_encrypted.c | 107 +-- ext/zip/lib/zip_fread.c | 2 +- ext/zip/lib/zip_get_archive_comment.c | 41 +- ext/zip/lib/zip_get_archive_flag.c | 6 +- .../lib/zip_get_compression_implementation.c | 6 +- .../lib/zip_get_encryption_implementation.c | 4 +- ext/zip/lib/zip_get_file_comment.c | 25 +- ext/zip/lib/zip_get_name.c | 35 +- ext/zip/lib/zip_get_num_entries.c | 15 +- ext/zip/lib/zip_get_num_files.c | 6 +- ext/zip/lib/zip_memdup.c | 5 +- ext/zip/lib/zip_name_locate.c | 40 +- ext/zip/lib/zip_new.c | 13 +- ext/zip/lib/zip_open.c | 477 +++++++---- ext/zip/lib/zip_rename.c | 31 +- ext/zip/lib/zip_replace.c | 48 +- ext/zip/lib/zip_set_archive_comment.c | 42 +- ext/zip/lib/zip_set_archive_flag.c | 4 +- ext/zip/lib/zip_set_default_password.c | 2 +- ext/zip/lib/zip_set_file_comment.c | 37 +- ext/zip/lib/zip_set_file_compression.c | 90 +++ ext/zip/lib/zip_set_name.c | 74 +- ext/zip/lib/zip_source_buffer.c | 10 +- ext/zip/lib/zip_source_close.c | 2 +- ext/zip/lib/zip_source_crc.c | 29 +- ext/zip/lib/zip_source_deflate.c | 26 +- ext/zip/lib/zip_source_error.c | 23 +- ext/zip/lib/zip_source_file.c | 2 +- ext/zip/lib/zip_source_filep.c | 29 +- ext/zip/lib/zip_source_free.c | 2 +- ext/zip/lib/zip_source_function.c | 2 +- ext/zip/lib/zip_source_layered.c | 2 +- ext/zip/lib/zip_source_open.c | 6 +- ext/zip/lib/zip_source_pkware.c | 17 +- ext/zip/lib/zip_source_pop.c | 2 +- ext/zip/lib/zip_source_read.c | 2 +- ext/zip/lib/zip_source_stat.c | 2 +- ext/zip/lib/zip_source_window.c | 150 ++++ ext/zip/lib/zip_source_zip.c | 151 +--- ext/zip/lib/zip_source_zip_new.c | 172 ++++ ext/zip/lib/zip_stat.c | 8 +- ext/zip/lib/zip_stat_index.c | 30 +- ext/zip/lib/zip_stat_init.c | 2 +- ext/zip/lib/zip_strerror.c | 3 +- ext/zip/lib/zip_string.c | 196 +++++ ext/zip/lib/zip_unchange.c | 29 +- ext/zip/lib/zip_unchange_all.c | 5 +- ext/zip/lib/zip_unchange_archive.c | 12 +- ext/zip/lib/zip_unchange_data.c | 18 +- ext/zip/lib/zip_utf-8.c | 255 ++++++ ext/zip/lib/zip_win32.h | 31 - ext/zip/lib/zipconf.h | 176 ++-- ext/zip/lib/zipint.h | 423 +++++++--- ext/zip/php_zip.c | 185 +++-- ext/zip/php_zip.h | 15 +- ext/zip/tests/bug38943.inc | 16 + ext/zip/tests/bug38943_2.phpt | 38 + ext/zip/tests/doubleclose.phpt | 43 + ext/zip/tests/zip_entry_close.phpt | 24 + ext/zip/zip_stream.c | 20 +- 99 files changed, 4813 insertions(+), 1870 deletions(-) create mode 100644 ext/zip/examples/addglob.php create mode 100644 ext/zip/examples/addpattern.php create mode 100644 ext/zip/lib/mkstemp.c create mode 100644 ext/zip/lib/php_zip_config.w32.h create mode 100644 ext/zip/lib/zip_add_entry.c rename ext/zip/lib/{zip_entry_new.c => zip_dir_add.c} (61%) rename ext/zip/lib/{zip_free.c => zip_discard.c} (86%) rename ext/zip/lib/{zip_entry_free.c => zip_entry.c} (79%) create mode 100644 ext/zip/lib/zip_extra_field.c create mode 100644 ext/zip/lib/zip_extra_field_api.c create mode 100644 ext/zip/lib/zip_file_add.c rename ext/zip/lib/{zip_get_file_extra.c => zip_file_get_comment.c} (72%) rename ext/zip/lib/{zip_set_file_extra.c => zip_file_rename.c} (70%) create mode 100644 ext/zip/lib/zip_file_replace.c create mode 100644 ext/zip/lib/zip_file_set_comment.c create mode 100644 ext/zip/lib/zip_set_file_compression.c create mode 100644 ext/zip/lib/zip_source_window.c create mode 100644 ext/zip/lib/zip_source_zip_new.c create mode 100644 ext/zip/lib/zip_string.c create mode 100644 ext/zip/lib/zip_utf-8.c delete mode 100644 ext/zip/lib/zip_win32.h create mode 100644 ext/zip/tests/bug38943.inc create mode 100644 ext/zip/tests/bug38943_2.phpt create mode 100644 ext/zip/tests/doubleclose.phpt create mode 100644 ext/zip/tests/zip_entry_close.phpt diff --git a/ext/zip/CREDITS b/ext/zip/CREDITS index 6c7e42d417160..59b7ef097e531 100644 --- a/ext/zip/CREDITS +++ b/ext/zip/CREDITS @@ -1,2 +1,2 @@ Zip -Pierre-Alain Joye +Pierre-Alain Joye, Remi Collet diff --git a/ext/zip/config.m4 b/ext/zip/config.m4 index 805d92442e017..83e32feca76ee 100644 --- a/ext/zip/config.m4 +++ b/ext/zip/config.m4 @@ -11,10 +11,14 @@ if test -z "$PHP_ZLIB_DIR"; then fi PHP_ARG_WITH(pcre-dir, pcre install prefix, -[ --with-pcre-dir ZIP: pcre install prefix], no, no) +[ --with-pcre-dir ZIP: pcre install prefix], no, no) + +PHP_ARG_WITH(libzip, libzip, +[ --with-libzip[=DIR] ZIP: use libzip], no, no) if test "$PHP_ZIP" != "no"; then + dnl libzip, depends on zlib if test "$PHP_ZLIB_DIR" != "no" && test "$PHP_ZLIB_DIR" != "yes"; then if test -f "$PHP_ZLIB_DIR/include/zlib/zlib.h"; then PHP_ZLIB_DIR="$PHP_ZLIB_DIR" @@ -47,61 +51,124 @@ if test "$PHP_ZIP" != "no"; then PHP_ADD_INCLUDE($PHP_ZLIB_INCDIR) fi - dnl This is PECL build, check if bundled PCRE library is used - old_CPPFLAGS=$CPPFLAGS - CPPFLAGS=$INCLUDES - AC_EGREP_CPP(yes,[ -#include
-#if defined(HAVE_BUNDLED_PCRE) && !defined(COMPILE_DL_PCRE) -yes -#endif - ],[ - PHP_PCRE_REGEX=yes - ],[ - AC_EGREP_CPP(yes,[ -#include
-#if defined(HAVE_PCRE) && !defined(COMPILE_DL_PCRE) -yes -#endif - ],[ - PHP_PCRE_REGEX=pecl - ],[ - PHP_PCRE_REGEX=no + if test "$PHP_LIBZIP" != "no"; then + + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + + dnl system libzip, depends on libzip + AC_MSG_CHECKING(for libzip) + if test -r $PHP_LIBZIP/include/zip.h; then + LIBZIP_CFLAGS="-I$PHP_LIBZIP/include" + LIBZIP_LIBDIR="$PHP_LIBZIP/$PHP_LIBDIR" + AC_MSG_RESULT(from option: found in $PHP_LIBZIP) + + elif test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libzip; then + LIBZIP_CFLAGS=`$PKG_CONFIG libzip --cflags` + LIBZIP_LIBDIR=`$PKG_CONFIG libzip --variable=libdir` + AC_MSG_RESULT(from pkgconfig: found in $LIBZIP_LIBDIR) + + else + for i in /usr/local /usr; do + if test -r $i/include/zip.h; then + LIBZIP_CFLAGS="-I$i/include" + LIBZIP_LIBDIR="$i/$PHP_LIBDIR" + AC_MSG_RESULT(in default path: found in $i) + break + fi + done + fi + + if test -z "$LIBZIP_LIBDIR"; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR(Please reinstall the libzip distribution) + fi + + dnl Could not think of a simple way to check libzip for overwrite support + PHP_CHECK_LIBRARY(zip, zip_open, + [ + PHP_ADD_LIBRARY_WITH_PATH(zip, $LIBZIP_LIBDIR, ZIP_SHARED_LIBADD) + AC_DEFINE(HAVE_LIBZIP,1,[ ]) + ], [ + AC_MSG_ERROR(could not find usable libzip) + ], [ + -L$LIBZIP_LIBDIR ]) - ]) - CPPFLAGS=$old_CPPFLAGS - - PHP_ZIP_SOURCES="$PHP_ZIP_SOURCES lib/zip_add.c lib/zip_error.c lib/zip_fclose.c \ - lib/zip_fread.c lib/zip_open.c lib/zip_source_filep.c \ - lib/zip_strerror.c lib/zip_close.c lib/zip_error_get.c \ - lib/zip_file_error_get.c lib/zip_free.c lib/zip_rename.c \ - lib/zip_source_free.c lib/zip_unchange_all.c lib/zip_delete.c \ - lib/zip_error_get_sys_type.c lib/zip_file_get_offset.c \ - lib/zip_get_name.c lib/zip_replace.c lib/zip_source_function.c \ - lib/zip_unchange.c lib/zip_dirent.c lib/zip_error_strerror.c \ - lib/zip_filerange_crc.c lib/zip_file_strerror.c lib/zip_get_num_files.c \ - lib/zip_get_archive_flag.c lib/zip_set_archive_flag.c \ - lib/zip_set_name.c lib/zip_source_zip.c lib/zip_unchange_data.c \ - lib/zip_entry_free.c lib/zip_error_to_str.c lib/zip_fopen.c \ - lib/zip_name_locate.c lib/zip_source_buffer.c lib/zip_stat.c \ - lib/zip_entry_new.c lib/zip_err_str.c lib/zip_fopen_index.c \ - lib/zip_get_archive_comment.c lib/zip_get_file_comment.c \ - lib/zip_new.c lib/zip_source_file.c lib/zip_stat_index.c \ - lib/zip_set_archive_comment.c lib/zip_set_file_comment.c \ - lib/zip_unchange_archive.c lib/zip_memdup.c lib/zip_stat_init.c lib/zip_add_dir.c \ - lib/zip_error_clear.c lib/zip_file_error_clear.c \ - lib/zip_fdopen.c lib/zip_fopen_encrypted.c lib/zip_fopen_index_encrypted.c \ - lib/zip_get_compression_implementation.c lib/zip_get_encryption_implementation.c \ - lib/zip_get_file_extra.c lib/zip_get_num_entries.c lib/zip_set_default_password.c \ - lib/zip_set_file_extra.c lib/zip_source_close.c lib/zip_source_crc.c \ - lib/zip_source_deflate.c lib/zip_source_error.c lib/zip_source_layered.c \ - lib/zip_source_open.c lib/zip_source_pkware.c lib/zip_source_pop.c \ - lib/zip_source_read.c lib/zip_source_stat.c" + + AC_DEFINE(HAVE_ZIP,1,[ ]) + PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c, $ext_shared,, $LIBZIP_CFLAGS) + PHP_SUBST(ZIP_SHARED_LIBADD) + else + + + PHP_ZIP_SOURCES="$PHP_ZIP_SOURCES lib/zip_add.c lib/zip_add_dir.c lib/zip_add_entry.c\ + lib/zip_close.c lib/zip_delete.c lib/zip_dir_add.c lib/zip_dirent.c lib/zip_discard.c lib/zip_entry.c\ + lib/zip_err_str.c lib/zip_error.c lib/zip_error_clear.c lib/zip_error_get.c lib/zip_error_get_sys_type.c\ + lib/zip_error_strerror.c lib/zip_error_to_str.c lib/zip_extra_field.c lib/zip_extra_field_api.c\ + lib/zip_fclose.c lib/zip_fdopen.c lib/zip_file_add.c lib/zip_file_error_clear.c lib/zip_file_error_get.c\ + lib/zip_file_get_comment.c lib/zip_file_get_offset.c lib/zip_file_rename.c lib/zip_file_replace.c\ + lib/zip_file_set_comment.c lib/zip_file_strerror.c lib/zip_filerange_crc.c lib/zip_fopen.c\ + lib/zip_fopen_encrypted.c lib/zip_fopen_index.c lib/zip_fopen_index_encrypted.c lib/zip_fread.c\ + lib/zip_get_archive_comment.c lib/zip_get_archive_flag.c lib/zip_get_compression_implementation.c\ + lib/zip_get_encryption_implementation.c lib/zip_get_file_comment.c lib/zip_get_name.c lib/zip_get_num_entries.c \ + lib/zip_get_num_files.c lib/zip_memdup.c lib/zip_name_locate.c lib/zip_new.c lib/zip_open.c lib/zip_rename.c lib/zip_replace.c\ + lib/zip_set_archive_comment.c lib/zip_set_archive_flag.c lib/zip_set_default_password.c lib/zip_set_file_comment.c\ + lib/zip_set_file_compression.c lib/zip_set_name.c lib/zip_source_buffer.c lib/zip_source_close.c lib/zip_source_crc.c\ + lib/zip_source_deflate.c lib/zip_source_error.c lib/zip_source_file.c lib/zip_source_filep.c lib/zip_source_free.c\ + lib/zip_source_function.c lib/zip_source_layered.c lib/zip_source_open.c lib/zip_source_pkware.c lib/zip_source_pop.c\ + lib/zip_source_read.c lib/zip_source_stat.c lib/zip_source_window.c lib/zip_source_zip.c lib/zip_source_zip_new.c\ + lib/zip_stat.c lib/zip_stat_index.c lib/zip_stat_init.c lib/zip_strerror.c lib/zip_string.c lib/zip_unchange.c lib/zip_unchange_all.c\ + lib/zip_unchange_archive.c lib/zip_unchange_data.c lib/zip_utf-8.c lib/mkstemp.c" AC_DEFINE(HAVE_ZIP,1,[ ]) PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c $PHP_ZIP_SOURCES, $ext_shared) PHP_ADD_BUILD_DIR($ext_builddir/lib, 1) PHP_SUBST(ZIP_SHARED_LIBADD) +fi + + +AC_CHECK_TYPES([int8_t]) +AC_CHECK_TYPES([int16_t]) +AC_CHECK_TYPES([int32_t]) +AC_CHECK_TYPES([int64_t]) +AC_CHECK_TYPES([uint8_t]) +AC_CHECK_TYPES([uint16_t]) +AC_CHECK_TYPES([uint32_t]) +AC_CHECK_TYPES([uint64_t]) +AC_CHECK_TYPES([ssize_t]) + +AC_CHECK_SIZEOF([short]) +AC_CHECK_SIZEOF([int]) +AC_CHECK_SIZEOF([long]) +AC_CHECK_SIZEOF([long long]) +AC_CHECK_SIZEOF([off_t]) +AC_CHECK_SIZEOF([size_t]) + +AC_PATH_PROG([TOUCH], [touch]) +AC_PATH_PROG([UNZIP], [unzip]) + +AC_STRUCT_TIMEZONE + +case $host_os +in + *bsd*) MANFMT=mdoc;; + *) MANFMT=man;; +esac +AC_SUBST([MANFMT]) + +AH_BOTTOM([ +#ifndef HAVE_SSIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT +typedef int ssize_t; +# elif SIZEOF_SIZE_T == SIZEOF_LONG +typedef long ssize_t; +# elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +typedef long long ssize_t; +# else +#error no suitable type for ssize_t found +# endif +#endif +]) + dnl so we always include the known-good working hack. PHP_ADD_MAKEFILE_FRAGMENT diff --git a/ext/zip/config.w32 b/ext/zip/config.w32 index fa0a5180df5ce..5b9f09575a769 100644 --- a/ext/zip/config.w32 +++ b/ext/zip/config.w32 @@ -9,36 +9,28 @@ if (PHP_ZIP != "no") { (PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "zip", PHP_ZIP)) || (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED))) ) { EXTENSION('zip', 'php_zip.c zip_stream.c'); - ADD_SOURCES(configure_module_dirname + "/lib", "zip_add.c zip_error.c zip_fclose.c \ - zip_fread.c zip_open.c zip_source_filep.c \ - zip_strerror.c zip_close.c zip_error_get.c \ - zip_file_error_get.c zip_free.c zip_rename.c \ - zip_source_free.c zip_unchange_all.c zip_delete.c \ - zip_error_get_sys_type.c zip_file_get_offset.c \ - zip_get_name.c zip_replace.c zip_source_function.c \ - zip_unchange.c zip_dirent.c zip_error_strerror.c \ - zip_filerange_crc.c zip_file_strerror.c zip_get_num_files.c \ - zip_get_archive_flag.c zip_set_archive_flag.c \ - zip_set_name.c zip_source_zip.c zip_unchange_data.c \ - zip_entry_free.c zip_error_to_str.c zip_fopen.c \ - zip_name_locate.c zip_source_buffer.c zip_stat.c \ - zip_entry_new.c zip_err_str.c zip_fopen_index.c \ - zip_new.c zip_source_file.c zip_stat_index.c \ - zip_get_archive_comment.c zip_get_file_comment.c \ - zip_set_archive_comment.c zip_set_file_comment.c \ - zip_unchange_archive.c zip_memdup.c zip_stat_init.c \ - zip_add_dir.c zip_file_error_clear.c zip_error_clear.c \ - zip_fdopen.c zip_fopen_encrypted.c zip_fopen_index_encrypted.c \ - zip_get_compression_implementation.c zip_get_encryption_implementation.c \ - zip_get_file_extra.c zip_get_num_entries.c zip_set_default_password.c \ - zip_set_file_extra.c zip_source_close.c zip_source_crc.c \ - zip_source_deflate.c zip_source_error.c zip_source_layered.c \ - zip_source_open.c zip_source_pkware.c zip_source_pop.c \ - zip_source_read.c zip_source_stat.c", "zip"); + ADD_SOURCES(configure_module_dirname + "/lib", "zip_add.c zip_add_dir.c zip_add_entry.c\ + zip_close.c zip_delete.c zip_dir_add.c zip_dirent.c zip_discard.c zip_entry.c\ + zip_err_str.c zip_error.c zip_error_clear.c zip_error_get.c zip_error_get_sys_type.c\ + zip_error_strerror.c zip_error_to_str.c zip_extra_field.c zip_extra_field_api.c\ + zip_fclose.c zip_fdopen.c zip_file_add.c zip_file_error_clear.c zip_file_error_get.c\ + zip_file_get_comment.c zip_file_get_offset.c zip_file_rename.c zip_file_replace.c\ + zip_file_set_comment.c zip_file_strerror.c zip_filerange_crc.c zip_fopen.c\ + zip_fopen_encrypted.c zip_fopen_index.c zip_fopen_index_encrypted.c zip_fread.c\ + zip_get_archive_comment.c zip_get_archive_flag.c zip_get_compression_implementation.c\ + zip_get_encryption_implementation.c zip_get_file_comment.c zip_get_name.c zip_get_num_entries.c \ + zip_get_num_files.c zip_memdup.c zip_name_locate.c zip_new.c zip_open.c zip_rename.c zip_replace.c\ + zip_set_archive_comment.c zip_set_archive_flag.c zip_set_default_password.c zip_set_file_comment.c\ + zip_set_file_compression.c zip_set_name.c zip_source_buffer.c zip_source_close.c zip_source_crc.c\ + zip_source_deflate.c zip_source_error.c zip_source_file.c zip_source_filep.c zip_source_free.c\ + zip_source_function.c zip_source_layered.c zip_source_open.c zip_source_pkware.c zip_source_pop.c\ + zip_source_read.c zip_source_stat.c zip_source_window.c zip_source_zip.c zip_source_zip_new.c\ + zip_stat.c zip_stat_index.c zip_stat_init.c zip_strerror.c zip_string.c zip_unchange.c zip_unchange_all.c\ + zip_unchange_archive.c zip_unchange_data.c zip_utf-8.c mkstemp.c", "zip"); AC_DEFINE('HAVE_ZIP', 1); + ADD_FLAG("CFLAGS_ZIP", "/D _WIN32"); } else { WARNING("zip not enabled; libraries and headers not found"); } } - diff --git a/ext/zip/examples/addglob.php b/ext/zip/examples/addglob.php new file mode 100644 index 0000000000000..790312b4d586a --- /dev/null +++ b/ext/zip/examples/addglob.php @@ -0,0 +1,14 @@ +open('a.zip', ZIPARCHIVE::CREATE); + +/* or 'remove_all_path' => 0*/ +$options = array( + 'remove_path' => '/home/francis/myimages', + 'add_path' => 'images/', +); +$found = $z->addGlob("/home/pierre/cvs/gd/libgd/tests/*.png", 0, $options); +var_dump($found); +$z->close(); + diff --git a/ext/zip/examples/addpattern.php b/ext/zip/examples/addpattern.php new file mode 100644 index 0000000000000..a1a9b122914e5 --- /dev/null +++ b/ext/zip/examples/addpattern.php @@ -0,0 +1,13 @@ +open('a.zip', ZIPARCHIVE::CREATE); + +/* or 'remove_all_path' => 0*/ +$options = array('remove_path' => '/home/pierre/cvs/gd/libgd/tests', +'add_path' => 'images/', +); + +$found = $z->addPattern("/(\.png)$/i", "/home/pierre/cvs/gd/libgd/tests", $options); +var_dump($found); +$z->close(); + diff --git a/ext/zip/lib/mkstemp.c b/ext/zip/lib/mkstemp.c new file mode 100644 index 0000000000000..843d5e3613143 --- /dev/null +++ b/ext/zip/lib/mkstemp.c @@ -0,0 +1,151 @@ +/* Adapted from NetBSB libc by Dieter Baron */ + +/* NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + + + +int +_zip_mkstemp(char *path) +{ +#ifdef _WIN32 + int ret; + ret = _creat(_mktemp(path), _S_IREAD|_S_IWRITE); + if (ret == -1) { + return 0; + } else { + return ret; + } +#else + int fd; + char *start, *trv; + struct stat sbuf; + pid_t pid; + + /* To guarantee multiple calls generate unique names even if + the file is not created. 676 different possibilities with 7 + or more X's, 26 with 6 or less. */ + static char xtra[2] = "aa"; + int xcnt = 0; + + pid = getpid(); + + /* Move to end of path and count trailing X's. */ + for (trv = path; *trv; ++trv) + if (*trv == 'X') + xcnt++; + else + xcnt = 0; + + /* Use at least one from xtra. Use 2 if more than 6 X's. */ + if (*(trv - 1) == 'X') + *--trv = xtra[0]; + if (xcnt > 6 && *(trv - 1) == 'X') + *--trv = xtra[1]; + + /* Set remaining X's to pid digits with 0's to the left. */ + while (*--trv == 'X') { + *trv = (pid % 10) + '0'; + pid /= 10; + } + + /* update xtra for next call. */ + if (xtra[0] != 'z') + xtra[0]++; + else { + xtra[0] = 'a'; + if (xtra[1] != 'z') + xtra[1]++; + else + xtra[1] = 'a'; + } + + /* + * check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + for (start = trv + 1;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + if (stat(path, &sbuf)) + return (0); + if (!S_ISDIR(sbuf.st_mode)) { + errno = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) { + if ((fd=open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0) + return (fd); + if (errno != EEXIST) + return (0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) { + if (!*trv) + return (0); + if (*trv == 'z') + *trv++ = 'a'; + else { + if (isdigit((unsigned char)*trv)) + *trv = 'a'; + else + ++*trv; + break; + } + } + } + /*NOTREACHED*/ +#endif +} diff --git a/ext/zip/lib/php_zip_config.w32.h b/ext/zip/lib/php_zip_config.w32.h new file mode 100644 index 0000000000000..8956839c62c32 --- /dev/null +++ b/ext/zip/lib/php_zip_config.w32.h @@ -0,0 +1,57 @@ +#ifndef HAD_CONFIG_H +#define HAD_CONFIG_H +#define HAVE__CLOSE +#define HAVE__DUP +#define HAVE__FDOPEN +#define HAVE__FILENO +#define HAVE__OPEN +#define HAVE__SNPRINTF +/* #undef HAVE__STRCMPI */ +#define HAVE__STRDUP +#define HAVE__STRICMP +/* #undef HAVE_FSEEKO */ +/* #undef HAVE_FTELLO */ +/* #undef HAVE_MKSTEMP */ +#define HAVE_MOVEFILEEXA +/* #undef HAVE_SNPRINTF */ +/* #undef HAVE_STRCASECMP */ +/* #undef HAVE_STRINGS_H */ +/* #undef HAVE_STRUCT_TM_TM_ZONE */ +/* #undef HAVE_UNISTD_H */ +#define PACKAGE "libzip" +#define VERSION "0.10.b" + +/* #undef HAVE_SSIZE_T */ + +#ifndef HAVE_SSIZE_T + +#ifndef SIZE_T_LIBZIP +#define SIZE_T_LIBZIP 4 +#endif +#ifndef INT_LIBZIP +#define INT_LIBZIP 4 +#endif +#ifndef LONG_LIBZIP +#define LONG_LIBZIP 4 +#endif +#ifndef LONG_LONG_LIBZIP +#define LONG_LONG_LIBZIP 8 +#endif +#ifndef SIZEOF_OFF_T +#define SIZEOF_OFF_T 4 +#endif + +# if SIZE_T_LIBZIP == INT_LIBZIP +# ifndef ssize_t +typedef int ssize_t; +# endif +# elif SIZE_T_LIBZIP == LONG_LIBZIP +typedef long ssize_t; +# elif SIZE_T_LIBZIP == LONG_LONG_LIBZIP +typedef long long ssize_t; +# else +#error no suitable type for ssize_t found +# endif +#endif + +#endif /* HAD_CONFIG_H */ diff --git a/ext/zip/lib/zip.h b/ext/zip/lib/zip.h index f11c9aba7f99c..1fb1dbf5e0f5b 100644 --- a/ext/zip/lib/zip.h +++ b/ext/zip/lib/zip.h @@ -3,7 +3,7 @@ /* zip.h -- exported declarations. - Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -38,18 +38,30 @@ #include "main/php.h" #ifdef PHP_WIN32 -# include "zip_win32.h" -# ifdef PHP_ZIP_EXPORTS -# define ZIP_EXTERN(rt) __declspec(dllexport)rt _stdcall -# else -# define ZIP_EXTERN(rt) rt -# endif +#ifdef PHP_ZIP_EXPORTS +# define ZIP_EXTERN __declspec(dllexport) _stdcall +# else +# define ZIP_EXTERN +# endif #elif defined(__GNUC__) && __GNUC__ >= 4 -# define ZIP_EXTERN(rt) __attribute__ ((visibility("default"))) rt +# define ZIP_EXTERN __attribute__ ((visibility("default"))) #else -# define ZIP_EXTERN(rt) rt +# define ZIP_EXTERN #endif + +#ifndef ZIP_EXTERN +#ifdef _WIN32 +#define ZIP_EXTERN __declspec(dllimport) +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ZIP_EXTERN __attribute__ ((visibility ("default"))) +#else +#define ZIP_EXTERN +#endif +#endif + + + BEGIN_EXTERN_C() #include "zipconf.h" @@ -63,27 +75,40 @@ BEGIN_EXTERN_C() #define ZIP_CREATE 1 #define ZIP_EXCL 2 #define ZIP_CHECKCONS 4 -#define ZIP_OVERWRITE 8 - +#define ZIP_TRUNCATE 8 /* flags for zip_name_locate, zip_fopen, zip_stat, ... */ -#define ZIP_FL_NOCASE 1 /* ignore case on name lookup */ -#define ZIP_FL_NODIR 2 /* ignore directory component */ -#define ZIP_FL_COMPRESSED 4 /* read compressed data */ -#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ -#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */ -#define ZIP_FL_ENCRYPTED 32 /* read encrypted data - (implies ZIP_FL_COMPRESSED) */ +#define ZIP_FL_NOCASE 1u /* ignore case on name lookup */ +#define ZIP_FL_NODIR 2u /* ignore directory component */ +#define ZIP_FL_COMPRESSED 4u /* read compressed data */ +#define ZIP_FL_UNCHANGED 8u /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */ +#define ZIP_FL_ENCRYPTED 32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */ +#define ZIP_FL_ENC_GUESS 0u /* guess string encoding (is default) */ +#define ZIP_FL_ENC_RAW 64u /* get unmodified string */ +#define ZIP_FL_ENC_STRICT 128u /* follow specification strictly */ +#define ZIP_FL_LOCAL 256u /* in local header */ +#define ZIP_FL_CENTRAL 512u /* in central directory */ +/* 1024u reserved for internal use */ +#define ZIP_FL_ENC_UTF_8 2048u /* string is UTF-8 encoded */ +#define ZIP_FL_ENC_CP437 4096u /* string is CP437 encoded */ +#define ZIP_FL_OVERWRITE 8192u /* zip_file_add: if file with name exists, overwrite (replace) it */ /* archive global flags flags */ -#define ZIP_AFL_TORRENT 1 /* torrent zipped */ -#define ZIP_AFL_RDONLY 2 /* read only -- cannot be cleared */ +#define ZIP_AFL_TORRENT 1u /* torrent zipped */ +#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */ + +/* create a new extra field */ + +#define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX +#define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX /* flags for compression and encryption sources */ +#define ZIP_CODEC_DECODE 0 /* decompress/decrypt (encode flag not set) */ #define ZIP_CODEC_ENCODE 1 /* compress/encrypt */ @@ -178,15 +203,15 @@ enum zip_source_cmd { #define ZIP_SOURCE_ERR_LOWER -2 -#define ZIP_STAT_NAME 0x0001 -#define ZIP_STAT_INDEX 0x0002 -#define ZIP_STAT_SIZE 0x0004 -#define ZIP_STAT_COMP_SIZE 0x0008 -#define ZIP_STAT_MTIME 0x0010 -#define ZIP_STAT_CRC 0x0020 -#define ZIP_STAT_COMP_METHOD 0x0040 -#define ZIP_STAT_ENCRYPTION_METHOD 0x0080 -#define ZIP_STAT_FLAGS 0x0100 +#define ZIP_STAT_NAME 0x0001u +#define ZIP_STAT_INDEX 0x0002u +#define ZIP_STAT_SIZE 0x0004u +#define ZIP_STAT_COMP_SIZE 0x0008u +#define ZIP_STAT_MTIME 0x0010u +#define ZIP_STAT_CRC 0x0020u +#define ZIP_STAT_COMP_METHOD 0x0040u +#define ZIP_STAT_ENCRYPTION_METHOD 0x0080u +#define ZIP_STAT_FLAGS 0x0100u struct zip_stat { zip_uint64_t valid; /* which fields have valid values */ @@ -205,72 +230,78 @@ struct zip; struct zip_file; struct zip_source; +typedef zip_uint32_t zip_flags_t; + typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t, enum zip_source_cmd); -ZIP_EXTERN(zip_int64_t) zip_add(struct zip *, const char *, struct zip_source *); -ZIP_EXTERN(zip_int64_t) zip_add_dir(struct zip *, const char *); -ZIP_EXTERN(int) zip_close(struct zip *); -ZIP_EXTERN(int) zip_delete(struct zip *, zip_uint64_t); -ZIP_EXTERN(void) zip_error_clear(struct zip *); -ZIP_EXTERN(void) zip_error_get(struct zip *, int *, int *); -ZIP_EXTERN(int) zip_error_get_sys_type(int); -ZIP_EXTERN(int) zip_error_to_str(char *, zip_uint64_t, int, int); -ZIP_EXTERN(int) zip_fclose(struct zip_file *); -ZIP_EXTERN(struct zip *)zip_fdopen(int, int, int *); -ZIP_EXTERN(void) zip_file_error_clear(struct zip_file *); -ZIP_EXTERN(void) zip_file_error_get(struct zip_file *, int *, int *); -ZIP_EXTERN(const char *)zip_file_strerror(struct zip_file *); -ZIP_EXTERN(struct) zip_file *zip_fopen(struct zip *, const char *, int); -ZIP_EXTERN(struct) zip_file *zip_fopen_encrypted(struct zip *, const char *, - int, const char *); -ZIP_EXTERN(struct zip_file *)zip_fopen_index(struct zip *, zip_uint64_t, int); -ZIP_EXTERN(struct zip_file *)zip_fopen_index_encrypted(struct zip *, - zip_uint64_t, int, - const char *); -ZIP_EXTERN(zip_int64_t) zip_fread(struct zip_file *, void *, zip_uint64_t); -ZIP_EXTERN(const char *)zip_get_archive_comment(struct zip *, int *, int); -ZIP_EXTERN(int) zip_get_archive_flag(struct zip *, int, int); -ZIP_EXTERN(const char *)zip_get_file_comment(struct zip *, zip_uint64_t, - int *, int); -ZIP_EXTERN(const char *)zip_get_file_extra(struct zip *, zip_uint64_t, - int *, int); -ZIP_EXTERN(const char *)zip_get_name(struct zip *, zip_uint64_t, int); -ZIP_EXTERN(zip_uint64_t) zip_get_num_entries(struct zip *, int); -ZIP_EXTERN(int) zip_get_num_files(struct zip *); /* deprecated, use zip_get_num_entries instead */ -ZIP_EXTERN(int) zip_name_locate(struct zip *, const char *, int); -ZIP_EXTERN(struct zip *)zip_open(const char *, int, int *); -ZIP_EXTERN(int) zip_rename(struct zip *, zip_uint64_t, const char *); -ZIP_EXTERN(int) zip_replace(struct zip *, zip_uint64_t, struct zip_source *); -ZIP_EXTERN(int) zip_set_archive_comment(struct zip *, const char *, int); -ZIP_EXTERN(int) zip_set_archive_flag(struct zip *, int, int); -ZIP_EXTERN(int) zip_set_default_password(struct zip *, const char *); -ZIP_EXTERN(int) zip_set_file_comment(struct zip *, zip_uint64_t, - const char *, int); -ZIP_EXTERN(int) zip_set_file_extra(struct zip *, zip_uint64_t, - const char *, int); -ZIP_EXTERN(struct) zip_source *zip_source_buffer(struct zip *, const void *, - zip_uint64_t, int); -ZIP_EXTERN(struct) zip_source *zip_source_file(struct zip *, const char *, - zip_uint64_t, zip_int64_t); -ZIP_EXTERN(struct) zip_source *zip_source_filep(struct zip *, FILE *, - zip_uint64_t, zip_int64_t); -ZIP_EXTERN(void) zip_source_free(struct zip_source *); -ZIP_EXTERN(struct zip_source *)zip_source_function(struct zip *, - zip_source_callback, void *); -ZIP_EXTERN(struct zip_source *)zip_source_zip(struct zip *, struct zip *, - zip_uint64_t, int, - zip_uint64_t, zip_int64_t); -ZIP_EXTERN(int) zip_stat(struct zip *, const char *, int, struct zip_stat *); -ZIP_EXTERN(int) zip_stat_index(struct zip *, zip_uint64_t, int, - struct zip_stat *); -ZIP_EXTERN(void) zip_stat_init(struct zip_stat *); -ZIP_EXTERN(const char *)zip_strerror(struct zip *); -ZIP_EXTERN(int) zip_unchange(struct zip *, zip_uint64_t); -ZIP_EXTERN(int) zip_unchange_all(struct zip *); -ZIP_EXTERN(int) zip_unchange_archive(struct zip *); +#ifndef ZIP_DISABLE_DEPRECATED +ZIP_EXTERN zip_int64_t zip_add(struct zip *, const char *, struct zip_source *); /* use zip_file_add */ +ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *, const char *); /* use zip_dir_add */ +ZIP_EXTERN const char *zip_get_file_comment(struct zip *, zip_uint64_t, int *, int); /* use zip_file_get_comment */ +ZIP_EXTERN int zip_get_num_files(struct zip *); /* use zip_get_num_entries instead */ +ZIP_EXTERN int zip_rename(struct zip *, zip_uint64_t, const char *); /* use zip_file_rename */ +ZIP_EXTERN int zip_replace(struct zip *, zip_uint64_t, struct zip_source *); /* use zip_file_replace */ +ZIP_EXTERN int zip_set_file_comment(struct zip *, zip_uint64_t, const char *, int); /* use zip_file_set_comment */ +#endif + +ZIP_EXTERN int zip_archive_set_tempdir(struct zip *, const char *); +ZIP_EXTERN zip_int64_t zip_file_add(struct zip *, const char *, struct zip_source *, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_dir_add(struct zip *, const char *, zip_flags_t); +ZIP_EXTERN int zip_close(struct zip *); +ZIP_EXTERN void zip_discard(struct zip *); +ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_t); +ZIP_EXTERN int zip_file_extra_field_delete(struct zip *, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_extra_field_delete_by_id(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN void zip_error_clear(struct zip *); +ZIP_EXTERN void zip_error_get(struct zip *, int *, int *); +ZIP_EXTERN int zip_error_get_sys_type(int); +ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int); +ZIP_EXTERN int zip_fclose(struct zip_file *); +ZIP_EXTERN struct zip *zip_fdopen(int, int, int *); +ZIP_EXTERN void zip_file_error_clear(struct zip_file *); +ZIP_EXTERN void zip_file_error_get(struct zip_file *, int *, int *); +ZIP_EXTERN const char *zip_file_strerror(struct zip_file *); +ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, zip_flags_t); +ZIP_EXTERN struct zip_file *zip_fopen_encrypted(struct zip *, const char *, zip_flags_t, const char *); +ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, zip_uint64_t, zip_flags_t); +ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *, zip_uint64_t, zip_flags_t, const char *); +ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t); +ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, zip_flags_t); +ZIP_EXTERN int zip_get_archive_flag(struct zip *, zip_flags_t, zip_flags_t); +ZIP_EXTERN const char *zip_file_get_comment(struct zip *, zip_uint64_t, zip_uint32_t *, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t *, zip_uint16_t *, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get_by_id(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(struct zip *, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(struct zip *, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN const char *zip_get_name(struct zip *, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_get_num_entries(struct zip *, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_name_locate(struct zip *, const char *, zip_flags_t); +ZIP_EXTERN struct zip *zip_open(const char *, int, int *); +ZIP_EXTERN int zip_file_rename(struct zip *, zip_uint64_t, const char *, zip_flags_t); +ZIP_EXTERN int zip_file_replace(struct zip *, zip_uint64_t, struct zip_source *, zip_flags_t); +ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, zip_uint16_t); +ZIP_EXTERN int zip_set_archive_flag(struct zip *, zip_flags_t, int); +ZIP_EXTERN int zip_set_default_password(struct zip *, const char *); +ZIP_EXTERN int zip_file_set_comment(struct zip *, zip_uint64_t, const char *, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_set_file_compression(struct zip *, zip_uint64_t, zip_int32_t, zip_uint32_t); +ZIP_EXTERN int zip_file_extra_field_set(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_uint16_t, zip_flags_t); +ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *, zip_uint64_t, int); +ZIP_EXTERN struct zip_source *zip_source_file(struct zip *, const char *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN struct zip_source *zip_source_filep(struct zip *, FILE *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN void zip_source_free(struct zip_source *); +ZIP_EXTERN struct zip_source *zip_source_function(struct zip *, zip_source_callback, void *); +ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t); +ZIP_EXTERN int zip_stat(struct zip *, const char *, zip_flags_t, struct zip_stat *); +ZIP_EXTERN int zip_stat_index(struct zip *, zip_uint64_t, zip_flags_t, struct zip_stat *); +ZIP_EXTERN void zip_stat_init(struct zip_stat *); +ZIP_EXTERN const char *zip_strerror(struct zip *); +ZIP_EXTERN int zip_unchange(struct zip *, zip_uint64_t); +ZIP_EXTERN int zip_unchange_all(struct zip *); +ZIP_EXTERN int zip_unchange_archive(struct zip *); + END_EXTERN_C(); #endif /* _HAD_ZIP_H */ diff --git a/ext/zip/lib/zip_add.c b/ext/zip/lib/zip_add.c index 6067abbac491f..4bce3fd4af274 100644 --- a/ext/zip/lib/zip_add.c +++ b/ext/zip/lib/zip_add.c @@ -1,6 +1,6 @@ /* zip_add.c -- add file via callback function - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,6 +33,7 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" @@ -44,13 +45,8 @@ ZIP_UINT64_MAX, and each entry is larger than 2 bytes. */ -ZIP_EXTERN(zip_int64_t) +ZIP_EXTERN zip_int64_t zip_add(struct zip *za, const char *name, struct zip_source *source) { - if (name == NULL || source == NULL) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - return _zip_replace(za, ZIP_UINT64_MAX, name, source); + return zip_file_add(za, name, source, 0); } diff --git a/ext/zip/lib/zip_add_dir.c b/ext/zip/lib/zip_add_dir.c index 0a9d7f4863011..22a28bd856253 100644 --- a/ext/zip/lib/zip_add_dir.c +++ b/ext/zip/lib/zip_add_dir.c @@ -1,6 +1,6 @@ /* zip_add_dir.c -- add directory - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,56 +33,15 @@ -#include -#include - +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" /* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ -ZIP_EXTERN(zip_int64_t) +ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *za, const char *name) { - int len; - zip_int64_t ret; - char *s; - struct zip_source *source; - - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; - } - - if (name == NULL) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - s = NULL; - len = strlen(name); - - if (name[len-1] != '/') { - if ((s=(char *)malloc(len+2)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return -1; - } - strcpy(s, name); - s[len] = '/'; - s[len+1] = '\0'; - } - - if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) { - free(s); - return -1; - } - - ret = _zip_replace(za, -1, s ? s : name, source); - - free(s); - if (ret < 0) - zip_source_free(source); - - return ret; + return zip_dir_add(za, name, 0); } diff --git a/ext/zip/lib/zip_add_entry.c b/ext/zip/lib/zip_add_entry.c new file mode 100644 index 0000000000000..3a7e2ccbe920f --- /dev/null +++ b/ext/zip/lib/zip_add_entry.c @@ -0,0 +1,66 @@ +/* + zip_add_entry.c -- create and init struct zip_entry + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include + +#include "zipint.h" + + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_add_entry(struct zip *za) +{ + zip_uint64_t idx; + + if (za->nentry+1 >= za->nentry_alloc) { + struct zip_entry *rentries; + zip_uint64_t nalloc = za->nentry_alloc + 16; + rentries = (struct zip_entry *)realloc(za->entry, sizeof(struct zip_entry) * nalloc); + if (!rentries) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + za->entry = rentries; + za->nentry_alloc = nalloc; + } + + idx = za->nentry++; + + _zip_entry_init(za->entry+idx); + + return (zip_int64_t)idx; +} diff --git a/ext/zip/lib/zip_close.c b/ext/zip/lib/zip_close.c index 576be3b3536fb..c9c7e58088644 100644 --- a/ext/zip/lib/zip_close.c +++ b/ext/zip/lib/zip_close.c @@ -38,6 +38,9 @@ #include #include #include +#ifdef HAVE_STRINGS_H +#include +#endif #include #ifdef HAVE_UNISTD_H #include @@ -49,110 +52,106 @@ #include #endif -static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, - FILE *); -static int copy_data(FILE *, off_t, FILE *, struct zip_error *); + + +/* max deflate size increase: size + ceil(size/16k)*5+6 */ +#define MAX_DEFLATE_SIZE_32 4293656963u + +static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, FILE *); +static int copy_data(FILE *, zip_uint64_t, FILE *, struct zip_error *); static int copy_source(struct zip *, struct zip_source *, FILE *); -static int write_cdir(struct zip *, struct zip_cdir *, FILE *); -static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *); +static int write_cdir(struct zip *, const struct zip_filelist *, zip_uint64_t, FILE *); static char *_zip_create_temp_output(struct zip *, FILE **); static int _zip_torrentzip_cmp(const void *, const void *); -struct filelist { - int idx; - const char *name; -}; - - - -ZIP_EXTERN(int) +ZIP_EXTERN int zip_close(struct zip *za) { - int survivors; - int i, j, error; + zip_uint64_t i, j, survivors; + int error; char *temp; FILE *out; #ifndef PHP_WIN32 mode_t mask; #endif - struct zip_cdir *cd; - struct zip_dirent de; - struct filelist *filelist; + struct zip_filelist *filelist; int reopen_on_error; int new_torrentzip; + int changed; reopen_on_error = 0; if (za == NULL) return -1; - if (!_zip_changed(za, &survivors)) { - _zip_free(za); - return 0; - } + changed = _zip_changed(za, &survivors); /* don't create zip files with no entries */ if (survivors == 0) { - if (za->zn && za->zp) { + if (za->zn && ((za->open_flags & ZIP_TRUNCATE) || (changed && za->zp))) { if (remove(za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_REMOVE, errno); return -1; } } - _zip_free(za); + zip_discard(za); return 0; } - if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors)) - == NULL) - return -1; - - if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) { - free(filelist); - return -1; + if (!changed) { + zip_discard(za); + return 0; } - for (i=0; ientry[i]); + if (survivors > za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((filelist=(struct zip_filelist *)malloc(sizeof(filelist[0])*survivors)) == NULL) + return -1; /* archive comment is special for torrentzip */ if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) { - cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX", - TORRENT_SIG_LEN + TORRENT_CRC_LEN, - &za->error); - if (cd->comment == NULL) { - _zip_cdir_free(cd); - free(filelist); - return -1; - } - cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN; - } - else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) { - if (_zip_cdir_set_comment(cd, za) == -1) { - _zip_cdir_free(cd); + /* XXX: use internal function when zip_set_archive_comment clears TORRENT flag */ + if (zip_set_archive_comment(za, TORRENT_SIG "XXXXXXXX", TORRENT_SIG_LEN + TORRENT_CRC_LEN) < 0) { free(filelist); return -1; } } - - if ((temp=_zip_create_temp_output(za, &out)) == NULL) { - _zip_cdir_free(cd); - free(filelist); - return -1; - } + /* XXX: if no longer torrentzip and archive comment not changed by user, delete it */ /* create list of files with index into original archive */ for (i=j=0; inentry; i++) { - if (za->entry[i].state == ZIP_ST_DELETED) + if (za->entry[i].deleted) continue; + if (j >= survivors) { + free(filelist); + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + filelist[j].idx = i; filelist[j].name = zip_get_name(za, i, 0); j++; } + if (j < survivors) { + free(filelist); + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + + if ((temp=_zip_create_temp_output(za, &out)) == NULL) { + free(filelist); + return -1; + } + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) qsort(filelist, survivors, sizeof(filelist[0]), _zip_torrentzip_cmp); @@ -162,106 +161,49 @@ zip_close(struct zip *za) ZIP_FL_UNCHANGED) == 0); error = 0; for (j=0; jentry+i; - _zip_dirent_init(&de); + new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || new_torrentzip || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD)); /* create new local directory entry */ - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { - - if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) - _zip_dirent_torrent_normalize(&de); - - /* use it as central directory entry */ - memcpy(cd->entry+j, &de, sizeof(cd->entry[j])); - - /* set/update file name */ - if (za->entry[i].ch_filename == NULL) { - if (za->entry[i].state == ZIP_ST_ADDED) { - de.filename = strdup("-"); - de.filename_len = 1; - cd->entry[j].filename = "-"; - cd->entry[j].filename_len = 1; - } - else { - de.filename = strdup(za->cdir->entry[i].filename); - de.filename_len = strlen(de.filename); - cd->entry[j].filename = za->cdir->entry[i].filename; - cd->entry[j].filename_len = de.filename_len; - } + if (entry->changes == NULL) { + if ((entry->changes=_zip_dirent_clone(entry->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + error = 1; + break; } } - else { - /* copy existing directory entries */ - if ((NULL == za->zp) || (fseeko(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0)) { - _zip_error_set(&za->error, ZIP_ER_SEEK, errno); - error = 1; - break; - } - if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, - &za->error) != 0) { - error = 1; - break; - } - memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j])); - if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { - de.crc = za->cdir->entry[i].crc; - de.comp_size = za->cdir->entry[i].comp_size; - de.uncomp_size = za->cdir->entry[i].uncomp_size; - de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; - cd->entry[j].bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; - } - } + de = entry->changes; - if (za->entry[i].ch_filename) { - free(de.filename); - if ((de.filename=strdup(za->entry[i].ch_filename)) == NULL) { - error = 1; - break; - } - de.filename_len = strlen(de.filename); - cd->entry[j].filename = za->entry[i].ch_filename; - cd->entry[j].filename_len = de.filename_len; + if (_zip_read_local_ef(za, i) < 0) { + error = 1; + break; } - if (za->entry[i].ch_extra_len != -1) { - free(de.extrafield); - if ((de.extrafield=malloc(za->entry[i].ch_extra_len)) == NULL) { - error = 1; - break; - } - memcpy(de.extrafield, za->entry[i].ch_extra, za->entry[i].ch_extra_len); - de.extrafield_len = za->entry[i].ch_extra_len; - /* as the rest of cd entries, its malloc/free is done by za */ - /* TODO unsure if this should also be set in the CD -- - * not done for now - cd->entry[j].extrafield = za->entry[i].ch_extra; - cd->entry[j].extrafield_len = za->entry[i].ch_extra_len; - */ - } + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(entry->changes); - if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0 - && za->entry[i].ch_comment_len != -1) { - /* as the rest of cd entries, its malloc/free is done by za */ - cd->entry[j].comment = za->entry[i].ch_comment; - cd->entry[j].comment_len = za->entry[i].ch_comment_len; - } - cd->entry[j].offset = ftello(out); + de->offset = (zip_uint64_t)ftello(out); /* XXX: check for errors */ - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { + if (new_data) { struct zip_source *zs; zs = NULL; - if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { - if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) - == NULL) { + if (!ZIP_ENTRY_DATA_CHANGED(entry)) { + if ((zs=_zip_source_zip_new(za, za, i, ZIP_FL_UNCHANGED, 0, 0, NULL)) == NULL) { error = 1; break; } } - if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) { + /* add_data writes dirent */ + if (add_data(za, zs ? zs : entry->source, de, out) < 0) { error = 1; if (zs) zip_source_free(zs); @@ -269,51 +211,49 @@ zip_close(struct zip *za) } if (zs) zip_source_free(zs); - - cd->entry[j].last_mod = de.last_mod; - cd->entry[j].comp_method = de.comp_method; - cd->entry[j].comp_size = de.comp_size; - cd->entry[j].uncomp_size = de.uncomp_size; - cd->entry[j].crc = de.crc; } else { - if (_zip_dirent_write(&de, out, 1, &za->error) < 0) { + zip_uint64_t offset; + + /* when copying data, all sizes are known -> no data descriptor needed */ + de->bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; + if (_zip_dirent_write(de, out, ZIP_FL_LOCAL, &za->error) < 0) { error = 1; break; } - /* we just read the local dirent, file is at correct position */ - if (copy_data(za->zp, cd->entry[j].comp_size, out, - &za->error) < 0) { + if ((offset=_zip_file_get_offset(za, i, &za->error)) == 0) { + error = 1; + break; + } + if ((fseek(za->zp, (off_t)offset, SEEK_SET) < 0)) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + error = 1; + break; + } + if (copy_data(za->zp, de->comp_size, out, &za->error) < 0) { error = 1; break; } } - - _zip_dirent_finalize(&de); } - free(filelist); - if (!error) { - if (write_cdir(za, cd, out) < 0) + if (write_cdir(za, filelist, survivors, out) < 0) error = 1; } - /* pointers in cd entries are owned by za */ - cd->nentry = 0; - _zip_cdir_free(cd); + free(filelist); if (error) { - _zip_dirent_finalize(&de); fclose(out); - remove(temp); + (void)remove(temp); free(temp); return -1; } if (fclose(out) != 0) { _zip_error_set(&za->error, ZIP_ER_CLOSE, errno); - remove(temp); + (void)remove(temp); free(temp); return -1; } @@ -325,7 +265,7 @@ zip_close(struct zip *za) } if (_zip_rename(temp, za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_RENAME, errno); - remove(temp); + (void)remove(temp); free(temp); if (reopen_on_error) { /* ignore errors, since we're already in an error case */ @@ -339,56 +279,112 @@ zip_close(struct zip *za) chmod(za->zn, 0666&~mask); #endif - _zip_free(za); - free(temp); - + zip_discard(za); + free(temp); + return 0; } static int -add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, - FILE *ft) +add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, FILE *ft) { off_t offstart, offdata, offend; struct zip_stat st; struct zip_source *s2; - zip_compression_implementation comp_impl; int ret; + int is_zip64; + zip_flags_t flags; if (zip_source_stat(src, &st) < 0) { _zip_error_set_from_source(&za->error, src); return -1; } + if ((st.valid & ZIP_STAT_COMP_METHOD) == 0) { + st.valid |= ZIP_STAT_COMP_METHOD; + st.comp_method = ZIP_CM_STORE; + } + + if (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != ZIP_CM_STORE) + de->comp_method = st.comp_method; + else if (de->comp_method == ZIP_CM_STORE && (st.valid & ZIP_STAT_SIZE)) { + st.valid |= ZIP_STAT_COMP_SIZE; + st.comp_size = st.size; + } + else { + /* we'll recompress */ + st.valid &= ~ZIP_STAT_COMP_SIZE; + } + + + flags = ZIP_EF_LOCAL; + + if ((st.valid & ZIP_STAT_SIZE) == 0) + flags |= ZIP_FL_FORCE_ZIP64; + else { + de->uncomp_size = st.size; + + if ((st.valid & ZIP_STAT_COMP_SIZE) == 0) { + if (( ((de->comp_method == ZIP_CM_DEFLATE || ZIP_CM_IS_DEFAULT(de->comp_method)) && st.size > MAX_DEFLATE_SIZE_32) + || (de->comp_method != ZIP_CM_STORE && de->comp_method != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(de->comp_method)))) + flags |= ZIP_FL_FORCE_ZIP64; + } + else + de->comp_size = st.comp_size; + } + + offstart = ftello(ft); - if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + /* as long as we don't support non-seekable output, clear data descriptor bit */ + de->bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; + if ((is_zip64=_zip_dirent_write(de, ft, flags, &za->error)) < 0) return -1; - if ((s2=zip_source_crc(za, src, 0)) == NULL) { - zip_source_pop(s2); - return -1; - } - - /* XXX: deflate 0-byte files for torrentzip? */ - if (((st.valid & ZIP_STAT_COMP_METHOD) == 0 - || st.comp_method == ZIP_CM_STORE) - && ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) { - comp_impl = NULL; - if ((comp_impl=zip_get_compression_implementation(ZIP_CM_DEFLATE)) - == NULL) { - _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); - zip_source_pop(s2); - return -1; + + if (st.comp_method == ZIP_CM_STORE || (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != de->comp_method)) { + struct zip_source *s_store, *s_crc; + zip_compression_implementation comp_impl; + + if (st.comp_method != ZIP_CM_STORE) { + if ((comp_impl=_zip_get_compression_implementation(st.comp_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return -1; + } + if ((s_store=comp_impl(za, src, st.comp_method, ZIP_CODEC_DECODE)) == NULL) { + /* error set by comp_impl */ + return -1; + } } - if ((s2=comp_impl(za, s2, ZIP_CM_DEFLATE, ZIP_CODEC_ENCODE)) - == NULL) { - /* XXX: set error? */ - zip_source_pop(s2); + else + s_store = src; + + if ((s_crc=zip_source_crc(za, s_store, 0)) == NULL) { + if (s_store != src) + zip_source_pop(s_store); return -1; } + + /* XXX: deflate 0-byte files for torrentzip? */ + if (de->comp_method != ZIP_CM_STORE && ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) { + if ((comp_impl=_zip_get_compression_implementation(de->comp_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + zip_source_pop(s_crc); + if (s_store != src) + zip_source_pop(s_store); + return -1; + } + if ((s2=comp_impl(za, s_crc, de->comp_method, ZIP_CODEC_ENCODE)) == NULL) { + zip_source_pop(s_crc); + if (s_store != src) + zip_source_pop(s_store); + return -1; + } + } + else + s2 = s_crc; } else s2 = src; @@ -418,18 +414,33 @@ add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, return -1; } - de->last_mod = st.mtime; + if ((st.valid & (ZIP_STAT_COMP_METHOD|ZIP_STAT_CRC|ZIP_STAT_SIZE)) != (ZIP_STAT_COMP_METHOD|ZIP_STAT_CRC|ZIP_STAT_SIZE)) { + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if (st.valid & ZIP_STAT_MTIME) + de->last_mod = st.mtime; + else + time(&de->last_mod); de->comp_method = st.comp_method; de->crc = st.crc; de->uncomp_size = st.size; - de->comp_size = offend - offdata; + de->comp_size = (zip_uint64_t)(offend - offdata); if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) _zip_dirent_torrent_normalize(de); - if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + if ((ret=_zip_dirent_write(de, ft, flags, &za->error)) < 0) return -1; - + + if (is_zip64 != ret) { + /* Zip64 mismatch between preliminary file header written before data and final file header written afterwards */ + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if (fseeko(ft, offend, SEEK_SET) < 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return -1; @@ -441,24 +452,26 @@ add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, static int -copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error) +copy_data(FILE *fs, zip_uint64_t len, FILE *ft, struct zip_error *error) { char buf[BUFSIZE]; - int n, nn; + size_t n, nn; if (len == 0) return 0; while (len > 0) { nn = len > sizeof(buf) ? sizeof(buf) : len; - if ((n=fread(buf, 1, nn, fs)) < 0) { - _zip_error_set(error, ZIP_ER_READ, errno); - return -1; - } - else if (n == 0) { - _zip_error_set(error, ZIP_ER_EOF, 0); - return -1; - } + if ((n=fread(buf, 1, nn, fs)) == 0) { + if (ferror(fs)) { + _zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + else { + _zip_error_set(error, ZIP_ER_EOF, 0); + return -1; + } + } if (fwrite(buf, 1, n, ft) != (size_t)n) { _zip_error_set(error, ZIP_ER_WRITE, errno); @@ -487,7 +500,7 @@ copy_source(struct zip *za, struct zip_source *src, FILE *ft) ret = 0; while ((n=zip_source_read(src, buf, sizeof(buf))) > 0) { - if (fwrite(buf, 1, n, ft) != (size_t)n) { + if (fwrite(buf, 1, (size_t)n, ft) != (size_t)n) { _zip_error_set(&za->error, ZIP_ER_WRITE, errno); ret = -1; break; @@ -508,29 +521,32 @@ copy_source(struct zip *za, struct zip_source *src, FILE *ft) static int -write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) +write_cdir(struct zip *za, const struct zip_filelist *filelist, zip_uint64_t survivors, FILE *out) { - off_t offset; + off_t cd_start, end; + zip_int64_t size; uLong crc; char buf[TORRENT_CRC_LEN+1]; - if (_zip_cdir_write(cd, out, &za->error) < 0) + cd_start = ftello(out); + + if ((size=_zip_cdir_write(za, filelist, survivors, out)) < 0) return -1; + end = ftello(out); + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0) return 0; /* fix up torrentzip comment */ - offset = ftello(out); - - if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0) + if (_zip_filerange_crc(out, cd_start, size, &crc, &za->error) < 0) return -1; snprintf(buf, sizeof(buf), "%08lX", (long)crc); - if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) { + if (fseeko(out, end-TORRENT_CRC_LEN, SEEK_SET) < 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return -1; } @@ -545,47 +561,22 @@ write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) -static int -_zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src) -{ - if (src->ch_comment_len != -1) { - dest->comment = _zip_memdup(src->ch_comment, - src->ch_comment_len, &src->error); - if (dest->comment == NULL) - return -1; - dest->comment_len = src->ch_comment_len; - } else { - if (src->cdir && src->cdir->comment) { - dest->comment = _zip_memdup(src->cdir->comment, - src->cdir->comment_len, &src->error); - if (dest->comment == NULL) - return -1; - dest->comment_len = src->cdir->comment_len; - } - } - - return 0; -} - - - int -_zip_changed(struct zip *za, int *survivorsp) +_zip_changed(const struct zip *za, zip_uint64_t *survivorsp) { - int changed, i, survivors; + int changed; + zip_uint64_t i, survivors; - changed = survivors = 0; + changed = 0; + survivors = 0; - if (za->ch_comment_len != -1 - || za->ch_flags != za->flags) + if (za->comment_changed || za->ch_flags != za->flags) changed = 1; for (i=0; inentry; i++) { - if ((za->entry[i].state != ZIP_ST_UNCHANGED) - || (za->entry[i].ch_extra_len != -1) - || (za->entry[i].ch_comment_len != -1)) + if (za->entry[i].deleted || za->entry[i].source || (za->entry[i].changes && za->entry[i].changes->changed != 0)) changed = 1; - if (za->entry[i].state != ZIP_ST_DELETED) + if (!za->entry[i].deleted) survivors++; } @@ -603,14 +594,21 @@ _zip_create_temp_output(struct zip *za, FILE **outp) char *temp; int tfd; FILE *tfp; - int len = strlen(za->zn) + 8; - - if ((temp=(char *)malloc(len)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return NULL; + + if (za->tempdir) { + if ((temp=(char *)malloc(strlen(za->tempdir)+13)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + sprintf(temp, "%s/.zip.XXXXXX", za->tempdir); + } + else { + if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + sprintf(temp, "%s.XXXXXX", za->zn); } - - snprintf(temp, len, "%s.XXXXXX", za->zn); if ((tfd=mkstemp(temp)) == -1) { _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); @@ -621,7 +619,7 @@ _zip_create_temp_output(struct zip *za, FILE **outp) if ((tfp=fdopen(tfd, "r+b")) == NULL) { _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); close(tfd); - remove(temp); + (void)remove(temp); free(temp); return NULL; } @@ -630,7 +628,7 @@ _zip_create_temp_output(struct zip *za, FILE **outp) According to Pierre Joye, Windows in some environments per default creates text files, so force binary mode. */ - _setmode(_fileno(tfp), _O_BINARY ); + _setmode(_fileno(tfp), _O_BINARY ); #endif *outp = tfp; @@ -642,6 +640,13 @@ _zip_create_temp_output(struct zip *za, FILE **outp) static int _zip_torrentzip_cmp(const void *a, const void *b) { - return strcasecmp(((const struct filelist *)a)->name, - ((const struct filelist *)b)->name); + const char *aname = ((const struct zip_filelist *)a)->name; + const char *bname = ((const struct zip_filelist *)b)->name; + + if (aname == NULL) + return (bname != NULL) * -1; + else if (bname == NULL) + return 1; + + return strcasecmp(aname, bname); } diff --git a/ext/zip/lib/zip_delete.c b/ext/zip/lib/zip_delete.c index 131d444124c4b..cb769367cc6f6 100644 --- a/ext/zip/lib/zip_delete.c +++ b/ext/zip/lib/zip_delete.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_delete(struct zip *za, zip_uint64_t idx) { if (idx >= za->nentry) { @@ -55,7 +55,7 @@ zip_delete(struct zip *za, zip_uint64_t idx) if (_zip_unchange(za, idx, 1) != 0) return -1; - za->entry[idx].state = ZIP_ST_DELETED; + za->entry[idx].deleted = 1; return 0; } diff --git a/ext/zip/lib/zip_entry_new.c b/ext/zip/lib/zip_dir_add.c similarity index 61% rename from ext/zip/lib/zip_entry_new.c rename to ext/zip/lib/zip_dir_add.c index ad5d59975a927..0a74bd608764e 100644 --- a/ext/zip/lib/zip_entry_new.c +++ b/ext/zip/lib/zip_dir_add.c @@ -1,6 +1,6 @@ /* - zip_entry_new.c -- create and init struct zip_entry - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + zip_dir_add.c -- add directory + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -34,48 +34,55 @@ #include +#include #include "zipint.h" -struct zip_entry * -_zip_entry_new(struct zip *za) +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +ZIP_EXTERN zip_int64_t +zip_dir_add(struct zip *za, const char *name, zip_flags_t flags) { - struct zip_entry *ze; - if (!za) { - ze = (struct zip_entry *)malloc(sizeof(struct zip_entry)); - if (!ze) { - return NULL; - } + size_t len; + zip_int64_t ret; + char *s; + struct zip_source *source; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; } - else { - if (za->nentry+1 >= za->nentry_alloc) { - struct zip_entry *rentries; - za->nentry_alloc += 16; - rentries = (struct zip_entry *)realloc(za->entry, - sizeof(struct zip_entry) - * za->nentry_alloc); - if (!rentries) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return NULL; - } - za->entry = rentries; - } - ze = za->entry+za->nentry; + + if (name == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; } - ze->state = ZIP_ST_UNCHANGED; + s = NULL; + len = strlen(name); - ze->ch_filename = NULL; - ze->ch_extra = NULL; - ze->ch_extra_len = -1; - ze->ch_comment = NULL; - ze->ch_comment_len = -1; - ze->source = NULL; + if (name[len-1] != '/') { + if ((s=(char *)malloc(len+2)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + strcpy(s, name); + s[len] = '/'; + s[len+1] = '\0'; + } + + if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) { + free(s); + return -1; + } + + ret = _zip_file_replace(za, ZIP_UINT64_MAX, s ? s : name, source, flags); - if (za) - za->nentry++; + free(s); + if (ret < 0) + zip_source_free(source); - return ze; + return ret; } diff --git a/ext/zip/lib/zip_dirent.c b/ext/zip/lib/zip_dirent.c index b9dac5c989e32..f4f2deb6fc5b9 100644 --- a/ext/zip/lib/zip_dirent.c +++ b/ext/zip/lib/zip_dirent.c @@ -1,6 +1,6 @@ /* zip_dirent.c -- read directory entry (local or central), clean dirent - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -42,48 +42,54 @@ #include "zipint.h" -static time_t _zip_d2u_time(int, int); -static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *); -static char *_zip_readstr(unsigned char **, int, int, struct zip_error *); -static void _zip_write2(unsigned short, FILE *); -static void _zip_write4(unsigned int, FILE *); +static time_t _zip_d2u_time(zip_uint16_t, zip_uint16_t); +static struct zip_string *_zip_read_string(const unsigned char **, FILE *, zip_uint16_t, int, struct zip_error *); +static struct zip_string *_zip_dirent_process_ef_utf_8(const struct zip_dirent *, zip_uint16_t, struct zip_string *); +static struct zip_extra_field *_zip_ef_utf8(zip_uint16_t, struct zip_string *, struct zip_error *); void _zip_cdir_free(struct zip_cdir *cd) { - int i; + zip_uint64_t i; if (!cd) return; for (i=0; inentry; i++) - _zip_dirent_finalize(cd->entry+i); - free(cd->comment); + _zip_entry_finalize(cd->entry+i); free(cd->entry); + _zip_string_free(cd->comment); free(cd); } int -_zip_cdir_grow(struct zip_cdir *cd, int nentry, struct zip_error *error) +_zip_cdir_grow(struct zip_cdir *cd, zip_uint64_t nentry, struct zip_error *error) { - struct zip_dirent *entry; + struct zip_entry *entry; + zip_uint64_t i; - if (nentry < cd->nentry) { + if (nentry < cd->nentry_alloc) { _zip_error_set(error, ZIP_ER_INTERNAL, 0); return -1; } - if ((entry=((struct zip_dirent *) + if (nentry == cd->nentry_alloc) + return 0; + + if ((entry=((struct zip_entry *) realloc(cd->entry, sizeof(*(cd->entry))*nentry))) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return -1; } + + for (i=cd->nentry_alloc; inentry = nentry; + cd->nentry_alloc = nentry; cd->entry = entry; return 0; @@ -92,64 +98,132 @@ _zip_cdir_grow(struct zip_cdir *cd, int nentry, struct zip_error *error) struct zip_cdir * -_zip_cdir_new(int nentry, struct zip_error *error) +_zip_cdir_new(zip_uint64_t nentry, struct zip_error *error) { struct zip_cdir *cd; + zip_uint64_t i; if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } - if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry)) - == NULL) { + if (nentry == 0) + cd->entry = NULL; + else if ((cd->entry=(struct zip_entry *)malloc(sizeof(*(cd->entry))*nentry)) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); free(cd); return NULL; } - /* entries must be initialized by caller */ + for (i=0; ientry+i); - cd->nentry = nentry; + cd->nentry = cd->nentry_alloc = nentry; cd->size = cd->offset = 0; cd->comment = NULL; - cd->comment_len = 0; return cd; } -int -_zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) +zip_int64_t +_zip_cdir_write(struct zip *za, const struct zip_filelist *filelist, zip_uint64_t survivors, FILE *fp) { - int i; + off_t off; + zip_uint64_t offset, size; + struct zip_string *comment; + zip_uint64_t i; + int is_zip64; + int ret; + + if ((off=ftello(fp)) < 0) { + _zip_error_set(&za->error, ZIP_ER_READ, errno); + return -1; + } + offset = (zip_uint64_t)off; - cd->offset = ftello(fp); + is_zip64 = 0; - for (i=0; inentry; i++) { - if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0) + for (i=0; ientry+filelist[i].idx; + + if ((ret=_zip_dirent_write(entry->changes ? entry->changes : entry->orig, fp, ZIP_FL_CENTRAL, &za->error)) < 0) return -1; + if (ret) + is_zip64 = 1; + } + + if ((off=ftello(fp)) < 0) { + _zip_error_set(&za->error, ZIP_ER_READ, errno); + return -1; + } + size = (zip_uint64_t)off - offset; + + if (offset > ZIP_UINT32_MAX || survivors > ZIP_UINT16_MAX) + is_zip64 = 1; + + if (is_zip64) { + fwrite(EOCD64_MAGIC, 1, 4, fp); + _zip_write8(EOCD64LEN-12, fp); + _zip_write2(45, fp); + _zip_write2(45, fp); + _zip_write4(0, fp); + _zip_write4(0, fp); + _zip_write8(survivors, fp); + _zip_write8(survivors, fp); + _zip_write8(size, fp); + _zip_write8(offset, fp); + + fwrite(EOCD64LOC_MAGIC, 1, 4, fp); + _zip_write4(0, fp); + _zip_write8(offset+size, fp); + _zip_write4(1, fp); + } - cd->size = ftello(fp) - cd->offset; - /* clearerr(fp); */ fwrite(EOCD_MAGIC, 1, 4, fp); _zip_write4(0, fp); - _zip_write2((unsigned short)cd->nentry, fp); - _zip_write2((unsigned short)cd->nentry, fp); - _zip_write4(cd->size, fp); - _zip_write4(cd->offset, fp); - _zip_write2(cd->comment_len, fp); - fwrite(cd->comment, 1, cd->comment_len, fp); + _zip_write2(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : (zip_uint16_t)survivors, fp); + _zip_write2(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : (zip_uint16_t)survivors, fp); + _zip_write4(size >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)size, fp); + _zip_write4(offset >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)offset, fp); + + comment = za->comment_changed ? za->comment_changes : za->comment_orig; + + _zip_write2(comment ? comment->length : 0, fp); + if (comment) + fwrite(comment->raw, 1, comment->length, fp); if (ferror(fp)) { - _zip_error_set(error, ZIP_ER_WRITE, errno); + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); return -1; } - return 0; + return (zip_int64_t)size; +} + + + +struct zip_dirent * +_zip_dirent_clone(const struct zip_dirent *sde) +{ + struct zip_dirent *tde; + + if ((tde=(struct zip_dirent *)malloc(sizeof(*tde))) == NULL) + return NULL; + + if (sde) + memcpy(tde, sde, sizeof(*sde)); + else + _zip_dirent_init(tde); + + tde->changed = 0; + tde->cloned = 1; + + return tde; } @@ -157,18 +231,24 @@ _zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) void _zip_dirent_finalize(struct zip_dirent *zde) { - if (zde->filename_len > 0) { - free(zde->filename); - } - zde->filename = NULL; - if (zde->extrafield_len > 0) { - free(zde->extrafield); - } - zde->extrafield = NULL; - if (zde->comment_len > 0) { - free(zde->comment); - } - zde->comment = NULL; + if (!zde->cloned || zde->changed & ZIP_DIRENT_FILENAME) + _zip_string_free(zde->filename); + if (!zde->cloned || zde->changed & ZIP_DIRENT_EXTRA_FIELD) + _zip_ef_free(zde->extra_fields); + if (!zde->cloned || zde->changed & ZIP_DIRENT_COMMENT) + _zip_string_free(zde->comment); +} + + + +void +_zip_dirent_free(struct zip_dirent *zde) +{ + if (zde == NULL) + return; + + _zip_dirent_finalize(zde); + free(zde); } @@ -176,20 +256,21 @@ _zip_dirent_finalize(struct zip_dirent *zde) void _zip_dirent_init(struct zip_dirent *de) { - de->version_madeby = 0; + de->changed = 0; + de->local_extra_fields_read = 0; + de->cloned = 0; + + de->version_madeby = 20; de->version_needed = 20; /* 2.0 */ de->bitflags = 0; - de->comp_method = 0; + de->comp_method = ZIP_CM_DEFAULT; de->last_mod = 0; de->crc = 0; de->comp_size = 0; de->uncomp_size = 0; de->filename = NULL; - de->filename_len = 0; - de->extrafield = NULL; - de->extrafield_len = 0; + de->extra_fields = NULL; de->comment = NULL; - de->comment_len = 0; de->disk_number = 0; de->int_attrib = 0; de->ext_attrib = 0; @@ -198,6 +279,32 @@ _zip_dirent_init(struct zip_dirent *de) +int +_zip_dirent_needs_zip64(const struct zip_dirent *de, zip_flags_t flags) +{ + if (de->uncomp_size >= ZIP_UINT32_MAX || de->comp_size >= ZIP_UINT32_MAX + || ((flags & ZIP_FL_CENTRAL) && de->offset >= ZIP_UINT32_MAX)) + return 1; + + return 0; +} + + + +struct zip_dirent * +_zip_dirent_new(void) +{ + struct zip_dirent *de; + + if ((de=(struct zip_dirent *)malloc(sizeof(*de))) == NULL) + return NULL; + + _zip_dirent_init(de); + return de; +} + + + /* _zip_dirent_read(zde, fp, bufp, left, localp, error): Fills the zip directory entry zde. @@ -218,13 +325,14 @@ _zip_dirent_init(struct zip_dirent *de) int _zip_dirent_read(struct zip_dirent *zde, FILE *fp, - unsigned char **bufp, zip_uint32_t *leftp, int local, + const unsigned char **bufp, zip_uint64_t *leftp, int local, struct zip_error *error) { unsigned char buf[CDENTRYSIZE]; - unsigned char *cur; - unsigned short dostime, dosdate; + const unsigned char *cur; + zip_uint16_t dostime, dosdate; zip_uint32_t size; + zip_uint16_t filename_len, comment_len, ef_len; if (local) size = LENTRYSIZE; @@ -255,9 +363,10 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, } cur += 4; - + /* convert buffercontents to zip_dirent */ - + + _zip_dirent_init(zde); if (!local) zde->version_madeby = _zip_read2(&cur); else @@ -275,17 +384,17 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, zde->comp_size = _zip_read4(&cur); zde->uncomp_size = _zip_read4(&cur); - zde->filename_len = _zip_read2(&cur); - zde->extrafield_len = _zip_read2(&cur); + filename_len = _zip_read2(&cur); + ef_len = _zip_read2(&cur); if (local) { - zde->comment_len = 0; + comment_len = 0; zde->disk_number = 0; zde->int_attrib = 0; zde->ext_attrib = 0; zde->offset = 0; } else { - zde->comment_len = _zip_read2(&cur); + comment_len = _zip_read2(&cur); zde->disk_number = _zip_read2(&cur); zde->int_attrib = _zip_read2(&cur); zde->ext_attrib = _zip_read4(&cur); @@ -293,56 +402,102 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, } zde->filename = NULL; - zde->extrafield = NULL; + zde->extra_fields = NULL; zde->comment = NULL; - size += zde->filename_len+zde->extrafield_len+zde->comment_len; + size += filename_len+ef_len+comment_len; if (leftp && (*leftp < size)) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); + _zip_error_set(error, ZIP_ER_INCONS, 0); return -1; } - if (bufp) { - if (zde->filename_len) { - zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error); - if (!zde->filename) - return -1; - } + if (filename_len) { + zde->filename = _zip_read_string(bufp ? &cur : NULL, fp, filename_len, 1, error); + if (!zde->filename) + return -1; - if (zde->extrafield_len) { - zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0, - error); - if (!zde->extrafield) + if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { + if (_zip_guess_encoding(zde->filename, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { + _zip_error_set(error, ZIP_ER_INCONS, 0); return -1; + } } + } - if (zde->comment_len) { - zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error); - if (!zde->comment) - return -1; + if (ef_len) { + zip_uint8_t *ef = _zip_read_data(bufp ? &cur : NULL, fp, ef_len, 0, error); + + if (ef == NULL) + return -1; + if ((zde->extra_fields=_zip_ef_parse(ef, ef_len, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error)) == NULL) { + free(ef); + return -1; } + free(ef); + if (local) + zde->local_extra_fields_read = 1; } - else { - if (zde->filename_len) { - zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error); - if (!zde->filename) - return -1; - } - if (zde->extrafield_len) { - zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0, - error); - if (!zde->extrafield) + if (comment_len) { + zde->comment = _zip_read_string(bufp ? &cur : NULL, fp, comment_len, 0, error); + if (!zde->comment) + return -1; + + if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { + if (_zip_guess_encoding(zde->comment, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { + _zip_error_set(error, ZIP_ER_INCONS, 0); return -1; + } } + } - if (zde->comment_len) { - zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error); - if (!zde->comment) - return -1; + zde->filename = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_NAME, zde->filename); + zde->comment = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_COMMENT, zde->comment); + + /* Zip64 */ + + if (zde->uncomp_size == ZIP_UINT32_MAX || zde->comp_size == ZIP_UINT32_MAX || zde->offset == ZIP_UINT32_MAX) { + zip_uint16_t got_len, needed_len; + const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error); + /* XXX: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */ + if (ef == NULL) + return -1; + + + if (local) + needed_len = 16; + else + needed_len = ((zde->uncomp_size == ZIP_UINT32_MAX) + (zde->comp_size == ZIP_UINT32_MAX) + (zde->offset == ZIP_UINT32_MAX)) * 8 + + (zde->disk_number == ZIP_UINT16_MAX) * 4; + + if (got_len != needed_len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return -1; } + + if (zde->uncomp_size == ZIP_UINT32_MAX) + zde->uncomp_size = _zip_read8(&ef); + else if (local) + ef += 8; + if (zde->comp_size == ZIP_UINT32_MAX) + zde->comp_size = _zip_read8(&ef); + if (!local) { + if (zde->offset == ZIP_UINT32_MAX) + zde->offset = _zip_read8(&ef); + if (zde->disk_number == ZIP_UINT16_MAX) + zde->disk_number = _zip_read4(&ef); + } + } + + if (!local) { + if (zde->offset > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return -1; + } } + + zde->extra_fields = _zip_ef_remove_internal(zde->extra_fields); if (bufp) *bufp = cur; @@ -354,6 +509,65 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, +static struct zip_string * +_zip_dirent_process_ef_utf_8(const struct zip_dirent *de, zip_uint16_t id, struct zip_string *str) +{ + zip_uint16_t ef_len; + zip_uint32_t ef_crc; + + const zip_uint8_t *ef = _zip_ef_get_by_id(de->extra_fields, &ef_len, id, 0, ZIP_EF_BOTH, NULL); + + if (ef == NULL || ef_len < 5 || ef[0] != 1) + return str; + + ef++; + ef_crc = _zip_read4(&ef); + + if (_zip_string_crc32(str) == ef_crc) { + struct zip_string *ef_str = _zip_string_new(ef, ef_len-5, ZIP_ENCODING_UTF8_KNOWN, NULL); + + if (ef_str != NULL) { + _zip_string_free(str); + str = ef_str; + } + } + + return str; +} + + + +zip_int32_t +_zip_dirent_size(FILE *f, zip_uint16_t flags, struct zip_error *error) +{ + zip_int32_t size; + int local = (flags & ZIP_EF_LOCAL); + int i; + unsigned char b[6]; + const unsigned char *p; + + size = local ? LENTRYSIZE : CDENTRYSIZE; + + if (fseek(f, local ? 26 : 28, SEEK_CUR) < 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fread(b, (local ? 4 : 6), 1, f) != 1) { + _zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + + p = b; + for (i=0; i<(local ? 2 : 3); i++) { + size += _zip_read2(&p); + } + + return size; +} + + + /* _zip_dirent_torrent_normalize(de); Set values suitable for torrentzip. */ @@ -399,84 +613,157 @@ _zip_dirent_torrent_normalize(struct zip_dirent *de) de->disk_number = 0; de->int_attrib = 0; de->ext_attrib = 0; - de->offset = 0; - free(de->extrafield); - de->extrafield = NULL; - de->extrafield_len = 0; - free(de->comment); + _zip_ef_free(de->extra_fields); + de->extra_fields = NULL; + _zip_string_free(de->comment); de->comment = NULL; - de->comment_len = 0; } -/* _zip_dirent_write(zde, fp, localp, error): +/* _zip_dirent_write(zde, fp, flags, error): Writes zip directory entry zde to file fp. - If localp != 0, it writes a local header instead of a central - directory entry. + If flags & ZIP_EF_LOCAL, it writes a local header instead of a central + directory entry. If flags & ZIP_EF_FORCE_ZIP64, a ZIP64 extra field is written, even if not needed. - Returns 0 if successful. On error, error is filled in and -1 is + Returns 0 if successful, 1 if successful and wrote ZIP64 extra field. On error, error is filled in and -1 is returned. */ int -_zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, - struct zip_error *error) +_zip_dirent_write(struct zip_dirent *de, FILE *fp, zip_flags_t flags, struct zip_error *error) { unsigned short dostime, dosdate; + enum zip_encoding_type com_enc, name_enc; + struct zip_extra_field *ef; + zip_uint8_t ef_zip64[24], *ef_zip64_p; + int is_zip64; + int is_really_zip64; + + ef = NULL; - fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); + is_zip64 = 0; - if (!localp) - _zip_write2(zde->version_madeby, fp); - _zip_write2(zde->version_needed, fp); - _zip_write2(zde->bitflags, fp); - _zip_write2(zde->comp_method, fp); + fwrite((flags & ZIP_FL_LOCAL) ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); - _zip_u2d_time(zde->last_mod, &dostime, &dosdate); + name_enc = _zip_guess_encoding(de->filename, ZIP_ENCODING_UNKNOWN); + com_enc = _zip_guess_encoding(de->comment, ZIP_ENCODING_UNKNOWN); + + if ((name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_ASCII) || + (name_enc == ZIP_ENCODING_ASCII && com_enc == ZIP_ENCODING_UTF8_KNOWN) || + (name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_UTF8_KNOWN)) + de->bitflags |= ZIP_GPBF_ENCODING_UTF_8; + else { + de->bitflags &= ~ZIP_GPBF_ENCODING_UTF_8; + if (name_enc == ZIP_ENCODING_UTF8_KNOWN) { + ef = _zip_ef_utf8(ZIP_EF_UTF_8_NAME, de->filename, error); + if (ef == NULL) + return -1; + } + if ((flags & ZIP_FL_LOCAL) == 0 && com_enc == ZIP_ENCODING_UTF8_KNOWN){ + struct zip_extra_field *ef2 = _zip_ef_utf8(ZIP_EF_UTF_8_COMMENT, de->comment, error); + if (ef2 == NULL) { + _zip_ef_free(ef); + return -1; + } + ef2->next = ef; + ef = ef2; + } + } + + ef_zip64_p = ef_zip64; + if (flags & ZIP_FL_LOCAL) { + if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX) { + _zip_poke8(de->comp_size, &ef_zip64_p); + _zip_poke8(de->uncomp_size, &ef_zip64_p); + } + } + else { + if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX || de->offset > ZIP_UINT32_MAX) { + if (de->comp_size >= ZIP_UINT32_MAX) + _zip_poke8(de->comp_size, &ef_zip64_p); + if (de->uncomp_size >= ZIP_UINT32_MAX) + _zip_poke8(de->uncomp_size, &ef_zip64_p); + if (de->offset >= ZIP_UINT32_MAX) + _zip_poke8(de->offset, &ef_zip64_p); + } + } + + if (ef_zip64_p != ef_zip64) { + struct zip_extra_field *ef64 = _zip_ef_new(ZIP_EF_ZIP64, (zip_uint16_t)(ef_zip64_p-ef_zip64), ef_zip64, ZIP_EF_BOTH); + ef64->next = ef; + ef = ef64; + is_zip64 = 1; + } + + if ((flags & (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64)) == (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64)) + is_really_zip64 = _zip_dirent_needs_zip64(de, flags); + else + is_really_zip64 = is_zip64; + + if ((flags & ZIP_FL_LOCAL) == 0) + _zip_write2(is_really_zip64 ? 45 : de->version_madeby, fp); + _zip_write2(is_really_zip64 ? 45 : de->version_needed, fp); + _zip_write2(de->bitflags&0xfff9, fp); /* clear compression method specific flags */ + _zip_write2((zip_uint16_t)de->comp_method, fp); /* XXX: can it be ZIP_CM_DEFAULT? */ + + _zip_u2d_time(de->last_mod, &dostime, &dosdate); _zip_write2(dostime, fp); _zip_write2(dosdate, fp); + + _zip_write4(de->crc, fp); + if (de->comp_size < ZIP_UINT32_MAX) + _zip_write4((zip_uint32_t)de->comp_size, fp); + else + _zip_write4(ZIP_UINT32_MAX, fp); + if (de->uncomp_size < ZIP_UINT32_MAX) + _zip_write4((zip_uint32_t)de->uncomp_size, fp); + else + _zip_write4(ZIP_UINT32_MAX, fp); + + _zip_write2(_zip_string_length(de->filename), fp); + _zip_write2(_zip_ef_size(de->extra_fields, flags) + _zip_ef_size(ef, ZIP_EF_BOTH), fp); - _zip_write4(zde->crc, fp); - _zip_write4(zde->comp_size, fp); - _zip_write4(zde->uncomp_size, fp); - - _zip_write2(zde->filename_len, fp); - _zip_write2(zde->extrafield_len, fp); - - if (!localp) { - _zip_write2(zde->comment_len, fp); - _zip_write2(zde->disk_number, fp); - _zip_write2(zde->int_attrib, fp); - _zip_write4(zde->ext_attrib, fp); - _zip_write4(zde->offset, fp); + if ((flags & ZIP_FL_LOCAL) == 0) { + _zip_write2(_zip_string_length(de->comment), fp); + _zip_write2((zip_uint16_t)de->disk_number, fp); + _zip_write2(de->int_attrib, fp); + _zip_write4(de->ext_attrib, fp); + if (de->offset < ZIP_UINT32_MAX) + _zip_write4((zip_uint32_t)de->offset, fp); + else + _zip_write4(ZIP_UINT32_MAX, fp); } - if (zde->filename_len) - fwrite(zde->filename, 1, zde->filename_len, fp); + if (de->filename) + _zip_string_write(de->filename, fp); - if (zde->extrafield_len) - fwrite(zde->extrafield, 1, zde->extrafield_len, fp); + if (ef) + _zip_ef_write(ef, ZIP_EF_BOTH, fp); + if (de->extra_fields) + _zip_ef_write(de->extra_fields, flags, fp); - if (!localp) { - if (zde->comment_len) - fwrite(zde->comment, 1, zde->comment_len, fp); + if ((flags & ZIP_FL_LOCAL) == 0) { + if (de->comment) + _zip_string_write(de->comment, fp); } + _zip_ef_free(ef); + if (ferror(fp)) { _zip_error_set(error, ZIP_ER_WRITE, errno); return -1; } - return 0; + return is_zip64; } static time_t -_zip_d2u_time(int dtime, int ddate) +_zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate) { struct tm tm; @@ -498,12 +785,72 @@ _zip_d2u_time(int dtime, int ddate) -unsigned short -_zip_read2(unsigned char **a) +static struct zip_extra_field * +_zip_ef_utf8(zip_uint16_t id, struct zip_string *str, struct zip_error *error) { - unsigned short ret; + const zip_uint8_t *raw; + zip_uint8_t *data, *p; + zip_uint32_t len; + struct zip_extra_field *ef; + + raw = _zip_string_get(str, &len, ZIP_FL_ENC_RAW, NULL); + + if (len+5 > ZIP_UINT16_MAX) { + /* XXX: error */ + } + + if ((data=(zip_uint8_t *)malloc(len+5)) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + p = data; + *(p++) = 1; + _zip_poke4(_zip_string_crc32(str), &p); + memcpy(p, raw, len); + p += len; + + ef = _zip_ef_new(id, (zip_uint16_t)(p-data), data, ZIP_EF_BOTH); + free(data); + return ef; +} + + + +struct zip_dirent * +_zip_get_dirent(struct zip *za, zip_uint64_t idx, zip_flags_t flags, struct zip_error *error) +{ + if (error == NULL) + error = &za->error; + + if (idx >= za->nentry) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) || za->entry[idx].changes == NULL) { + if (za->entry[idx].orig == NULL) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if (za->entry[idx].deleted && (flags & ZIP_FL_UNCHANGED) == 0) { + _zip_error_set(error, ZIP_ER_DELETED, 0); + return NULL; + } + return za->entry[idx].orig; + } + else + return za->entry[idx].changes; +} + + - ret = (*a)[0]+((*a)[1]<<8); +zip_uint16_t +_zip_read2(const zip_uint8_t **a) +{ + zip_uint16_t ret; + + ret = (zip_uint16_t)((*a)[0]+((*a)[1]<<8)); *a += 2; return ret; @@ -511,12 +858,12 @@ _zip_read2(unsigned char **a) -unsigned int -_zip_read4(unsigned char **a) +zip_uint32_t +_zip_read4(const zip_uint8_t **a) { - unsigned int ret; + zip_uint32_t ret; - ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + ret = ((((((zip_uint32_t)(*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; *a += 4; return ret; @@ -524,65 +871,108 @@ _zip_read4(unsigned char **a) -static char * -_zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error) +zip_uint64_t +_zip_read8(const zip_uint8_t **a) { - char *r, *o; + zip_uint64_t x, y; + + x = ((((((zip_uint64_t)(*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + *a += 4; + y = ((((((zip_uint64_t)(*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + *a += 4; + + return x+(y<<32); +} - r = (char *)malloc(nulp ? len+1 : len); + + +zip_uint8_t * +_zip_read_data(const zip_uint8_t **buf, FILE *fp, size_t len, int nulp, struct zip_error *error) +{ + zip_uint8_t *r; + + if (len == 0 && nulp == 0) + return NULL; + + r = (zip_uint8_t *)malloc(nulp ? len+1 : len); if (!r) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } - if (fread(r, 1, len, fp)>8)&0xff; + *((*p)++) = (i>>16)&0xff; + *((*p)++) = (i>>24)&0xff; +} + + + +void +_zip_poke8(zip_uint64_t i, zip_uint8_t **p) +{ + *((*p)++) = i&0xff; + *((*p)++) = (i>>8)&0xff; + *((*p)++) = (i>>16)&0xff; + *((*p)++) = (i>>24)&0xff; + *((*p)++) = (i>>32)&0xff; + *((*p)++) = (i>>40)&0xff; + *((*p)++) = (i>>48)&0xff; + *((*p)++) = (i>>56)&0xff; } -static void -_zip_write2(unsigned short i, FILE *fp) +void +_zip_write2(zip_uint16_t i, FILE *fp) { putc(i&0xff, fp); putc((i>>8)&0xff, fp); @@ -592,13 +982,30 @@ _zip_write2(unsigned short i, FILE *fp) -static void -_zip_write4(unsigned int i, FILE *fp) +void +_zip_write4(zip_uint32_t i, FILE *fp) +{ + putc(i&0xff, fp); + putc((i>>8)&0xff, fp); + putc((i>>16)&0xff, fp); + putc((i>>24)&0xff, fp); + + return; +} + + + +void +_zip_write8(zip_uint64_t i, FILE *fp) { putc(i&0xff, fp); putc((i>>8)&0xff, fp); putc((i>>16)&0xff, fp); putc((i>>24)&0xff, fp); + putc((i>>32)&0xff, fp); + putc((i>>40)&0xff, fp); + putc((i>>48)&0xff, fp); + putc((i>>56)&0xff, fp); return; } @@ -606,15 +1013,13 @@ _zip_write4(unsigned int i, FILE *fp) void -_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate) +_zip_u2d_time(time_t time, zip_uint16_t *dtime, zip_uint16_t *ddate) { struct tm *tm; tm = localtime(&time); - *ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) - + tm->tm_mday; - *dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5) - + ((tm->tm_sec)>>1); + *ddate = (zip_uint16_t)(((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + tm->tm_mday); + *dtime = (zip_uint16_t)(((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + ((tm->tm_sec)>>1)); return; } diff --git a/ext/zip/lib/zip_free.c b/ext/zip/lib/zip_discard.c similarity index 86% rename from ext/zip/lib/zip_free.c rename to ext/zip/lib/zip_discard.c index 9932c14fec9a2..37ba8c2ea64de 100644 --- a/ext/zip/lib/zip_free.c +++ b/ext/zip/lib/zip_discard.c @@ -1,6 +1,6 @@ /* - zip_free.c -- free struct zip - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + zip_discard.c -- discard and free struct zip + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -39,14 +39,14 @@ -/* _zip_free: +/* zip_discard: frees the space allocated to a zipfile struct, and closes the corresponding file. */ void -_zip_free(struct zip *za) +zip_discard(struct zip *za) { - int i; + zip_uint64_t i; if (za == NULL) return; @@ -58,13 +58,12 @@ _zip_free(struct zip *za) fclose(za->zp); free(za->default_password); - _zip_cdir_free(za->cdir); - free(za->ch_comment); + _zip_string_free(za->comment_orig); + _zip_string_free(za->comment_changes); if (za->entry) { - for (i=0; inentry; i++) { - _zip_entry_free(za->entry+i); - } + for (i=0; inentry; i++) + _zip_entry_finalize(za->entry+i); free(za->entry); } diff --git a/ext/zip/lib/zip_entry_free.c b/ext/zip/lib/zip_entry.c similarity index 79% rename from ext/zip/lib/zip_entry_free.c rename to ext/zip/lib/zip_entry.c index e8a77707f0bfa..58663e8d0c88e 100644 --- a/ext/zip/lib/zip_entry_free.c +++ b/ext/zip/lib/zip_entry.c @@ -1,6 +1,6 @@ /* - zip_entry_free.c -- free struct zip_entry - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + zip_entry.c -- struct zip_entry helper functions + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,23 +33,23 @@ -#include - #include "zipint.h" +void +_zip_entry_finalize(struct zip_entry *e) +{ + _zip_unchange_data(e); + _zip_dirent_free(e->orig); + _zip_dirent_free(e->changes); +} + void -_zip_entry_free(struct zip_entry *ze) +_zip_entry_init(struct zip_entry *e) { - free(ze->ch_filename); - ze->ch_filename = NULL; - free(ze->ch_extra); - ze->ch_extra = NULL; - ze->ch_extra_len = -1; - free(ze->ch_comment); - ze->ch_comment = NULL; - ze->ch_comment_len = -1; - - _zip_unchange_data(ze); + e->orig = NULL; + e->changes = NULL; + e->source = NULL; + e->deleted = 0; } diff --git a/ext/zip/lib/zip_error.c b/ext/zip/lib/zip_error.c index b8d907abf4d9a..4b1f27921a256 100644 --- a/ext/zip/lib/zip_error.c +++ b/ext/zip/lib/zip_error.c @@ -1,6 +1,6 @@ /* zip_error.c -- struct zip_error helper functions - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -42,6 +42,9 @@ void _zip_error_clear(struct zip_error *err) { + if (err == NULL) + return; + err->zip_err = ZIP_ER_OK; err->sys_err = 0; } @@ -49,7 +52,7 @@ _zip_error_clear(struct zip_error *err) void -_zip_error_copy(struct zip_error *dst, struct zip_error *src) +_zip_error_copy(struct zip_error *dst, const struct zip_error *src) { dst->zip_err = src->zip_err; dst->sys_err = src->sys_err; @@ -67,7 +70,7 @@ _zip_error_fini(struct zip_error *err) void -_zip_error_get(struct zip_error *err, int *zep, int *sep) +_zip_error_get(const struct zip_error *err, int *zep, int *sep) { if (zep) *zep = err->zip_err; diff --git a/ext/zip/lib/zip_error_clear.c b/ext/zip/lib/zip_error_clear.c index 34e7dea48ebba..b4ff10391290a 100644 --- a/ext/zip/lib/zip_error_clear.c +++ b/ext/zip/lib/zip_error_clear.c @@ -37,8 +37,11 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_error_clear(struct zip *za) { + if (za == NULL) + return; + _zip_error_clear(&za->error); } diff --git a/ext/zip/lib/zip_error_get.c b/ext/zip/lib/zip_error_get.c index c15705e32fccd..6d1c958c17766 100644 --- a/ext/zip/lib/zip_error_get.c +++ b/ext/zip/lib/zip_error_get.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_error_get(struct zip *za, int *zep, int *sep) { _zip_error_get(&za->error, zep, sep); diff --git a/ext/zip/lib/zip_error_get_sys_type.c b/ext/zip/lib/zip_error_get_sys_type.c index 47aa93e69b927..6c6f38074040e 100644 --- a/ext/zip/lib/zip_error_get_sys_type.c +++ b/ext/zip/lib/zip_error_get_sys_type.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_error_get_sys_type(int ze) { if (ze < 0 || ze >= _zip_nerr_str) diff --git a/ext/zip/lib/zip_error_to_str.c b/ext/zip/lib/zip_error_to_str.c index bafe74335a049..11a0cd2bb0e6d 100644 --- a/ext/zip/lib/zip_error_to_str.c +++ b/ext/zip/lib/zip_error_to_str.c @@ -42,7 +42,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { const char *zs, *ss; diff --git a/ext/zip/lib/zip_extra_field.c b/ext/zip/lib/zip_extra_field.c new file mode 100644 index 0000000000000..41fd2b1d901af --- /dev/null +++ b/ext/zip/lib/zip_extra_field.c @@ -0,0 +1,386 @@ +/* + zip_extra_field.c -- manipulate extra fields + Copyright (C) 2012-2013 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + +#include +#include +#include + + + +struct zip_extra_field * +_zip_ef_clone(const struct zip_extra_field *ef, struct zip_error *error) +{ + struct zip_extra_field *head, *prev, *def; + + head = prev = NULL; + + while (ef) { + if ((def=_zip_ef_new(ef->id, ef->size, ef->data, ef->flags)) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_ef_free(head); + return NULL; + } + + if (head == NULL) + head = def; + if (prev) + prev->next = def; + prev = def; + + ef = ef->next; + } + + return head; +} + + +struct zip_extra_field * +_zip_ef_delete_by_id(struct zip_extra_field *ef, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags) +{ + struct zip_extra_field *head, *prev; + int i; + + i = 0; + head = ef; + prev = NULL; + for (; ef; ef=(prev ? prev->next : head)) { + if ((ef->flags & flags & ZIP_EF_BOTH) && ef->id == id) { + if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) { + ef->flags &= ~(flags & ZIP_EF_BOTH); + if ((ef->flags & ZIP_EF_BOTH) == 0) { + if (prev) + prev->next = ef->next; + else + head = ef->next; + ef->next = NULL; + _zip_ef_free(ef); + + if (id_idx == ZIP_EXTRA_FIELD_ALL) + continue; + } + } + + i++; + if (i > id_idx) + break; + } + prev = ef; + } + + return head; +} + + + + +void +_zip_ef_free(struct zip_extra_field *ef) +{ + struct zip_extra_field *ef2; + + while (ef) { + ef2 = ef->next; + free(ef->data); + free(ef); + ef = ef2; + } +} + + + +const zip_uint8_t * +_zip_ef_get_by_id(const struct zip_extra_field *ef, zip_uint16_t *lenp, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags, struct zip_error *error) +{ + static const zip_uint8_t empty[1] = { '\0' }; + + int i; + + i = 0; + for (; ef; ef=ef->next) { + if (ef->id == id && (ef->flags & flags & ZIP_EF_BOTH)) { + if (i < id_idx) { + i++; + continue; + } + + if (lenp) + *lenp = ef->size; + if (ef->size > 0) + return ef->data; + else + return empty; + } + } + + _zip_error_set(error, ZIP_ER_NOENT, 0); + return NULL; +} + + + +struct zip_extra_field * +_zip_ef_merge(struct zip_extra_field *to, struct zip_extra_field *from) +{ + struct zip_extra_field *ef2, *tt, *tail; + int duplicate; + + if (to == NULL) + return from; + + for (tail=to; tail->next; tail=tail->next) + ; + + for (; from; from=ef2) { + ef2 = from->next; + + duplicate = 0; + for (tt=to; tt; tt=tt->next) { + if (tt->id == from->id && tt->size == from->size && memcmp(tt->data, from->data, tt->size) == 0) { + tt->flags |= (from->flags & ZIP_EF_BOTH); + duplicate = 1; + break; + } + } + + from->next = NULL; + if (duplicate) + _zip_ef_free(from); + else + tail = tail->next = from; + } + + return to; +} + + + +struct zip_extra_field * +_zip_ef_new(zip_uint16_t id, zip_uint16_t size, const zip_uint8_t *data, zip_flags_t flags) +{ + struct zip_extra_field *ef; + + if ((ef=(struct zip_extra_field *)malloc(sizeof(*ef))) == NULL) + return NULL; + + ef->next = NULL; + ef->flags = flags; + ef->id = id; + ef->size = size; + if (size > 0) { + if ((ef->data=(zip_uint8_t *)_zip_memdup(data, size, NULL)) == NULL) { + free(ef); + return NULL; + } + } + else + ef->data = NULL; + + return ef; +} + + + +struct zip_extra_field * +_zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, struct zip_error *error) +{ + struct zip_extra_field *ef, *ef2, *ef_head; + const zip_uint8_t *p; + zip_uint16_t fid, flen; + + ef_head = NULL; + for (p=data; p data+len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_ef_free(ef_head); + return NULL; + } + + fid = _zip_read2(&p); + flen = _zip_read2(&p); + + if (p+flen > data+len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_ef_free(ef_head); + return NULL; + } + + if ((ef2=_zip_ef_new(fid, flen, p, flags)) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_ef_free(ef_head); + return NULL; + } + + if (ef_head) { + ef->next = ef2; + ef = ef2; + } + else + ef_head = ef = ef2; + } + + return ef_head; +} + + + +struct zip_extra_field * +_zip_ef_remove_internal(struct zip_extra_field *ef) +{ + struct zip_extra_field *ef_head; + struct zip_extra_field *prev, *next; + + ef_head = ef; + prev = NULL; + + while (ef) { + if (ZIP_EF_IS_INTERNAL(ef->id)) { + next = ef->next; + if (ef_head == ef) + ef_head = next; + ef->next = NULL; + _zip_ef_free(ef); + if (prev) + prev->next = next; + ef = next; + } + else { + prev = ef; + ef = ef->next; + } + } + + return ef_head; +} + + +zip_uint16_t +_zip_ef_size(const struct zip_extra_field *ef, zip_flags_t flags) +{ + zip_uint16_t size; + + size = 0; + for (; ef; ef=ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) + size += 4+ef->size; + } + + return size; +} + + + +void +_zip_ef_write(const struct zip_extra_field *ef, zip_flags_t flags, FILE *f) +{ + for (; ef; ef=ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) { + _zip_write2(ef->id, f); + _zip_write2(ef->size, f); + if (ef->size > 0) + fwrite(ef->data, ef->size, 1, f); + } + } +} + + + +int +_zip_read_local_ef(struct zip *za, zip_uint64_t idx) +{ + struct zip_entry *e; + unsigned char b[4]; + const unsigned char *p; + zip_uint16_t fname_len, ef_len; + + if (idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + e = za->entry+idx; + + if (e->orig == NULL || e->orig->local_extra_fields_read) + return 0; + + + if (fseeko(za->zp, (off_t)(e->orig->offset + 26), SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fread(b, sizeof(b), 1, za->zp) != 1) { + _zip_error_set(&za->error, ZIP_ER_READ, errno); + return -1; + } + + p = b; + fname_len = _zip_read2(&p); + ef_len = _zip_read2(&p); + + if (ef_len > 0) { + struct zip_extra_field *ef; + zip_uint8_t *ef_raw; + + if (fseek(za->zp, fname_len, SEEK_CUR) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + ef_raw = _zip_read_data(NULL, za->zp, ef_len, 0, &za->error); + + if (ef_raw == NULL) + return -1; + + if ((ef=_zip_ef_parse(ef_raw, ef_len, ZIP_EF_LOCAL, &za->error)) == NULL) { + free(ef_raw); + return -1; + } + free(ef_raw); + + ef = _zip_ef_remove_internal(ef); + e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef); + } + + e->orig->local_extra_fields_read = 1; + + if (e->changes && e->changes->local_extra_fields_read == 0) { + e->changes->extra_fields = e->orig->extra_fields; + e->changes->local_extra_fields_read = 1; + } + + return 0; +} diff --git a/ext/zip/lib/zip_extra_field_api.c b/ext/zip/lib/zip_extra_field_api.c new file mode 100644 index 0000000000000..02ed4555e0c0d --- /dev/null +++ b/ext/zip/lib/zip_extra_field_api.c @@ -0,0 +1,364 @@ +/* + zip_extra_field_api.c -- public extra fields API functions + Copyright (C) 2012-2013 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_file_extra_field_delete(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags) +{ + struct zip_dirent *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags); + return 0; +} + + + +ZIP_EXTERN int +zip_file_extra_field_delete_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags) +{ + struct zip_dirent *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags); + return 0; +} + + + +ZIP_EXTERN const zip_uint8_t * +zip_file_extra_field_get(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags) +{ + static const zip_uint8_t empty[1] = { '\0' }; + + struct zip_dirent *de; + struct zip_extra_field *ef; + int i; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return NULL; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return NULL; + + i = 0; + for (ef=de->extra_fields; ef; ef=ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) { + if (i < ef_idx) { + i++; + continue; + } + + if (idp) + *idp = ef->id; + if (lenp) + *lenp = ef->size; + if (ef->size > 0) + return ef->data; + else + return empty; + } + } + + _zip_error_set(&za->error, ZIP_ER_NOENT, 0); + return NULL; + +} + + + +ZIP_EXTERN const zip_uint8_t * +zip_file_extra_field_get_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags) +{ + struct zip_dirent *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return NULL; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return NULL; + + return _zip_ef_get_by_id(de->extra_fields, lenp, ef_id, ef_idx, flags, &za->error); +} + + + +ZIP_EXTERN zip_int16_t +zip_file_extra_fields_count(struct zip *za, zip_uint64_t idx, zip_flags_t flags) +{ + struct zip_dirent *de; + struct zip_extra_field *ef; + zip_uint16_t n; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return -1; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return -1; + + n = 0; + for (ef=de->extra_fields; ef; ef=ef->next) + if (ef->flags & flags & ZIP_EF_BOTH) + n++; + + return (zip_int16_t)n; +} + + + +ZIP_EXTERN zip_int16_t +zip_file_extra_fields_count_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags) +{ + struct zip_dirent *de; + struct zip_extra_field *ef; + zip_uint16_t n; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return -1; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return -1; + + n = 0; + for (ef=de->extra_fields; ef; ef=ef->next) + if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) + n++; + + return (zip_int16_t)n; +} + + + +ZIP_EXTERN int +zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags) +{ + struct zip_dirent *de; + zip_uint16_t ls, cs; + struct zip_extra_field *ef, *ef_prev, *ef_new; + int i, found, new_len; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (ZIP_EF_IS_INTERNAL(ef_id)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + ef = de->extra_fields; + ef_prev = NULL; + i = 0; + found = 0; + + for (; ef; ef=ef->next) { + if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) { + if (i == ef_idx) { + found = 1; + break; + } + i++; + } + ef_prev = ef; + } + + if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (flags & ZIP_EF_LOCAL) + ls = _zip_ef_size(de->extra_fields, ZIP_EF_LOCAL); + else + ls = 0; + if (flags & ZIP_EF_CENTRAL) + cs = _zip_ef_size(de->extra_fields, ZIP_EF_CENTRAL); + else + cs = 0; + + new_len = ls > cs ? ls : cs; + if (found) + new_len -= ef->size + 4; + new_len += len + 4; + + if (new_len > ZIP_UINT16_MAX) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((ef_new=_zip_ef_new(ef_id, len, data, flags)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (found) { + if ((ef->flags & ZIP_EF_BOTH) == (flags & ZIP_EF_BOTH)) { + ef_new->next = ef->next; + ef->next = NULL; + _zip_ef_free(ef); + if (ef_prev) + ef_prev->next = ef_new; + else + de->extra_fields = ef_new; + } + else { + ef->flags &= ~(flags & ZIP_EF_BOTH); + ef_new->next = ef->next; + ef->next = ef_new; + } + } + else if (ef_prev) { + ef_new->next = ef_prev->next; + ef_prev->next = ef_new; + } + else + de->extra_fields = ef_new; + + return 0; +} + + + +int +_zip_file_extra_field_prepare_for_change(struct zip *za, zip_uint64_t idx) +{ + struct zip_entry *e; + + if (idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + e = za->entry+idx; + + if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD)) + return 0; + + if (e->orig) { + if (_zip_read_local_ef(za, idx) < 0) + return -1; + } + + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + if (e->orig && e->orig->extra_fields) { + if ((e->changes->extra_fields=_zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL) + return -1; + } + e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD; + + return 0; +} + diff --git a/ext/zip/lib/zip_fclose.c b/ext/zip/lib/zip_fclose.c index eb55ddbcea455..093c30eada9f1 100644 --- a/ext/zip/lib/zip_fclose.c +++ b/ext/zip/lib/zip_fclose.c @@ -39,20 +39,23 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_fclose(struct zip_file *zf) { - int i, ret; + int ret; + unsigned int i; if (zf->src) zip_source_free(zf->src); - for (i=0; iza->nfile; i++) { - if (zf->za->file[i] == zf) { - zf->za->file[i] = zf->za->file[zf->za->nfile-1]; - zf->za->nfile--; - break; - } + if (zf->za) { + for (i=0; iza->nfile; i++) { + if (zf->za->file[i] == zf) { + zf->za->file[i] = zf->za->file[zf->za->nfile-1]; + zf->za->nfile--; + break; + } + } } ret = 0; diff --git a/ext/zip/lib/zip_fdopen.c b/ext/zip/lib/zip_fdopen.c index df70f27561ace..bda9aabac4915 100644 --- a/ext/zip/lib/zip_fdopen.c +++ b/ext/zip/lib/zip_fdopen.c @@ -37,11 +37,24 @@ -ZIP_EXTERN(struct zip *) -zip_fdopen(int fd_orig, int flags, int *zep) +ZIP_EXTERN struct zip * +zip_fdopen(int fd_orig, int _flags, int *zep) { int fd; FILE *fp; + unsigned int flags; + + if (_flags < 0) { + if (zep) + *zep = ZIP_ER_INVAL; + return NULL; + } + flags = (unsigned int)_flags; + + if (flags & ZIP_TRUNCATE) { + *zep = ZIP_ER_INVAL; + return NULL; + } /* We dup() here to avoid messing with the passed in fd. We could not restore it to the original state in case of error. */ @@ -58,5 +71,5 @@ zip_fdopen(int fd_orig, int flags, int *zep) } close(fd_orig); - return _zip_open(NULL, fp, flags, ZIP_AFL_RDONLY, zep); + return _zip_open(NULL, fp, flags, zep); } diff --git a/ext/zip/lib/zip_file_add.c b/ext/zip/lib/zip_file_add.c new file mode 100644 index 0000000000000..995cb91c1a287 --- /dev/null +++ b/ext/zip/lib/zip_file_add.c @@ -0,0 +1,55 @@ +/* + zip_file_add.c -- add file via callback function + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + +/* + NOTE: Return type is signed so we can return -1 on error. + The index can not be larger than ZIP_INT64_MAX since the size + of the central directory cannot be larger than + ZIP_UINT64_MAX, and each entry is larger than 2 bytes. +*/ + +ZIP_EXTERN zip_int64_t +zip_file_add(struct zip *za, const char *name, struct zip_source *source, zip_flags_t flags) +{ + if (name == NULL || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_file_replace(za, ZIP_UINT64_MAX, name, source, flags); +} diff --git a/ext/zip/lib/zip_file_error_clear.c b/ext/zip/lib/zip_file_error_clear.c index 6c9c2a02b3f0f..ce8b6cbd9403a 100644 --- a/ext/zip/lib/zip_file_error_clear.c +++ b/ext/zip/lib/zip_file_error_clear.c @@ -37,8 +37,11 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_file_error_clear(struct zip_file *zf) { + if (zf == NULL) + return; + _zip_error_clear(&zf->error); } diff --git a/ext/zip/lib/zip_file_error_get.c b/ext/zip/lib/zip_file_error_get.c index a53fa7e003324..f20e011fc747e 100644 --- a/ext/zip/lib/zip_file_error_get.c +++ b/ext/zip/lib/zip_file_error_get.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_file_error_get(struct zip_file *zf, int *zep, int *sep) { _zip_error_get(&zf->error, zep, sep); diff --git a/ext/zip/lib/zip_get_file_extra.c b/ext/zip/lib/zip_file_get_comment.c similarity index 72% rename from ext/zip/lib/zip_get_file_extra.c rename to ext/zip/lib/zip_file_get_comment.c index a27edd8ee9452..766731ea268ef 100644 --- a/ext/zip/lib/zip_get_file_extra.c +++ b/ext/zip/lib/zip_file_get_comment.c @@ -1,6 +1,6 @@ /* - zip_get_file_extra.c -- get file extra field - Copyright (C) 2006-2010 Dieter Baron and Thomas Klausner + zip_file_get_comment.c -- get file comment + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -17,7 +17,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -31,28 +31,28 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - + #include "zipint.h" + +/* lenp is 32 bit because converted comment can be longer than ZIP_UINT16_MAX */ - -ZIP_EXTERN(const char *) -zip_get_file_extra(struct zip *za, zip_uint64_t idx, int *lenp, int flags) +ZIP_EXTERN const char * +zip_file_get_comment(struct zip *za, zip_uint64_t idx, zip_uint32_t *lenp, zip_flags_t flags) { - if (idx >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + struct zip_dirent *de; + zip_uint32_t len; + const zip_uint8_t *str; + + if ((de=_zip_get_dirent(za, idx, flags, NULL)) == NULL) return NULL; - } - - if ((flags & ZIP_FL_UNCHANGED) - || (za->entry[idx].ch_extra_len == -1)) { - if (lenp != NULL) - *lenp = za->cdir->entry[idx].extrafield_len; - return za->cdir->entry[idx].extrafield; - } - - if (lenp != NULL) - *lenp = za->entry[idx].ch_extra_len; - return za->entry[idx].ch_extra; + + if ((str=_zip_string_get(de->comment, &len, flags, &za->error)) == NULL) + return NULL; + + if (lenp) + *lenp = len; + + return (const char *)str; } diff --git a/ext/zip/lib/zip_file_get_offset.c b/ext/zip/lib/zip_file_get_offset.c index b96fd5e480907..65a011fc077c3 100644 --- a/ext/zip/lib/zip_file_get_offset.c +++ b/ext/zip/lib/zip_file_get_offset.c @@ -50,25 +50,27 @@ On error, fills in za->error and returns 0. */ -unsigned int -_zip_file_get_offset(struct zip *za, int idx) +zip_uint64_t +_zip_file_get_offset(const struct zip *za, zip_uint64_t idx, struct zip_error *error) { - struct zip_dirent de; - unsigned int offset; + zip_uint64_t offset; + zip_int32_t size; - offset = za->cdir->entry[idx].offset; + offset = za->entry[idx].orig->offset; - if (fseeko(za->zp, offset, SEEK_SET) != 0) { - _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + if (fseeko(za->zp, (off_t)offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); return 0; } - if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, &za->error) != 0) + /* XXX: cache? */ + if ((size=_zip_dirent_size(za->zp, ZIP_EF_LOCAL, error)) < 0) return 0; - offset += LENTRYSIZE + de.filename_len + de.extrafield_len; - - _zip_dirent_finalize(&de); - - return offset; + if (offset+(zip_uint32_t)size > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return 0; + } + + return offset + (zip_uint32_t)size; } diff --git a/ext/zip/lib/zip_set_file_extra.c b/ext/zip/lib/zip_file_rename.c similarity index 70% rename from ext/zip/lib/zip_set_file_extra.c rename to ext/zip/lib/zip_file_rename.c index db829e2e0a842..383a52adae714 100644 --- a/ext/zip/lib/zip_set_file_extra.c +++ b/ext/zip/lib/zip_file_rename.c @@ -1,6 +1,6 @@ /* - zip_set_file_extra.c -- set extra field for file in archive - Copyright (C) 2006-2010 Dieter Baron and Thomas Klausner + zip_file_rename.c -- rename file in zip archive + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -17,7 +17,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -31,23 +31,21 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + - -#include +#include #include "zipint.h" + - -ZIP_EXTERN(int) -zip_set_file_extra(struct zip *za, zip_uint64_t idx, - const char *extra, int len) +ZIP_EXTERN int +zip_file_rename(struct zip *za, zip_uint64_t idx, const char *name, zip_flags_t flags) { - char *tmpext; - - if (idx >= za->nentry - || len < 0 || len > MAXEXTLEN - || (len > 0 && extra == NULL)) { + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || (name != NULL && strlen(name) > ZIP_UINT16_MAX)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } @@ -57,16 +55,16 @@ zip_set_file_extra(struct zip *za, zip_uint64_t idx, return -1; } - if (len > 0) { - if ((tmpext=(char *)_zip_memdup(extra, len, &za->error)) == NULL) - return -1; - } - else - tmpext = NULL; + if ((old_name=zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name != NULL && name[strlen(name)-1] == '/'); + old_is_dir = (old_name[strlen(old_name)-1] == '/'); - free(za->entry[idx].ch_extra); - za->entry[idx].ch_extra = tmpext; - za->entry[idx].ch_extra_len = len; + if (new_is_dir != old_is_dir) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } - return 0; + return _zip_set_name(za, idx, name, flags); } diff --git a/ext/zip/lib/zip_file_replace.c b/ext/zip/lib/zip_file_replace.c new file mode 100644 index 0000000000000..7e7e942168478 --- /dev/null +++ b/ext/zip/lib/zip_file_replace.c @@ -0,0 +1,111 @@ +/* + zip_file_replace.c -- replace file via callback function + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_file_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source, zip_flags_t flags) +{ + if (idx >= za->nentry || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_file_replace(za, idx, NULL, source, flags) == -1) + return -1; + + return 0; +} + + + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_file_replace(struct zip *za, zip_uint64_t idx, const char *name, struct zip_source *source, zip_flags_t flags) +{ + zip_uint64_t za_nentry_prev; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + za_nentry_prev = za->nentry; + if (idx == ZIP_UINT64_MAX) { + zip_int64_t i = -1; + + if (flags & ZIP_FL_OVERWRITE) + i = _zip_name_locate(za, name, flags, NULL); + + if (i == -1) { + /* create and use new entry, used by zip_add */ + if ((i=_zip_add_entry(za)) < 0) + return -1; + } + idx = (zip_uint64_t)i; + } + + if (name && _zip_set_name(za, idx, name, flags) != 0) { + if (za->nentry != za_nentry_prev) { + _zip_entry_finalize(za->entry+idx); + za->nentry = za_nentry_prev; + } + return -1; + } + + /* does not change any name related data, so we can do it here; + * needed for a double add of the same file name */ + _zip_unchange_data(za->entry+idx); + + if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) { + if (za->entry[idx].changes == NULL) { + if ((za->entry[idx].changes=_zip_dirent_clone(za->entry[idx].orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT; + za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD; + } + + za->entry[idx].source = source; + + return (zip_int64_t)idx; +} diff --git a/ext/zip/lib/zip_file_set_comment.c b/ext/zip/lib/zip_file_set_comment.c new file mode 100644 index 0000000000000..722f3d43cc3d3 --- /dev/null +++ b/ext/zip/lib/zip_file_set_comment.c @@ -0,0 +1,105 @@ +/* + zip_file_set_comment.c -- set comment for file in archive + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_file_set_comment(struct zip *za, zip_uint64_t idx, + const char *comment, zip_uint16_t len, zip_flags_t flags) +{ + struct zip_entry *e; + struct zip_string *cstr; + int changed; + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (len > 0 && comment == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, flags, &za->error)) == NULL) + return -1; + if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED) + cstr->encoding = ZIP_ENCODING_UTF8_KNOWN; + } + else + cstr = NULL; + + e = za->entry+idx; + + if (e->changes) { + _zip_string_free(e->changes->comment); + e->changes->comment = NULL; + e->changes->changed &= ~ZIP_DIRENT_COMMENT; + } + + if (e->orig && e->orig->comment) + changed = !_zip_string_equal(e->orig->comment, cstr); + else + changed = (cstr != NULL); + + if (changed) { + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_string_free(cstr); + return -1; + } + } + e->changes->comment = cstr; + e->changes->changed |= ZIP_DIRENT_COMMENT; + } + else { + _zip_string_free(cstr); + if (e->changes && e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + + return 0; +} diff --git a/ext/zip/lib/zip_file_strerror.c b/ext/zip/lib/zip_file_strerror.c index c2864f2ba1aaf..9ba70f14ff52b 100644 --- a/ext/zip/lib/zip_file_strerror.c +++ b/ext/zip/lib/zip_file_strerror.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(const char *) +ZIP_EXTERN const char * zip_file_strerror(struct zip_file *zf) { return _zip_error_strerror(&zf->error); diff --git a/ext/zip/lib/zip_filerange_crc.c b/ext/zip/lib/zip_filerange_crc.c index 4d1ad566929f8..3b1c868407ef9 100644 --- a/ext/zip/lib/zip_filerange_crc.c +++ b/ext/zip/lib/zip_filerange_crc.c @@ -1,6 +1,6 @@ /* zip_filerange_crc.c -- compute CRC32 for a range of a file - Copyright (C) 2008 Dieter Baron and Thomas Klausner + Copyright (C) 2008-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -56,13 +56,13 @@ _zip_filerange_crc(FILE *fp, off_t start, off_t len, uLong *crcp, } while (len > 0) { - n = len > BUFSIZE ? BUFSIZE : len; - if ((n=fread(buf, 1, n, fp)) <= 0) { + n = len > BUFSIZE ? BUFSIZE : (size_t)len; + if ((n=fread(buf, 1, n, fp)) == 0) { _zip_error_set(errp, ZIP_ER_READ, errno); return -1; } - *crcp = crc32(*crcp, buf, n); + *crcp = crc32(*crcp, buf, (uInt)n); len-= n; } diff --git a/ext/zip/lib/zip_fopen.c b/ext/zip/lib/zip_fopen.c index f62adbbf92692..331f79ea36149 100644 --- a/ext/zip/lib/zip_fopen.c +++ b/ext/zip/lib/zip_fopen.c @@ -37,13 +37,13 @@ -ZIP_EXTERN(struct zip_file *) -zip_fopen(struct zip *za, const char *fname, int flags) +ZIP_EXTERN struct zip_file * +zip_fopen(struct zip *za, const char *fname, zip_flags_t flags) { - int idx; + zip_int64_t idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return NULL; - return zip_fopen_index_encrypted(za, idx, flags, za->default_password); + return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, za->default_password); } diff --git a/ext/zip/lib/zip_fopen_encrypted.c b/ext/zip/lib/zip_fopen_encrypted.c index 8aba0625672bc..34230f00d7c0a 100644 --- a/ext/zip/lib/zip_fopen_encrypted.c +++ b/ext/zip/lib/zip_fopen_encrypted.c @@ -37,14 +37,13 @@ -ZIP_EXTERN(struct zip_file *) -zip_fopen_encrypted(struct zip *za, const char *fname, int flags, - const char *password) +ZIP_EXTERN struct zip_file * +zip_fopen_encrypted(struct zip *za, const char *fname, zip_flags_t flags, const char *password) { - int idx; + zip_int64_t idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return NULL; - return zip_fopen_index_encrypted(za, idx, flags, password); + return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, password); } diff --git a/ext/zip/lib/zip_fopen_index.c b/ext/zip/lib/zip_fopen_index.c index b60fd33e8f53e..30466ffa19a59 100644 --- a/ext/zip/lib/zip_fopen_index.c +++ b/ext/zip/lib/zip_fopen_index.c @@ -1,6 +1,6 @@ /* zip_fopen_index.c -- open file in zip archive for reading by index - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -41,8 +41,8 @@ -ZIP_EXTERN(struct zip_file *) -zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags) +ZIP_EXTERN struct zip_file * +zip_fopen_index(struct zip *za, zip_uint64_t index, zip_flags_t flags) { - return zip_fopen_index_encrypted(za, fileno, flags, za->default_password); + return zip_fopen_index_encrypted(za, index, flags, za->default_password); } diff --git a/ext/zip/lib/zip_fopen_index_encrypted.c b/ext/zip/lib/zip_fopen_index_encrypted.c index 988a78fe03f9a..cc81ca7f53b67 100644 --- a/ext/zip/lib/zip_fopen_index_encrypted.c +++ b/ext/zip/lib/zip_fopen_index_encrypted.c @@ -1,6 +1,6 @@ /* zip_fopen_index_encrypted.c -- open file for reading by index w/ password - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -43,103 +43,15 @@ static struct zip_file *_zip_file_new(struct zip *za); -ZIP_EXTERN(struct zip_file *) -zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags, +ZIP_EXTERN struct zip_file * +zip_fopen_index_encrypted(struct zip *za, zip_uint64_t index, zip_flags_t flags, const char *password) { struct zip_file *zf; - zip_compression_implementation comp_impl; - zip_encryption_implementation enc_impl; - struct zip_source *src, *s2; - zip_uint64_t start; - struct zip_stat st; - - if (fileno >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; - } + struct zip_source *src; - if ((flags & ZIP_FL_UNCHANGED) == 0 - && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) { - _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + if ((src=_zip_source_zip_new(za, za, index, flags, 0, 0, password)) == NULL) return NULL; - } - - if (fileno >= za->cdir->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; - } - - if (flags & ZIP_FL_ENCRYPTED) - flags |= ZIP_FL_COMPRESSED; - - zip_stat_index(za, fileno, flags, &st); - - enc_impl = NULL; - if ((flags & ZIP_FL_ENCRYPTED) == 0) { - if (st.encryption_method != ZIP_EM_NONE) { - if (password == NULL) { - _zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0); - return NULL; - } - if ((enc_impl=zip_get_encryption_implementation( - st.encryption_method)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); - return NULL; - } - } - } - - comp_impl = NULL; - if ((flags & ZIP_FL_COMPRESSED) == 0) { - if (st.comp_method != ZIP_CM_STORE) { - if ((comp_impl=zip_get_compression_implementation( - st.comp_method)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); - return NULL; - } - } - } - - if ((start=_zip_file_get_offset(za, fileno)) == 0) - return NULL; - - if (st.comp_size == 0) { - if ((src=zip_source_buffer(za, NULL, 0, 0)) == NULL) - return NULL; - } - else { - if ((src=_zip_source_file_or_p(za, NULL, za->zp, start, st.comp_size, - 0, &st)) == NULL) - return NULL; - if (enc_impl) { - if ((s2=enc_impl(za, src, ZIP_EM_TRAD_PKWARE, 0, - password)) == NULL) { - zip_source_free(src); - /* XXX: set error (how?) */ - return NULL; - } - src = s2; - } - if (comp_impl) { - if ((s2=comp_impl(za, src, za->cdir->entry[fileno].comp_method, - 0)) == NULL) { - zip_source_free(src); - /* XXX: set error (how?) */ - return NULL; - } - src = s2; - } - if ((flags & ZIP_FL_COMPRESSED) == 0 - || st.comp_method == ZIP_CM_STORE ) { - if ((s2=zip_source_crc(za, src, 1)) == NULL) { - zip_source_free(src); - /* XXX: set error (how?) */ - return NULL; - } - src = s2; - } - } if (zip_source_open(src) < 0) { _zip_error_set_from_source(&za->error, src); @@ -147,7 +59,10 @@ zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags, return NULL; } - zf = _zip_file_new(za); + if ((zf=_zip_file_new(za)) == NULL) { + zip_source_free(src); + return NULL; + } zf->src = src; @@ -160,14 +75,14 @@ static struct zip_file * _zip_file_new(struct zip *za) { struct zip_file *zf, **file; - int n; if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } - if (za->nfile >= za->nfile_alloc-1) { + if (za->nfile+1 >= za->nfile_alloc) { + unsigned int n; n = za->nfile_alloc + 10; file = (struct zip_file **)realloc(za->file, n*sizeof(struct zip_file *)); diff --git a/ext/zip/lib/zip_fread.c b/ext/zip/lib/zip_fread.c index a6c0851b0aaac..8235c6dfacf80 100644 --- a/ext/zip/lib/zip_fread.c +++ b/ext/zip/lib/zip_fread.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(zip_int64_t) +ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread) { zip_int64_t n; diff --git a/ext/zip/lib/zip_get_archive_comment.c b/ext/zip/lib/zip_get_archive_comment.c index fe97e6e8c18a1..202f761f4e852 100644 --- a/ext/zip/lib/zip_get_archive_comment.c +++ b/ext/zip/lib/zip_get_archive_comment.c @@ -1,6 +1,6 @@ /* zip_get_archive_comment.c -- get archive comment - Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,28 +33,29 @@ +#include + #include "zipint.h" -ZIP_EXTERN(const char *) -zip_get_archive_comment(struct zip *za, int *lenp, int flags) +ZIP_EXTERN const char * +zip_get_archive_comment(struct zip *za, int *lenp, zip_flags_t flags) { - if ((flags & ZIP_FL_UNCHANGED) - || (za->ch_comment_len == -1)) { - if (za->cdir) { - if (lenp != NULL) - *lenp = za->cdir->comment_len; - return za->cdir->comment; - } - else { - if (lenp != NULL) - *lenp = -1; - return NULL; - } - } - - if (lenp != NULL) - *lenp = za->ch_comment_len; - return za->ch_comment; + struct zip_string *comment; + zip_uint32_t len; + const zip_uint8_t *str; + + if ((flags & ZIP_FL_UNCHANGED) || (za->comment_changes == NULL)) + comment = za->comment_orig; + else + comment = za->comment_changes; + + if ((str=_zip_string_get(comment, &len, flags, &za->error)) == NULL) + return NULL; + + if (lenp) + *lenp = (int)len; + + return (const char *)str; } diff --git a/ext/zip/lib/zip_get_archive_flag.c b/ext/zip/lib/zip_get_archive_flag.c index 2d46aa39ffbb4..c3be5c14fec38 100644 --- a/ext/zip/lib/zip_get_archive_flag.c +++ b/ext/zip/lib/zip_get_archive_flag.c @@ -37,10 +37,10 @@ -ZIP_EXTERN(int) -zip_get_archive_flag(struct zip *za, int flag, int flags) +ZIP_EXTERN int +zip_get_archive_flag(struct zip *za, unsigned int flag, zip_flags_t flags) { - int fl; + unsigned int fl; fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; diff --git a/ext/zip/lib/zip_get_compression_implementation.c b/ext/zip/lib/zip_get_compression_implementation.c index 197cd49635d41..aa4a1605c0f36 100644 --- a/ext/zip/lib/zip_get_compression_implementation.c +++ b/ext/zip/lib/zip_get_compression_implementation.c @@ -37,10 +37,10 @@ -ZIP_EXTERN(zip_compression_implementation) -zip_get_compression_implementation(zip_uint16_t cm) +zip_compression_implementation +_zip_get_compression_implementation(zip_int32_t cm) { - if (cm == ZIP_CM_DEFLATE) + if (cm == ZIP_CM_DEFLATE || ZIP_CM_IS_DEFAULT(cm)) return zip_source_deflate; return NULL; } diff --git a/ext/zip/lib/zip_get_encryption_implementation.c b/ext/zip/lib/zip_get_encryption_implementation.c index 783d538d3f6ff..7dcb99210d498 100644 --- a/ext/zip/lib/zip_get_encryption_implementation.c +++ b/ext/zip/lib/zip_get_encryption_implementation.c @@ -37,8 +37,8 @@ -ZIP_EXTERN(zip_encryption_implementation) -zip_get_encryption_implementation(zip_uint16_t em) +zip_encryption_implementation +_zip_get_encryption_implementation(zip_uint16_t em) { if (em == ZIP_EM_TRAD_PKWARE) return zip_source_pkware; diff --git a/ext/zip/lib/zip_get_file_comment.c b/ext/zip/lib/zip_get_file_comment.c index 43c1520e1d438..3be459d4da6b0 100644 --- a/ext/zip/lib/zip_get_file_comment.c +++ b/ext/zip/lib/zip_get_file_comment.c @@ -1,6 +1,6 @@ /* zip_get_file_comment.c -- get file comment - Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,26 +33,21 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(const char *) +ZIP_EXTERN const char * zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags) { - if (idx >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; - } + zip_uint32_t len; + const char *s; - if ((flags & ZIP_FL_UNCHANGED) - || (za->entry[idx].ch_comment_len == -1)) { - if (lenp != NULL) - *lenp = za->cdir->entry[idx].comment_len; - return za->cdir->entry[idx].comment; + if ((s=zip_file_get_comment(za, idx, &len, (zip_flags_t)flags)) != NULL) { + if (lenp) + *lenp = (int)len; } - - if (lenp != NULL) - *lenp = za->entry[idx].ch_comment_len; - return za->entry[idx].ch_comment; + + return s; } diff --git a/ext/zip/lib/zip_get_name.c b/ext/zip/lib/zip_get_name.c index 945e24e1501d5..f67c7caf4305f 100644 --- a/ext/zip/lib/zip_get_name.c +++ b/ext/zip/lib/zip_get_name.c @@ -1,6 +1,6 @@ /* zip_get_name.c -- get filename for a file in zip file - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,12 +33,14 @@ +#include + #include "zipint.h" -ZIP_EXTERN(const char *) -zip_get_name(struct zip *za, zip_uint64_t idx, int flags) +ZIP_EXTERN const char * +zip_get_name(struct zip *za, zip_uint64_t idx, zip_flags_t flags) { return _zip_get_name(za, idx, flags, &za->error); } @@ -46,27 +48,16 @@ zip_get_name(struct zip *za, zip_uint64_t idx, int flags) const char * -_zip_get_name(struct zip *za, zip_uint64_t idx, int flags, - struct zip_error *error) +_zip_get_name(struct zip *za, zip_uint64_t idx, zip_flags_t flags, struct zip_error *error) { - if (idx >= za->nentry) { - _zip_error_set(error, ZIP_ER_INVAL, 0); - return NULL; - } + struct zip_dirent *de; + const zip_uint8_t *str; - if ((flags & ZIP_FL_UNCHANGED) == 0) { - if (za->entry[idx].state == ZIP_ST_DELETED) { - _zip_error_set(error, ZIP_ER_DELETED, 0); - return NULL; - } - if (za->entry[idx].ch_filename) - return za->entry[idx].ch_filename; - } + if ((de=_zip_get_dirent(za, idx, flags, error)) == NULL) + return NULL; - if (za->cdir == NULL || idx >= za->cdir->nentry) { - _zip_error_set(error, ZIP_ER_INVAL, 0); + if ((str=_zip_string_get(de->filename, NULL, flags, error)) == NULL) return NULL; - } - - return za->cdir->entry[idx].filename; + + return (const char *)str; } diff --git a/ext/zip/lib/zip_get_num_entries.c b/ext/zip/lib/zip_get_num_entries.c index dd392e909592e..26484baff22a6 100644 --- a/ext/zip/lib/zip_get_num_entries.c +++ b/ext/zip/lib/zip_get_num_entries.c @@ -37,16 +37,19 @@ -ZIP_EXTERN(zip_uint64_t) -zip_get_num_entries(struct zip *za, int flags) +ZIP_EXTERN zip_int64_t +zip_get_num_entries(struct zip *za, zip_flags_t flags) { + zip_uint64_t n; + if (za == NULL) return -1; if (flags & ZIP_FL_UNCHANGED) { - if (za->cdir == NULL) - return 0; - return za->cdir->nentry; + n = za->nentry; + while (n>0 && za->entry[n-1].orig == NULL) + --n; + return (zip_int64_t)n; } - return za->nentry; + return (zip_int64_t)za->nentry; } diff --git a/ext/zip/lib/zip_get_num_files.c b/ext/zip/lib/zip_get_num_files.c index a442f293ec350..29b06dc8193ff 100644 --- a/ext/zip/lib/zip_get_num_files.c +++ b/ext/zip/lib/zip_get_num_files.c @@ -33,15 +33,17 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) +ZIP_EXTERN int zip_get_num_files(struct zip *za) { if (za == NULL) return -1; - return za->nentry; + /* XXX: check for overflow */ + return (int)za->nentry; } diff --git a/ext/zip/lib/zip_memdup.c b/ext/zip/lib/zip_memdup.c index 641125ed2d1b2..06af2dabd36c7 100644 --- a/ext/zip/lib/zip_memdup.c +++ b/ext/zip/lib/zip_memdup.c @@ -1,6 +1,6 @@ /* zip_memdup.c -- internal zip function, "strdup" with len - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -43,6 +43,9 @@ _zip_memdup(const void *mem, size_t len, struct zip_error *error) { void *ret; + if (len == 0) + return NULL; + ret = malloc(len); if (!ret) { _zip_error_set(error, ZIP_ER_MEMORY, 0); diff --git a/ext/zip/lib/zip_name_locate.c b/ext/zip/lib/zip_name_locate.c index 8cdd2c4d7ea0b..3cac110543672 100644 --- a/ext/zip/lib/zip_name_locate.c +++ b/ext/zip/lib/zip_name_locate.c @@ -34,26 +34,28 @@ #include +#ifdef HAVE_STRINGS_H +#include +#endif #include "zipint.h" -ZIP_EXTERN(int) -zip_name_locate(struct zip *za, const char *fname, int flags) +ZIP_EXTERN zip_int64_t +zip_name_locate(struct zip *za, const char *fname, zip_flags_t flags) { return _zip_name_locate(za, fname, flags, &za->error); } -int -_zip_name_locate(struct zip *za, const char *fname, int flags, - struct zip_error *error) +zip_int64_t +_zip_name_locate(struct zip *za, const char *fname, zip_flags_t flags, struct zip_error *error) { int (*cmp)(const char *, const char *); const char *fn, *p; - int i, n; + zip_uint64_t i; if (za == NULL) return -1; @@ -63,21 +65,12 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, return -1; } - if ((flags & ZIP_FL_UNCHANGED) && za->cdir == NULL) { - _zip_error_set(error, ZIP_ER_NOENT, 0); - return -1; - } - - cmp = (flags & ZIP_FL_NOCASE) ? strcmpi : strcmp; + cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; - n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; - for (i=0; icdir->entry[i].filename; - else - fn = _zip_get_name(za, i, flags, error); + for (i=0; inentry; i++) { + fn = _zip_get_name(za, i, flags, error); - /* newly added (partially filled) entry */ + /* newly added (partially filled) entry or error */ if (fn == NULL) continue; @@ -87,11 +80,12 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, fn = p+1; } - if (cmp(fname, fn) == 0) - return i; + if (cmp(fname, fn) == 0) { + _zip_error_clear(error); + return (zip_int64_t)i; + } } -/* Look for an entry should not raise an error */ -/* _zip_error_set(error, ZIP_ER_NOENT, 0);*/ + _zip_error_set(error, ZIP_ER_NOENT, 0); return -1; } diff --git a/ext/zip/lib/zip_new.c b/ext/zip/lib/zip_new.c index 7ce1237cdbabd..f77634a389f36 100644 --- a/ext/zip/lib/zip_new.c +++ b/ext/zip/lib/zip_new.c @@ -1,6 +1,6 @@ /* zip_new.c -- create and init struct zip - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -56,16 +56,17 @@ _zip_new(struct zip_error *error) za->zn = NULL; za->zp = NULL; + za->open_flags = 0; _zip_error_init(&za->error); - za->cdir = NULL; - za->ch_comment = NULL; - za->ch_comment_len = -1; + za->flags = za->ch_flags = 0; + za->default_password = NULL; + za->comment_orig = za->comment_changes = NULL; + za->comment_changed = 0; za->nentry = za->nentry_alloc = 0; za->entry = NULL; za->nfile = za->nfile_alloc = 0; za->file = NULL; - za->flags = za->ch_flags = 0; - za->default_password = NULL; + za->tempdir = NULL; return za; } diff --git a/ext/zip/lib/zip_open.c b/ext/zip/lib/zip_open.c index 5ce1c1070ae03..e6a30d5ae7066 100644 --- a/ext/zip/lib/zip_open.c +++ b/ext/zip/lib/zip_open.c @@ -1,6 +1,6 @@ /* zip_open.c -- open zip archive by name - Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -42,38 +42,53 @@ #include "zipint.h" -static void set_error(int *, struct zip_error *, int); -static struct zip *_zip_allocate_new(const char *, int *); -static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); -static void _zip_check_torrentzip(struct zip *); -static struct zip_cdir *_zip_find_central_dir(FILE *, int, int *, off_t); -static int _zip_file_exists(const char *, int, int *); -static int _zip_headercomp(struct zip_dirent *, int, - struct zip_dirent *, int); -static unsigned char *_zip_memmem(const unsigned char *, int, - const unsigned char *, int); -static struct zip_cdir *_zip_readcdir(FILE *, off_t, unsigned char *, unsigned char *, - int, int, struct zip_error *); +static void set_error(int *, const struct zip_error *, int); +static struct zip *_zip_allocate_new(const char *, unsigned int, int *); +static zip_int64_t _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); +static void _zip_check_torrentzip(struct zip *, const struct zip_cdir *); +static struct zip_cdir *_zip_find_central_dir(FILE *, unsigned int, int *, off_t); +static int _zip_file_exists(const char *, unsigned int, int *); +static int _zip_headercomp(const struct zip_dirent *, const struct zip_dirent *); +static unsigned char *_zip_memmem(const unsigned char *, size_t, + const unsigned char *, size_t); +static struct zip_cdir *_zip_readcdir(FILE *, off_t, unsigned char *, const unsigned char *, + size_t, unsigned int, struct zip_error *); +static struct zip_cdir *_zip_read_eocd(const unsigned char *, const unsigned char *, off_t, + size_t, unsigned int, struct zip_error *); +static struct zip_cdir *_zip_read_eocd64(FILE *, const unsigned char *, const unsigned char *, + off_t, size_t, unsigned int, struct zip_error *); -ZIP_EXTERN(struct zip *) -zip_open(const char *fn, int flags, int *zep) +ZIP_EXTERN struct zip * +zip_open(const char *fn, int _flags, int *zep) { FILE *fp; - - if (flags & ZIP_OVERWRITE) { - return _zip_allocate_new(fn, zep); + unsigned int flags; + + if (_flags < 0) { + if (zep) + *zep = ZIP_ER_INVAL; + return NULL; } - + flags = (unsigned int)_flags; + switch (_zip_file_exists(fn, flags, zep)) { case -1: - if (!(flags & ZIP_OVERWRITE)) { - return NULL; - } + return NULL; case 0: - return _zip_allocate_new(fn, zep); + return _zip_allocate_new(fn, flags, zep); default: + if (flags & ZIP_TRUNCATE) { + FILE *f; + + if ((f = fopen(fn, "rb")) == NULL) { + set_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + fclose(f); + return _zip_allocate_new(fn, flags, zep); + } break; } @@ -82,17 +97,36 @@ zip_open(const char *fn, int flags, int *zep) return NULL; } - return _zip_open(fn, fp, flags, 0, zep); + return _zip_open(fn, fp, flags, zep); } + +ZIP_EXTERN int +zip_archive_set_tempdir(struct zip *za, const char *tempdir) +{ + char *new_tempdir; + + if (tempdir) { + if ((new_tempdir = strdup(tempdir)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, errno); + return -1; + } + } + else + new_tempdir = NULL; + + free(za->tempdir); + za->tempdir = new_tempdir; + + return 0; +} struct zip * -_zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep) +_zip_open(const char *fn, FILE *fp, unsigned int flags, int *zep) { struct zip *za; struct zip_cdir *cdir; - int i; off_t len; if (fseeko(fp, 0, SEEK_END) < 0) { @@ -103,7 +137,7 @@ _zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep) /* treat empty files as empty archives */ if (len == 0) { - if ((za=_zip_allocate_new(fn, zep)) == NULL) + if ((za=_zip_allocate_new(fn, flags, zep)) == NULL) fclose(fp); else za->zp = fp; @@ -116,34 +150,32 @@ _zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep) return NULL; } - if ((za=_zip_allocate_new(fn, zep)) == NULL) { + if ((za=_zip_allocate_new(fn, flags, zep)) == NULL) { _zip_cdir_free(cdir); fclose(fp); return NULL; } - za->cdir = cdir; + za->entry = cdir->entry; + za->nentry = cdir->nentry; + za->nentry_alloc = cdir->nentry_alloc; + za->comment_orig = cdir->comment; + za->zp = fp; - if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry)) - * cdir->nentry)) == NULL) { - set_error(zep, NULL, ZIP_ER_MEMORY); - _zip_free(za); - return NULL; - } - for (i=0; inentry; i++) - _zip_entry_new(za); + _zip_check_torrentzip(za, cdir); - _zip_check_torrentzip(za); za->ch_flags = za->flags; + free(cdir); + return za; } static void -set_error(int *zep, struct zip_error *err, int ze) +set_error(int *zep, const struct zip_error *err, int ze) { int se; @@ -166,16 +198,17 @@ set_error(int *zep, struct zip_error *err, int ze) entries, or NULL if unsuccessful. */ static struct zip_cdir * -_zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eocd, int buflen, - int flags, struct zip_error *error) +_zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, const unsigned char *eocd, size_t buflen, + unsigned int flags, struct zip_error *error) { struct zip_cdir *cd; - unsigned char *cdp, **bufp; - int i, comlen, nentry; - zip_uint32_t left; + const unsigned char *cdp; + const unsigned char **bufp; + zip_int64_t tail_len, comment_len; + zip_uint64_t i, left; - comlen = buf + buflen - eocd - EOCDLEN; - if (comlen < 0) { + tail_len = buf + buflen - eocd - EOCDLEN; + if (tail_len < 0) { /* not enough bytes left for comment */ _zip_error_set(error, ZIP_ER_NOZIP, 0); return NULL; @@ -192,46 +225,32 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc return NULL; } - cdp = eocd + 8; - /* number of cdir-entries on this disk */ - i = _zip_read2(&cdp); - /* number of cdir-entries */ - nentry = _zip_read2(&cdp); + if (eocd-EOCD64LOCLEN >= buf && memcmp(eocd-EOCD64LOCLEN, EOCD64LOC_MAGIC, 4) == 0) + cd = _zip_read_eocd64(fp, eocd-EOCD64LOCLEN, buf, buf_offset, buflen, flags, error); + else + cd = _zip_read_eocd(eocd, buf, buf_offset, buflen, flags, error); - if ((cd=_zip_cdir_new(nentry, error)) == NULL) + if (cd == NULL) return NULL; - cd->size = _zip_read4(&cdp); - cd->offset = _zip_read4(&cdp); - cd->comment = NULL; - cd->comment_len = _zip_read2(&cdp); + cdp = eocd + 20; + comment_len = _zip_read2(&cdp); - if (((zip_uint64_t)cd->offset)+cd->size > buf_offset + (eocd-buf)) { + if ((zip_uint64_t)cd->offset+(zip_uint64_t)cd->size > (zip_uint64_t)buf_offset + (zip_uint64_t)(eocd-buf)) { /* cdir spans past EOCD record */ _zip_error_set(error, ZIP_ER_INCONS, 0); - cd->nentry = 0; _zip_cdir_free(cd); return NULL; } - if ((comlen < cd->comment_len) || (cd->nentry != i)) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); - cd->nentry = 0; - _zip_cdir_free(cd); - return NULL; - } - if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) { + if (tail_len < comment_len || ((flags & ZIP_CHECKCONS) && tail_len != comment_len)) { _zip_error_set(error, ZIP_ER_INCONS, 0); - cd->nentry = 0; _zip_cdir_free(cd); return NULL; } - if (cd->comment_len) { - if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN, - cd->comment_len, error)) - == NULL) { - cd->nentry = 0; + if (comment_len) { + if ((cd->comment=_zip_string_new(eocd+EOCDLEN, (zip_uint16_t)comment_len, ZIP_FL_ENC_GUESS, error)) == NULL) { _zip_cdir_free(cd); return NULL; } @@ -249,40 +268,32 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc fseeko(fp, cd->offset, SEEK_SET); /* possible consistency check: cd->offset = len-(cd->size+cd->comment_len+EOCDLEN) ? */ - if (ferror(fp) || ((unsigned long)ftello(fp) != cd->offset)) { + if (ferror(fp) || (ftello(fp) != cd->offset)) { /* seek error or offset of cdir wrong */ if (ferror(fp)) _zip_error_set(error, ZIP_ER_SEEK, errno); else _zip_error_set(error, ZIP_ER_NOZIP, 0); - cd->nentry = 0; _zip_cdir_free(cd); return NULL; } } - left = cd->size; + left = (zip_uint64_t)cd->size; i=0; while (inentry && left > 0) { - if ((_zip_dirent_read(cd->entry+i, fp, bufp, &left, 0, error)) < 0) { - cd->nentry = i; + if ((cd->entry[i].orig=_zip_dirent_new()) == NULL + || (_zip_dirent_read(cd->entry[i].orig, fp, bufp, &left, 0, error)) < 0) { _zip_cdir_free(cd); return NULL; } i++; - - if (i == cd->nentry && left > 0) { - /* Infozip extension for more than 64k entries: - nentries wraps around, size indicates correct EOCD */ - if (_zip_cdir_grow(cd, cd->nentry+ZIP_UINT16_MAX, error) < 0) { - cd->nentry = i; - _zip_cdir_free(cd); - return NULL; - } - } } - - cd->nentry = i; + if (i != cd->nentry || ((flags & ZIP_CHECKCONS) && left != 0)) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_cdir_free(cd); + return NULL; + } return cd; } @@ -295,84 +306,88 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc file and header offsets. Returns -1 if not plausible, else the difference between the lowest and the highest fileposition reached */ -static int +static zip_int64_t _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) { - int i; - unsigned int min, max, j; + zip_uint64_t i; + zip_uint64_t min, max, j; struct zip_dirent temp; if (cd->nentry) { - max = cd->entry[0].offset; - min = cd->entry[0].offset; + max = cd->entry[0].orig->offset; + min = cd->entry[0].orig->offset; } else min = max = 0; for (i=0; inentry; i++) { - if (cd->entry[i].offset < min) - min = cd->entry[i].offset; - if (min > cd->offset) { + if (cd->entry[i].orig->offset < min) + min = cd->entry[i].orig->offset; + if (min > (zip_uint64_t)cd->offset) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } - j = cd->entry[i].offset + cd->entry[i].comp_size - + cd->entry[i].filename_len + LENTRYSIZE; + j = cd->entry[i].orig->offset + cd->entry[i].orig->comp_size + + _zip_string_length(cd->entry[i].orig->filename) + LENTRYSIZE; if (j > max) max = j; - if (max > cd->offset) { + if (max > (zip_uint64_t)cd->offset) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } - if (fseeko(fp, cd->entry[i].offset, SEEK_SET) != 0) { - _zip_error_set(error, ZIP_ER_SEEK, 0); + if (fseeko(fp, (off_t)cd->entry[i].orig->offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); return -1; } if (_zip_dirent_read(&temp, fp, NULL, NULL, 1, error) == -1) return -1; - if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { + if (_zip_headercomp(cd->entry[i].orig, &temp) != 0) { _zip_error_set(error, ZIP_ER_INCONS, 0); _zip_dirent_finalize(&temp); return -1; } + + cd->entry[i].orig->extra_fields = _zip_ef_merge(cd->entry[i].orig->extra_fields, temp.extra_fields); + cd->entry[i].orig->local_extra_fields_read = 1; + temp.extra_fields = NULL; + _zip_dirent_finalize(&temp); } - return max - min; + return (max-min) < ZIP_INT64_MAX ? (zip_int64_t)(max-min) : ZIP_INT64_MAX; } /* _zip_check_torrentzip: - check whether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ + check wether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ static void -_zip_check_torrentzip(struct zip *za) +_zip_check_torrentzip(struct zip *za, const struct zip_cdir *cdir) { uLong crc_got, crc_should; char buf[8+1]; char *end; - if (za->zp == NULL || za->cdir == NULL) + if (za->zp == NULL || cdir == NULL) return; - if (za->cdir->comment_len != TORRENT_SIG_LEN+8 - || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0) + if (_zip_string_length(cdir->comment) != TORRENT_SIG_LEN+8 + || strncmp((const char *)cdir->comment->raw, TORRENT_SIG, TORRENT_SIG_LEN) != 0) return; - memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8); + memcpy(buf, cdir->comment->raw+TORRENT_SIG_LEN, 8); buf[8] = '\0'; errno = 0; crc_should = strtoul(buf, &end, 16); if ((crc_should == UINT_MAX && errno != 0) || (end && *end)) return; - if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size, - &crc_got, NULL) < 0) + if (_zip_filerange_crc(za->zp, cdir->offset, cdir->size, &crc_got, NULL) < 0) return; if (crc_got == crc_should) @@ -383,68 +398,32 @@ _zip_check_torrentzip(struct zip *za) /* _zip_headercomp: - compares two headers h1 and h2; if they are local headers, set - local1p or local2p respectively to 1, else 0. Return 0 if they - are identical, -1 if not. */ + compares a central directory entry and a local file header + Return 0 if they are consistent, -1 if not. */ static int -_zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, - int local2p) +_zip_headercomp(const struct zip_dirent *central, const struct zip_dirent *local) { - if ((h1->version_needed != h2->version_needed) + if ((central->version_needed != local->version_needed) #if 0 /* some zip-files have different values in local and global headers for the bitflags */ - || (h1->bitflags != h2->bitflags) + || (central->bitflags != local->bitflags) #endif - || (h1->comp_method != h2->comp_method) - || (h1->last_mod != h2->last_mod) - || (h1->filename_len != h2->filename_len) - || !h1->filename || !h2->filename - || strcmp(h1->filename, h2->filename)) + || (central->comp_method != local->comp_method) + || (central->last_mod != local->last_mod) + || !_zip_string_equal(central->filename, local->filename)) return -1; - /* check that CRC and sizes are zero if data descriptor is used */ - if ((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local1p - && (h1->crc != 0 - || h1->comp_size != 0 - || h1->uncomp_size != 0)) - return -1; - if ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local2p - && (h2->crc != 0 - || h2->comp_size != 0 - || h2->uncomp_size != 0)) - return -1; - - /* check that CRC and sizes are equal if no data descriptor is used */ - if (((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local1p == 0) - && ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local2p == 0)) { - if ((h1->crc != h2->crc) - || (h1->comp_size != h2->comp_size) - || (h1->uncomp_size != h2->uncomp_size)) + + if ((central->crc != local->crc) || (central->comp_size != local->comp_size) + || (central->uncomp_size != local->uncomp_size)) { + /* InfoZip stores valid values in local header even when data descriptor is used. + This is in violation of the appnote. */ + if (((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 + || local->crc != 0 || local->comp_size != 0 || local->uncomp_size != 0)) return -1; } - - if ((local1p == local2p) - && ((h1->extrafield_len != h2->extrafield_len) - || (h1->extrafield_len && h2->extrafield - && memcmp(h1->extrafield, h2->extrafield, - h1->extrafield_len)))) - return -1; - - /* if either is local, nothing more to check */ - if (local1p || local2p) - return 0; - - if ((h1->version_madeby != h2->version_madeby) - || (h1->disk_number != h2->disk_number) - || (h1->int_attrib != h2->int_attrib) - || (h1->ext_attrib != h2->ext_attrib) - || (h1->offset != h2->offset) - || (h1->comment_len != h2->comment_len) - || (h1->comment_len && h2->comment - && memcmp(h1->comment, h2->comment, h1->comment_len))) - return -1; return 0; } @@ -452,7 +431,7 @@ _zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, static struct zip * -_zip_allocate_new(const char *fn, int *zep) +_zip_allocate_new(const char *fn, unsigned int flags, int *zep) { struct zip *za; struct zip_error error; @@ -467,18 +446,19 @@ _zip_allocate_new(const char *fn, int *zep) else { za->zn = strdup(fn); if (!za->zn) { - _zip_free(za); + zip_discard(za); set_error(zep, NULL, ZIP_ER_MEMORY); return NULL; } } + za->open_flags = flags; return za; } static int -_zip_file_exists(const char *fn, int flags, int *zep) +_zip_file_exists(const char *fn, unsigned int flags, int *zep) { struct stat st; @@ -488,7 +468,7 @@ _zip_file_exists(const char *fn, int flags, int *zep) } if (stat(fn, &st) != 0) { - if (flags & ZIP_CREATE || flags & ZIP_OVERWRITE) + if (flags & ZIP_CREATE) return 0; else { set_error(zep, NULL, ZIP_ER_OPEN); @@ -508,12 +488,14 @@ _zip_file_exists(const char *fn, int flags, int *zep) static struct zip_cdir * -_zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) +_zip_find_central_dir(FILE *fp, unsigned int flags, int *zep, off_t len) { struct zip_cdir *cdir, *cdirnew; unsigned char *buf, *match; off_t buf_offset; - int a, best, buflen, i; + size_t buflen; + zip_int64_t a, i; + zip_int64_t best; struct zip_error zerr; i = fseeko(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END); @@ -541,10 +523,10 @@ _zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) best = -1; cdir = NULL; - match = buf; + match = buf+ (buflen < CDBUFSIZE ? 0 : EOCD64LOCLEN); _zip_error_set(&zerr, ZIP_ER_NOZIP, 0); - while ((match=_zip_memmem(match, buflen-(match-buf)-18, + while ((match=_zip_memmem(match, buflen-(size_t)(match-buf)-(EOCDLEN-4), (const unsigned char *)EOCD_MAGIC, 4))!=NULL) { /* found match -- check, if good */ /* to avoid finding the same match all over again */ @@ -589,8 +571,7 @@ _zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) static unsigned char * -_zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, - int littlelen) +_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen) { const unsigned char *p; @@ -598,11 +579,159 @@ _zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, return NULL; p = big-1; while ((p=(const unsigned char *) - memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1))) - != NULL) { + memchr(p+1, little[0], (size_t)(big-(p+1))+(size_t)(biglen-littlelen)+1)) != NULL) { if (memcmp(p+1, little+1, littlelen-1)==0) return (unsigned char *)p; } return NULL; } + + + +static struct zip_cdir * +_zip_read_eocd(const unsigned char *eocd, const unsigned char *buf, off_t buf_offset, size_t buflen, + unsigned int flags, struct zip_error *error) +{ + struct zip_cdir *cd; + const unsigned char *cdp; + zip_uint64_t i, nentry, size, offset; + + if (eocd+EOCDLEN > buf+buflen) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + cdp = eocd + 8; + + /* number of cdir-entries on this disk */ + i = _zip_read2(&cdp); + /* number of cdir-entries */ + nentry = _zip_read2(&cdp); + + if (nentry != i) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + size = _zip_read4(&cdp); + offset = _zip_read4(&cdp); + + if (size > ZIP_OFF_MAX || offset > ZIP_OFF_MAX || offset+size > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + + if (offset+size > (zip_uint64_t)(buf_offset + (eocd-buf))) { + /* cdir spans past EOCD record */ + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((flags & ZIP_CHECKCONS) && offset+size != (zip_uint64_t)(buf_offset + (eocd-buf))) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((cd=_zip_cdir_new(nentry, error)) == NULL) + return NULL; + + cd->size = (off_t)size; + cd->offset = (off_t)offset; + + return cd; +} + + + +static struct zip_cdir * +_zip_read_eocd64(FILE *f, const zip_uint8_t *eocd64loc, const zip_uint8_t *buf, + off_t buf_offset, size_t buflen, unsigned int flags, struct zip_error *error) +{ + struct zip_cdir *cd; + zip_uint64_t offset; + const zip_uint8_t *cdp; + zip_uint8_t eocd[EOCD64LEN]; + zip_uint64_t eocd_offset; + zip_uint64_t size, nentry, i; + + cdp = eocd64loc+8; + eocd_offset = _zip_read8(&cdp); + + if (eocd_offset > ZIP_OFF_MAX || eocd_offset + EOCD64LEN > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + + if (eocd64loc < buf || (off_t)eocd_offset+EOCD64LEN > (buf_offset+(eocd64loc-buf))) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((off_t)eocd_offset >= buf_offset && (off_t)eocd_offset+EOCD64LEN <= buf_offset+(ssize_t)buflen) + cdp = buf+((off_t)eocd_offset-buf_offset); + else { + if (fseeko(f, (off_t)eocd_offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); + return NULL; + } + + clearerr(f); + if (fread(eocd, 1, EOCD64LEN, f) < EOCD64LEN) { + _zip_error_set(error, ZIP_ER_READ, errno); + return NULL; + } + + if (ferror(f)) { + _zip_error_set(error, ZIP_ER_READ, errno); + return NULL; + } + + cdp = eocd; + } + + if (memcmp(cdp, EOCD64_MAGIC, 4) != 0) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + cdp += 4; + + size = _zip_read8(&cdp); + + if ((flags & ZIP_CHECKCONS) && size+eocd_offset+12 != (zip_uint64_t)(buf_offset+(eocd64loc-buf))) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + cdp += 4; /* skip version made by/needed */ + cdp += 8; /* skip num disks */ + + nentry = _zip_read8(&cdp); + i = _zip_read8(&cdp); + + if (nentry != i) { + _zip_error_set(error, ZIP_ER_MULTIDISK, 0); + return NULL; + } + + size = _zip_read8(&cdp); + offset = _zip_read8(&cdp); + + if (size > ZIP_OFF_MAX || offset > ZIP_OFF_MAX || offset+size > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + if ((flags & ZIP_CHECKCONS) && offset+size != eocd_offset) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((cd=_zip_cdir_new(nentry, error)) == NULL) + return NULL; + + + cd->size = (off_t)size; + cd->offset = (off_t)offset; + + return cd; +} diff --git a/ext/zip/lib/zip_rename.c b/ext/zip/lib/zip_rename.c index 6b5a0359172da..8841caeca9a9e 100644 --- a/ext/zip/lib/zip_rename.c +++ b/ext/zip/lib/zip_rename.c @@ -1,6 +1,6 @@ /* zip_rename.c -- rename file in zip archive - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -35,36 +35,13 @@ #include +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) +ZIP_EXTERN int zip_rename(struct zip *za, zip_uint64_t idx, const char *name) { - const char *old_name; - int old_is_dir, new_is_dir; - - if (idx >= za->nentry || name[0] == '\0') { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; - } - - if ((old_name=zip_get_name(za, idx, 0)) == NULL) - return -1; - - new_is_dir = (name[strlen(name)-1] == '/'); - old_is_dir = (old_name[strlen(old_name)-1] == '/'); - - if (new_is_dir != old_is_dir) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - return _zip_set_name(za, idx, name); + return zip_file_rename(za, idx, name, 0); } diff --git a/ext/zip/lib/zip_replace.c b/ext/zip/lib/zip_replace.c index 6dc3dd5ab508f..de717afec7dd1 100644 --- a/ext/zip/lib/zip_replace.c +++ b/ext/zip/lib/zip_replace.c @@ -1,6 +1,6 @@ /* zip_replace.c -- replace file via callback function - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,53 +33,13 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) +ZIP_EXTERN int zip_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source) { - if (idx >= za->nentry || source == NULL) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - if (_zip_replace(za, idx, NULL, source) == -1) - return -1; - - return 0; -} - - - - -/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ - -zip_int64_t -_zip_replace(struct zip *za, zip_uint64_t idx, const char *name, - struct zip_source *source) -{ - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; - } - - if (idx == ZIP_UINT64_MAX) { - if (_zip_entry_new(za) == NULL) - return -1; - - idx = za->nentry - 1; - } - - _zip_unchange_data(za->entry+idx); - - if (name && _zip_set_name(za, idx, name) != 0) - return -1; - - za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry) - ? ZIP_ST_ADDED : ZIP_ST_REPLACED); - za->entry[idx].source = source; - - return idx; + return zip_file_replace(za, idx, source, 0); } diff --git a/ext/zip/lib/zip_set_archive_comment.c b/ext/zip/lib/zip_set_archive_comment.c index 3cd069c7577c9..df1caee06b116 100644 --- a/ext/zip/lib/zip_set_archive_comment.c +++ b/ext/zip/lib/zip_set_archive_comment.c @@ -1,6 +1,6 @@ /* zip_set_archive_comment.c -- set archive comment - Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -39,32 +39,46 @@ -ZIP_EXTERN(int) -zip_set_archive_comment(struct zip *za, const char *comment, int len) +ZIP_EXTERN int +zip_set_archive_comment(struct zip *za, const char *comment, zip_uint16_t len) { - char *tmpcom; + struct zip_string *cstr; - if (len < 0 || len > MAXCOMLEN - || (len > 0 && comment == NULL)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + if (len > 0 && comment == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (len > 0) { - if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) + if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, ZIP_FL_ENC_GUESS, &za->error)) == NULL) return -1; + + if (_zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_CP437) { + _zip_string_free(cstr); + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } } else - tmpcom = NULL; + cstr = NULL; + + _zip_string_free(za->comment_changes); + za->comment_changes = NULL; - free(za->ch_comment); - za->ch_comment = tmpcom; - za->ch_comment_len = len; + if (((za->comment_orig && _zip_string_equal(za->comment_orig, cstr)) + || (za->comment_orig == NULL && cstr == NULL))) { + _zip_string_free(cstr); + za->comment_changed = 0; + } + else { + za->comment_changes = cstr; + za->comment_changed = 1; + } return 0; } diff --git a/ext/zip/lib/zip_set_archive_flag.c b/ext/zip/lib/zip_set_archive_flag.c index 07bcfbe304d85..b6cdab120ddb2 100644 --- a/ext/zip/lib/zip_set_archive_flag.c +++ b/ext/zip/lib/zip_set_archive_flag.c @@ -37,8 +37,8 @@ -ZIP_EXTERN(int) -zip_set_archive_flag(struct zip *za, int flag, int value) +ZIP_EXTERN int +zip_set_archive_flag(struct zip *za, unsigned int flag, int value) { unsigned int new_flags; diff --git a/ext/zip/lib/zip_set_default_password.c b/ext/zip/lib/zip_set_default_password.c index c274d1100bb3a..b9aa80acffc25 100644 --- a/ext/zip/lib/zip_set_default_password.c +++ b/ext/zip/lib/zip_set_default_password.c @@ -40,7 +40,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_set_default_password(struct zip *za, const char *passwd) { if (za == NULL) diff --git a/ext/zip/lib/zip_set_file_comment.c b/ext/zip/lib/zip_set_file_comment.c index 5e63dc2730ad4..7acd0eb36de29 100644 --- a/ext/zip/lib/zip_set_file_comment.c +++ b/ext/zip/lib/zip_set_file_comment.c @@ -1,6 +1,6 @@ /* zip_set_file_comment.c -- set comment for file in archive - Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -35,38 +35,17 @@ #include +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) -zip_set_file_comment(struct zip *za, zip_uint64_t idx, - const char *comment, int len) +ZIP_EXTERN int +zip_set_file_comment(struct zip *za, zip_uint64_t idx, const char *comment, int len) { - char *tmpcom; - - if (idx >= za->nentry - || len < 0 || len > MAXCOMLEN - || (len > 0 && comment == NULL)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; + if (len < 0 || len > ZIP_UINT16_MAX) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; } - - if (len > 0) { - if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) - return -1; - } - else - tmpcom = NULL; - - free(za->entry[idx].ch_comment); - za->entry[idx].ch_comment = tmpcom; - za->entry[idx].ch_comment_len = len; - - return 0; + return zip_file_set_comment(za, idx, comment, (zip_uint16_t)len, 0); } diff --git a/ext/zip/lib/zip_set_file_compression.c b/ext/zip/lib/zip_set_file_compression.c new file mode 100644 index 0000000000000..ea8517d70e602 --- /dev/null +++ b/ext/zip/lib/zip_set_file_compression.c @@ -0,0 +1,90 @@ +/* + zip_set_file_compression.c -- set compression for file in archive + Copyright (C) 2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_set_file_compression(struct zip *za, zip_uint64_t idx, + zip_int32_t method, zip_uint32_t flags) +{ + struct zip_entry *e; + zip_int32_t old_method; + + if (idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (method != ZIP_CM_DEFAULT && method != ZIP_CM_STORE && method != ZIP_CM_DEFLATE) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return -1; + } + + e = za->entry+idx; + + old_method = (e->orig == NULL ? ZIP_CM_DEFAULT : e->orig->comp_method); + + /* XXX: revisit this when flags are supported, since they may require a recompression */ + + if (method == old_method) { + if (e->changes) { + e->changes->changed &= ~ZIP_DIRENT_COMP_METHOD; + if (e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + } + else { + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + e->changes->comp_method = method; + e->changes->changed |= ZIP_DIRENT_COMP_METHOD; + } + + return 0; +} diff --git a/ext/zip/lib/zip_set_name.c b/ext/zip/lib/zip_set_name.c index 2a90601bfec35..60c9e7d5bf59a 100644 --- a/ext/zip/lib/zip_set_name.c +++ b/ext/zip/lib/zip_set_name.c @@ -1,6 +1,6 @@ /* zip_set_name.c -- rename helper function - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -41,35 +41,77 @@ int -_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name) +_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name, zip_flags_t flags) { - char *s; + struct zip_entry *e; + struct zip_string *str; + int changed; zip_int64_t i; - - if (idx >= za->nentry || name == NULL) { + + if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) { + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (name && strlen(name) > 0) { + /* XXX: check for string too long */ + if ((str=_zip_string_new((const zip_uint8_t *)name, (zip_uint16_t)strlen(name), flags, &za->error)) == NULL) + return -1; + if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(str, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED) + str->encoding = ZIP_ENCODING_UTF8_KNOWN; + } + else + str = NULL; + + /* XXX: encoding flags needed for CP437? */ + if ((i=_zip_name_locate(za, name, 0, NULL)) >= 0 && (zip_uint64_t)i != idx) { + _zip_string_free(str); _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); return -1; } /* no effective name change */ - if (i == idx) + if (i>=0 && (zip_uint64_t)i == idx) { + _zip_string_free(str); return 0; - - if ((s=strdup(name)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return -1; } - - if (za->entry[idx].state == ZIP_ST_UNCHANGED) - za->entry[idx].state = ZIP_ST_RENAMED; - free(za->entry[idx].ch_filename); - za->entry[idx].ch_filename = s; + e = za->entry+idx; + + if (e->changes) { + _zip_string_free(e->changes->filename); + e->changes->filename = NULL; + e->changes->changed &= ~ZIP_DIRENT_FILENAME; + } + + if (e->orig) + changed = !_zip_string_equal(e->orig->filename, str); + else + changed = 1; + + if (changed) { + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_string_free(str); + return -1; + } + } + e->changes->filename = str; + e->changes->changed |= ZIP_DIRENT_FILENAME; + } + else { + _zip_string_free(str); + if (e->changes && e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } return 0; } diff --git a/ext/zip/lib/zip_source_buffer.c b/ext/zip/lib/zip_source_buffer.c index 8c9154ce3c5ba..8a13e7602d195 100644 --- a/ext/zip/lib/zip_source_buffer.c +++ b/ext/zip/lib/zip_source_buffer.c @@ -48,7 +48,7 @@ static zip_int64_t read_data(void *, void *, zip_uint64_t, enum zip_source_cmd); -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_buffer(struct zip *za, const void *data, zip_uint64_t len, int freep) { struct read_data *f; @@ -98,9 +98,7 @@ read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) return 0; case ZIP_SOURCE_READ: - /* XXX: return error if (len > ZIP_INT64_MAX) */ - - n = z->end - z->buf; + n = (zip_uint64_t)(z->end - z->buf); if (n > len) n = len; @@ -109,7 +107,7 @@ read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) z->buf += n; } - return n; + return (zip_int64_t)n; case ZIP_SOURCE_CLOSE: return 0; @@ -125,7 +123,7 @@ read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) zip_stat_init(st); st->mtime = z->mtime; - st->size = z->end - z->data; + st->size = (zip_uint64_t)(z->end - z->data); st->comp_size = st->size; st->comp_method = ZIP_CM_STORE; st->encryption_method = ZIP_EM_NONE; diff --git a/ext/zip/lib/zip_source_close.c b/ext/zip/lib/zip_source_close.c index a3bf7e5e1d9bd..7b89d5fc15f68 100644 --- a/ext/zip/lib/zip_source_close.c +++ b/ext/zip/lib/zip_source_close.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +void zip_source_close(struct zip_source *src) { if (!src->is_open) diff --git a/ext/zip/lib/zip_source_crc.c b/ext/zip/lib/zip_source_crc.c index 7fd78f56970cf..99bc965228898 100644 --- a/ext/zip/lib/zip_source_crc.c +++ b/ext/zip/lib/zip_source_crc.c @@ -38,7 +38,7 @@ #include "zipint.h" -struct crc { +struct crc_context { int eof; int validate; int e[2]; @@ -51,23 +51,27 @@ static zip_int64_t crc_read(struct zip_source *, void *, void * -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_crc(struct zip *za, struct zip_source *src, int validate) { - struct crc *ctx; + struct crc_context *ctx; if (src == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } - if ((ctx=(struct crc *)malloc(sizeof(*ctx))) == NULL) { + if ((ctx=(struct crc_context *)malloc(sizeof(*ctx))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } + ctx->eof = 0; ctx->validate = validate; - + ctx->e[0] = ctx->e[1] = 0; + ctx->size = 0; + ctx->crc = 0; + return zip_source_layered(za, src, crc_read, ctx); } @@ -77,15 +81,15 @@ static zip_int64_t crc_read(struct zip_source *src, void *_ctx, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { - struct crc *ctx; + struct crc_context *ctx; zip_int64_t n; - ctx = (struct crc *)_ctx; + ctx = (struct crc_context *)_ctx; switch (cmd) { case ZIP_SOURCE_OPEN: ctx->eof = 0; - ctx->crc = crc32(0, NULL, 0); + ctx->crc = (zip_uint32_t)crc32(0, NULL, 0); ctx->size = 0; return 0; @@ -120,8 +124,8 @@ crc_read(struct zip_source *src, void *_ctx, void *data, } } else { - ctx->size += n; - ctx->crc = crc32(ctx->crc, data, n); + ctx->size += (zip_uint64_t)n; + ctx->crc = (zip_uint32_t)crc32(ctx->crc, (const Bytef *)data, (uInt)n); /* XXX: check for overflow, use multiple crc calls if needed */ } return n; @@ -139,7 +143,10 @@ crc_read(struct zip_source *src, void *_ctx, void *data, After all, this only works for uncompressed data. */ st->size = ctx->size; st->crc = ctx->crc; - st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC; + st->comp_size = ctx->size; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; + st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;; } } return 0; diff --git a/ext/zip/lib/zip_source_deflate.c b/ext/zip/lib/zip_source_deflate.c index 5d9c5e67bb605..879953144ce56 100644 --- a/ext/zip/lib/zip_source_deflate.c +++ b/ext/zip/lib/zip_source_deflate.c @@ -60,14 +60,14 @@ static void deflate_free(struct deflate *); -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_deflate(struct zip *za, struct zip_source *src, - zip_uint16_t cm, int flags) + zip_int32_t cm, int flags) { struct deflate *ctx; struct zip_source *s2; - if (src == NULL || cm != ZIP_CM_DEFLATE) { + if (src == NULL || (cm != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(cm))) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } @@ -113,7 +113,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, return 0; ctx->zstr.next_out = (Bytef *)data; - ctx->zstr.avail_out = len; + ctx->zstr.avail_out = (uInt)len; /* XXX: check for overflow */ end = 0; while (!end) { @@ -136,8 +136,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, break; } - if ((n=zip_source_read(src, ctx->buffer, - sizeof(ctx->buffer))) < 0) { + if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) { zip_source_error(src, ctx->e, ctx->e+1); end = 1; break; @@ -149,7 +148,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, } else { ctx->zstr.next_in = (Bytef *)ctx->buffer; - ctx->zstr.avail_in = n; + ctx->zstr.avail_in = (uInt)n; } continue; } @@ -167,7 +166,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, } if (ctx->zstr.avail_out < len) - return len - ctx->zstr.avail_out; + return (zip_int64_t)(len - ctx->zstr.avail_out); return (ctx->e[0] == 0) ? 0 : -1; } @@ -188,7 +187,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, return 0; ctx->zstr.next_out = (Bytef *)data; - ctx->zstr.avail_out = len; + ctx->zstr.avail_out = (uInt)len; /* XXX: check for overflow */ end = 0; while (!end && ctx->zstr.avail_out) { @@ -210,8 +209,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, break; } - if ((n=zip_source_read(src, ctx->buffer, - sizeof(ctx->buffer))) < 0) { + if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) { zip_source_error(src, ctx->e, ctx->e+1); end = 1; break; @@ -220,7 +218,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, ctx->eof = 1; else { ctx->zstr.next_in = (Bytef *)ctx->buffer; - ctx->zstr.avail_in = n; + ctx->zstr.avail_in = (uInt)n; } continue; } @@ -237,7 +235,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, } if (ctx->zstr.avail_out < len) - return len - ctx->zstr.avail_out; + return (zip_int64_t)(len - ctx->zstr.avail_out); return (ctx->e[0] == 0) ? 0 : -1; } @@ -334,7 +332,7 @@ deflate_decompress(struct zip_source *src, void *ud, void *data, ctx->zstr.zfree = Z_NULL; ctx->zstr.opaque = NULL; ctx->zstr.next_in = (Bytef *)ctx->buffer; - ctx->zstr.avail_in = n; + ctx->zstr.avail_in = (uInt)n /* XXX: check for overflow */; /* negative value to tell zlib that there is no header */ if ((ret=inflateInit2(&ctx->zstr, -MAX_WBITS)) != Z_OK) { diff --git a/ext/zip/lib/zip_source_error.c b/ext/zip/lib/zip_source_error.c index 70ec8bc5d452f..a1efd551ea3dd 100644 --- a/ext/zip/lib/zip_source_error.c +++ b/ext/zip/lib/zip_source_error.c @@ -1,6 +1,6 @@ /* zip_source_error.c -- get last error from zip_source - Copyright (C) 2009 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -37,24 +37,21 @@ -ZIP_EXTERN(void) +void zip_source_error(struct zip_source *src, int *ze, int *se) { - int e[2] = { 0, 0 }; + int e[2]; if (src->src == NULL) { + if (src->cb.f(src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { + e[0] = ZIP_ER_INTERNAL; + e[1] = 0; + } } else { switch (src->error_source) { case ZIP_LES_NONE: - if (src->src == NULL) { - if (src->cb.f(src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { - e[0] = ZIP_ER_INTERNAL; - e[1] = 0; - } - } - else - e[0] = e[1] = 0; + e[0] = e[1] = 0; break; case ZIP_LES_INVAL: @@ -67,8 +64,7 @@ zip_source_error(struct zip_source *src, int *ze, int *se) return; case ZIP_LES_UPPER: - if (src->cb.l(src->src, src->ud, e, sizeof(e), - ZIP_SOURCE_ERROR) < 0) { + if (src->cb.l(src->src, src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { e[0] = ZIP_ER_INTERNAL; e[1] = 0; } @@ -77,6 +73,7 @@ zip_source_error(struct zip_source *src, int *ze, int *se) default: e[0] = ZIP_ER_INTERNAL; e[1] = 0; + break; } } diff --git a/ext/zip/lib/zip_source_file.c b/ext/zip/lib/zip_source_file.c index 681cc2f3ea643..79c8ee5aca22b 100644 --- a/ext/zip/lib/zip_source_file.c +++ b/ext/zip/lib/zip_source_file.c @@ -40,7 +40,7 @@ -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_file(struct zip *za, const char *fname, zip_uint64_t start, zip_int64_t len) { diff --git a/ext/zip/lib/zip_source_filep.c b/ext/zip/lib/zip_source_filep.c index 4d896a4c01bfc..0bd2d6846e5a3 100644 --- a/ext/zip/lib/zip_source_filep.c +++ b/ext/zip/lib/zip_source_filep.c @@ -58,14 +58,14 @@ static zip_int64_t read_file(void *state, void *data, zip_uint64_t len, -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_filep(struct zip *za, FILE *file, zip_uint64_t start, zip_int64_t len) { if (za == NULL) return NULL; - if (file == NULL || start < 0 || len < -1) { + if (file == NULL || len < -1) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } @@ -125,7 +125,7 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { struct read_file *z; char *buf; - int i, n; + size_t i, n; z = (struct read_file *)state; buf = (char *)data; @@ -140,7 +140,7 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) } } - if (z->closep) { + if (z->closep && z->off > 0) { if (fseeko(z->f, (off_t)z->off, SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; @@ -153,30 +153,31 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) case ZIP_SOURCE_READ: /* XXX: return INVAL if len > size_t max */ if (z->remain != -1) - n = len > z->remain ? z->remain : len; + n = len > (zip_uint64_t)z->remain ? (zip_uint64_t)z->remain : len; else n = len; if (!z->closep) { /* we might share this file with others, so let's be safe */ - if (fseeko(z->f, (off_t)(z->off + z->len-z->remain), - SEEK_SET) < 0) { + if (fseeko(z->f, (off_t)(z->off + (zip_uint64_t)(z->len-z->remain)), SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; return -1; } } - if ((i=fread(buf, 1, n, z->f)) < 0) { - z->e[0] = ZIP_ER_READ; - z->e[1] = errno; - return -1; + if ((i=fread(buf, 1, n, z->f)) == 0) { + if (ferror(z->f)) { + z->e[0] = ZIP_ER_READ; + z->e[1] = errno; + return -1; + } } if (z->remain != -1) z->remain -= i; - return i; + return (zip_int64_t)i; case ZIP_SOURCE_CLOSE: if (z->fname) { @@ -214,11 +215,11 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) st->mtime = fst.st_mtime; st->valid |= ZIP_STAT_MTIME; if (z->len != -1) { - st->size = z->len; + st->size = (zip_uint64_t)z->len; st->valid |= ZIP_STAT_SIZE; } else if ((fst.st_mode&S_IFMT) == S_IFREG) { - st->size = fst.st_size; + st->size = (zip_uint64_t)fst.st_size; st->valid |= ZIP_STAT_SIZE; } } diff --git a/ext/zip/lib/zip_source_free.c b/ext/zip/lib/zip_source_free.c index f71c71ed6c577..b1e78404965c2 100644 --- a/ext/zip/lib/zip_source_free.c +++ b/ext/zip/lib/zip_source_free.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_source_free(struct zip_source *src) { if (src == NULL) diff --git a/ext/zip/lib/zip_source_function.c b/ext/zip/lib/zip_source_function.c index 984b107f7baa6..cb92e339b4bb2 100644 --- a/ext/zip/lib/zip_source_function.c +++ b/ext/zip/lib/zip_source_function.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_function(struct zip *za, zip_source_callback zcb, void *ud) { struct zip_source *zs; diff --git a/ext/zip/lib/zip_source_layered.c b/ext/zip/lib/zip_source_layered.c index 86ed420407071..ad2870333cdee 100644 --- a/ext/zip/lib/zip_source_layered.c +++ b/ext/zip/lib/zip_source_layered.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_layered(struct zip *za, struct zip_source *src, zip_source_layered_callback cb, void *ud) { diff --git a/ext/zip/lib/zip_source_open.c b/ext/zip/lib/zip_source_open.c index 2c768f7f3a4e5..a5010393e7b9c 100644 --- a/ext/zip/lib/zip_source_open.c +++ b/ext/zip/lib/zip_source_open.c @@ -1,6 +1,6 @@ /* zip_source_open.c -- open zip_source (prepare for reading) - Copyright (C) 2009 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +int zip_source_open(struct zip_source *src) { zip_int64_t ret; @@ -60,7 +60,7 @@ zip_source_open(struct zip_source *src) ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN); if (ret < 0) { - (void)zip_source_close(src->src); + zip_source_close(src->src); if (ret == ZIP_SOURCE_ERR_LOWER) src->error_source = ZIP_LES_LOWER; diff --git a/ext/zip/lib/zip_source_pkware.c b/ext/zip/lib/zip_source_pkware.c index 83b5cc5ad5b22..ec53dfeef0468 100644 --- a/ext/zip/lib/zip_source_pkware.c +++ b/ext/zip/lib/zip_source_pkware.c @@ -49,10 +49,6 @@ struct trad_pkware { #define KEY1 591751049 #define KEY2 878082192 -static const uLongf *crc = NULL; - -#define CRC32(c, b) (crc[((c) ^ (b)) & 0xff] ^ ((c) >> 8)) - static void decrypt(struct trad_pkware *, zip_uint8_t *, @@ -64,7 +60,7 @@ static void pkware_free(struct trad_pkware *); -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_pkware(struct zip *za, struct zip_source *src, zip_uint16_t em, int flags, const char *password) { @@ -80,9 +76,6 @@ zip_source_pkware(struct zip *za, struct zip_source *src, return NULL; } - if (crc == NULL) - crc = get_crc_table(); - if ((ctx=(struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; @@ -118,7 +111,7 @@ decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in, if (!update_only) { /* decrypt next byte */ - tmp = ctx->key[2] | 2; + tmp = (zip_uint16_t)(ctx->key[2] | 2); tmp = (tmp * (tmp ^ 1)) >> 8; b ^= tmp; } @@ -128,10 +121,10 @@ decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in, out[i] = b; /* update keys */ - ctx->key[0] = CRC32(ctx->key[0], b); + ctx->key[0] = (zip_uint32_t)crc32(ctx->key[0] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL; ctx->key[1] = (ctx->key[1] + (ctx->key[0] & 0xff)) * 134775813 + 1; b = ctx->key[1] >> 24; - ctx->key[2] = CRC32(ctx->key[2], b); + ctx->key[2] = (zip_uint32_t)crc32(ctx->key[2] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL; } } @@ -196,7 +189,7 @@ pkware_decrypt(struct zip_source *src, void *ud, void *data, if ((n=zip_source_read(src, data, len)) < 0) return ZIP_SOURCE_ERR_LOWER; - decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n, + decrypt((struct trad_pkware *)ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n, 0); return n; diff --git a/ext/zip/lib/zip_source_pop.c b/ext/zip/lib/zip_source_pop.c index 406093869b962..cd9cb529b5cc7 100644 --- a/ext/zip/lib/zip_source_pop.c +++ b/ext/zip/lib/zip_source_pop.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_pop(struct zip_source *src) { struct zip_source *lower; diff --git a/ext/zip/lib/zip_source_read.c b/ext/zip/lib/zip_source_read.c index 7246f9ccb5367..81b90ba42de35 100644 --- a/ext/zip/lib/zip_source_read.c +++ b/ext/zip/lib/zip_source_read.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(zip_int64_t) +zip_int64_t zip_source_read(struct zip_source *src, void *data, zip_uint64_t len) { zip_int64_t ret; diff --git a/ext/zip/lib/zip_source_stat.c b/ext/zip/lib/zip_source_stat.c index 662779eb6cfba..85ae6a2fd6a26 100644 --- a/ext/zip/lib/zip_source_stat.c +++ b/ext/zip/lib/zip_source_stat.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +int zip_source_stat(struct zip_source *src, struct zip_stat *st) { zip_int64_t ret; diff --git a/ext/zip/lib/zip_source_window.c b/ext/zip/lib/zip_source_window.c new file mode 100644 index 0000000000000..fd202099b5aa8 --- /dev/null +++ b/ext/zip/lib/zip_source_window.c @@ -0,0 +1,150 @@ +/* + zip_source_window.c -- return part of lower source + Copyright (C) 2012-2013 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include +#include + +#include "zipint.h" + +struct window { + zip_uint64_t skip; + zip_uint64_t len; + zip_uint64_t left; + int e[2]; +}; + +static zip_int64_t window_read(struct zip_source *, void *, void *, + zip_uint64_t, enum zip_source_cmd); + + + +struct zip_source * +zip_source_window(struct zip *za, struct zip_source *src, zip_uint64_t start, zip_uint64_t len) +{ + struct window *ctx; + + if (src == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((ctx=(struct window *)malloc(sizeof(*ctx))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + ctx->skip = start; + ctx->len = len; + ctx->left = len; + + return zip_source_layered(za, src, window_read, ctx); +} + + + +static zip_int64_t +window_read(struct zip_source *src, void *_ctx, void *data, + zip_uint64_t len, enum zip_source_cmd cmd) +{ + struct window *ctx; + zip_int64_t ret; + zip_uint64_t n, i; + char b[8192]; + + ctx = (struct window *)_ctx; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + for (n=0; nskip; n+=(zip_uint64_t)ret) { + i = (ctx->skip-n > sizeof(b) ? sizeof(b) : ctx->skip-n); + if ((ret=zip_source_read(src, b, i)) < 0) + return ZIP_SOURCE_ERR_LOWER; + if (ret==0) { + ctx->e[0] = ZIP_ER_EOF; + ctx->e[1] = 0; + return -1; + } + } + return 0; + + case ZIP_SOURCE_READ: + if (len > ctx->left) + len = ctx->left; + + if (len == 0) + return 0; + + if ((ret=zip_source_read(src, data, len)) < 0) + return ZIP_SOURCE_ERR_LOWER; + + ctx->left -= (zip_uint64_t)ret; + + if (ret == 0) { + if (ctx->left > 0) { + ctx->e[0] = ZIP_ER_EOF; + ctx->e[1] = 0; + return -1; + } + } + return ret; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: + { + struct zip_stat *st; + + st = (struct zip_stat *)data; + + st->size = ctx->len; + st->valid |= ZIP_STAT_SIZE; + st->valid &= ~(ZIP_STAT_CRC|ZIP_STAT_COMP_SIZE); + } + return 0; + + case ZIP_SOURCE_ERROR: + memcpy(data, ctx->e, sizeof(ctx->e)); + return 0; + + case ZIP_SOURCE_FREE: + free(ctx); + return 0; + + default: + return -1; + } + +} diff --git a/ext/zip/lib/zip_source_zip.c b/ext/zip/lib/zip_source_zip.c index 228803c717f6a..e4fc2229f782c 100644 --- a/ext/zip/lib/zip_source_zip.c +++ b/ext/zip/lib/zip_source_zip.c @@ -38,153 +38,24 @@ #include "zipint.h" -struct read_zip { - struct zip_file *zf; - struct zip_stat st; - zip_uint64_t off; - zip_int64_t len; -}; - -static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len, - enum zip_source_cmd cmd); - -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx, - int flags, zip_uint64_t start, zip_int64_t len) + zip_flags_t flags, zip_uint64_t start, zip_int64_t len) { - struct zip_error error; - struct zip_source *zs; - struct read_zip *p; - - /* XXX: ZIP_FL_RECOMPRESS */ - - if (za == NULL) - return NULL; - - if (srcza == NULL || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; + if (len < -1) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; } - - if ((flags & ZIP_FL_UNCHANGED) == 0 - && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) { - _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); - return NULL; - } - - if (len == 0) - len = -1; - - if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0) + + if (len == -1) + len = 0; + + if (start == 0 && len == 0) flags |= ZIP_FL_COMPRESSED; else flags &= ~ZIP_FL_COMPRESSED; - if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return NULL; - } - - _zip_error_copy(&error, &srcza->error); - - if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0 - || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) { - free(p); - _zip_error_copy(&za->error, &srcza->error); - _zip_error_copy(&srcza->error, &error); - - return NULL; - } - p->off = start; - p->len = len; - - if ((flags & ZIP_FL_COMPRESSED) == 0) { - p->st.size = p->st.comp_size = len; - p->st.comp_method = ZIP_CM_STORE; - p->st.crc = 0; - } - - if ((zs=zip_source_function(za, read_zip, p)) == NULL) { - free(p); - return NULL; - } - - return zs; -} - - - -static zip_int64_t -read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) -{ - struct read_zip *z; - char b[8192], *buf; - int i; - zip_uint64_t n; - - z = (struct read_zip *)state; - buf = (char *)data; - - switch (cmd) { - case ZIP_SOURCE_OPEN: - for (n=0; noff; n+= i) { - i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n); - if ((i=zip_fread(z->zf, b, i)) < 0) { - zip_fclose(z->zf); - z->zf = NULL; - return -1; - } - } - return 0; - - case ZIP_SOURCE_READ: - if (z->len != -1) - n = len > z->len ? z->len : len; - else - n = len; - - - if ((i=zip_fread(z->zf, buf, n)) < 0) - return -1; - - if (z->len != -1) - z->len -= i; - - return i; - - case ZIP_SOURCE_CLOSE: - return 0; - - case ZIP_SOURCE_STAT: - if (len < sizeof(z->st)) - return -1; - len = sizeof(z->st); - - memcpy(data, &z->st, len); - return len; - - case ZIP_SOURCE_ERROR: - { - int *e; - - if (len < sizeof(int)*2) - return -1; - - e = (int *)data; - zip_file_error_get(z->zf, e, e+1); - } - return sizeof(int)*2; - - case ZIP_SOURCE_FREE: - zip_fclose(z->zf); - free(z); - return 0; - - default: - ; - } - - return -1; + return _zip_source_zip_new(za, srcza, srcidx, flags, start, (zip_uint64_t)len, NULL); } diff --git a/ext/zip/lib/zip_source_zip_new.c b/ext/zip/lib/zip_source_zip_new.c new file mode 100644 index 0000000000000..8e48f6f3faa0c --- /dev/null +++ b/ext/zip/lib/zip_source_zip_new.c @@ -0,0 +1,172 @@ +/* + zip_source_zip_new.c -- prepare data structures for zip_fopen/zip_source_zip + Copyright (C) 2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include + +#include "zipint.h" + + + +struct zip_source * +_zip_source_zip_new(struct zip *za, struct zip *srcza, zip_uint64_t srcidx, zip_flags_t flags, + zip_uint64_t start, zip_uint64_t len, const char *password) +{ + zip_compression_implementation comp_impl; + zip_encryption_implementation enc_impl; + struct zip_source *src, *s2; + zip_uint64_t offset; + struct zip_stat st; + + if (za == NULL) + return NULL; + + if (srcza == NULL || srcidx >= srcza->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && (ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx) || srcza->entry[srcidx].deleted)) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (zip_stat_index(srcza, srcidx, flags|ZIP_FL_UNCHANGED, &st) < 0) { + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return NULL; + } + + if (flags & ZIP_FL_ENCRYPTED) + flags |= ZIP_FL_COMPRESSED; + + if ((start > 0 || len > 0) && (flags & ZIP_FL_COMPRESSED)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + /* overflow or past end of file */ + if ((start > 0 || len > 0) && (start+len < start || start+len > st.size)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + enc_impl = NULL; + if (((flags & ZIP_FL_ENCRYPTED) == 0) && (st.encryption_method != ZIP_EM_NONE)) { + if (password == NULL) { + _zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0); + return NULL; + } + if ((enc_impl=_zip_get_encryption_implementation(st.encryption_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + return NULL; + } + } + + comp_impl = NULL; + if ((flags & ZIP_FL_COMPRESSED) == 0) { + if (st.comp_method != ZIP_CM_STORE) { + if ((comp_impl=_zip_get_compression_implementation(st.comp_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return NULL; + } + } + } + + if ((offset=_zip_file_get_offset(srcza, srcidx, &za->error)) == 0) + return NULL; + + if (st.comp_size == 0) { + if ((src=zip_source_buffer(za, NULL, 0, 0)) == NULL) + return NULL; + } + else { + if (start+len > 0 && enc_impl == NULL && comp_impl == NULL) { + struct zip_stat st2; + + st2.size = len ? len : st.size-start; + st2.comp_size = st2.size; + st2.comp_method = ZIP_CM_STORE; + st2.mtime = st.mtime; + st2.valid = ZIP_STAT_SIZE|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_MTIME; + + /* XXX: check for overflow of st2.size */ + if ((src=_zip_source_file_or_p(za, NULL, srcza->zp, offset+start, (zip_int64_t)st2.size, 0, &st2)) == NULL) + return NULL; + } + else { + /* XXX: check for overflow of st.comp_size */ + if ((src=_zip_source_file_or_p(za, NULL, srcza->zp, offset, (zip_int64_t)st.comp_size, 0, &st)) == NULL) + return NULL; + } + + if (enc_impl) { + if ((s2=enc_impl(za, src, st.encryption_method, 0, password)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) */ + return NULL; + } + src = s2; + } + if (comp_impl) { + if ((s2=comp_impl(za, src, st.comp_method, 0)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) */ + return NULL; + } + src = s2; + } + if (((flags & ZIP_FL_COMPRESSED) == 0 || st.comp_method == ZIP_CM_STORE) + && (len == 0 || len == st.comp_size)) { + /* when reading the whole file, check for crc errors */ + if ((s2=zip_source_crc(za, src, 1)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) */ + return NULL; + } + src = s2; + } + + if (start+len > 0 && (comp_impl || enc_impl)) { + if ((s2=zip_source_window(za, src, start, len ? len : st.size-start)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) (why?) */ + return NULL; + } + src = s2; + } + } + + return src; +} diff --git a/ext/zip/lib/zip_stat.c b/ext/zip/lib/zip_stat.c index c8a25e1d84ac3..8254627d929f4 100644 --- a/ext/zip/lib/zip_stat.c +++ b/ext/zip/lib/zip_stat.c @@ -37,13 +37,13 @@ -ZIP_EXTERN(int) -zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st) +ZIP_EXTERN int +zip_stat(struct zip *za, const char *fname, zip_flags_t flags, struct zip_stat *st) { - int idx; + zip_int64_t idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return -1; - return zip_stat_index(za, idx, flags, st); + return zip_stat_index(za, (zip_uint64_t)idx, flags, st); } diff --git a/ext/zip/lib/zip_stat_index.c b/ext/zip/lib/zip_stat_index.c index 8faa8cc394972..f4ce72aaa82d8 100644 --- a/ext/zip/lib/zip_stat_index.c +++ b/ext/zip/lib/zip_stat_index.c @@ -37,16 +37,15 @@ -ZIP_EXTERN(int) -zip_stat_index(struct zip *za, zip_uint64_t index, int flags, +ZIP_EXTERN int +zip_stat_index(struct zip *za, zip_uint64_t index, zip_flags_t flags, struct zip_stat *st) { const char *name; - - if (index >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + struct zip_dirent *de; + + if ((de=_zip_get_dirent(za, index, flags, NULL)) == NULL) return -1; - } if ((name=zip_get_name(za, index, flags)) == NULL) return -1; @@ -60,20 +59,15 @@ zip_stat_index(struct zip *za, zip_uint64_t index, int flags, } } else { - if (za->cdir == NULL || index >= za->cdir->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - zip_stat_init(st); - st->crc = za->cdir->entry[index].crc; - st->size = za->cdir->entry[index].uncomp_size; - st->mtime = za->cdir->entry[index].last_mod; - st->comp_size = za->cdir->entry[index].comp_size; - st->comp_method = za->cdir->entry[index].comp_method; - if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) { - if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { + st->crc = de->crc; + st->size = de->uncomp_size; + st->mtime = de->last_mod; + st->comp_size = de->comp_size; + st->comp_method = (zip_uint16_t)de->comp_method; + if (de->bitflags & ZIP_GPBF_ENCRYPTED) { + if (de->bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { /* XXX */ st->encryption_method = ZIP_EM_UNKNOWN; } diff --git a/ext/zip/lib/zip_stat_init.c b/ext/zip/lib/zip_stat_init.c index 74e1ffd0b0dce..d17613bf5e7e8 100644 --- a/ext/zip/lib/zip_stat_init.c +++ b/ext/zip/lib/zip_stat_init.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_stat_init(struct zip_stat *st) { st->valid = 0; diff --git a/ext/zip/lib/zip_strerror.c b/ext/zip/lib/zip_strerror.c index ad23bafed6c62..9ebee144f908a 100644 --- a/ext/zip/lib/zip_strerror.c +++ b/ext/zip/lib/zip_strerror.c @@ -36,7 +36,8 @@ #include "zipint.h" -ZIP_EXTERN(const char *) + +ZIP_EXTERN const char * zip_strerror(struct zip *za) { return _zip_error_strerror(&za->error); diff --git a/ext/zip/lib/zip_string.c b/ext/zip/lib/zip_string.c new file mode 100644 index 0000000000000..a2d5eb5d3fdae --- /dev/null +++ b/ext/zip/lib/zip_string.c @@ -0,0 +1,196 @@ +/* + zip_string.c -- string handling (with encoding) + Copyright (C) 2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include +#include + +#include "zipint.h" + + + +zip_uint32_t +_zip_string_crc32(const struct zip_string *s) +{ + zip_uint32_t crc; + + crc = (zip_uint32_t)crc32(0L, Z_NULL, 0); + + if (s != NULL) + crc = (zip_uint32_t)crc32(crc, s->raw, s->length); + + return crc; +} + + + +int +_zip_string_equal(const struct zip_string *a, const struct zip_string *b) +{ + if (a == NULL || b == NULL) + return a == b; + + if (a->length != b->length) + return 0; + + /* XXX: encoding */ + + return (memcmp(a->raw, b->raw, a->length) == 0); +} + + + +void +_zip_string_free(struct zip_string *s) +{ + if (s == NULL) + return; + + free(s->raw); + free(s->converted); + free(s); +} + + + +const zip_uint8_t * +_zip_string_get(struct zip_string *string, zip_uint32_t *lenp, zip_flags_t flags, struct zip_error *error) +{ + static const zip_uint8_t empty[1] = ""; + + if (string == NULL) { + if (lenp) + *lenp = 0; + return empty; + } + + if ((flags & ZIP_FL_ENC_RAW) == 0) { + /* start guessing */ + if (string->encoding == ZIP_ENCODING_UNKNOWN) + _zip_guess_encoding(string, ZIP_ENCODING_UNKNOWN); + + if (((flags & ZIP_FL_ENC_STRICT) + && string->encoding != ZIP_ENCODING_ASCII && string->encoding != ZIP_ENCODING_UTF8_KNOWN) + || (string->encoding == ZIP_ENCODING_CP437)) { + if (string->converted == NULL) { + if ((string->converted=_zip_cp437_to_utf8(string->raw, string->length, + &string->converted_length, error)) == NULL) + return NULL; + } + if (lenp) + *lenp = string->converted_length; + return string->converted; + } + } + + if (lenp) + *lenp = string->length; + return string->raw; +} + + + +zip_uint16_t +_zip_string_length(const struct zip_string *s) +{ + if (s == NULL) + return 0; + + return s->length; +} + + + +struct zip_string * +_zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, struct zip_error *error) +{ + struct zip_string *s; + enum zip_encoding_type expected_encoding; + + if (length == 0) + return NULL; + + switch (flags & ZIP_FL_ENCODING_ALL) { + case ZIP_FL_ENC_GUESS: + expected_encoding = ZIP_ENCODING_UNKNOWN; + break; + case ZIP_FL_ENC_UTF_8: + expected_encoding = ZIP_ENCODING_UTF8_KNOWN; + break; + case ZIP_FL_ENC_CP437: + expected_encoding = ZIP_ENCODING_CP437; + break; + default: + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((s=(struct zip_string *)malloc(sizeof(*s))) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((s->raw=(zip_uint8_t *)malloc(length+1)) == NULL) { + free(s); + return NULL; + } + + memcpy(s->raw, raw, length); + s->raw[length] = '\0'; + s->length = length; + s->encoding = ZIP_ENCODING_UNKNOWN; + s->converted = NULL; + s->converted_length = 0; + + if (expected_encoding != ZIP_ENCODING_UNKNOWN) { + if (_zip_guess_encoding(s, expected_encoding) == ZIP_ENCODING_ERROR) { + _zip_string_free(s); + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + } + + return s; +} + + + +void +_zip_string_write(const struct zip_string *s, FILE *f) +{ + if (s == NULL) + return; + + fwrite(s->raw, s->length, 1, f); +} diff --git a/ext/zip/lib/zip_unchange.c b/ext/zip/lib/zip_unchange.c index 550e8b99031f2..5f0e753b78634 100644 --- a/ext/zip/lib/zip_unchange.c +++ b/ext/zip/lib/zip_unchange.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_unchange(struct zip *za, zip_uint64_t idx) { return _zip_unchange(za, idx, 0); @@ -50,34 +50,23 @@ zip_unchange(struct zip *za, zip_uint64_t idx) int _zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates) { - int i; + zip_int64_t i; if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - if (za->entry[idx].ch_filename) { - if (!allow_duplicates) { - i = _zip_name_locate(za, - _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), - 0, NULL); - if (i != -1 && i != idx) { - _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); - return -1; - } + if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) { + i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL); + if (i >= 0 && (zip_uint64_t)i != idx) { + _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; } - - free(za->entry[idx].ch_filename); - za->entry[idx].ch_filename = NULL; } - free(za->entry[idx].ch_extra); - za->entry[idx].ch_extra = NULL; - za->entry[idx].ch_extra_len = -1; - free(za->entry[idx].ch_comment); - za->entry[idx].ch_comment = NULL; - za->entry[idx].ch_comment_len = -1; + _zip_dirent_free(za->entry[idx].changes); + za->entry[idx].changes = NULL; _zip_unchange_data(za->entry+idx); diff --git a/ext/zip/lib/zip_unchange_all.c b/ext/zip/lib/zip_unchange_all.c index 01282f89dbbaf..bbc2825eb6265 100644 --- a/ext/zip/lib/zip_unchange_all.c +++ b/ext/zip/lib/zip_unchange_all.c @@ -39,10 +39,11 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_unchange_all(struct zip *za) { - int ret, i; + int ret; + zip_uint64_t i; ret = 0; for (i=0; inentry; i++) diff --git a/ext/zip/lib/zip_unchange_archive.c b/ext/zip/lib/zip_unchange_archive.c index ca2b67854435a..e24ee21727002 100644 --- a/ext/zip/lib/zip_unchange_archive.c +++ b/ext/zip/lib/zip_unchange_archive.c @@ -39,13 +39,15 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_unchange_archive(struct zip *za) { - free(za->ch_comment); - za->ch_comment = NULL; - za->ch_comment_len = -1; - + if (za->comment_changed) { + _zip_string_free(za->comment_changes); + za->comment_changes = NULL; + za->comment_changed = 0; + } + za->ch_flags = za->flags; return 0; diff --git a/ext/zip/lib/zip_unchange_data.c b/ext/zip/lib/zip_unchange_data.c index 7dd93b768a87a..fa25feb03885f 100644 --- a/ext/zip/lib/zip_unchange_data.c +++ b/ext/zip/lib/zip_unchange_data.c @@ -1,8 +1,6 @@ /* - $NiH: zip_unchange_data.c,v 1.14 2004/11/30 23:02:47 wiz Exp $ - zip_unchange_data.c -- undo helper function - Copyright (C) 1999, 2004 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -35,8 +33,6 @@ -#include - #include "zipint.h" void @@ -46,7 +42,15 @@ _zip_unchange_data(struct zip_entry *ze) zip_source_free(ze->source); ze->source = NULL; } - - ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED; + + if (ze->changes != NULL && (ze->changes->changed & ZIP_DIRENT_COMP_METHOD) && ze->changes->comp_method == ZIP_CM_REPLACED_DEFAULT) { + ze->changes->changed &= ~ZIP_DIRENT_COMP_METHOD; + if (ze->changes->changed == 0) { + _zip_dirent_free(ze->changes); + ze->changes = NULL; + } + } + + ze->deleted = 0; } diff --git a/ext/zip/lib/zip_utf-8.c b/ext/zip/lib/zip_utf-8.c new file mode 100644 index 0000000000000..c36fad13f5f45 --- /dev/null +++ b/ext/zip/lib/zip_utf-8.c @@ -0,0 +1,255 @@ +/* + zip_utf-8.c -- UTF-8 support functions for libzip + Copyright (C) 2011-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + +#include + + + +static const zip_uint16_t _cp437_to_unicode[256] = { + /* 0x00 - 0x0F */ + 0x2007, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, + 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + + /* 0x10 - 0x1F */ + 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, + 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, + + /* 0x20 - 0x2F */ + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + + /* 0x30 - 0x3F */ + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + + /* 0x40 - 0x4F */ + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + + /* 0x50 - 0x5F */ + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + + /* 0x60 - 0x6F */ + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + + /* 0x70 - 0x7F */ + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302, + + /* 0x80 - 0x8F */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + + /* 0x90 - 0x9F */ + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + + /* 0xA0 - 0xAF */ + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + + /* 0xB0 - 0xBF */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + + /* 0xC0 - 0xCF */ + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + + /* 0xD0 - 0xDF */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + + /* 0xE0 - 0xEF */ + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + + /* 0xF0 - 0xFF */ + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#define UTF_8_LEN_2_MASK 0xe0 +#define UTF_8_LEN_2_MATCH 0xc0 +#define UTF_8_LEN_3_MASK 0xf0 +#define UTF_8_LEN_3_MATCH 0xe0 +#define UTF_8_LEN_4_MASK 0xf8 +#define UTF_8_LEN_4_MATCH 0xf0 +#define UTF_8_CONTINUE_MASK 0xc0 +#define UTF_8_CONTINUE_MATCH 0x80 + + + +enum zip_encoding_type +_zip_guess_encoding(struct zip_string *str, enum zip_encoding_type expected_encoding) +{ + enum zip_encoding_type enc; + const zip_uint8_t *name; + zip_uint32_t i, j, ulen; + + if (str == NULL) + return ZIP_ENCODING_ASCII; + + name = str->raw; + + if (str->encoding != ZIP_ENCODING_UNKNOWN) + enc = str->encoding; + else { + enc = ZIP_ENCODING_ASCII; + for (i=0; ilength; i++) { + if ((name[i] > 31 && name[i] < 128) || name[i] == '\r' || name[i] == '\n' || name[i] == '\t') + continue; + + enc = ZIP_ENCODING_UTF8_GUESSED; + if ((name[i] & UTF_8_LEN_2_MASK) == UTF_8_LEN_2_MATCH) + ulen = 1; + else if ((name[i] & UTF_8_LEN_3_MASK) == UTF_8_LEN_3_MATCH) + ulen = 2; + else if ((name[i] & UTF_8_LEN_4_MASK) == UTF_8_LEN_4_MATCH) + ulen = 3; + else { + enc = ZIP_ENCODING_CP437; + break; + } + + if (i + ulen >= str->length) { + enc = ZIP_ENCODING_CP437; + break; + } + + for (j=1; j<=ulen; j++) { + if ((name[i+j] & UTF_8_CONTINUE_MASK) != UTF_8_CONTINUE_MATCH) { + enc = ZIP_ENCODING_CP437; + goto done; + } + } + i += ulen; + } + } + +done: + str->encoding = enc; + + if (expected_encoding != ZIP_ENCODING_UNKNOWN) { + if (expected_encoding == ZIP_ENCODING_UTF8_KNOWN && enc == ZIP_ENCODING_UTF8_GUESSED) + str->encoding = enc = ZIP_ENCODING_UTF8_KNOWN; + + if (expected_encoding != enc && enc != ZIP_ENCODING_ASCII) + return ZIP_ENCODING_ERROR; + } + + return enc; +} + + + +static zip_uint32_t +_zip_unicode_to_utf8_len(zip_uint32_t codepoint) +{ + if (codepoint < 0x0080) + return 1; + if (codepoint < 0x0800) + return 2; + if (codepoint < 0x10000) + return 3; + return 4; +} + + + +static zip_uint32_t +_zip_unicode_to_utf8(zip_uint32_t codepoint, zip_uint8_t *buf) +{ + if (codepoint < 0x0080) { + buf[0] = codepoint & 0xff; + return 1; + } + if (codepoint < 0x0800) { + buf[0] = UTF_8_LEN_2_MATCH | ((codepoint >> 6) & 0x1f); + buf[1] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f); + return 2; + } + if (codepoint < 0x10000) { + buf[0] = UTF_8_LEN_3_MATCH | ((codepoint >> 12) & 0x0f); + buf[1] = UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f); + buf[2] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f); + return 3; + } + buf[0] = UTF_8_LEN_4_MATCH | ((codepoint >> 18) & 0x07); + buf[1] = UTF_8_CONTINUE_MATCH | ((codepoint >> 12) & 0x3f); + buf[2] = UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f); + buf[3] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f); + return 4; +} + + + +zip_uint8_t * +_zip_cp437_to_utf8(const zip_uint8_t * const _cp437buf, zip_uint32_t len, + zip_uint32_t *utf8_lenp, struct zip_error *error) +{ + zip_uint8_t *cp437buf = (zip_uint8_t *)_cp437buf; + zip_uint8_t *utf8buf; + zip_uint32_t buflen, i, offset; + + if (len == 0) { + if (utf8_lenp) + *utf8_lenp = 0; + return NULL; + } + + buflen = 1; + for (i=0; i -#include -#include -#include -#include - -#ifndef strcasecmp -# define strcmpi _strcmpi -#endif - -#ifndef ssize_t -# define ssize_t SSIZE_T -#endif - -#ifndef mode_t -# define mode_t int -#endif - -#ifndef snprintf -# define snprintf _snprintf -#endif - -#ifndef mkstemp -# define mkstemp(t) _creat(_mktemp(t), _S_IREAD|_S_IWRITE) -#endif -/* -#ifndef fseeko -# define fseeko fseek -#endif -*/ diff --git a/ext/zip/lib/zipconf.h b/ext/zip/lib/zipconf.h index 646c0bde53f0e..1cb5c0467aeb8 100644 --- a/ext/zip/lib/zipconf.h +++ b/ext/zip/lib/zipconf.h @@ -1,47 +1,129 @@ -#ifndef _HAD_ZIPCONF_H -#define _HAD_ZIPCONF_H - -/* - zipconf.h -- platform specific include file - - This file was generated automatically by ./make_zipconf.sh - based on ../config.h. - */ - -#define LIBZIP_VERSION "0.10.1" -#define LIBZIP_VERSION_MAJOR 0 -#define LIBZIP_VERSION_MINOR 10 -#define LIBZIP_VERSION_MICRO 0 - -#include - -typedef int8_t zip_int8_t; -#define ZIP_INT8_MIN INT8_MIN -#define ZIP_INT8_MAX INT8_MAX - -typedef uint8_t zip_uint8_t; -#define ZIP_UINT8_MAX UINT8_MAX - -typedef int16_t zip_int16_t; -#define ZIP_INT16_MIN INT16_MIN -#define ZIP_INT16_MAX INT16_MAX - -typedef uint16_t zip_uint16_t; -#define ZIP_UINT16_MAX UINT16_MAX - -typedef int32_t zip_int32_t; -#define ZIP_INT32_MIN INT32_MIN -#define ZIP_INT32_MAX INT32_MAX - -typedef uint32_t zip_uint32_t; -#define ZIP_UINT32_MAX UINT32_MAX - -typedef int64_t zip_int64_t; -#define ZIP_INT64_MIN INT64_MIN -#define ZIP_INT64_MAX INT64_MAX - -typedef uint64_t zip_uint64_t; -#define ZIP_UINT64_MAX UINT64_MAX - - -#endif /* zipconf.h */ +#ifndef _HAD_ZIPCONF_H +#define _HAD_ZIPCONF_H + +/* + zipconf.h -- platform specific include file + + This file was generated automatically by CMake + based on ../cmake-zipconf.h.in. + */ +#define LIBZIP_VERSION "0.11.1" +/* #undef HAVE_INTTYPES_H_LIBZIP */ + +#if defined(_WIN32) +# if _MSC_VER > 1500 +# define HAVE_STDINT_H_LIBZIP +# else +# include "win32/php_stdint.h" +# endif +#else +# include +#endif +#define HAVE_SYS_TYPES_H_LIBZIP +#define HAVE___INT8_LIBZIP +#define HAVE_INT8_T_LIBZIP +#define HAVE_UINT8_T_LIBZIP +#define HAVE___INT16_LIBZIP +#define HAVE_INT16_T_LIBZIP +#define HAVE_UINT16_T_LIBZIP +#define HAVE___INT32_LIBZIP +#define HAVE_INT32_T_LIBZIP +#define HAVE_UINT32_T_LIBZIP +#define HAVE___INT64_LIBZIP +#define HAVE_INT64_T_LIBZIP +#define HAVE_UINT64_T_LIBZIP +#define SHORT_LIBZIP 2 +#define INT_LIBZIP 4 +#define LONG_LIBZIP 4 +#define LONG_LONG_LIBZIP 8 + +#if defined(HAVE_STDINT_H_LIBZIP) +#include +#elif defined(HAVE_INTTYPES_H_LIBZIP) +#include +#elif defined(HAVE_SYS_TYPES_H_LIBZIP) +#include +#endif + +#if defined(HAVE_INT8_T_LIBZIP) +typedef int8_t zip_int8_t; +#elif defined(HAVE___INT8_LIBZIP) +typedef __int8 zip_int8_t; +#else +typedef signed char zip_int8_t; +#endif +#if defined(HAVE_UINT8_T_LIBZIP) +typedef uint8_t zip_uint8_t; +#elif defined(HAVE___INT8_LIBZIP) +typedef unsigned __int8 zip_uint8_t; +#else +typedef unsigned char zip_uint8_t; +#endif +#if defined(HAVE_INT16_T_LIBZIP) +typedef int16_t zip_int16_t; +#elif defined(HAVE___INT16_LIBZIP) +typedef __int16 zip_int16_t; +#elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2 +typedef signed short zip_int16_t; +#endif +#if defined(HAVE_UINT16_T_LIBZIP) +typedef uint16_t zip_uint16_t; +#elif defined(HAVE___INT16_LIBZIP) +typedef unsigned __int16 zip_uint16_t; +#elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2 +typedef unsigned short zip_uint16_t; +#endif +#if defined(HAVE_INT32_T_LIBZIP) +typedef int32_t zip_int32_t; +#elif defined(HAVE___INT32_LIBZIP) +typedef __int32 zip_int32_t; +#elif defined(INT_LIBZIP) && INT_LIBZIP == 4 +typedef signed int zip_int32_t; +#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4 +typedef signed long zip_int32_t; +#endif +#if defined(HAVE_UINT32_T_LIBZIP) +typedef uint32_t zip_uint32_t; +#elif defined(HAVE___INT32_LIBZIP) +typedef unsigned __int32 zip_uint32_t; +#elif defined(INT_LIBZIP) && INT_LIBZIP == 4 +typedef unsigned int zip_uint32_t; +#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4 +typedef unsigned long zip_uint32_t; +#endif +#if defined(HAVE_INT64_T_LIBZIP) +typedef int64_t zip_int64_t; +#elif defined(HAVE___INT64_LIBZIP) +typedef __int64 zip_int64_t; +#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 8 +typedef signed long zip_int64_t; +#elif defined(LONG_LONG_LIBZIP) && LONG_LONG_LIBZIP == 8 +typedef signed long long zip_int64_t; +#endif +#if defined(HAVE_UINT64_T_LIBZIP) +typedef uint64_t zip_uint64_t; +#elif defined(HAVE___INT64_LIBZIP) +typedef unsigned __int64 zip_uint64_t; +#elif defined(LONG_LIBZIP) && LONG_LONG_LIBZIP == 8 +typedef unsigned long zip_uint64_t; +#elif defined(LONG_LONG_LIBZIP) && LONG_LONG_LIBZIP == 8 +typedef unsigned long long zip_uint64_t; +#endif + +#define ZIP_INT8_MIN -0x80 +#define ZIP_INT8_MAX 0x7f +#define ZIP_UINT8_MAX 0xff + +#define ZIP_INT16_MIN -0x8000 +#define ZIP_INT16_MAX 0x7fff +#define ZIP_UINT16_MAX 0xffff + +#define ZIP_INT32_MIN -0x80000000L +#define ZIP_INT32_MAX 0x7fffffffL +#define ZIP_UINT32_MAX 0xffffffffLU + +#define ZIP_INT64_MIN -0x8000000000000000LL +#define ZIP_INT64_MAX 0x7fffffffffffffffLL +#define ZIP_UINT64_MAX 0xffffffffffffffffULL + +#endif /* zipconf.h */ diff --git a/ext/zip/lib/zipint.h b/ext/zip/lib/zipint.h index ea21dddcd4257..e8765c5b6619f 100644 --- a/ext/zip/lib/zipint.h +++ b/ext/zip/lib/zipint.h @@ -3,7 +3,7 @@ /* zipint.h -- internal declarations. - Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -20,7 +20,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -34,69 +34,123 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +/* to have *_MAX definitions for all types when compiling with g++ */ +#define __STDC_LIMIT_MACROS -#include "zip.h" +#include -#ifndef HAVE_FSEEKO -#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) +#ifdef PHP_WIN32 +/* for dup(), close(), etc. */ +#include +#include "config.w32.h" #endif -#ifndef HAVE_FTELLO -#define ftello(s) ((long)ftell((s))) +#ifndef _ZIP_COMPILING_DEPRECATED +#define ZIP_DISABLE_DEPRECATED #endif -#ifndef PHP_WIN32 -#ifndef HAVE_MKSTEMP -int _zip_mkstemp(char *); -#define mkstemp _zip_mkstemp -#endif +#include "zip.h" +#ifdef PHP_WIN32 +# include "php_zip_config.w32.h" +#else +# include "config.h" #endif -#ifdef PHP_WIN32 +#if defined(HAVE_MOVEFILEEXA) && defined(_WIN32) #include -#include #define _zip_rename(s, t) \ - (!MoveFileExA((s), (t), \ - MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) + (!MoveFileExA((s), (t), MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) +#else +#define _zip_rename rename +#endif -/* for dup(), close(), etc. */ -#include +#ifdef _WIN32 +#undef strcasecmp +# define strcasecmp _strcmpi +#endif -#if !defined(HAVE_OPEN) +#if defined(HAVE__CLOSE) +#define close _close +#endif +#if defined(HAVE__DUP) +#define dup _dup +#endif +/* crashes reported when using fdopen instead of _fdopen on Windows/Visual Studio 10/Win64 */ +#if defined(HAVE__FDOPEN) +#define fdopen _fdopen +#endif +#if defined(HAVE__FILENO) +#define fileno _fileno +#endif +/* Windows' open() doesn't understand Unix permissions */ #if defined(HAVE__OPEN) #define open(a, b, c) _open((a), (b)) #endif +#if defined(HAVE__SNPRINTF) +#define snprintf _snprintf +#endif +#if defined(HAVE__STRDUP) && !defined(strdup) +#define strdup _strdup #endif -#else -#define _zip_rename rename +#ifndef HAVE_FSEEKO +#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) #endif -#ifndef strcasecmp -# define strcmpi strcasecmp +#ifndef HAVE_FTELLO +#define ftello(s) ((long)ftell((s))) #endif +#ifndef HAVE_MKSTEMP +int _zip_mkstemp(char *); +#define mkstemp _zip_mkstemp +#endif - +#if !defined(HAVE_STRCASECMP) +#if defined(HAVE__STRICMP) +#define strcasecmp _stricmp +#endif +#endif + +#if SIZEOF_OFF_T == 8 +#define ZIP_OFF_MAX ZIP_INT64_MAX +#elif SIZEOF_OFF_T == 4 +#define ZIP_OFF_MAX ZIP_INT32_MAX +#elif SIZEOF_OFF_T == 2 +#define ZIP_OFF_MAX ZIP_INT16_MAX +#else +#error unsupported size of off_t +#endif #define CENTRAL_MAGIC "PK\1\2" #define LOCAL_MAGIC "PK\3\4" #define EOCD_MAGIC "PK\5\6" #define DATADES_MAGIC "PK\7\8" +#define EOCD64LOC_MAGIC "PK\6\7" +#define EOCD64_MAGIC "PK\6\6" #define TORRENT_SIG "TORRENTZIPPED-" #define TORRENT_SIG_LEN 14 #define TORRENT_CRC_LEN 8 #define TORRENT_MEM_LEVEL 8 #define CDENTRYSIZE 46u #define LENTRYSIZE 30 -#undef MAXCOMLEN /* defined as 19 on BSD for max command name */ #define MAXCOMLEN 65536 #define MAXEXTLEN 65536 #define EOCDLEN 22 -#define CDBUFSIZE (MAXCOMLEN+EOCDLEN) +#define EOCD64LOCLEN 20 +#define EOCD64LEN 56 +#define CDBUFSIZE (MAXCOMLEN+EOCDLEN+EOCD64LOCLEN) #define BUFSIZE 8192 +#define ZIP_CM_REPLACED_DEFAULT (-2) + +#define ZIP_CM_IS_DEFAULT(x) ((x) == ZIP_CM_DEFAULT || (x) == ZIP_CM_REPLACED_DEFAULT) + +#define ZIP_EF_UTF_8_COMMENT 0x6375 +#define ZIP_EF_UTF_8_NAME 0x7075 +#define ZIP_EF_ZIP64 0x0001 + +#define ZIP_EF_IS_INTERNAL(id) ((id) == ZIP_EF_UTF_8_COMMENT || (id) == ZIP_EF_UTF_8_NAME || (id) == ZIP_EF_ZIP64) /* This section contains API that won't materialize like this. It's @@ -104,20 +158,22 @@ int _zip_mkstemp(char *); typedef struct zip_source *(*zip_compression_implementation)(struct zip *, struct zip_source *, - zip_uint16_t, int); + zip_int32_t, int); typedef struct zip_source *(*zip_encryption_implementation)(struct zip *, struct zip_source *, zip_uint16_t, int, const char *); -ZIP_EXTERN(zip_compression_implementation) zip_get_compression_implementation( - zip_uint16_t); -ZIP_EXTERN(zip_encryption_implementation) zip_get_encryption_implementation( - zip_uint16_t); +zip_compression_implementation _zip_get_compression_implementation(zip_int32_t); +zip_encryption_implementation _zip_get_encryption_implementation(zip_uint16_t); +/* This API is not final yet, but we need it internally, so it's private for now. */ + +const zip_uint8_t *zip_get_extra_field_by_id(struct zip *, int, int, zip_uint16_t, int, zip_uint16_t *); + /* This section contains API that is of limited use until support for user-supplied compression/encryption implementation is finished. Thus we will keep it private for now. */ @@ -126,40 +182,37 @@ typedef zip_int64_t (*zip_source_layered_callback)(struct zip_source *, void *, void *, zip_uint64_t, enum zip_source_cmd); -ZIP_EXTERN(void) zip_source_close(struct zip_source *); -ZIP_EXTERN(struct zip_source *)zip_source_crc(struct zip *, struct zip_source *, - int); -ZIP_EXTERN(struct zip_source *)zip_source_deflate(struct zip *, - struct zip_source *, - zip_uint16_t, int); -ZIP_EXTERN(void) zip_source_error(struct zip_source *, int *, int *); -ZIP_EXTERN(struct zip_source *)zip_source_layered(struct zip *, - struct zip_source *, - zip_source_layered_callback, - void *); -ZIP_EXTERN(int) zip_source_open(struct zip_source *); -ZIP_EXTERN(struct zip_source *)zip_source_pkware(struct zip *, - struct zip_source *, - zip_uint16_t, int, - const char *); -ZIP_EXTERN(zip_int64_t) zip_source_read(struct zip_source *, void *, - zip_uint64_t); -ZIP_EXTERN(int) zip_source_stat(struct zip_source *, struct zip_stat *); +void zip_source_close(struct zip_source *); +struct zip_source *zip_source_crc(struct zip *, struct zip_source *, + int); +struct zip_source *zip_source_deflate(struct zip *, + struct zip_source *, + zip_int32_t, int); +void zip_source_error(struct zip_source *, int *, int *); +struct zip_source *zip_source_layered(struct zip *, + struct zip_source *, + zip_source_layered_callback, + void *); +int zip_source_open(struct zip_source *); +struct zip_source *zip_source_pkware(struct zip *, + struct zip_source *, + zip_uint16_t, int, + const char *); +zip_int64_t zip_source_read(struct zip_source *, void *, + zip_uint64_t); +int zip_source_stat(struct zip_source *, struct zip_stat *); +struct zip_source *zip_source_window(struct zip *, struct zip_source *, + zip_uint64_t, zip_uint64_t); /* This function will probably remain private. It is not needed to implement compression/encryption routines. (We should probably rename it to _zip_source_pop.) */ -ZIP_EXTERN(struct zip_source *)zip_source_pop(struct zip_source *); +struct zip_source *zip_source_pop(struct zip_source *); -/* state of change of a file in zip archive */ - -enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED, - ZIP_ST_ADDED, ZIP_ST_RENAMED }; - /* error source for layered sources */ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; @@ -169,6 +222,28 @@ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; #define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */ #define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */ #define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */ +#define ZIP_GPBF_ENCODING_UTF_8 0x0800 /* file name encoding is UTF-8 */ + + +/* extra fields */ +#define ZIP_EF_LOCAL ZIP_FL_LOCAL /* include in local header */ +#define ZIP_EF_CENTRAL ZIP_FL_CENTRAL /* include in central directory */ +#define ZIP_EF_BOTH (ZIP_EF_LOCAL|ZIP_EF_CENTRAL) /* include in both */ + +#define ZIP_FL_FORCE_ZIP64 1024 /* force zip64 extra field (_zip_dirent_write) */ + +#define ZIP_FL_ENCODING_ALL (ZIP_FL_ENC_GUESS|ZIP_FL_ENC_CP437|ZIP_FL_ENC_UTF_8) + + +/* encoding type */ +enum zip_encoding_type { + ZIP_ENCODING_UNKNOWN, /* not yet analyzed */ + ZIP_ENCODING_ASCII, /* plain ASCII */ + ZIP_ENCODING_UTF8_KNOWN, /* is UTF-8 */ + ZIP_ENCODING_UTF8_GUESSED, /* possibly UTF-8 */ + ZIP_ENCODING_CP437, /* Code Page 437 */ + ZIP_ENCODING_ERROR /* should be UTF-8 but isn't */ +}; /* error information */ @@ -181,25 +256,29 @@ struct zip_error { /* zip archive, part of API */ struct zip { - char *zn; /* file name */ - FILE *zp; /* file */ - struct zip_error error; /* error information */ + char *zn; /* file name */ + FILE *zp; /* file */ + unsigned int open_flags; /* flags passed to zip_open */ + struct zip_error error; /* error information */ - unsigned int flags; /* archive global flags */ - unsigned int ch_flags; /* changed archive global flags */ - - char *default_password; /* password used when no other supplied */ - - struct zip_cdir *cdir; /* central directory */ - char *ch_comment; /* changed archive comment */ - int ch_comment_len; /* length of changed zip archive - * comment, -1 if unchanged */ - zip_uint64_t nentry; /* number of entries */ - zip_uint64_t nentry_alloc; /* number of entries allocated */ - struct zip_entry *entry; /* entries */ - int nfile; /* number of opened files within archive */ - int nfile_alloc; /* number of files allocated */ - struct zip_file **file; /* opened files within archive */ + unsigned int flags; /* archive global flags */ + unsigned int ch_flags; /* changed archive global flags */ + + char *default_password; /* password used when no other supplied */ + + struct zip_string *comment_orig; /* archive comment */ + struct zip_string *comment_changes; /* changed archive comment */ + int comment_changed; /* whether archive comment was changed */ + + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ + struct zip_entry *entry; /* entries */ + + unsigned int nfile; /* number of opened files within archive */ + unsigned int nfile_alloc; /* number of files allocated */ + struct zip_file **file; /* opened files within archive */ + + char *tempdir; /* custom temp dir (needed e.g. for OS X sandboxing) */ }; /* file in zip archive, part of API */ @@ -213,37 +292,52 @@ struct zip_file { /* zip archive directory entry (central or local) */ +#define ZIP_DIRENT_COMP_METHOD 0x0001u +#define ZIP_DIRENT_FILENAME 0x0002u +#define ZIP_DIRENT_COMMENT 0x0004u +#define ZIP_DIRENT_EXTRA_FIELD 0x0008u +#define ZIP_DIRENT_ALL 0xffffu + struct zip_dirent { - unsigned short version_madeby; /* (c) version of creator */ - unsigned short version_needed; /* (cl) version needed to extract */ - unsigned short bitflags; /* (cl) general purpose bit flag */ - unsigned short comp_method; /* (cl) compression method used */ - time_t last_mod; /* (cl) time of last modification */ - unsigned int crc; /* (cl) CRC-32 of uncompressed data */ - unsigned int comp_size; /* (cl) size of commpressed data */ - unsigned int uncomp_size; /* (cl) size of uncommpressed data */ - char *filename; /* (cl) file name (NUL-terminated) */ - unsigned short filename_len; /* (cl) length of filename (w/o NUL) */ - char *extrafield; /* (cl) extra field */ - unsigned short extrafield_len; /* (cl) length of extra field */ - char *comment; /* (c) file comment */ - unsigned short comment_len; /* (c) length of file comment */ - unsigned short disk_number; /* (c) disk number start */ - unsigned short int_attrib; /* (c) internal file attributes */ - unsigned int ext_attrib; /* (c) external file attributes */ - unsigned int offset; /* (c) offset of local header */ + zip_uint32_t changed; + int local_extra_fields_read; /* whether we already read in local header extra fields */ + int cloned; /* wether this instance is cloned, and thus shares non-changed strings */ + + zip_uint16_t version_madeby; /* (c) version of creator */ + zip_uint16_t version_needed; /* (cl) version needed to extract */ + zip_uint16_t bitflags; /* (cl) general purpose bit flag */ + zip_int32_t comp_method; /* (cl) compression method used (uint16 and ZIP_CM_DEFAULT (-1)) */ + time_t last_mod; /* (cl) time of last modification */ + zip_uint32_t crc; /* (cl) CRC-32 of uncompressed data */ + zip_uint64_t comp_size; /* (cl) size of compressed data */ + zip_uint64_t uncomp_size; /* (cl) size of uncompressed data */ + struct zip_string *filename; /* (cl) file name (NUL-terminated) */ + struct zip_extra_field *extra_fields; /* (cl) extra fields, parsed */ + struct zip_string *comment; /* (c) file comment */ + zip_uint32_t disk_number; /* (c) disk number start */ + zip_uint16_t int_attrib; /* (c) internal file attributes */ + zip_uint32_t ext_attrib; /* (c) external file attributes */ + zip_uint64_t offset; /* (c) offset of local header */ }; /* zip archive central directory */ struct zip_cdir { - struct zip_dirent *entry; /* directory entries */ - int nentry; /* number of entries */ + struct zip_entry *entry; /* directory entries */ + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ - unsigned int size; /* size of central direcotry */ - unsigned int offset; /* offset of central directory in file */ - char *comment; /* zip archive comment */ - unsigned short comment_len; /* length of zip archive comment */ + off_t size; /* size of central directory */ + off_t offset; /* offset of central directory in file */ + struct zip_string *comment; /* zip archive comment */ +}; + +struct zip_extra_field { + struct zip_extra_field *next; + zip_flags_t flags; /* in local/central header */ + zip_uint16_t id; /* header id */ + zip_uint16_t size; /* data size */ + zip_uint8_t *data; }; @@ -262,13 +356,31 @@ struct zip_source { /* entry in zip archive directory */ struct zip_entry { - enum zip_state state; + struct zip_dirent *orig; + struct zip_dirent *changes; struct zip_source *source; - char *ch_filename; - char *ch_extra; - int ch_extra_len; - char *ch_comment; - int ch_comment_len; + int deleted; +}; + + + +/* file or archive comment, or filename */ + +struct zip_string { + zip_uint8_t *raw; /* raw string */ + zip_uint16_t length; /* length of raw string */ + enum zip_encoding_type encoding; /* autorecognized encoding */ + zip_uint8_t *converted; /* autoconverted string */ + zip_uint32_t converted_length; /* length of converted */ +}; + + + +/* which files to write, and in which order (name is for torrentzip sorting) */ + +struct zip_filelist { + zip_uint64_t idx; + const char *name; }; @@ -279,66 +391,111 @@ extern const int _zip_err_type[]; -#define ZIP_ENTRY_DATA_CHANGED(x) \ - ((x)->state == ZIP_ST_REPLACED \ - || (x)->state == ZIP_ST_ADDED) +#define ZIP_ENTRY_CHANGED(e, f) ((e)->changes && ((e)->changes->changed & (f))) + +#define ZIP_ENTRY_DATA_CHANGED(x) ((x)->source != NULL) #define ZIP_IS_RDONLY(za) ((za)->ch_flags & ZIP_AFL_RDONLY) +zip_int64_t _zip_add_entry(struct zip *); + int _zip_cdir_compute_crc(struct zip *, uLong *); void _zip_cdir_free(struct zip_cdir *); -int _zip_cdir_grow(struct zip_cdir *, int, struct zip_error *); -struct zip_cdir *_zip_cdir_new(int, struct zip_error *); -int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); +int _zip_cdir_grow(struct zip_cdir *, zip_uint64_t, struct zip_error *); +struct zip_cdir *_zip_cdir_new(zip_uint64_t, struct zip_error *); +zip_int64_t _zip_cdir_write(struct zip *, const struct zip_filelist *, zip_uint64_t, FILE *); +struct zip_dirent *_zip_dirent_clone(const struct zip_dirent *); +void _zip_dirent_free(struct zip_dirent *); void _zip_dirent_finalize(struct zip_dirent *); void _zip_dirent_init(struct zip_dirent *); -int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **, - zip_uint32_t *, int, struct zip_error *); +int _zip_dirent_needs_zip64(const struct zip_dirent *, zip_flags_t); +struct zip_dirent *_zip_dirent_new(void); +int _zip_dirent_read(struct zip_dirent *, FILE *, const unsigned char **, + zip_uint64_t *, int, struct zip_error *); +zip_int32_t _zip_dirent_size(FILE *, zip_uint16_t, struct zip_error *); void _zip_dirent_torrent_normalize(struct zip_dirent *); -int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); - -void _zip_entry_free(struct zip_entry *); -void _zip_entry_init(struct zip *, int); -struct zip_entry *_zip_entry_new(struct zip *); +int _zip_dirent_write(struct zip_dirent *, FILE *, zip_flags_t, struct zip_error *); + +struct zip_extra_field *_zip_ef_clone(const struct zip_extra_field *, struct zip_error *); +struct zip_extra_field *_zip_ef_delete_by_id(struct zip_extra_field *, zip_uint16_t, zip_uint16_t, zip_flags_t); +void _zip_ef_free(struct zip_extra_field *); +const zip_uint8_t *_zip_ef_get_by_id(const struct zip_extra_field *, zip_uint16_t *, zip_uint16_t, zip_uint16_t, zip_flags_t, struct zip_error *); +struct zip_extra_field *_zip_ef_merge(struct zip_extra_field *, struct zip_extra_field *); +struct zip_extra_field *_zip_ef_new(zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_flags_t); +struct zip_extra_field *_zip_ef_parse(const zip_uint8_t *, zip_uint16_t, zip_flags_t, struct zip_error *); +struct zip_extra_field *_zip_ef_remove_internal(struct zip_extra_field *); +zip_uint16_t _zip_ef_size(const struct zip_extra_field *, zip_flags_t); +void _zip_ef_write(const struct zip_extra_field *, zip_flags_t, FILE *); + +void _zip_entry_finalize(struct zip_entry *); +void _zip_entry_init(struct zip_entry *); void _zip_error_clear(struct zip_error *); -void _zip_error_copy(struct zip_error *, struct zip_error *); +void _zip_error_copy(struct zip_error *, const struct zip_error *); void _zip_error_fini(struct zip_error *); -void _zip_error_get(struct zip_error *, int *, int *); +void _zip_error_get(const struct zip_error *, int *, int *); void _zip_error_init(struct zip_error *); void _zip_error_set(struct zip_error *, int, int); void _zip_error_set_from_source(struct zip_error *, struct zip_source *); const char *_zip_error_strerror(struct zip_error *); +const zip_uint8_t *_zip_extract_extra_field_by_id(struct zip_error *, zip_uint16_t, int, const zip_uint8_t *, zip_uint16_t, zip_uint16_t *); + +int _zip_file_extra_field_prepare_for_change(struct zip *, zip_uint64_t); int _zip_file_fillbuf(void *, size_t, struct zip_file *); -unsigned int _zip_file_get_offset(struct zip *, int); +zip_uint64_t _zip_file_get_offset(const struct zip *, zip_uint64_t, struct zip_error *); int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *); -struct zip *_zip_open(const char *, FILE *, int, int, int *); +struct zip_dirent *_zip_get_dirent(struct zip *, zip_uint64_t, zip_flags_t, struct zip_error *); + +enum zip_encoding_type _zip_guess_encoding(struct zip_string *, enum zip_encoding_type); +zip_uint8_t *_zip_cp437_to_utf8(const zip_uint8_t * const, zip_uint32_t, + zip_uint32_t *, struct zip_error *error); + +struct zip *_zip_open(const char *, FILE *, unsigned int, int *); + +int _zip_read_local_ef(struct zip *, zip_uint64_t); struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *, zip_uint64_t, zip_int64_t, int, const struct zip_stat *); struct zip_source *_zip_source_new(struct zip *); - -int _zip_changed(struct zip *, int *); -void _zip_free(struct zip *); -const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *); +struct zip_source *_zip_source_zip_new(struct zip *, struct zip *, zip_uint64_t, zip_flags_t, + zip_uint64_t, zip_uint64_t, const char *); + +int _zip_string_equal(const struct zip_string *, const struct zip_string *); +void _zip_string_free(struct zip_string *); +zip_uint32_t _zip_string_crc32(const struct zip_string *); +const zip_uint8_t *_zip_string_get(struct zip_string *, zip_uint32_t *, zip_flags_t, struct zip_error *); +zip_uint16_t _zip_string_length(const struct zip_string *); +struct zip_string *_zip_string_new(const zip_uint8_t *, zip_uint16_t, zip_flags_t, struct zip_error *); +void _zip_string_write(const struct zip_string *, FILE *); + +int _zip_changed(const struct zip *, zip_uint64_t *); +const char *_zip_get_name(struct zip *, zip_uint64_t, zip_flags_t, struct zip_error *); int _zip_local_header_read(struct zip *, int); void *_zip_memdup(const void *, size_t, struct zip_error *); -int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); +zip_int64_t _zip_name_locate(struct zip *, const char *, zip_flags_t, struct zip_error *); struct zip *_zip_new(struct zip_error *); -unsigned short _zip_read2(unsigned char **); -unsigned int _zip_read4(unsigned char **); -zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *, - struct zip_source *); -int _zip_set_name(struct zip *, zip_uint64_t, const char *); -void _zip_u2d_time(time_t, unsigned short *, unsigned short *); +zip_uint16_t _zip_read2(const zip_uint8_t **); +zip_uint32_t _zip_read4(const zip_uint8_t **); +zip_uint64_t _zip_read8(const zip_uint8_t **); +zip_uint8_t *_zip_read_data(const zip_uint8_t **, FILE *, size_t, int, struct zip_error *); +zip_int64_t _zip_file_replace(struct zip *, zip_uint64_t, const char *, struct zip_source *, zip_flags_t); +int _zip_set_name(struct zip *, zip_uint64_t, const char *, zip_flags_t); +void _zip_u2d_time(time_t, zip_uint16_t *, zip_uint16_t *); int _zip_unchange(struct zip *, zip_uint64_t, int); void _zip_unchange_data(struct zip_entry *); +void _zip_poke4(zip_uint32_t, zip_uint8_t **); +void _zip_poke8(zip_uint64_t, zip_uint8_t **); +void _zip_write2(zip_uint16_t, FILE *); +void _zip_write4(zip_uint32_t, FILE *); +void _zip_write8(zip_uint64_t, FILE *); + + #endif /* zipint.h */ diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 0b8f3fcad3304..82f99b02f5484 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -30,8 +30,6 @@ #include "ext/pcre/php_pcre.h" #include "ext/standard/php_filestat.h" #include "php_zip.h" -#include "lib/zip.h" -#include "lib/zipint.h" /* zip_open is a macro for renaming libzip zipopen, so we need to use PHP_NAMED_FUNCTION */ static PHP_NAMED_FUNCTION(zif_zip_open); @@ -53,6 +51,24 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_close); #endif #endif +#if PHP_VERSION_ID < 50400 +#define ARG_PATH "s" +#define KEY_ARG_DC +#define KEY_ARG_CC +#else +#define ARG_PATH "p" +#define KEY_ARG_DC , const zend_literal *key +#define KEY_ARG_CC , key +#endif + +#if PHP_VERSION_ID < 50500 +#define TYPE_ARG_DC +#define TYPE_ARG_CC +#else +#define TYPE_ARG_DC , int type +#define TYPE_ARG_CC , type +#endif + /* {{{ Resource le */ static int le_zip_dir; #define le_zip_dir_name "Zip Directory" @@ -299,7 +315,6 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam char *entry_name, size_t entry_name_len, long offset_start, long offset_len TSRMLS_DC) /* {{{ */ { struct zip_source *zs; - int cur_idx; char resolved_path[MAXPATHLEN]; zval exists_flag; @@ -321,25 +336,11 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam if (!zs) { return -1; } - - cur_idx = zip_name_locate(za, (const char *)entry_name, 0); - /* TODO: fix _zip_replace */ - if (cur_idx<0) { - /* reset the error */ - if (za->error.str) { - _zip_error_fini(&za->error); - } - _zip_error_init(&za->error); - } else { - if (zip_delete(za, cur_idx) == -1) { - zip_source_free(zs); - return -1; - } - } - - if (zip_add(za, entry_name, zs) == -1) { + if (zip_file_add(za, entry_name, zs, ZIP_FL_OVERWRITE) < 0) { + zip_source_free(zs); return -1; } else { + zip_error_clear(za); return 1; } } @@ -780,7 +781,11 @@ static const zend_function_entry zip_functions[] = { PHP_FE(zip_entry_name, arginfo_zip_entry_name) PHP_FE(zip_entry_compressedsize, arginfo_zip_entry_compressedsize) PHP_FE(zip_entry_compressionmethod, arginfo_zip_entry_compressionmethod) +#ifdef PHP_FE_END PHP_FE_END +#else + {NULL,NULL,NULL} +#endif }; /* }}} */ @@ -869,7 +874,7 @@ static int php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd, zv } /* }}} */ -static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */ +static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member TYPE_ARG_DC KEY_ARG_DC TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; @@ -884,24 +889,27 @@ static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; +#if PHP_VERSION_ID >= 50400 key = NULL; +#endif } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { +#if PHP_VERSION_ID >= 50400 if (key) { ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd); - } else { + } else +#endif ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); - } } if (ret == FAILURE) { std_hnd = zend_get_std_object_handlers(); - retval = std_hnd->get_property_ptr_ptr(object, member, type, key TSRMLS_CC); + retval = std_hnd->get_property_ptr_ptr(object, member TYPE_ARG_CC KEY_ARG_CC TSRMLS_CC); } if (member == &tmp_member) { @@ -911,7 +919,7 @@ static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, } /* }}} */ -static zval* php_zip_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */ +static zval* php_zip_read_property(zval *object, zval *member, int type KEY_ARG_DC TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; @@ -925,18 +933,21 @@ static zval* php_zip_read_property(zval *object, zval *member, int type, const z zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; +#if PHP_VERSION_ID >= 50400 key = NULL; +#endif } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { +#if PHP_VERSION_ID >= 50400 if (key) { ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd); - } else { + } else +#endif ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); - } } if (ret == SUCCESS) { @@ -949,7 +960,7 @@ static zval* php_zip_read_property(zval *object, zval *member, int type, const z } } else { std_hnd = zend_get_std_object_handlers(); - retval = std_hnd->read_property(object, member, type, key TSRMLS_CC); + retval = std_hnd->read_property(object, member, type KEY_ARG_CC TSRMLS_CC); } if (member == &tmp_member) { @@ -959,7 +970,7 @@ static zval* php_zip_read_property(zval *object, zval *member, int type, const z } /* }}} */ -static int php_zip_has_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */ +static int php_zip_has_property(zval *object, zval *member, int type KEY_ARG_DC TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; @@ -972,18 +983,21 @@ static int php_zip_has_property(zval *object, zval *member, int type, const zend zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; +#if PHP_VERSION_ID >= 50400 key = NULL; +#endif } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { +#if PHP_VERSION_ID >= 50400 if (key) { ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd); - } else { + } else +#endif ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); - } } if (ret == SUCCESS) { @@ -1005,7 +1019,7 @@ static int php_zip_has_property(zval *object, zval *member, int type, const zend zval_ptr_dtor(&tmp); } else { std_hnd = zend_get_std_object_handlers(); - retval = std_hnd->has_property(object, member, type, key TSRMLS_CC); + retval = std_hnd->has_property(object, member, type KEY_ARG_CC TSRMLS_CC); } if (member == &tmp_member) { @@ -1059,7 +1073,8 @@ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */ } if (intern->za) { if (zip_close(intern->za) != 0) { - _zip_free(intern->za); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot destroy the zip context"); + return; } intern->za = NULL; } @@ -1096,6 +1111,9 @@ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */ static zend_object_value php_zip_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ { +#if PHP_VERSION_ID < 50400 + zval *tmp; +#endif ze_zip_object *intern; zend_object_value retval; @@ -1116,8 +1134,13 @@ static zend_object_value php_zip_object_new(zend_class_entry *class_type TSRMLS_ intern->zo.ce = class_type; #endif - object_properties_init(&intern->zo, class_type); +#if PHP_VERSION_ID < 50400 + zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, + (void *) &tmp, sizeof(zval *)); +#else + object_properties_init(&intern->zo, class_type); +#endif retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_zip_object_free_storage, @@ -1140,7 +1163,7 @@ static void php_zip_free_dir(zend_rsrc_list_entry *rsrc TSRMLS_DC) if (zip_int) { if (zip_int->za) { if (zip_close(zip_int->za) != 0) { - _zip_free(zip_int->za); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot destroy the zip context"); } zip_int->za = NULL; } @@ -1159,13 +1182,7 @@ static void php_zip_free_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC) if (zr_rsrc) { if (zr_rsrc->zf) { - if (zr_rsrc->zf->za) { - zip_fclose(zr_rsrc->zf); - } else { - if (zr_rsrc->zf->src) - zip_source_free(zr_rsrc->zf->src); - free(zr_rsrc->zf); - } + zip_fclose(zr_rsrc->zf); zr_rsrc->zf = NULL; } efree(zr_rsrc); @@ -1195,7 +1212,7 @@ zend_module_entry zip_module_entry = { NULL, NULL, PHP_MINFO(zip), - PHP_ZIP_VERSION_STRING, + PHP_ZIP_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */ @@ -1215,7 +1232,7 @@ static PHP_NAMED_FUNCTION(zif_zip_open) zip_rsrc *rsrc_int; int err = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH, &filename, &filename_len) == FAILURE) { return; } @@ -1498,7 +1515,7 @@ static ZIPARCHIVE_METHOD(open) zval *this = getThis(); ze_zip_object *ze_obj = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", &filename, &filename_len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &filename, &filename_len, &flags) == FAILURE) { return; } @@ -1523,7 +1540,8 @@ static ZIPARCHIVE_METHOD(open) if (ze_obj->za) { /* we already have an opened zip, free it */ if (zip_close(ze_obj->za) != 0) { - _zip_free(ze_obj->za); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source"); + RETURN_FALSE; } ze_obj->za = NULL; } @@ -1543,6 +1561,38 @@ static ZIPARCHIVE_METHOD(open) } /* }}} */ +/* {{{ proto resource ZipArchive::setPassword(string password) +Set the password for the active archive */ +static ZIPARCHIVE_METHOD(setPassword) +{ + struct zip *intern; + zval *this = getThis(); + char *password; + int password_len; + + if (!this) { + RETURN_FALSE; + } + + ZIP_FROM_OBJECT(intern, this); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &password, &password_len) == FAILURE) { + return; + } + + if (password_len < 1) { + RETURN_FALSE; + } else { + int res = zip_set_default_password(intern, (const char *)password); + if (res == 0) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } + } +} +/* }}} */ + /* {{{ proto bool ZipArchive::close() close the zip archive */ static ZIPARCHIVE_METHOD(close) @@ -1552,7 +1602,7 @@ static ZIPARCHIVE_METHOD(close) ze_zip_object *ze_obj; if (!this) { - RETURN_FALSE; + RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); @@ -1560,7 +1610,7 @@ static ZIPARCHIVE_METHOD(close) ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC); if (zip_close(intern)) { - RETURN_FALSE; + zip_discard(intern); } efree(ze_obj->filename); @@ -1637,6 +1687,7 @@ static ZIPARCHIVE_METHOD(addEmptyDir) if (zip_add_dir(intern, (const char *)s) == -1) { RETVAL_FALSE; } + zip_error_clear(intern); RETVAL_TRUE; } @@ -1654,7 +1705,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* char *path = NULL; char *remove_path = NULL; char *add_path = NULL; - int pattern_len, add_path_len = 0, remove_path_len = 0, path_len = 0; + int pattern_len, add_path_len, remove_path_len = 0, path_len = 0; long remove_all_path = 0; long flags = 0; zval *options = NULL; @@ -1667,12 +1718,12 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* ZIP_FROM_OBJECT(intern, this); /* 1 == glob, 2==pcre */ if (type == 1) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|la", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|la", &pattern, &pattern_len, &flags, &options) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sa", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|sa", &pattern, &pattern_len, &path, &path_len, &options) == FAILURE) { return; } @@ -1703,13 +1754,12 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* zval **zval_file = NULL; for (i = 0; i < found; i++) { - char *file, *file_stripped, *entry_name; + char *file_stripped, *entry_name; size_t entry_name_len, file_stripped_len; char entry_name_buf[MAXPATHLEN]; char *basename = NULL; if (zend_hash_index_find(Z_ARRVAL_P(return_value), i, (void **) &zval_file) == SUCCESS) { - file = Z_STRVAL_PP(zval_file); if (remove_all_path) { php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0, &basename, (size_t *)&file_stripped_len TSRMLS_CC); @@ -1786,7 +1836,7 @@ static ZIPARCHIVE_METHOD(addFile) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sll", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|sll", &filename, &filename_len, &entry_name, &entry_name_len, &offset_start, &offset_len) == FAILURE) { return; } @@ -1856,16 +1906,18 @@ static ZIPARCHIVE_METHOD(addFromString) /* TODO: fix _zip_replace */ if (cur_idx >= 0) { if (zip_delete(intern, cur_idx) == -1) { - goto fail; + zip_source_free(zs); + RETURN_FALSE; } } - if (zip_add(intern, name, zs) != -1) { + if (zip_add(intern, name, zs) == -1) { + zip_source_free(zs); + RETURN_FALSE; + } else { + zip_error_clear(intern); RETURN_TRUE; } -fail: - zip_source_free(zs); - RETURN_FALSE; } /* }}} */ @@ -1886,7 +1938,7 @@ static ZIPARCHIVE_METHOD(statName) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &name, &name_len, &flags) == FAILURE) { return; } @@ -1942,7 +1994,7 @@ static ZIPARCHIVE_METHOD(locateName) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &name, &name_len, &flags) == FAILURE) { return; } @@ -2522,7 +2574,7 @@ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ ZIP_FROM_OBJECT(intern, this); if (type == 1) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ll", &filename, &filename_len, &len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|ll", &filename, &filename_len, &len, &flags) == FAILURE) { return; } PHP_ZIP_STAT_PATH(intern, filename, filename_len, flags, sb); @@ -2598,7 +2650,7 @@ static ZIPARCHIVE_METHOD(getStream) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH, &filename, &filename_len) == FAILURE) { return; } @@ -2621,6 +2673,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_open, 0, 0, 1) ZEND_ARG_INFO(0, flags) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setpassword, 0, 0, 1) + ZEND_ARG_INFO(0, password) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_ziparchive__void, 0) ZEND_END_ARG_INFO() @@ -2733,6 +2789,7 @@ ZEND_END_ARG_INFO() /* {{{ ze_zip_object_class_functions */ static const zend_function_entry zip_class_functions[] = { ZIPARCHIVE_ME(open, arginfo_ziparchive_open, ZEND_ACC_PUBLIC) + ZIPARCHIVE_ME(setPassword, arginfo_ziparchive_setpassword, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(close, arginfo_ziparchive__void, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getStatusString, arginfo_ziparchive__void, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(addEmptyDir, arginfo_ziparchive_addemptydir, ZEND_ACC_PUBLIC) @@ -2875,7 +2932,7 @@ static PHP_MINFO_FUNCTION(zip) php_info_print_table_row(2, "Zip", "enabled"); php_info_print_table_row(2, "Extension Version","$Id$"); - php_info_print_table_row(2, "Zip version", PHP_ZIP_VERSION_STRING); + php_info_print_table_row(2, "Zip version", PHP_ZIP_VERSION); php_info_print_table_row(2, "Libzip version", LIBZIP_VERSION); php_info_print_table_end(); diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index dace407d14f31..c8da941b7a82d 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -28,9 +28,17 @@ extern zend_module_entry zip_module_entry; #include "TSRM.h" #endif +#if defined(HAVE_LIBZIP) +#include +#else #include "lib/zip.h" +#endif -#define PHP_ZIP_VERSION_STRING "1.11.0" +#ifndef ZIP_OVERWRITE +#define ZIP_OVERWRITE ZIP_TRUNCATE +#endif + +#define PHP_ZIP_VERSION "1.12.3" #if ((PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION >= 6) # define PHP_ZIP_USE_OO 1 @@ -67,8 +75,9 @@ typedef struct _ze_zip_read_rsrc { } zip_read_rsrc; #ifdef PHP_ZIP_USE_OO -#define ZIPARCHIVE_ME(name, arg_info, flags) ZEND_FENTRY(name, c_ziparchive_ ##name, arg_info, flags) -#define ZIPARCHIVE_METHOD(name) ZEND_NAMED_FUNCTION(c_ziparchive_##name) +#define ZIPARCHIVE_ME(name, arg_info, flags) {#name, c_ziparchive_ ##name, arg_info,(zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_info)-1), flags }, +#define ZIPARCHIVE_METHOD(name) ZEND_NAMED_FUNCTION(c_ziparchive_ ##name) + /* Extends zend object */ typedef struct _ze_zip_object { diff --git a/ext/zip/tests/bug38943.inc b/ext/zip/tests/bug38943.inc new file mode 100644 index 0000000000000..a6f45e8294eff --- /dev/null +++ b/ext/zip/tests/bug38943.inc @@ -0,0 +1,16 @@ +testarray[] = 1; + var_dump($this->testarray); + } +} + +$z = new myZip; +$z->testp = "foobar"; +var_dump($z); + diff --git a/ext/zip/tests/bug38943_2.phpt b/ext/zip/tests/bug38943_2.phpt new file mode 100644 index 0000000000000..bdbad94517cc9 --- /dev/null +++ b/ext/zip/tests/bug38943_2.phpt @@ -0,0 +1,38 @@ +--TEST-- +#38943, properties in extended class cannot be set (5.3) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +array(1) { + [0]=> + int(1) +} +object(myZip)#1 (%d) { + ["test":"myZip":private]=> + int(0) + ["testp"]=> + string(6) "foobar" + ["testarray":"myZip":private]=> + array(1) { + [0]=> + int(1) + } + ["status"]=> + int(0) + ["statusSys"]=> + int(0) + ["numFiles"]=> + int(0) + ["filename"]=> + string(0) "" + ["comment"]=> + string(0) "" +} diff --git a/ext/zip/tests/doubleclose.phpt b/ext/zip/tests/doubleclose.phpt new file mode 100644 index 0000000000000..abc62c8434789 --- /dev/null +++ b/ext/zip/tests/doubleclose.phpt @@ -0,0 +1,43 @@ +--TEST-- +close() called twice +--SKIPIF-- + +--FILE-- +open(dirname(__FILE__) . '/test.zip')) { + die('Failure'); +} +if ($zip->status == ZIPARCHIVE::ER_OK) { + var_dump($zip->close()); + var_dump($zip->close()); +} else { + die("Failure"); +} + +?> +Done +--EXPECTF-- +Procedural +NULL + +Warning: zip_close(): %i is not a valid Zip Directory resource in %s +bool(false) +Object +bool(true) + +Warning: ZipArchive::close(): Invalid or uninitialized Zip object in %s +bool(false) +Done diff --git a/ext/zip/tests/zip_entry_close.phpt b/ext/zip/tests/zip_entry_close.phpt new file mode 100644 index 0000000000000..82b7819054f49 --- /dev/null +++ b/ext/zip/tests/zip_entry_close.phpt @@ -0,0 +1,24 @@ +--TEST-- +zip_entry_close() function: simple and double call +--SKIPIF-- + +--FILE-- + +Done +--EXPECTF-- +entry_open: bool(true) +entry_close: bool(true) +entry_close: +Warning: zip_entry_close(): %d is not a valid Zip Entry resource in %s +bool(false) +Done diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c index 79b54cbbb0cdc..02fbc70f85e60 100644 --- a/ext/zip/zip_stream.c +++ b/ext/zip/zip_stream.c @@ -1,3 +1,21 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Piere-Alain Joye | + +----------------------------------------------------------------------+ +*/ + /* $Id$ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -6,8 +24,6 @@ #if HAVE_ZIP #ifdef ZEND_ENGINE_2 -#include "lib/zip.h" - #include "php_streams.h" #include "ext/standard/file.h" #include "ext/standard/php_string.h" From 5b8ae0143f5b6cd735e0c201d85556654a89db9e Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 4 Nov 2013 13:32:45 +0100 Subject: [PATCH 0270/1256] NEWS + UPGRADING --- NEWS | 6 ++++++ UPGRADING | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/NEWS b/NEWS index ed8bcc93b154f..0a4b78c9c6186 100644 --- a/NEWS +++ b/NEWS @@ -70,4 +70,10 @@ PHP NEWS . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). (Mike) +- Zip: + . update libzip to version 1.11.1. + PHP don't use any ilibzip private symbol anymore. (Pierre, Remi) + . new method ZipArchive::setPassword($password). (Pierre) + . add --with-libzip option to build with system libzip. (Remi) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index ab05b3a8bff04..022918cb14594 100755 --- a/UPGRADING +++ b/UPGRADING @@ -86,6 +86,9 @@ PHP X.Y UPGRADE NOTES - LDAP: Added ldap_escape($value, $ignore = "", $flags = 0). +- Zip: + Added ZipArchive::setPassword($password) + ======================================== 6. New Classes and Interfaces ======================================== @@ -141,3 +144,6 @@ PHP X.Y UPGRADE NOTES - HTTP stream wrapper: HTTP 1.1 requests now include a Connection: close header unless explicitly overridden by setting a Connection header via the header context option. + +- Zip: + New --with-libzip option allow to use system libzip. Version > 0.11 required. From e3d9e18e7b24ba2d5c9e420510e804330c94f955 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 5 Nov 2013 11:04:55 +0800 Subject: [PATCH 0271/1256] Fixed Bug #66034 (Segmentation Fault when constructor of PDO statement throws an exception) I know zend_call_function will initilize retval_ptr_ptr, but still set it to NULL explict is more readable --- NEWS | 6 +++++- ext/pdo/pdo_dbh.c | 4 ++-- ext/pdo_sqlite/tests/bug66033.phpt | 33 ++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 ext/pdo_sqlite/tests/bug66033.phpt diff --git a/NEWS b/NEWS index e5b79ec7bfafb..c3e70d94a3f51 100644 --- a/NEWS +++ b/NEWS @@ -18,10 +18,14 @@ PHP NEWS - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) -- ODBC +- ODBC: . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) +- PDO: + . Fixed bug #66033 (Segmentation Fault when constructor of PDO statement + throws an exception). (Laruence) + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index d5860b1a1eb02..ac8d29a95cad1 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -460,7 +460,7 @@ static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry if (dbstmt_ce->constructor) { zend_fcall_info fci; zend_fcall_info_cache fcc; - zval *retval; + zval *retval = NULL; fci.size = sizeof(zend_fcall_info); fci.function_table = &dbstmt_ce->function_table; @@ -495,7 +495,7 @@ static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry zval_dtor(object); ZVAL_NULL(object); object = NULL; /* marks failure */ - } else { + } else if (retval) { zval_ptr_dtor(&retval); } diff --git a/ext/pdo_sqlite/tests/bug66033.phpt b/ext/pdo_sqlite/tests/bug66033.phpt new file mode 100644 index 0000000000000..28da3b54bfff1 --- /dev/null +++ b/ext/pdo_sqlite/tests/bug66033.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #66033 (Segmentation Fault when constructor of PDO statement throws an exception) +--SKIPIF-- + +--FILE-- +dbh = $dbh; + throw new Exception("Blah"); + } +} + +$pdo = new PDO('sqlite::memory:', null, null); +$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', + array($pdo))); +$pdo->exec("CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY, + title TEXT, + message TEXT, + time INTEGER)"); + +try { + $pdoStatement = $pdo->query("select * from messages"); +} catch (Exception $e) { + var_dump($e->getMessage()); +} +?> +--EXPECTF-- +string(4) "Blah" From 906d3ae0edb1c371f4ad73585ef25337f8e0ef97 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 5 Nov 2013 11:08:55 +0800 Subject: [PATCH 0272/1256] Update NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 0c8a15a5f9175..26990debce239 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ PHP NEWS . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) +- PDO: + . Fixed bug #66033 (Segmentation Fault when constructor of PDO statement + throws an exception). (Laruence) + - Standard: . Fixed bug #64760 (var_export() does not use full precision for floating-point numbers) (Yasuo) From 63dba7ec9d7ce1ec5e2d48742c71ce66db973b93 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 5 Nov 2013 18:47:12 +0800 Subject: [PATCH 0273/1256] Remove outdate codes, make it clearer, although just a bit.. --- ext/phar/phar.c | 94 +----------- ext/phar/phar_internal.h | 59 -------- ext/phar/phar_object.c | 78 +--------- ext/phar/stream.c | 12 -- ext/phar/util.c | 299 +-------------------------------------- ext/phar/zip.c | 10 -- 6 files changed, 6 insertions(+), 546 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index ec8e5fbde7521..13b3d6428e324 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -27,9 +27,7 @@ static void destroy_phar_data(void *pDest); ZEND_DECLARE_MODULE_GLOBALS(phar) -#if PHP_VERSION_ID >= 50300 char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); -#endif /** * set's phar->is_writeable based on the current INI value @@ -3321,31 +3319,18 @@ static size_t phar_zend_stream_reader(void *handle, char *buf, size_t len TSRMLS } /* }}} */ -#if PHP_VERSION_ID >= 50300 static size_t phar_zend_stream_fsizer(void *handle TSRMLS_DC) /* {{{ */ { return ((phar_archive_data*)handle)->halt_offset + 32; } /* }}} */ -#else /* PHP_VERSION_ID */ - -static long phar_stream_fteller_for_zend(void *handle TSRMLS_DC) /* {{{ */ -{ - return (long)php_stream_tell(phar_get_pharfp((phar_archive_data*)handle TSRMLS_CC)); -} -/* }}} */ -#endif - zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); -#if PHP_VERSION_ID >= 50300 #define phar_orig_zend_open zend_stream_open_function + static char *phar_resolve_path(const char *filename, int filename_len TSRMLS_DC) { return phar_find_in_include_path((char *) filename, filename_len, NULL TSRMLS_CC); } -#else -int (*phar_orig_zend_open)(const char *filename, zend_file_handle *handle TSRMLS_DC); -#endif static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) /* {{{ */ { @@ -3378,7 +3363,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type } } else if (phar->flags & PHAR_FILE_COMPRESSION_MASK) { /* compressed phar */ -#if PHP_VERSION_ID >= 50300 file_handle->type = ZEND_HANDLE_STREAM; /* we do our own reading directly from the phar, don't change the next line */ file_handle->handle.stream.handle = phar; @@ -3390,18 +3374,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type php_stream_rewind(PHAR_GLOBALS->cached_fp[phar->phar_pos].fp) : php_stream_rewind(phar->fp); memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap)); -#else /* PHP_VERSION_ID */ - file_handle->type = ZEND_HANDLE_STREAM; - /* we do our own reading directly from the phar, don't change the next line */ - file_handle->handle.stream.handle = phar; - file_handle->handle.stream.reader = phar_zend_stream_reader; - file_handle->handle.stream.closer = NULL; /* don't close - let phar handle this one */ - file_handle->handle.stream.fteller = phar_stream_fteller_for_zend; - file_handle->handle.stream.interactive = 0; - phar->is_persistent ? - php_stream_rewind(PHAR_GLOBALS->cached_fp[phar->phar_pos].fp) : - php_stream_rewind(phar->fp); -#endif } } } @@ -3426,60 +3398,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type } /* }}} */ -#if PHP_VERSION_ID < 50300 -int phar_zend_open(const char *filename, zend_file_handle *handle TSRMLS_DC) /* {{{ */ -{ - char *arch, *entry; - int arch_len, entry_len; - - /* this code is obsoleted in php 5.3 */ - entry = (char *) filename; - if (!IS_ABSOLUTE_PATH(entry, strlen(entry)) && !strstr(entry, "://")) { - phar_archive_data **pphar = NULL; - char *fname; - int fname_len; - - fname = (char*)zend_get_executed_filename(TSRMLS_C); - fname_len = strlen(fname); - - if (fname_len > 7 && !strncasecmp(fname, "phar://", 7)) { - if (SUCCESS == phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **) &pphar); - if (!pphar && PHAR_G(manifest_cached)) { - zend_hash_find(&cached_phars, arch, arch_len, (void **) &pphar); - } - efree(arch); - efree(entry); - } - } - - /* retrieving an include within the current directory, so use this if possible */ - if (!(entry = phar_find_in_include_path((char *) filename, strlen(filename), NULL TSRMLS_CC))) { - /* this file is not in the phar, use the original path */ - goto skip_phar; - } - - if (SUCCESS == phar_orig_zend_open(entry, handle TSRMLS_CC)) { - if (!handle->opened_path) { - handle->opened_path = entry; - } - if (entry != filename) { - handle->free_filename = 1; - } - return SUCCESS; - } - - if (entry != filename) { - efree(entry); - } - - return FAILURE; - } -skip_phar: - return phar_orig_zend_open(filename, handle TSRMLS_CC); -} -/* }}} */ -#endif typedef zend_op_array* (zend_compile_t)(zend_file_handle*, int TSRMLS_DC); typedef zend_compile_t* (compile_hook)(zend_compile_t *ptr); @@ -3556,13 +3474,8 @@ PHP_MINIT_FUNCTION(phar) /* {{{ */ phar_orig_compile_file = zend_compile_file; zend_compile_file = phar_compile_file; -#if PHP_VERSION_ID >= 50300 phar_save_resolve_path = zend_resolve_path; zend_resolve_path = phar_resolve_path; -#else - phar_orig_zend_open = zend_stream_open_function; - zend_stream_open_function = phar_zend_open; -#endif phar_object_init(TSRMLS_C); @@ -3583,11 +3496,6 @@ PHP_MSHUTDOWN_FUNCTION(phar) /* {{{ */ zend_compile_file = phar_orig_compile_file; } -#if PHP_VERSION_ID < 50300 - if (zend_stream_open_function == phar_zend_open) { - zend_stream_open_function = phar_orig_zend_open; - } -#endif if (PHAR_G(manifest_cached)) { zend_hash_destroy(&(cached_phars)); zend_hash_destroy(&(cached_alias)); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index daa85f1b70f8b..fcfb6471844a0 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -516,76 +516,17 @@ union _phar_entry_object { #endif #ifndef PHAR_MAIN -# if PHP_VERSION_ID >= 50300 extern char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); -# endif #endif -#if PHP_VERSION_ID < 50209 -static inline size_t phar_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC TSRMLS_DC) -{ - size_t ret = php_stream_copy_to_stream(src, dest, maxlen); - if (len) { - *len = ret; - } - if (ret) { - return SUCCESS; - } - return FAILURE; -} -#else # define phar_stream_copy_to_stream(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) -#endif - -#if PHP_VERSION_ID >= 60000 -typedef zstr phar_zstr; -#define PHAR_STR(a, b) \ - spprintf(&b, 0, "%s", a.s); -#define PHAR_ZSTR(a, b) \ - b = ZSTR(a); -#define PHAR_STR_FREE(a) \ - efree(a); -static inline int phar_make_unicode(zstr *c_var, char *arKey, uint nKeyLength TSRMLS_DC) -{ - int c_var_len; - UConverter *conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv)); - - c_var->u = NULL; - if (zend_string_to_unicode(conv, &c_var->u, &c_var_len, arKey, nKeyLength TSRMLS_CC) == FAILURE) { - - if (c_var->u) { - efree(c_var->u); - } - return 0; - - } - return c_var_len; -} -static inline int phar_find_key(HashTable *_SERVER, char *key, int len, void **stuff TSRMLS_DC) -{ - if (SUCCESS == zend_hash_find(_SERVER, key, len, stuff)) { - return 1; - } else { - int s = len; - zstr var; - s = phar_make_unicode(&var, key, len TSRMLS_CC); - if (SUCCESS == zend_u_hash_find(_SERVER, IS_UNICODE, var, s, stuff)) { - efree(var.u); - return 1; - } - efree(var.u); - return 0; - } -} -#else typedef char *phar_zstr; #define PHAR_STR(a, b) \ b = a; #define PHAR_ZSTR(a, b) \ b = a; #define PHAR_STR_FREE(a) -#endif BEGIN_EXTERN_C() diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index dcb67fe9fa6e4..7d2922fbaa15c 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -685,11 +685,7 @@ PHP_METHOD(Phar, webPhar) ZVAL_STRINGL(params, entry, entry_len, 1); zp[0] = ¶ms; -#if PHP_VERSION_ID < 50300 - if (FAILURE == zend_fcall_info_init(rewrite, &fci, &fcc TSRMLS_CC)) { -#else if (FAILURE == zend_fcall_info_init(rewrite, 0, &fci, &fcc, NULL, NULL TSRMLS_CC)) { -#endif zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar error: invalid rewrite callback"); if (free_pathinfo) { @@ -701,11 +697,7 @@ PHP_METHOD(Phar, webPhar) fci.param_count = 1; fci.params = zp; -#if PHP_VERSION_ID < 50300 - ++(params->refcount); -#else Z_ADDREF_P(params); -#endif fci.retval_ptr_ptr = &retval_ptr; if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) { @@ -729,11 +721,6 @@ PHP_METHOD(Phar, webPhar) } switch (Z_TYPE_P(retval_ptr)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(retval_ptr TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: efree(entry); @@ -1155,11 +1142,7 @@ PHP_METHOD(Phar, __construct) #else char *fname, *alias = NULL, *error, *arch = NULL, *entry = NULL, *save_fname; int fname_len, alias_len = 0, arch_len, entry_len, is_data; -#if PHP_VERSION_ID < 50300 - long flags = 0; -#else long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS; -#endif long format = 0; phar_archive_object *phar_obj; phar_archive_data *phar_data; @@ -1459,11 +1442,6 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ } switch (Z_TYPE_PP(value)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(*(value) TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: break; case IS_RESOURCE: @@ -1514,13 +1492,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ switch (intern->type) { case SPL_FS_DIR: -#if PHP_VERSION_ID >= 60000 - test = spl_filesystem_object_get_path(intern, NULL, NULL TSRMLS_CC).s; -#elif PHP_VERSION_ID >= 50300 test = spl_filesystem_object_get_path(intern, NULL TSRMLS_CC); -#else - test = intern->path; -#endif fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name); php_stat(fname, fname_len, FS_IS_DIR, &dummy TSRMLS_CC); @@ -1545,25 +1517,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ goto phar_spl_fileinfo; case SPL_FS_INFO: case SPL_FS_FILE: -#if PHP_VERSION_ID >= 60000 - if (intern->file_name_type == IS_UNICODE) { - zval zv; - - INIT_ZVAL(zv); - Z_UNIVAL(zv) = intern->file_name; - Z_UNILEN(zv) = intern->file_name_len; - Z_TYPE(zv) = IS_UNICODE; - - zval_copy_ctor(&zv); - zval_unicode_to_string(&zv TSRMLS_CC); - fname = expand_filepath(Z_STRVAL(zv), NULL TSRMLS_CC); - ezfree(Z_UNIVAL(zv)); - } else { - fname = expand_filepath(intern->file_name.s, NULL TSRMLS_CC); - } -#else fname = expand_filepath(intern->file_name, NULL TSRMLS_CC); -#endif if (!fname) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Could not resolve file path"); return ZEND_HASH_APPLY_STOP; @@ -1816,11 +1770,7 @@ PHP_METHOD(Phar, buildFromDirectory) INIT_PZVAL(&arg); ZVAL_STRINGL(&arg, dir, dir_len, 0); INIT_PZVAL(&arg2); -#if PHP_VERSION_ID < 50300 - ZVAL_LONG(&arg2, 0); -#else ZVAL_LONG(&arg2, SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS); -#endif zend_call_method_with_2_params(&iter, spl_ce_RecursiveDirectoryIterator, &spl_ce_RecursiveDirectoryIterator->constructor, "__construct", NULL, &arg, &arg2); @@ -2313,11 +2263,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char ALLOC_ZVAL(phar->metadata); *phar->metadata = *t; zval_copy_ctor(phar->metadata); -#if PHP_VERSION_ID < 50300 - phar->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(phar->metadata, 1); -#endif phar->metadata_len = 0; } @@ -2365,11 +2311,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char ALLOC_ZVAL(newentry.metadata); *newentry.metadata = *t; zval_copy_ctor(newentry.metadata); -#if PHP_VERSION_ID < 50300 - newentry.metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(newentry.metadata, 1); -#endif newentry.metadata_str.c = NULL; newentry.metadata_str.len = 0; @@ -3552,11 +3494,7 @@ PHP_METHOD(Phar, copy) ALLOC_ZVAL(newentry.metadata); *newentry.metadata = *t; zval_copy_ctor(newentry.metadata); -#if PHP_VERSION_ID < 50300 - newentry.metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(newentry.metadata, 1); -#endif newentry.metadata_str.c = NULL; newentry.metadata_str.len = 0; @@ -4371,11 +4309,6 @@ PHP_METHOD(Phar, extractTo) switch (Z_TYPE_P(zval_files)) { case IS_NULL: goto all_files; -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(zval_files TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: filename = Z_STRVAL_P(zval_files); filename_len = Z_STRLEN_P(zval_files); @@ -4389,11 +4322,6 @@ PHP_METHOD(Phar, extractTo) zval **zval_file; if (zend_hash_index_find(Z_ARRVAL_P(zval_files), i, (void **) &zval_file) == SUCCESS) { switch (Z_TYPE_PP(zval_file)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(*(zval_file) TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: break; default: @@ -5414,11 +5342,7 @@ zend_function_entry phar_exception_methods[] = { #define REGISTER_PHAR_CLASS_CONST_LONG(class_name, const_name, value) \ zend_declare_class_constant_long(class_name, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC); -#if PHP_VERSION_ID < 50200 -# define phar_exception_get_default() zend_exception_get_default() -#else -# define phar_exception_get_default() zend_exception_get_default(TSRMLS_C) -#endif +#define phar_exception_get_default() zend_exception_get_default(TSRMLS_C) void phar_object_init(TSRMLS_D) /* {{{ */ { diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 401d81e109bcb..f4197a5b11672 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -942,11 +942,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char entry->filename_len = new_key_len; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif } PHAR_STR_FREE(str_key); } @@ -968,11 +964,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char new_str_key[new_key_len] = 0; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif efree(new_str_key); } PHAR_STR_FREE(str_key); @@ -996,11 +988,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char new_str_key[new_key_len] = 0; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif efree(new_str_key); } PHAR_STR_FREE(str_key); diff --git a/ext/phar/util.c b/ext/phar/util.c index f2271dffd4d4a..31d12e3da7b52 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -41,10 +41,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, char *key, int key_len, char **signature, int *signature_len TSRMLS_DC); #endif -#if !defined(PHP_VERSION_ID) || PHP_VERSION_ID < 50300 -extern php_stream_wrapper php_stream_phar_wrapper; -#endif - /* for links to relative location, prepend cwd of the entry */ static char *phar_get_link_location(phar_entry_info *entry TSRMLS_DC) /* {{{ */ { @@ -256,7 +252,6 @@ int phar_mount_entry(phar_archive_data *phar, char *filename, int filename_len, char *phar_find_in_include_path(char *filename, int filename_len, phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { -#if PHP_VERSION_ID >= 50300 char *path, *fname, *arch, *entry, *ret, *test; int arch_len, entry_len, fname_len, ret_len; phar_archive_data *phar; @@ -344,223 +339,6 @@ char *phar_find_in_include_path(char *filename, int filename_len, phar_archive_d } return ret; -#else /* PHP 5.2 */ - char resolved_path[MAXPATHLEN]; - char trypath[MAXPATHLEN]; - char *ptr, *end, *path = PG(include_path); - php_stream_wrapper *wrapper; - const char *p; - int n = 0; - char *fname, *arch, *entry, *ret, *test; - int arch_len, entry_len; - phar_archive_data *phar = NULL; - - if (!filename) { - return NULL; - } - - if (!zend_is_executing(TSRMLS_C) || !PHAR_G(cwd)) { - goto doit; - } - - fname = (char*)zend_get_executed_filename(TSRMLS_C); - - if (SUCCESS != phar_split_fname(fname, strlen(fname), &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - goto doit; - } - - efree(entry); - - if (*filename == '.') { - int try_len; - - if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL TSRMLS_CC)) { - efree(arch); - goto doit; - } - - try_len = filename_len; - test = phar_fix_filepath(estrndup(filename, filename_len), &try_len, 1 TSRMLS_CC); - - if (*test == '/') { - if (zend_hash_exists(&(phar->manifest), test + 1, try_len - 1)) { - spprintf(&ret, 0, "phar://%s%s", arch, test); - efree(arch); - efree(test); - return ret; - } - } else { - if (zend_hash_exists(&(phar->manifest), test, try_len)) { - spprintf(&ret, 0, "phar://%s/%s", arch, test); - efree(arch); - efree(test); - return ret; - } - } - - efree(test); - } - - efree(arch); -doit: - if (*filename == '.' || IS_ABSOLUTE_PATH(filename, filename_len) || !path || !*path) { - if (tsrm_realpath(filename, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } else { - return NULL; - } - } - - /* test for stream wrappers and return */ - for (p = filename; p - filename < filename_len && (isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'); ++p, ++n); - - if (n < filename_len - 3 && (*p == ':') && (!strncmp("//", p+1, 2) || ( filename_len > 4 && !memcmp("data", filename, 4)))) { - /* found stream wrapper, this is an absolute path until stream wrappers implement realpath */ - return estrndup(filename, filename_len); - } - - ptr = (char *) path; - while (ptr && *ptr) { - int len, is_stream_wrapper = 0, maybe_stream = 1; - - end = strchr(ptr, DEFAULT_DIR_SEPARATOR); -#ifndef PHP_WIN32 - /* search for stream wrapper */ - if (end - ptr <= 1) { - maybe_stream = 0; - goto not_stream; - } - - for (p = ptr, n = 0; p < end && (isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'); ++p, ++n); - - if (n == end - ptr && *p && !strncmp("//", p+1, 2)) { - is_stream_wrapper = 1; - /* seek to real end of include_path portion */ - end = strchr(end + 1, DEFAULT_DIR_SEPARATOR); - } else { - maybe_stream = 0; - } -not_stream: -#endif - if (end) { - if ((end-ptr) + 1 + filename_len + 1 >= MAXPATHLEN) { - ptr = end + 1; - continue; - } - - memcpy(trypath, ptr, end-ptr); - len = end-ptr; - trypath[end-ptr] = '/'; - memcpy(trypath+(end-ptr)+1, filename, filename_len+1); - ptr = end+1; - } else { - len = strlen(ptr); - - if (len + 1 + filename_len + 1 >= MAXPATHLEN) { - break; - } - - memcpy(trypath, ptr, len); - trypath[len] = '/'; - memcpy(trypath+len+1, filename, filename_len+1); - ptr = NULL; - } - - if (!is_stream_wrapper && maybe_stream) { - /* search for stream wrapper */ - for (p = trypath, n = 0; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; ++p, ++n); - } - - if (is_stream_wrapper || (n < len - 3 && (*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", trypath, 4)))) { - char *actual; - - wrapper = php_stream_locate_url_wrapper(trypath, &actual, STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - if (wrapper == &php_plain_files_wrapper) { - strlcpy(trypath, actual, sizeof(trypath)); - } else if (!wrapper) { - /* if wrapper is NULL, there was a mal-formed include_path stream wrapper, so skip this ptr */ - continue; - } else { - if (wrapper->wops->url_stat) { - php_stream_statbuf ssb; - - if (SUCCESS == wrapper->wops->url_stat(wrapper, trypath, 0, &ssb, NULL TSRMLS_CC)) { - if (wrapper == &php_stream_phar_wrapper) { - char *arch, *entry; - int arch_len, entry_len, ret_len; - - ret_len = strlen(trypath); - /* found phar:// */ - - if (SUCCESS != phar_split_fname(trypath, ret_len, &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - return estrndup(trypath, ret_len); - } - - zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **) &pphar); - - if (!pphar && PHAR_G(manifest_cached)) { - zend_hash_find(&cached_phars, arch, arch_len, (void **) &pphar); - } - - efree(arch); - efree(entry); - - return estrndup(trypath, ret_len); - } - return estrdup(trypath); - } - } - continue; - } - } - - if (tsrm_realpath(trypath, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } - } /* end provided path */ - - /* check in calling scripts' current working directory as a fall back case */ - if (zend_is_executing(TSRMLS_C)) { - char *exec_fname = (char*)zend_get_executed_filename(TSRMLS_C); - int exec_fname_length = strlen(exec_fname); - const char *p; - int n = 0; - - while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length])); - if (exec_fname && exec_fname[0] != '[' && - exec_fname_length > 0 && - exec_fname_length + 1 + filename_len + 1 < MAXPATHLEN) { - memcpy(trypath, exec_fname, exec_fname_length + 1); - memcpy(trypath+exec_fname_length + 1, filename, filename_len+1); - - /* search for stream wrapper */ - for (p = trypath; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; ++p, ++n); - - if (n < exec_fname_length - 3 && (*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", trypath, 4))) { - char *actual; - - wrapper = php_stream_locate_url_wrapper(trypath, &actual, STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - - if (wrapper == &php_plain_files_wrapper) { - /* this should never technically happen, but we'll leave it here for completeness */ - strlcpy(trypath, actual, sizeof(trypath)); - } else if (!wrapper) { - /* if wrapper is NULL, there was a malformed include_path stream wrapper - this also should be impossible */ - return NULL; - } else { - return estrdup(trypath); - } - } - - if (tsrm_realpath(trypath, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } - } - } - - return NULL; -#endif /* PHP 5.2 */ } /* }}} */ @@ -850,11 +628,6 @@ int phar_open_archive_fp(phar_archive_data *phar TSRMLS_DC) /* {{{ */ if (phar_get_pharfp(phar TSRMLS_CC)) { return SUCCESS; } -#if PHP_API_VERSION < 20100412 - if (PG(safe_mode) && (!php_checkuid(phar->fname, NULL, CHECKUID_ALLOW_ONLY_FILE))) { - return FAILURE; - } -#endif if (php_check_open_basedir(phar->fname TSRMLS_CC)) { return FAILURE; @@ -1031,47 +804,12 @@ int phar_open_entry_fp(phar_entry_info *entry, char **error, int follow_links TS } /* }}} */ -#if defined(PHP_VERSION_ID) && PHP_VERSION_ID < 50202 -typedef struct { - char *data; - size_t fpos; - size_t fsize; - size_t smax; - int mode; - php_stream **owner_ptr; -} php_stream_memory_data; -#endif - int phar_create_writeable_entry(phar_archive_data *phar, phar_entry_info *entry, char **error TSRMLS_DC) /* {{{ */ { if (entry->fp_type == PHAR_MOD) { /* already newly created, truncate */ -#if PHP_VERSION_ID >= 50202 php_stream_truncate_set_size(entry->fp, 0); -#else - if (php_stream_is(entry->fp, PHP_STREAM_IS_TEMP)) { - if (php_stream_is(*(php_stream**)entry->fp->abstract, PHP_STREAM_IS_MEMORY)) { - php_stream *inner = *(php_stream**)entry->fp->abstract; - php_stream_memory_data *memfp = (php_stream_memory_data*)inner->abstract; - memfp->fpos = 0; - memfp->fsize = 0; - } else if (php_stream_is(*(php_stream**)entry->fp->abstract, PHP_STREAM_IS_STDIO)) { - php_stream_truncate_set_size(*(php_stream**)entry->fp->abstract, 0); - } else { - if (error) { - spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", phar->fname); - } - return FAILURE; - } - } else if (php_stream_is(entry->fp, PHP_STREAM_IS_STDIO)) { - php_stream_truncate_set_size(entry->fp, 0); - } else { - if (error) { - spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", phar->fname); - } - return FAILURE; - } -#endif + entry->old_flags = entry->flags; entry->is_modified = 1; phar->is_modified = 1; @@ -1689,11 +1427,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_TYPE_P(zdata) = IS_STRING; Z_STRLEN_P(zdata) = end; -#if PHP_MAJOR_VERSION > 5 - if (end != (off_t) php_stream_copy_to_mem(fp, (void **) &(Z_STRVAL_P(zdata)), (size_t) end, 0)) { -#else if (end != (off_t) php_stream_copy_to_mem(fp, &(Z_STRVAL_P(zdata)), (size_t) end, 0)) { -#endif zval_dtor(zdata); zval_dtor(zsig); zval_dtor(zkey); @@ -1705,11 +1439,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, return FAILURE; } -#if PHP_VERSION_ID < 50300 - if (FAILURE == zend_fcall_info_init(openssl, &fci, &fcc TSRMLS_CC)) { -#else if (FAILURE == zend_fcall_info_init(openssl, 0, &fci, &fcc, NULL, NULL TSRMLS_CC)) { -#endif zval_dtor(zdata); zval_dtor(zsig); zval_dtor(zkey); @@ -1723,13 +1453,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, fci.param_count = 3; fci.params = zp; -#if PHP_VERSION_ID < 50300 - ++(zdata->refcount); - if (!is_sign) { - ++(zsig->refcount); - } - ++(zkey->refcount); -#else Z_ADDREF_P(zdata); if (is_sign) { Z_SET_ISREF_P(zsig); @@ -1737,7 +1460,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_ADDREF_P(zsig); } Z_ADDREF_P(zkey); -#endif + fci.retval_ptr_ptr = &retval_ptr; if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) { @@ -1754,21 +1477,15 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, zval_dtor(openssl); efree(openssl); -#if PHP_VERSION_ID < 50300 - --(zdata->refcount); - if (!is_sign) { - --(zsig->refcount); - } - --(zkey->refcount); -#else Z_DELREF_P(zdata); + if (is_sign) { Z_UNSET_ISREF_P(zsig); } else { Z_DELREF_P(zsig); } Z_DELREF_P(zkey); -#endif + zval_dtor(zdata); efree(zdata); zval_dtor(zkey); @@ -2294,11 +2011,7 @@ static int phar_update_cached_entry(void *data, void *argument) /* {{{ */ ALLOC_ZVAL(entry->metadata); *entry->metadata = *t; zval_copy_ctor(entry->metadata); -#if PHP_VERSION_ID < 50300 - entry->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(entry->metadata, 1); -#endif entry->metadata_str.c = NULL; entry->metadata_str.len = 0; } @@ -2342,11 +2055,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ ALLOC_ZVAL(phar->metadata); *phar->metadata = *t; zval_copy_ctor(phar->metadata); -#if PHP_VERSION_ID < 50300 - phar->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(phar->metadata, 1); -#endif } } diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 6ba745e9cbf74..e3b64859b89cc 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -578,10 +578,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, /* construct actual offset to file start - local extra_len can be different from central extra_len */ entry.offset = entry.offset_abs = sizeof(local) + entry.header_offset + PHAR_GET_16(local.filename_len) + PHAR_GET_16(local.extra_len); -#if PHP_VERSION_ID < 50207 - /* work around Bug #46147 */ - fp->writepos = fp->readpos = 0; -#endif php_stream_seek(fp, entry.offset, SEEK_SET); /* these next lines should be for php < 5.2.6 after 5.3 filters are fixed */ fp->writepos = 0; @@ -605,9 +601,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, if (!(entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0)) || !actual_alias) { pefree(entry.filename, entry.is_persistent); -#if PHP_VERSION_ID < 50207 - PHAR_ZIP_FAIL("unable to read in alias, truncated (PHP 5.2.7 and newer has a potential fix for this problem)"); -#endif PHAR_ZIP_FAIL("unable to read in alias, truncated"); } @@ -626,9 +619,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, if (!(entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0)) || !actual_alias) { pefree(entry.filename, entry.is_persistent); -#if PHP_VERSION_ID < 50207 - PHAR_ZIP_FAIL("unable to read in alias, truncated (PHP 5.2.7 and newer has a potential fix for this problem)"); -#endif PHAR_ZIP_FAIL("unable to read in alias, truncated"); } From c4cfdfa911f74f73942d38c6ffb74a19feb2bfdb Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 5 Nov 2013 19:54:50 +0100 Subject: [PATCH 0274/1256] updated NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 0a4b78c9c6186..fdfaef53cb58f 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS variable. (Mike) . Implemented dedicated syntax for variadic functions (RFC: https://wiki.php.net/rfc/variadics). (Nikita) + . Fixed bug #50333 Improving multi-threaded scalability by using + emalloc/efree/estrdup (Anatol, Dmitry) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir From 3720fd77b5d042faed54f67115e1371ddd067763 Mon Sep 17 00:00:00 2001 From: George Wang Date: Tue, 5 Nov 2013 15:38:08 -0500 Subject: [PATCH 0275/1256] Fixed typo in Makefile.frag --- sapi/litespeed/Makefile.frag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/litespeed/Makefile.frag b/sapi/litespeed/Makefile.frag index b70e5e8702933..767c2e5eb1719 100644 --- a/sapi/litespeed/Makefile.frag +++ b/sapi/litespeed/Makefile.frag @@ -4,6 +4,6 @@ $(SAPI_LITESPEED_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_LITESPEED_OB $(BUILD_LITESPEED) install-litespeed: $(SAPI_LITESPEED_PATH) - @echo "Installing PHP LitSpeed binary: $(INSTALL_ROOT)$(bindir)/" + @echo "Installing PHP LiteSpeed binary: $(INSTALL_ROOT)$(bindir)/" @$(INSTALL) -m 0755 $(SAPI_LITESPEED_PATH) $(INSTALL_ROOT)$(bindir)/lsphp From 01bc13212e87d6ec2a0579641e0039e21dea74ea Mon Sep 17 00:00:00 2001 From: George Wang Date: Tue, 5 Nov 2013 16:14:49 -0500 Subject: [PATCH 0276/1256] Update LiteSpeed SAPI code to V6.4 --- sapi/litespeed/lsapi_main.c | 1371 +++++++++++-------- sapi/litespeed/lsapidef.h | 33 +- sapi/litespeed/lsapilib.c | 2486 ++++++++++++++++++++++++++--------- sapi/litespeed/lsapilib.h | 100 +- 4 files changed, 2764 insertions(+), 1226 deletions(-) diff --git a/sapi/litespeed/lsapi_main.c b/sapi/litespeed/lsapi_main.c index 19364c66e06f2..33ebb988a66b1 100644 --- a/sapi/litespeed/lsapi_main.c +++ b/sapi/litespeed/lsapi_main.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2013 The PHP Group | + | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id$ */ +/* $Id: lsapi_main.c,v 1.57 2013/08/23 14:50:25 gwang Exp $ */ #include "php.h" #include "SAPI.h" @@ -75,7 +75,9 @@ static int lsapi_mode = 1; static char *php_self = ""; static char *script_filename = ""; static int source_highlight = 0; - +static int ignore_php_ini = 0; +static char * argv0 = NULL; +static int engine = 1; #ifdef ZTS zend_compiler_globals *compiler_globals; zend_executor_globals *executor_globals; @@ -90,40 +92,65 @@ zend_module_entry litespeed_module_entry; */ static int php_lsapi_startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { - return FAILURE; - } - return SUCCESS; + if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { + return FAILURE; + } + argv0 = sapi_module->executable_location; + return SUCCESS; } /* }}} */ +/* {{{ sapi_lsapi_ini_defaults */ + +/* overwriteable ini defaults must be set in sapi_cli_ini_defaults() */ +#define INI_DEFAULT(name,value)\ + ZVAL_STRING(tmp, value, 0);\ + zend_hash_update(configuration_hash, name, sizeof(name), tmp, sizeof(zval), (void**)&entry);\ + Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry)) + +static void sapi_lsapi_ini_defaults(HashTable *configuration_hash) +{ + zval *tmp, *entry; + +#if PHP_MAJOR_VERSION > 4 +/* + MAKE_STD_ZVAL(tmp); + + INI_DEFAULT("register_long_arrays", "0"); + + FREE_ZVAL(tmp); +*/ +#endif + +} +/* }}} */ /* {{{ sapi_lsapi_ub_write */ static int sapi_lsapi_ub_write(const char *str, uint str_length TSRMLS_DC) { - int ret; - int remain; - if ( lsapi_mode ) { - ret = LSAPI_Write( str, str_length ); - if ( ret < str_length ) { - php_handle_aborted_connection(); - return str_length - ret; - } - } else { - remain = str_length; - while( remain > 0 ) { - ret = write( 1, str, remain ); - if ( ret <= 0 ) { - php_handle_aborted_connection(); - return str_length - remain; - } - str += ret; - remain -= ret; - } - } - return str_length; + int ret; + int remain; + if ( lsapi_mode ) { + ret = LSAPI_Write( str, str_length ); + if ( ret < str_length ) { + php_handle_aborted_connection(); + return str_length - ret; + } + } else { + remain = str_length; + while( remain > 0 ) { + ret = write( 1, str, remain ); + if ( ret <= 0 ) { + php_handle_aborted_connection(); + return str_length - remain; + } + str += ret; + remain -= ret; + } + } + return str_length; } /* }}} */ @@ -132,11 +159,11 @@ static int sapi_lsapi_ub_write(const char *str, uint str_length TSRMLS_DC) */ static void sapi_lsapi_flush( void * server_context ) { - if ( lsapi_mode ) { - if ( LSAPI_Flush() == -1) { - php_handle_aborted_connection(); - } - } + if ( lsapi_mode ) { + if ( LSAPI_Flush() == -1) { + php_handle_aborted_connection(); + } + } } /* }}} */ @@ -145,8 +172,12 @@ static void sapi_lsapi_flush( void * server_context ) */ static int sapi_lsapi_deactivate(TSRMLS_D) { - LSAPI_Finish(); - return SUCCESS; + if ( SG(request_info).path_translated ) + { + efree( SG(request_info).path_translated ); + } + + return SUCCESS; } /* }}} */ @@ -157,46 +188,99 @@ static int sapi_lsapi_deactivate(TSRMLS_D) */ static char *sapi_lsapi_getenv( char * name, size_t name_len TSRMLS_DC ) { - if ( lsapi_mode ) { - return LSAPI_GetEnv( name ); - } else { - return getenv( name ); - } + if ( lsapi_mode ) { + return LSAPI_GetEnv( name ); + } else { + return getenv( name ); + } } /* }}} */ +/* +static int add_variable( const char * pKey, int keyLen, const char * pValue, int valLen, + void * arg ) +{ + php_register_variable_safe((char *)pKey, (char *)pValue, valLen, (zval *)arg TSRMLS_CC); + return 1; +} +*/ static int add_variable( const char * pKey, int keyLen, const char * pValue, int valLen, - void * arg ) + void * arg ) { - php_register_variable_safe((char *)pKey, (char *)pValue, valLen, (zval *)arg TSRMLS_CC); - return 1; + zval * gpc_element, **gpc_element_p; + HashTable * symtable1 = Z_ARRVAL_P((zval * )arg); + register char * pKey1 = (char *)pKey; + + MAKE_STD_ZVAL(gpc_element); + Z_STRLEN_P( gpc_element ) = valLen; + Z_STRVAL_P( gpc_element ) = estrndup(pValue, valLen); + Z_TYPE_P( gpc_element ) = IS_STRING; +#if PHP_MAJOR_VERSION > 4 + zend_symtable_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#else + zend_hash_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#endif + return 1; } +#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || PHP_MAJOR_VERSION < 5) +static int add_variable_magic_quote( const char * pKey, int keyLen, const char * pValue, int valLen, + void * arg ) +{ + zval * gpc_element, **gpc_element_p; + HashTable * symtable1 = Z_ARRVAL_P((zval * )arg); + register char * pKey1 = (char *)pKey; + + MAKE_STD_ZVAL(gpc_element); + Z_STRLEN_P( gpc_element ) = valLen; + Z_STRVAL_P( gpc_element ) = php_addslashes((char *)pValue, valLen, &Z_STRLEN_P( gpc_element ), 0 ); + Z_TYPE_P( gpc_element ) = IS_STRING; +#if PHP_MAJOR_VERSION > 4 + zend_symtable_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#else + zend_hash_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#endif + return 1; +} + +#endif /* {{{ sapi_lsapi_register_variables */ static void sapi_lsapi_register_variables(zval *track_vars_array TSRMLS_DC) { + char * php_self = ""; + if ( lsapi_mode ) { + if ( (SG(request_info).request_uri ) ) + php_self = (SG(request_info).request_uri ); - if ( lsapi_mode ) { - LSAPI_ForeachHeader( add_variable, track_vars_array ); - LSAPI_ForeachEnv( add_variable, track_vars_array ); - php_import_environment_variables(track_vars_array TSRMLS_CC); - - php_register_variable("PHP_SELF", (SG(request_info).request_uri ? SG(request_info).request_uri:""), track_vars_array TSRMLS_CC); - } else { - php_import_environment_variables(track_vars_array TSRMLS_CC); +#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || PHP_MAJOR_VERSION < 5) + if (!PG(magic_quotes_gpc)) { +#endif + LSAPI_ForeachHeader( add_variable, track_vars_array ); + LSAPI_ForeachEnv( add_variable, track_vars_array ); + add_variable("PHP_SELF", 8, php_self, strlen( php_self ), track_vars_array ); +#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || PHP_MAJOR_VERSION < 5) + } else { + LSAPI_ForeachHeader( add_variable_magic_quote, track_vars_array ); + LSAPI_ForeachEnv( add_variable_magic_quote, track_vars_array ); + add_variable_magic_quote("PHP_SELF", 8, php_self, strlen( php_self ), track_vars_array ); + } +#endif + php_import_environment_variables(track_vars_array TSRMLS_CC); + } else { + php_import_environment_variables(track_vars_array TSRMLS_CC); - php_register_variable("PHP_SELF", php_self, track_vars_array TSRMLS_CC); - php_register_variable("SCRIPT_NAME", php_self, track_vars_array TSRMLS_CC); - php_register_variable("SCRIPT_FILENAME", script_filename, track_vars_array TSRMLS_CC); - php_register_variable("PATH_TRANSLATED", script_filename, track_vars_array TSRMLS_CC); - php_register_variable("DOCUMENT_ROOT", "", track_vars_array TSRMLS_CC); + php_register_variable("PHP_SELF", php_self, track_vars_array TSRMLS_CC); + php_register_variable("SCRIPT_NAME", php_self, track_vars_array TSRMLS_CC); + php_register_variable("SCRIPT_FILENAME", script_filename, track_vars_array TSRMLS_CC); + php_register_variable("PATH_TRANSLATED", script_filename, track_vars_array TSRMLS_CC); + php_register_variable("DOCUMENT_ROOT", "", track_vars_array TSRMLS_CC); - } + } } /* }}} */ @@ -205,11 +289,11 @@ static void sapi_lsapi_register_variables(zval *track_vars_array TSRMLS_DC) */ static int sapi_lsapi_read_post(char *buffer, uint count_bytes TSRMLS_DC) { - if ( lsapi_mode ) { - return LSAPI_ReadReqBody( buffer, count_bytes ); - } else { - return 0; - } + if ( lsapi_mode ) { + return LSAPI_ReadReqBody( buffer, (unsigned long long)count_bytes ); + } else { + return 0; + } } /* }}} */ @@ -220,11 +304,11 @@ static int sapi_lsapi_read_post(char *buffer, uint count_bytes TSRMLS_DC) */ static char *sapi_lsapi_read_cookies(TSRMLS_D) { - if ( lsapi_mode ) { - return LSAPI_GetHeader( H_COOKIE ); - } else { - return NULL; - } + if ( lsapi_mode ) { + return LSAPI_GetHeader( H_COOKIE ); + } else { + return NULL; + } } /* }}} */ @@ -233,33 +317,33 @@ static char *sapi_lsapi_read_cookies(TSRMLS_D) */ static int sapi_lsapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) { - sapi_header_struct *h; - zend_llist_position pos; - if ( lsapi_mode ) { - LSAPI_SetRespStatus( SG(sapi_headers).http_response_code ); - - h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); - while (h) { - if ( h->header_len > 0 ) { - LSAPI_AppendRespHeader(h->header, h->header_len); - } - h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); - } - if (SG(sapi_headers).send_default_content_type) { - char *hd; - int len; - char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; - - hd = sapi_get_default_content_type(TSRMLS_C); - len = snprintf( headerBuf, SAPI_LSAPI_MAX_HEADER_LENGTH - 1, - "Content-type: %s", hd ); - efree(hd); - - LSAPI_AppendRespHeader( headerBuf, len ); - } - } - LSAPI_FinalizeRespHeaders(); - return SAPI_HEADER_SENT_SUCCESSFULLY; + sapi_header_struct *h; + zend_llist_position pos; + if ( lsapi_mode ) { + LSAPI_SetRespStatus( SG(sapi_headers).http_response_code ); + + h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); + while (h) { + if ( h->header_len > 0 ) { + LSAPI_AppendRespHeader(h->header, h->header_len); + } + h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); + } + if (SG(sapi_headers).send_default_content_type) { + char *hd; + int len; + char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; + + hd = sapi_get_default_content_type(TSRMLS_C); + len = snprintf( headerBuf, SAPI_LSAPI_MAX_HEADER_LENGTH - 1, + "Content-type: %s", hd ); + efree(hd); + + LSAPI_AppendRespHeader( headerBuf, len ); + } + } + LSAPI_FinalizeRespHeaders(); + return SAPI_HEADER_SENT_SUCCESSFULLY; } @@ -270,8 +354,15 @@ static int sapi_lsapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) */ static void sapi_lsapi_log_message(char *message TSRMLS_DC) { - int len = strlen( message ); - LSAPI_Write_Stderr( message, len); + char buf[8192]; + int len = strlen( message ); + if ( *(message + len - 1 ) != '\n' ) + { + snprintf( buf, 8191, "%s\n", message ); + message = buf; + ++len; + } + LSAPI_Write_Stderr( message, len); } /* }}} */ @@ -280,158 +371,251 @@ static void sapi_lsapi_log_message(char *message TSRMLS_DC) */ static sapi_module_struct lsapi_sapi_module = { - "litespeed", - "LiteSpeed", + "litespeed", + "LiteSpeed V6.4", - php_lsapi_startup, /* startup */ - php_module_shutdown_wrapper, /* shutdown */ + php_lsapi_startup, /* startup */ + php_module_shutdown_wrapper, /* shutdown */ - NULL, /* activate */ - sapi_lsapi_deactivate, /* deactivate */ + NULL, /* activate */ + sapi_lsapi_deactivate, /* deactivate */ - sapi_lsapi_ub_write, /* unbuffered write */ - sapi_lsapi_flush, /* flush */ - NULL, /* get uid */ - sapi_lsapi_getenv, /* getenv */ + sapi_lsapi_ub_write, /* unbuffered write */ + sapi_lsapi_flush, /* flush */ + NULL, /* get uid */ + sapi_lsapi_getenv, /* getenv */ - php_error, /* error handler */ + php_error, /* error handler */ - NULL, /* header handler */ - sapi_lsapi_send_headers, /* send headers handler */ - NULL, /* send header handler */ + NULL, /* header handler */ + sapi_lsapi_send_headers, /* send headers handler */ + NULL, /* send header handler */ - sapi_lsapi_read_post, /* read POST data */ - sapi_lsapi_read_cookies, /* read Cookies */ + sapi_lsapi_read_post, /* read POST data */ + sapi_lsapi_read_cookies, /* read Cookies */ - sapi_lsapi_register_variables, /* register server variables */ - sapi_lsapi_log_message, /* Log message */ + sapi_lsapi_register_variables, /* register server variables */ + sapi_lsapi_log_message, /* Log message */ - NULL, /* php.ini path override */ - NULL, /* block interruptions */ - NULL, /* unblock interruptions */ - NULL, /* default post reader */ - NULL, /* treat data */ - NULL, /* executable location */ + NULL, /* php.ini path override */ + NULL, /* block interruptions */ + NULL, /* unblock interruptions */ + NULL, /* default post reader */ + NULL, /* treat data */ + NULL, /* executable location */ - 0, /* php.ini ignore */ + 0, /* php.ini ignore */ - STANDARD_SAPI_MODULE_PROPERTIES + STANDARD_SAPI_MODULE_PROPERTIES }; /* }}} */ static int init_request_info( TSRMLS_D ) { - char * pContentType = LSAPI_GetHeader( H_CONTENT_TYPE ); - char * pAuth; - - SG(request_info).content_type = pContentType ? pContentType : ""; - SG(request_info).request_method = LSAPI_GetRequestMethod(); - SG(request_info).query_string = LSAPI_GetQueryString(); - SG(request_info).request_uri = LSAPI_GetScriptName(); - SG(request_info).content_length = LSAPI_GetReqBodyLen(); - SG(request_info).path_translated = LSAPI_GetScriptFileName(); + char * pContentType = LSAPI_GetHeader( H_CONTENT_TYPE ); + char * pAuth; + + SG(request_info).content_type = pContentType ? pContentType : ""; + SG(request_info).request_method = LSAPI_GetRequestMethod(); + SG(request_info).query_string = LSAPI_GetQueryString(); + SG(request_info).request_uri = LSAPI_GetScriptName(); + SG(request_info).content_length = LSAPI_GetReqBodyLen(); + SG(request_info).path_translated = estrdup( LSAPI_GetScriptFileName()); + + /* It is not reset by zend engine, set it to 0. */ + SG(sapi_headers).http_response_code = 0; + + pAuth = LSAPI_GetHeader( H_AUTHORIZATION ); + php_handle_auth_data(pAuth TSRMLS_CC); +} - /* It is not reset by zend engine, set it to 0. */ - SG(sapi_headers).http_response_code = 0; - - pAuth = LSAPI_GetHeader( H_AUTHORIZATION ); - php_handle_auth_data(pAuth TSRMLS_CC); +static char s_cur_chdir[4096] = ""; + +static int lsapi_chdir_primary_script( zend_file_handle * file_handle ) +{ +#if PHP_MAJOR_VERSION > 4 + char * p; + char ch; + + SG(options) |= SAPI_OPTION_NO_CHDIR; + getcwd( s_cur_chdir, sizeof( s_cur_chdir ) ); + + p = strrchr( file_handle->filename, '/' ); + if ( *p ) + { + *p = 0; + if ( strcmp( file_handle->filename, s_cur_chdir ) != 0 ) { + chdir( file_handle->filename ); + } + *p++ = '/'; + ch = *p; + *p = 0; + if ( !CWDG(cwd).cwd || + ( strcmp( file_handle->filename, CWDG(cwd).cwd ) != 0 ) ) { + CWDG(cwd).cwd_length = p - file_handle->filename; + CWDG(cwd).cwd = (char *) realloc(CWDG(cwd).cwd, CWDG(cwd).cwd_length+1); + memmove( CWDG(cwd).cwd, file_handle->filename, CWDG(cwd).cwd_length+1 ); + } + *p = ch; + } + /* virtual_file_ex(&CWDG(cwd), file_handle->filename, NULL, CWD_REALPATH); */ +#else + VCWD_CHDIR_FILE( file_handle->filename ); +#endif + return 0; } -static int lsapi_module_main(int show_source TSRMLS_DC) +static int lsapi_fopen_primary_script( zend_file_handle * file_handle ) +{ + FILE * fp; + char * p; + fp = fopen( SG(request_info).path_translated, "rb" ); + if ( !fp ) + { + return -1; + } + file_handle->type = ZEND_HANDLE_FP; + file_handle->handle.fp = fp; + file_handle->filename = SG(request_info).path_translated; + file_handle->free_filename = 0; + file_handle->opened_path = NULL; + + lsapi_chdir_primary_script( file_handle ); + + return 0; +} + +static int lsapi_execute_script( zend_file_handle * file_handle TSRMLS_DC) { - zend_file_handle file_handle = {0}; + char *p; + int len; + file_handle->type = ZEND_HANDLE_FILENAME; + file_handle->handle.fd = 0; + file_handle->filename = SG(request_info).path_translated; + file_handle->free_filename = 0; + file_handle->opened_path = NULL; + + p = argv0; + *p++ = ':'; + len = strlen( SG(request_info).path_translated ); + if ( len > 45 ) + len = len - 45; + else + len = 0; + memccpy( p, SG(request_info).path_translated + len, 0, 46 ); + + php_execute_script(file_handle TSRMLS_CC); + return 0; - if (php_request_startup(TSRMLS_C) == FAILURE ) { - return -1; - } - if (show_source) { - zend_syntax_highlighter_ini syntax_highlighter_ini; +} - php_get_highlight_struct(&syntax_highlighter_ini); - highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); - } else { - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.handle.fd = 0; - file_handle.filename = SG(request_info).path_translated; - file_handle.free_filename = 0; - file_handle.opened_path = NULL; - php_execute_script(&file_handle TSRMLS_CC); - } - zend_try { - php_request_shutdown(NULL); - } zend_end_try(); - return 0; +static int lsapi_module_main(int show_source TSRMLS_DC) +{ + zend_file_handle file_handle = {0}; + + if (php_request_startup(TSRMLS_C) == FAILURE ) { + return -1; + } + if (show_source) { + zend_syntax_highlighter_ini syntax_highlighter_ini; + + php_get_highlight_struct(&syntax_highlighter_ini); + highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); + } else { + lsapi_execute_script( &file_handle TSRMLS_CC); + } + zend_try { + php_request_shutdown(NULL); + memset( argv0, 0, 46 ); + } zend_end_try(); + return 0; } static int alter_ini( const char * pKey, int keyLen, const char * pValue, int valLen, - void * arg ) + void * arg ) { - int type = ZEND_INI_PERDIR; - if ( '\001' == *pKey ) { - ++pKey; - if ( *pKey == 4 ) { - type = ZEND_INI_SYSTEM; - } - ++pKey; - --keyLen; - zend_alter_ini_entry((char *)pKey, keyLen, - (char *)pValue, valLen, - type, PHP_INI_STAGE_ACTIVATE); - } - return 1; + int type = ZEND_INI_PERDIR; + if ( '\001' == *pKey ) { + ++pKey; + if ( *pKey == 4 ) { + type = ZEND_INI_SYSTEM; + } + ++pKey; + --keyLen; + if (( keyLen == 7 )&&( strncasecmp( pKey, "engine", 6 )== 0 )) + { + if ( *pValue == '0' ) + engine = 0; + } + else + zend_alter_ini_entry((char *)pKey, keyLen, + (char *)pValue, valLen, + type, PHP_INI_STAGE_ACTIVATE); + } + return 1; } static void override_ini() { - LSAPI_ForeachSpecialEnv( alter_ini, NULL ); + LSAPI_ForeachSpecialEnv( alter_ini, NULL ); } + static int processReq( TSRMLS_D ) { - int ret = 0; - zend_first_try { - /* avoid server_context==NULL checks */ - SG(server_context) = (void *) 1; - - init_request_info( TSRMLS_C ); - - override_ini(); - - if ( lsapi_module_main( source_highlight TSRMLS_CC ) == -1 ) { - ret = -1; - } - } zend_end_try(); - return ret; + int ret = 0; + zend_first_try { + + /* avoid server_context==NULL checks */ + SG(server_context) = (void *) 1; + + engine = 1; + override_ini(); + + if ( engine ) { + init_request_info( TSRMLS_C ); + + if ( lsapi_module_main( source_highlight TSRMLS_CC ) == -1 ) { + ret = -1; + } + } else { + LSAPI_AppendRespHeader( "status: 403", 11 ); + LSAPI_AppendRespHeader( "content-type: text/html", 23 ); + LSAPI_Write( "Forbidden: PHP engine is disable.\n", 34 ); + } + } zend_end_try(); + return ret; } static void cli_usage( TSRMLS_D ) { - static const char * usage = - "Usage: php\n" - " php -[b|c|h|i|q|s|v|?] [] [args...]\n" - " Run in LSAPI mode, only '-b', '-s' and '-c' are effective\n" - " Run in Command Line Interpreter mode when parameters are specified\n" - "\n" - " -b | Bind Path for external LSAPI Server mode\n" - " -c | Look for php.ini file in this directory\n" - " -h This help\n" - " -i PHP information\n" - " -q Quiet-mode. Suppress HTTP Header output.\n" - " -s Display colour syntax highlighted source.\n" - " -v Version number\n" - " -? This help\n" - "\n" - " args... Arguments passed to script.\n"; - php_output_startup(); - php_output_activate(TSRMLS_C); - php_printf( "%s", usage ); + static const char * usage = + "Usage: php\n" + " php -[b|c|n|h|i|q|s|v|?] [] [args...]\n" + " Run in LSAPI mode, only '-b', '-s' and '-c' are effective\n" + " Run in Command Line Interpreter mode when parameters are specified\n" + "\n" + " -b | Bind Path for external LSAPI Server mode\n" + " -c | Look for php.ini file in this directory\n" + " -n No php.ini file will be used\n" + " -h This help\n" + " -i PHP information\n" + " -l Syntax check\n" + " -q Quiet-mode. Suppress HTTP Header output.\n" + " -s Display colour syntax highlighted source.\n" + " -v Version number\n" + " -? This help\n" + "\n" + " args... Arguments passed to script.\n"; + php_output_startup(); + php_output_activate(TSRMLS_C); + php_printf( usage ); #ifdef PHP_OUTPUT_NEWAPI php_output_end_all(TSRMLS_C); #else @@ -440,349 +624,419 @@ static void cli_usage( TSRMLS_D ) } static int parse_opt( int argc, char * argv[], int *climode, - char **php_ini_path, char ** php_bind ) -{ - char ** p = &argv[1]; - char ** argend= &argv[argc]; - int c; - while (( p < argend )&&(**p == '-' )) { - c = *((*p)+1); - ++p; - switch( c ) { - case 'b': - if ( p >= argend ) { - fprintf( stderr, "TCP or socket address must be specified following '-b' option.\n"); - return -1; - } - *php_bind = *p++; - break; - - case 'c': - if ( p >= argend ) { - fprintf( stderr, " or must be specified following '-c' option.\n"); - - return -1; - } - *php_ini_path = *p++; - break; - case 's': - source_highlight = 1; - break; - case 'h': - case 'i': - case 'q': - case 'v': - case '?': - default: - *climode = 1; - break; - } - } - if ( p - argv < argc ) { - *climode = 1; - } - return 0; + char **php_ini_path, char ** php_bind ) +{ + char ** p = &argv[1]; + char ** argend= &argv[argc]; + int c; + while (( p < argend )&&(**p == '-' )) { + c = *((*p)+1); + ++p; + switch( c ) { + case 'b': + if ( p >= argend ) { + fprintf( stderr, "TCP or socket address must be specified following '-b' option.\n"); + return -1; + } + *php_bind = strdup(*p++); + break; + + case 'c': + if ( p >= argend ) { + fprintf( stderr, " or must be specified following '-c' option.\n"); + + return -1; + } + *php_ini_path = strdup( *p++ ); + break; + case 's': + source_highlight = 1; + break; + case 'n': + ignore_php_ini = 1; + break; + case '?': + if ( *((*(p-1))+2) == 's' ) + exit( 99 ); + case 'h': + case 'i': + case 'l': + case 'q': + case 'v': + default: + *climode = 1; + break; + } + } + if ( p - argv < argc ) { + *climode = 1; + } + return 0; } static int cli_main( int argc, char * argv[] ) { - static const char * ini_defaults[] = { - "report_zend_debug", "0", - "display_errors", "1", - "register_argc_argv", "1", - "html_errors", "0", - "implicit_flush", "1", - "output_buffering", "0", - "max_execution_time", "0", - "max_input_time", "-1", - NULL - }; - - const char ** ini; - char ** p = &argv[1]; - char ** argend= &argv[argc]; - int ret = 0; - int c; - lsapi_mode = 0; /* enter CLI mode */ + static const char * ini_defaults[] = { + "report_zend_debug", "0", + "display_errors", "1", + "register_argc_argv", "1", + "html_errors", "0", + "implicit_flush", "1", + "output_buffering", "0", + "max_execution_time", "0", + "max_input_time", "-1", + NULL + }; + + const char ** ini; + char ** p = &argv[1]; + char ** argend= &argv[argc]; + int ret = -1; + int c; + lsapi_mode = 0; /* enter CLI mode */ #ifdef PHP_WIN32 - _fmode = _O_BINARY; /*sets default for file streams to binary */ - setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ + _fmode = _O_BINARY; /*sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - zend_first_try { - SG(server_context) = (void *) 1; - - zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */ - CG(in_compilation) = 0; /* not initialized but needed for several options */ - EG(uninitialized_zval_ptr) = NULL; - - for( ini = ini_defaults; *ini; ini+=2 ) { - zend_alter_ini_entry( (char *)*ini, strlen( *ini )+1, - (char *)*(ini+1), strlen( *(ini+1) ), - PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); - } - - while (( p < argend )&&(**p == '-' )) { - c = *((*p)+1); - ++p; - switch( c ) { - case 'q': - break; - case 'i': - if (php_request_startup(TSRMLS_C) != FAILURE) { - php_print_info(0xFFFFFFFF TSRMLS_CC); + zend_first_try { + SG(server_context) = (void *) 1; + + zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */ + CG(in_compilation) = 0; /* not initialized but needed for several options */ + EG(uninitialized_zval_ptr) = NULL; + + for( ini = ini_defaults; *ini; ini+=2 ) { + zend_alter_ini_entry( (char *)*ini, strlen( *ini )+1, + (char *)*(ini+1), strlen( *(ini+1) ), + PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); + } + + while (( p < argend )&&(**p == '-' )) { + c = *((*p)+1); + ++p; + switch( c ) { + case 'q': + break; + case 'i': + if (php_request_startup(TSRMLS_C) != FAILURE) { + php_print_info(0xFFFFFFFF TSRMLS_CC); #ifdef PHP_OUTPUT_NEWAPI php_output_end_all(TSRMLS_C); #else php_end_ob_buffers(1 TSRMLS_CC); #endif - php_request_shutdown( NULL ); - } - ret = 1; - break; - case 'v': - if (php_request_startup(TSRMLS_C) != FAILURE) { + php_request_shutdown( NULL ); + ret = 0; + } + break; + case 'v': + if (php_request_startup(TSRMLS_C) != FAILURE) { #if ZEND_DEBUG - php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2013 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2004 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); #else - php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2013 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2004 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); #endif #ifdef PHP_OUTPUT_NEWAPI php_output_end_all(TSRMLS_C); #else php_end_ob_buffers(1 TSRMLS_CC); #endif - php_request_shutdown( NULL ); - } - ret = 1; - break; - case 'c': - ++p; - /* fall through */ - case 's': - break; - - case 'h': - case '?': - default: - cli_usage(TSRMLS_C); - ret = 1; - break; - - } - } - if ( !ret ) { - if ( *p ) { - zend_file_handle file_handle = {0}; - - file_handle.type = ZEND_HANDLE_FP; - file_handle.handle.fp = VCWD_FOPEN(*p, "rb"); - - if ( file_handle.handle.fp ) { - script_filename = *p; - php_self = *p; - - SG(request_info).path_translated = *p; - SG(request_info).argc = argc - (p - argv); - SG(request_info).argv = p; - - if (php_request_startup(TSRMLS_C) == FAILURE ) { - fclose( file_handle.handle.fp ); - ret = 2; - } else { - if (source_highlight) { - zend_syntax_highlighter_ini syntax_highlighter_ini; - - php_get_highlight_struct(&syntax_highlighter_ini); - highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); - } else { - file_handle.filename = *p; - file_handle.free_filename = 0; - file_handle.opened_path = NULL; - - php_execute_script(&file_handle TSRMLS_CC); - } - - php_request_shutdown( NULL ); - } - } else { - php_printf("Could not open input file: %s.\n", *p); - } - } else { - cli_usage(TSRMLS_C); - } - } - - }zend_end_try(); - - php_module_shutdown(TSRMLS_C); + php_request_shutdown( NULL ); + ret = 0; + } + break; + case 'c': + ++p; + /* fall through */ + case 's': + break; + case 'l': + source_highlight = 2; + break; + case 'h': + case '?': + default: + cli_usage(TSRMLS_C); + ret = 0; + break; + + } + } + if ( ret == -1 ) { + if ( *p ) { + zend_file_handle file_handle = {0}; + + file_handle.type = ZEND_HANDLE_FP; + file_handle.handle.fp = VCWD_FOPEN(*p, "rb"); + + if ( file_handle.handle.fp ) { + script_filename = *p; + php_self = *p; + + SG(request_info).path_translated = estrdup(*p); + SG(request_info).argc = argc - (p - argv); + SG(request_info).argv = p; + + if (php_request_startup(TSRMLS_C) == FAILURE ) { + fclose( file_handle.handle.fp ); + ret = 2; + } else { + if (source_highlight == 1) { + zend_syntax_highlighter_ini syntax_highlighter_ini; + + php_get_highlight_struct(&syntax_highlighter_ini); + highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); + } else if (source_highlight == 2) { + file_handle.filename = *p; + file_handle.free_filename = 0; + file_handle.opened_path = NULL; + ret = php_lint_script(&file_handle TSRMLS_CC); + if (ret==SUCCESS) { + zend_printf("No syntax errors detected in %s\n", file_handle.filename); + } else { + zend_printf("Errors parsing %s\n", file_handle.filename); + } + + } else { + file_handle.filename = *p; + file_handle.free_filename = 0; + file_handle.opened_path = NULL; + + php_execute_script(&file_handle TSRMLS_CC); + ret = EG(exit_status); + } + + php_request_shutdown( NULL ); + } + } else { + php_printf("Could not open input file: %s.\n", *p); + } + } else { + cli_usage(TSRMLS_C); + } + } + + }zend_end_try(); + + php_module_shutdown(TSRMLS_C); #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return ret; + return ret; } static int s_stop; void litespeed_cleanup(int signal) { - s_stop = signal; + s_stop = signal; } void start_children( int children ) { - struct sigaction act, old_term, old_quit, old_int, old_usr1; - int running = 0; - int status; - pid_t pid; - - /* Create a process group */ - setsid(); - - /* Set up handler to kill children upon exit */ - act.sa_flags = 0; - act.sa_handler = litespeed_cleanup; - if( sigaction( SIGTERM, &act, &old_term ) || - sigaction( SIGINT, &act, &old_int ) || - sigaction( SIGUSR1, &act, &old_usr1 ) || - sigaction( SIGQUIT, &act, &old_quit )) { - perror( "Can't set signals" ); - exit( 1 ); - } - s_stop = 0; - while( 1 ) { - while((!s_stop )&&( running < children )) { - pid = fork(); - switch( pid ) { - case 0: /* children process */ - - /* don't catch our signals */ - sigaction( SIGTERM, &old_term, 0 ); - sigaction( SIGQUIT, &old_quit, 0 ); - sigaction( SIGINT, &old_int, 0 ); - sigaction( SIGUSR1, &old_usr1, 0 ); - return ; - case -1: - perror( "php (pre-forking)" ); - exit( 1 ); - break; - default: /* parent process */ - running++; - break; - } - } - if ( s_stop ) { - break; - } - pid = wait( &status ); - running--; - } - kill( -getpgrp(), SIGUSR1 ); - exit( 0 ); + struct sigaction act, old_term, old_quit, old_int, old_usr1; + int running = 0; + int status; + pid_t pid; + + /* Create a process group */ + setsid(); + + /* Set up handler to kill children upon exit */ + act.sa_flags = 0; + act.sa_handler = litespeed_cleanup; + if( sigaction( SIGTERM, &act, &old_term ) || + sigaction( SIGINT, &act, &old_int ) || + sigaction( SIGUSR1, &act, &old_usr1 ) || + sigaction( SIGQUIT, &act, &old_quit )) { + perror( "Can't set signals" ); + exit( 1 ); + } + s_stop = 0; + while( 1 ) { + while((!s_stop )&&( running < children )) { + pid = fork(); + switch( pid ) { + case 0: /* children process */ + + /* don't catch our signals */ + sigaction( SIGTERM, &old_term, 0 ); + sigaction( SIGQUIT, &old_quit, 0 ); + sigaction( SIGINT, &old_int, 0 ); + sigaction( SIGUSR1, &old_usr1, 0 ); + return ; + case -1: + perror( "php (pre-forking)" ); + exit( 1 ); + break; + default: /* parent process */ + running++; + break; + } + } + if ( s_stop ) { + break; + } + pid = wait( &status ); + running--; + } + kill( -getpgrp(), SIGUSR1 ); + exit( 0 ); } - +void setArgv0( int argc, char * argv[] ) +{ + char * p; + int i; + argv0 = argv[0] + strlen( argv[0] ); + p = argv0; + while(( p > argv[0] )&&( p[-1] != '/')) + --p; + if ( p > argv[0] ) + { + memmove( argv[0], p, argv0 - p ); + memset( argv[0] + ( argv0 - p ), 0, p - argv[0] ); + argv0 = argv[0] + (argv0 - p); + } + for( i = 1; i < argc; ++i ) + { + memset( argv[i], 0, strlen( argv[i] ) ); + } +} #include int main( int argc, char * argv[] ) { - int ret; - int bindFd; - - char * php_ini_path = NULL; - char * php_bind = NULL; - char * p; - int n; - int climode = 0; - + int ret; + int bindFd; + + char * php_ini_path = NULL; + char * php_bind = NULL; + int n; + int climode = 0; + struct timeval tv_req_begin; + struct timeval tv_req_end; + int slow_script_msec = 0; + char time_buf[40]; + #ifdef HAVE_SIGNAL_H #if defined(SIGPIPE) && defined(SIG_IGN) - signal(SIGPIPE, SIG_IGN); + signal(SIGPIPE, SIG_IGN); #endif #endif #ifdef ZTS - tsrm_startup(1, 1, 0, NULL); + tsrm_startup(1, 1, 0, NULL); #endif - if (argc > 1 ) { - if ( parse_opt( argc, argv, &climode, - &php_ini_path, &php_bind ) == -1 ) { - return 1; - } - } - if ( climode ) { - lsapi_sapi_module.phpinfo_as_text = 1; - } - sapi_startup(&lsapi_sapi_module); + if (argc > 1 ) { + if ( parse_opt( argc, argv, &climode, + &php_ini_path, &php_bind ) == -1 ) { + return 1; + } + } + if ( climode ) { + lsapi_sapi_module.phpinfo_as_text = 1; + } else { + setArgv0(argc, argv ); + } + + sapi_startup(&lsapi_sapi_module); #ifdef ZTS - compiler_globals = ts_resource(compiler_globals_id); - executor_globals = ts_resource(executor_globals_id); - core_globals = ts_resource(core_globals_id); - sapi_globals = ts_resource(sapi_globals_id); - tsrm_ls = ts_resource(0); + compiler_globals = ts_resource(compiler_globals_id); + executor_globals = ts_resource(executor_globals_id); + core_globals = ts_resource(core_globals_id); + sapi_globals = ts_resource(sapi_globals_id); + tsrm_ls = ts_resource(0); - SG(request_info).path_translated = NULL; + SG(request_info).path_translated = NULL; #endif - lsapi_sapi_module.executable_location = argv[0]; + lsapi_sapi_module.executable_location = argv[0]; + + if ( ignore_php_ini ) + lsapi_sapi_module.php_ini_ignore = 1; + + if ( php_ini_path ) { + lsapi_sapi_module.php_ini_path_override = php_ini_path; + } - if ( php_ini_path ) { - lsapi_sapi_module.php_ini_path_override = php_ini_path; - } - if (php_module_startup(&lsapi_sapi_module, &litespeed_module_entry, 1) == FAILURE) { + lsapi_sapi_module.ini_defaults = sapi_lsapi_ini_defaults; + + if (php_module_startup(&lsapi_sapi_module, &litespeed_module_entry, 1) == FAILURE) { #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return FAILURE; - } - - if ( climode ) { - return cli_main(argc, argv); - } - - - if ( php_bind ) { - bindFd = LSAPI_CreateListenSock( php_bind, 10 ); - if ( bindFd == -1 ) { - fprintf( stderr, - "Failed to bind socket [%s]: %s\n", php_bind, strerror( errno ) ); - exit( 2 ); - } - if ( bindFd != 0 ) { - dup2( bindFd, 0 ); - close( bindFd ); - } - } - - LSAPI_Init(); + return FAILURE; + } + + if ( climode ) { + return cli_main(argc, argv); + } + + if ( php_bind ) { + bindFd = LSAPI_CreateListenSock( php_bind, 10 ); + if ( bindFd == -1 ) { + fprintf( stderr, + "Failed to bind socket [%s]: %s\n", php_bind, strerror( errno ) ); + exit( 2 ); + } + if ( bindFd != 0 ) { + dup2( bindFd, 0 ); + close( bindFd ); + } + } + + LSAPI_Init(); - LSAPI_Init_Env_Parameters( NULL ); - - if ( php_bind ) { - LSAPI_No_Check_ppid(); - } - - while( LSAPI_Prefork_Accept_r( &g_req ) >= 0 ) { - ret = processReq(TSRMLS_C); - LSAPI_Finish(); - if ( ret ) { - break; - } - } - php_module_shutdown(TSRMLS_C); + LSAPI_Init_Env_Parameters( NULL ); + + slow_script_msec = LSAPI_Get_Slow_Req_Msecs(); + + if ( php_bind ) { + LSAPI_No_Check_ppid(); + free( php_bind ); + php_bind = NULL; + } + + while( LSAPI_Prefork_Accept_r( &g_req ) >= 0 ) { + if ( slow_script_msec ) { + gettimeofday( &tv_req_begin, NULL ); + } + ret = processReq(TSRMLS_C); + if ( slow_script_msec ) { + gettimeofday( &tv_req_end, NULL ); + n = ((long) tv_req_end.tv_sec - tv_req_begin.tv_sec ) * 1000 + + (tv_req_end.tv_usec - tv_req_begin.tv_usec) / 1000; + if ( n > slow_script_msec ) + { + strftime( time_buf, 30, "%d/%b/%Y:%H:%M:%S", localtime( &tv_req_end.tv_sec ) ); + fprintf( stderr, "[%s] Slow PHP script: %d ms\n URL: %s %s\n Query String: %s\n Script: %s\n", + time_buf, n, LSAPI_GetRequestMethod(), + LSAPI_GetScriptName(), LSAPI_GetQueryString(), + LSAPI_GetScriptFileName() ); + + } + } + LSAPI_Finish(); + if ( ret ) { + break; + } + } + php_module_shutdown(TSRMLS_C); #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return ret; + return ret; } @@ -795,49 +1049,51 @@ ZEND_END_ARG_INFO() PHP_FUNCTION(litespeed_request_headers); PHP_FUNCTION(litespeed_response_headers); +PHP_FUNCTION(apache_get_modules); PHP_MINFO_FUNCTION(litespeed); zend_function_entry litespeed_functions[] = { - PHP_FE(litespeed_request_headers, arginfo_litespeed__void) - PHP_FE(litespeed_response_headers, arginfo_litespeed__void) - PHP_FALIAS(getallheaders, litespeed_request_headers, arginfo_litespeed__void) - PHP_FALIAS(apache_request_headers, litespeed_request_headers, arginfo_litespeed__void) - PHP_FALIAS(apache_response_headers, litespeed_response_headers, arginfo_litespeed__void) - {NULL, NULL, NULL} + PHP_FE(litespeed_request_headers, arginfo_litespeed__void) + PHP_FE(litespeed_response_headers, arginfo_litespeed__void) + PHP_FE(apache_get_modules, arginfo_litespeed__void) + PHP_FALIAS(getallheaders, litespeed_request_headers, arginfo_litespeed__void) + PHP_FALIAS(apache_request_headers, litespeed_request_headers, arginfo_litespeed__void) + PHP_FALIAS(apache_response_headers, litespeed_response_headers, arginfo_litespeed__void) + {NULL, NULL, NULL} }; static PHP_MINIT_FUNCTION(litespeed) { - /* REGISTER_INI_ENTRIES(); */ - return SUCCESS; + /* REGISTER_INI_ENTRIES(); */ + return SUCCESS; } static PHP_MSHUTDOWN_FUNCTION(litespeed) { - /* UNREGISTER_INI_ENTRIES(); */ - return SUCCESS; + /* UNREGISTER_INI_ENTRIES(); */ + return SUCCESS; } zend_module_entry litespeed_module_entry = { - STANDARD_MODULE_HEADER, - "litespeed", - litespeed_functions, - PHP_MINIT(litespeed), - PHP_MSHUTDOWN(litespeed), - NULL, - NULL, - NULL, - NO_VERSION_YET, - STANDARD_MODULE_PROPERTIES + STANDARD_MODULE_HEADER, + "litespeed", + litespeed_functions, + PHP_MINIT(litespeed), + PHP_MSHUTDOWN(litespeed), + NULL, + NULL, + NULL, + NO_VERSION_YET, + STANDARD_MODULE_PROPERTIES }; static int add_associate_array( const char * pKey, int keyLen, const char * pValue, int valLen, - void * arg ) + void * arg ) { - add_assoc_string_ex( (zval *)arg, (char *)pKey, keyLen+1, (char *)pValue, 1 ); - return 1; + add_assoc_string_ex( (zval *)arg, (char *)pKey, keyLen+1, (char *)pValue, 1 ); + return 1; } @@ -845,13 +1101,13 @@ static int add_associate_array( const char * pKey, int keyLen, const char * pVal Fetch all HTTP request headers */ PHP_FUNCTION(litespeed_request_headers) { - /* TODO: */ - if (ZEND_NUM_ARGS() > 0) { - WRONG_PARAM_COUNT; - } - array_init(return_value); + /* TODO: */ + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + array_init(return_value); - LSAPI_ForeachOrgHeader( add_associate_array, return_value ); + LSAPI_ForeachOrgHeader( add_associate_array, return_value ); } /* }}} */ @@ -862,45 +1118,62 @@ PHP_FUNCTION(litespeed_request_headers) Fetch all HTTP response headers */ PHP_FUNCTION(litespeed_response_headers) { - sapi_header_struct *h; - zend_llist_position pos; - char * p; - int len; - char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; - - if (ZEND_NUM_ARGS() > 0) { - WRONG_PARAM_COUNT; - } - - if (!&SG(sapi_headers).headers) { - RETURN_FALSE; - } - array_init(return_value); - - h = zend_llist_get_first_ex(&SG(sapi_headers).headers, &pos); - while (h) { - if ( h->header_len > 0 ) { - p = strchr( h->header, ':' ); - len = p - h->header; - if (( p )&&( len > 0 )) { - memmove( headerBuf, h->header, len ); - while( len > 0 && (isspace( headerBuf[len-1])) ) { - --len; - } - headerBuf[len] = 0; - if ( len ) { - while( isspace(*++p)); - add_assoc_string_ex(return_value, headerBuf, len+1, p, 1 ); - } - } - } - h = zend_llist_get_next_ex(&SG(sapi_headers).headers, &pos); - } + sapi_header_struct *h; + zend_llist_position pos; + char * p; + int len; + char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + if (!&SG(sapi_headers).headers) { + RETURN_FALSE; + } + array_init(return_value); + + h = zend_llist_get_first_ex(&SG(sapi_headers).headers, &pos); + while (h) { + if ( h->header_len > 0 ) { + p = strchr( h->header, ':' ); + len = p - h->header; + if (( p )&&( len > 0 )) { + memmove( headerBuf, h->header, len ); + while( len > 0 && (isspace( headerBuf[len-1])) ) { + --len; + } + headerBuf[len] = 0; + if ( len ) { + while( isspace(*++p)); + add_assoc_string_ex(return_value, headerBuf, len+1, p, 1 ); + } + } + } + h = zend_llist_get_next_ex(&SG(sapi_headers).headers, &pos); + } } /* }}} */ +/* {{{ proto array apache_get_modules(void) + Fetch all loaded module names */ +PHP_FUNCTION(apache_get_modules) +{ + /* TODO: */ + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + array_init(return_value); + add_next_index_string(return_value, "mod_rewrite", 1); + add_next_index_string(return_value, "mod_mime", 1); + add_next_index_string(return_value, "mod_headers", 1); + add_next_index_string(return_value, "mod_expires", 1); +} +/* }}} */ + + /* * Local variables: * tab-width: 4 diff --git a/sapi/litespeed/lsapidef.h b/sapi/litespeed/lsapidef.h index c8940a930e947..5d5b4c1687a6c 100644 --- a/sapi/litespeed/lsapidef.h +++ b/sapi/litespeed/lsapidef.h @@ -1,25 +1,5 @@ - -/* - +----------------------------------------------------------------------+ - | PHP Version 5 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2013 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: George Wang | - +----------------------------------------------------------------------+ -*/ - - /* -Copyright (c) 2007, Lite Speed Technologies Inc. +Copyright (c) 2005, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -50,6 +30,13 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*************************************************************************** + $Id: lsapidef.h,v 1.17 2012/12/01 19:23:31 gwang Exp $ + ------------------- + begin : Thu Feb 10 2005 + author : George Wang + email : gwang@litespeedtech.com + ***************************************************************************/ #ifndef _LSAPIDEF_H_ #define _LSAPIDEF_H_ @@ -113,12 +100,14 @@ enum #define LSAPI_RESP_END 5 #define LSAPI_STDERR_STREAM 6 #define LSAPI_REQ_RECEIVED 7 +#define LSAPI_CONN_CLOSE 8 +#define LSAPI_INTERNAL_ERROR 9 #define LSAPI_MAX_HEADER_LEN 65535 #define LSAPI_MAX_DATA_PACKET_LEN 16384 -#define LSAPI_RESP_HTTP_HEADER_MAX 4096 +#define LSAPI_RESP_HTTP_HEADER_MAX 32768 #define LSAPI_PACKET_HEADER_LEN 8 diff --git a/sapi/litespeed/lsapilib.c b/sapi/litespeed/lsapilib.c index 3a13000e11f28..4a9affc60f213 100644 --- a/sapi/litespeed/lsapilib.c +++ b/sapi/litespeed/lsapilib.c @@ -1,25 +1,5 @@ /* - +----------------------------------------------------------------------+ - | PHP Version 5 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2013 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: George Wang | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -/* -Copyright (c) 2007, Lite Speed Technologies Inc. +Copyright (c) 2013, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -50,17 +30,21 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +/*************************************************************************** + lsapilib.c - description + ------------------- + begin : Mon Feb 21 2005 + copyright : (C) 2005 by George Wang + email : gwang@litespeedtech.com + ***************************************************************************/ + #include +#include #include #include -#include -#include -#include -#include -#include +#include #include #include #include @@ -71,8 +55,48 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include #include #include +#include +#include +#include +#include +#include + +#include "lsapilib.h" + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) +#include +#endif + +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ + || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +#include +#endif + +#include +#ifndef uint32 +#define uint32 uint32_t +#endif + +struct lsapi_MD5Context { + uint32 buf[4]; + uint32 bits[2]; + unsigned char in[64]; +}; + +void lsapi_MD5Init(struct lsapi_MD5Context *context); +void lsapi_MD5Update(struct lsapi_MD5Context *context, unsigned char const *buf, + unsigned len); +void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *context); + +/* + * This is needed to make RSAREF happy on some MS-DOS compilers. + */ +typedef struct lsapi_MD5Context lsapi_MD5_CTX; + #define LSAPI_ST_REQ_HEADER 1 #define LSAPI_ST_REQ_BODY 2 @@ -83,11 +107,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define LSAPI_INIT_RESP_HEADER_LEN 4096 + static int g_inited = 0; static int g_running = 1; static int s_ppid; +static int s_slow_req_msecs = 0; +static int s_keepListener = 0; +static int s_dump_debug_info = 0; +static int s_pid_dump_debug_info = 0; + LSAPI_Request g_req = { -1, -1 }; +static char s_pSecret[24]; + + void Flush_RespBuf_r( LSAPI_Request * pReq ); static const char *CGI_HEADERS[H_TRANSFER_ENCODING+1] = @@ -111,13 +144,13 @@ static const char *CGI_HEADERS[H_TRANSFER_ENCODING+1] = "HTTP_TRANSFER_ENCODING" }; -static int CGI_HEADER_LEN[H_TRANSFER_ENCODING+1] = { - 11, 19, 20, 20, 18, 15, 12, 14, 11, 12, 9, 11, 12, 15, 18, - 22, 13, 18, 13, 24, 15, 10, 20, 8, 22 -}; +static int CGI_HEADER_LEN[H_TRANSFER_ENCODING+1] = +{ 11, 19, 20, 20, 18, 15, 12, 14, 11, 12, 9, 11, 12, 15, 18, + 22, 13, 18, 13, 24, 15, 10, 20, 8, 22 }; -static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = { +static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = +{ "Accept", "Accept-Charset", "Accept-Encoding", "Accept-Language", "Authorization", @@ -137,8 +170,8 @@ static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = { "Transfer-Encoding" }; -static int HTTP_HEADER_LEN[H_TRANSFER_ENCODING+1] = { - 6, 14, 15, 15, 13, 10, 12, 14, 6, 7, 4, 6, 7, 10, /* user-agent */ +static int HTTP_HEADER_LEN[H_TRANSFER_ENCODING+1] = +{ 6, 14, 15, 15, 13, 10, 12, 14, 6, 7, 4, 6, 7, 10, //user-agent 13,17, 8, 13, 8, 19, 10, 5, 15, 3, 17 }; @@ -160,7 +193,8 @@ static void lsapi_signal(int signo, sighandler_t handler) sigaction(signo, NULL, &sa); - if (sa.sa_handler == SIG_DFL) { + if (sa.sa_handler == SIG_DFL) + { sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; @@ -169,6 +203,34 @@ static void lsapi_signal(int signo, sighandler_t handler) } +static int s_enable_core_dump = 0; +static void lsapi_enable_core_dump() +{ +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ + || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) + int mib[2]; + size_t len; + + len = 2; + if ( sysctlnametomib("kern.sugid_coredump", mib, &len) == 0 ) + { + len = sizeof(s_enable_core_dump); + if (sysctl(mib, 2, NULL, 0, &s_enable_core_dump, len) == -1) + perror( "sysctl: Failed to set 'kern.sugid_coredump', " + "core dump may not be available!"); + } + + +#endif + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if (prctl(PR_SET_DUMPABLE, s_enable_core_dump,0,0,0) == -1) + perror( "prctl: Failed to set dumpable, " + "core dump may not be available!"); +#endif +} + + static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader, char type, int len ) { @@ -199,75 +261,115 @@ static int lsapi_set_nblock( int fd, int nonblock ) return 0; } - static int lsapi_close( int fd ) { int ret; - while( 1 ) { + while( 1 ) + { ret = close( fd ); - if (( ret == -1 )&&( errno == EINTR )&&(g_running)) { + if (( ret == -1 )&&( errno == EINTR )&&(g_running)) continue; - } return ret; } } -static inline int lsapi_read( int fd, void * pBuf, int len ) +static inline ssize_t lsapi_read( int fd, void * pBuf, size_t len ) { - int ret; - while( 1 ) { + ssize_t ret; + while( 1 ) + { ret = read( fd, (char *)pBuf, len ); - if (( ret == -1 )&&( errno == EINTR )&&(g_running)) { + if (( ret == -1 )&&( errno == EINTR )&&(g_running)) continue; - } return ret; } } +/* +static int lsapi_write( int fd, const void * pBuf, int len ) +{ + int ret; + const char * pCur; + const char * pEnd; + if ( len == 0 ) + return 0; + pCur = (const char *)pBuf; + pEnd = pCur + len; + while( g_running && (pCur < pEnd) ) + { + ret = write( fd, pCur, pEnd - pCur ); + if ( ret >= 0) + pCur += ret; + else if (( ret == -1 )&&( errno != EINTR )) + return ret; + } + return pCur - (const char *)pBuf; +} +*/ static int lsapi_writev( int fd, struct iovec ** pVec, int count, int totalLen ) { int ret; int left = totalLen; int n = count; - while(( left > 0 )&&g_running ) { + while(( left > 0 )&&g_running ) + { ret = writev( fd, *pVec, n ); - if ( ret > 0 ) { + if ( ret > 0 ) + { left -= ret; - if (( left <= 0)||( !g_running )) { + if (( left <= 0)||( !g_running )) return totalLen - left; - } - while( ret > 0 ) { - if ( (*pVec)->iov_len <= ret ) { + while( ret > 0 ) + { + if ( (*pVec)->iov_len <= (unsigned int )ret ) + { ret -= (*pVec)->iov_len; ++(*pVec); - } else { + } + else + { (*pVec)->iov_base = (char *)(*pVec)->iov_base + ret; (*pVec)->iov_len -= ret; break; } } - } else if ( ret == -1 ) { - if ( errno == EAGAIN ) { - if ( totalLen - left > 0 ) { + } + else if ( ret == -1 ) + { + if ( errno == EAGAIN ) + { + if ( totalLen - left > 0 ) return totalLen - left; - } else { + else return -1; - } - } else { - if ( errno != EINTR ) { - return ret; - } } + else if ( errno != EINTR ) + return ret; } } return totalLen - left; } +/* +static int getTotalLen( struct iovec * pVec, int count ) +{ + struct iovec * pEnd = pVec + count; + int total = 0; + while( pVec < pEnd ) + { + total += pVec->iov_len; + ++pVec; + } + return total; +} +*/ + static inline int allocateBuf( LSAPI_Request * pReq, int size ) { char * pBuf = (char *)realloc( pReq->m_pReqBuf, size ); - if ( pBuf ) { + if ( pBuf ) + { pReq->m_pReqBuf = pBuf; pReq->m_reqBufSize = size; pReq->m_pHeader = (struct lsapi_req_header *)pReq->m_pReqBuf; @@ -281,9 +383,8 @@ static int allocateIovec( LSAPI_Request * pReq, int n ) { struct iovec * p = (struct iovec *)realloc( pReq->m_pIovec, sizeof(struct iovec) * n ); - if ( !p ) { + if ( !p ) return -1; - } pReq->m_pIovecToWrite = p + ( pReq->m_pIovecToWrite - pReq->m_pIovec ); pReq->m_pIovecCur = p + ( pReq->m_pIovecCur - pReq->m_pIovec ); pReq->m_pIovec = p; @@ -294,9 +395,8 @@ static int allocateIovec( LSAPI_Request * pReq, int n ) static int allocateRespHeaderBuf( LSAPI_Request * pReq, int size ) { char * p = (char *)realloc( pReq->m_pRespHeaderBuf, size ); - if ( !p ) { + if ( !p ) return -1; - } pReq->m_pRespHeaderBufPos = p + ( pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf ); pReq->m_pRespHeaderBuf = p; pReq->m_pRespHeaderBufEnd = p + size; @@ -308,10 +408,10 @@ static inline int verifyHeader( struct lsapi_packet_header * pHeader, char pktTy { if (( LSAPI_VERSION_B0 != pHeader->m_versionB0 )|| ( LSAPI_VERSION_B1 != pHeader->m_versionB1 )|| - ( pktType != pHeader->m_type )) { + ( pktType != pHeader->m_type )) return -1; - } - if ( LSAPI_ENDIAN != (pHeader->m_flag & LSAPI_ENDIAN_BIT )) { + if ( LSAPI_ENDIAN != (pHeader->m_flag & LSAPI_ENDIAN_BIT )) + { register char b; b = pHeader->m_packetLen.m_bytes[0]; pHeader->m_packetLen.m_bytes[0] = pHeader->m_packetLen.m_bytes[3]; @@ -327,21 +427,20 @@ static int allocateEnvList( struct LSAPI_key_value_pair ** pEnvList, int *curSize, int newSize ) { struct LSAPI_key_value_pair * pBuf; - if ( *curSize >= newSize ) { + if ( *curSize >= newSize ) return 0; - } - if ( newSize > 8192 ) { + if ( newSize > 8192 ) return -1; - } pBuf = (struct LSAPI_key_value_pair *)realloc( *pEnvList, newSize * sizeof(struct LSAPI_key_value_pair) ); - if ( pBuf ) { + if ( pBuf ) + { *pEnvList = pBuf; *curSize = newSize; return 0; - } else { - return -1; } + else + return -1; } @@ -350,36 +449,32 @@ static inline int isPipe( int fd ) char achPeer[128]; socklen_t len = 128; if (( getpeername( fd, (struct sockaddr *)achPeer, &len ) != 0 )&& - ( errno == ENOTCONN )) { + ( errno == ENOTCONN )) return 0; - } else { + else return 1; - } } static int parseEnv( struct LSAPI_key_value_pair * pEnvList, int count, char **pBegin, char * pEnd ) { struct LSAPI_key_value_pair * pEnvEnd; - int keyLen = 0, valLen = 0; - if ( count > 8192 ) { + int keyLen = 0, valLen = 0; + if ( count > 8192 ) return -1; - } pEnvEnd = pEnvList + count; - while( pEnvList != pEnvEnd ) { - if ( pEnd - *pBegin < 4 ) { + while( pEnvList != pEnvEnd ) + { + if ( pEnd - *pBegin < 4 ) return -1; - } keyLen = *((unsigned char *)((*pBegin)++)); keyLen = (keyLen << 8) + *((unsigned char *)((*pBegin)++)); valLen = *((unsigned char *)((*pBegin)++)); valLen = (valLen << 8) + *((unsigned char *)((*pBegin)++)); - if ( *pBegin + keyLen + valLen > pEnd ) { + if ( *pBegin + keyLen + valLen > pEnd ) return -1; - } - if (( !keyLen )||( !valLen )) { + if (( !keyLen )||( !valLen )) return -1; - } pEnvList->pKey = *pBegin; *pBegin += keyLen; @@ -390,9 +485,8 @@ static int parseEnv( struct LSAPI_key_value_pair * pEnvList, int count, pEnvList->valLen = valLen - 1; ++pEnvList; } - if ( memcmp( *pBegin, "\0\0\0\0", 4 ) != 0 ) { + if ( memcmp( *pBegin, "\0\0\0\0", 4 ) != 0 ) return -1; - } *pBegin += 4; return 0; } @@ -427,8 +521,10 @@ static inline void fixEndian( LSAPI_Request * pReq ) static void fixHeaderIndexEndian( LSAPI_Request * pReq ) { int i; - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { register char b; char * p = (char *)(&pReq->m_pHeaderIndex->m_headerLen[i]); b = p[0]; @@ -437,20 +533,434 @@ static void fixHeaderIndexEndian( LSAPI_Request * pReq ) swapIntEndian( &pReq->m_pHeaderIndex->m_headerOff[i] ); } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { swapIntEndian( &pCur->nameOff ); swapIntEndian( &pCur->nameLen ); swapIntEndian( &pCur->valueOff ); swapIntEndian( &pCur->valueLen ); ++pCur; } - } + } +} + +static uid_t s_uid = 0; +static uid_t s_defaultUid; //web server need set this +static gid_t s_defaultGid; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + +#define LSAPI_LVE_DISABLED 0 +#define LSAPI_LVE_ENABLED 1 +#define LSAPI_CAGEFS_ENABLED 2 +#define LSAPI_CAGEFS_NO_SUEXEC 3 +struct liblve; +static int s_enable_lve = LSAPI_LVE_DISABLED; +static struct liblve * s_lve = NULL; + +static void *s_liblve; +static int (*fp_lve_is_available)(void) = NULL; +static int (*fp_lve_instance_init)(struct liblve *) = NULL; +static int (*fp_lve_destroy)(struct liblve *) = NULL; +static int (*fp_lve_enter)(struct liblve *, uint32_t, int32_t, int32_t, uint32_t *) = NULL; +static int (*fp_lve_leave)(struct liblve *, uint32_t *) = NULL; +static int (*fp_lve_jail)( struct passwd *, char *) = NULL; +static int lsapi_load_lve_lib() +{ + s_liblve = dlopen("liblve.so.0", RTLD_LAZY); + if (s_liblve) + { + fp_lve_is_available = dlsym(s_liblve, "lve_is_available"); + if (dlerror() == NULL) + { + if ( !(*fp_lve_is_available)() ) + { + int uid = getuid(); + if ( uid ) + { + setreuid( s_uid, uid ); + if ( !(*fp_lve_is_available)() ) + s_enable_lve = 0; + setreuid( uid, s_uid ); + } + } + } + } + else + { + s_enable_lve = LSAPI_LVE_DISABLED; + } + return (s_liblve)? 0 : -1; } +static int init_lve_ex() +{ + int rc; + if ( !s_liblve ) + return -1; + fp_lve_instance_init = dlsym(s_liblve, "lve_instance_init"); + fp_lve_destroy = dlsym(s_liblve, "lve_destroy"); + fp_lve_enter = dlsym(s_liblve, "lve_enter"); + fp_lve_leave = dlsym(s_liblve, "lve_leave"); + if ( s_enable_lve >= LSAPI_CAGEFS_ENABLED ) + fp_lve_jail = dlsym(s_liblve, "jail" ); + + if ( s_lve == NULL ) + { + rc = (*fp_lve_instance_init)(NULL); + s_lve = malloc(rc); + } + rc = (*fp_lve_instance_init)(s_lve); + if (rc != 0) + { + perror( "LSAPI: Unable to initialize LVE" ); + free( s_lve ); + s_lve = NULL; + return -1; + } + return 0; + +} + +#endif + + + +static int readSecret( const char * pSecretFile ) +{ + struct stat st; + int fd = open( pSecretFile, O_RDONLY , 0600 ); + if ( fd == -1 ) + { + fprintf( stderr, "LSAPI: failed to open secret file: %s!\n", pSecretFile ); + return -1; + } + if ( fstat( fd, &st ) == -1 ) + { + fprintf( stderr, "LSAPI: failed to check state of file: %s!\n", pSecretFile ); + close( fd ); + return -1; + } +/* + if ( st.st_uid != s_uid ) + { + fprintf( stderr, "LSAPI: file owner check failure: %s!\n", pSecretFile ); + close( fd ); + return -1; + } +*/ + if ( st.st_mode & 0077 ) + { + fprintf( stderr, "LSAPI: file permission check failure: %s\n", pSecretFile ); + close( fd ); + return -1; + } + if ( read( fd, s_pSecret, 16 ) < 16 ) + { + fprintf( stderr, "LSAPI: failed to read secret from secret file: %s\n", pSecretFile ); + close( fd ); + return -1; + } + close( fd ); + return 0; +} + +int LSAPI_is_suEXEC_Daemon() +{ + if (( !s_uid )&&( s_pSecret[0] )) + return 1; + else + return 0; +} + +static int LSAPI_perror_r( LSAPI_Request * pReq, const char * pErr1, const char *pErr2 ) +{ + char achError[1024]; + int n = snprintf(achError, 1024, "%s:%s: %s\n", pErr1, (pErr2)?pErr2:"", strerror( errno ) ); + if ( pReq ) + LSAPI_Write_Stderr_r( pReq, achError, n ); + else + write( STDERR_FILENO, achError, n ); + return 0; +} + +static int lsapi_lve_error( LSAPI_Request * pReq ) +{ + static const char * headers[] = + { + "Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0", + "Pragma: no-cache", + "Retry-After: 60", + "Content-Type: text/html", + NULL + }; + static const char achBody[] = + "\n" + "\n508 Resource Limit Is Reached\n" + "\n" "

Resource Limit Is Reached

\n" + "The website is temporarily unable to service your request as it exceeded resource limit.\n" + "Please try again later.\n" + "
\n" + "\n"; + + LSAPI_ErrResponse_r( pReq, 508, headers, achBody, sizeof( achBody ) - 1 ); + return 0; +} + +static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid ) +{ +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if ( s_lve && uid ) //root user should not do that + { + uint32_t cookie; + int ret = -1; + ret = (*fp_lve_enter)(s_lve, uid, -1, -1, &cookie); + if ( ret < 0 ) + { + fprintf( stderr, "Pid (%d): enter LVE (%d) : ressult: %d !\n", getpid(), uid, ret ); + LSAPI_perror_r(pReq, "LSAPI: lve_enter() failure, reached resource limit.", NULL ); + lsapi_lve_error( pReq ); + return -1; + } + } +#endif + + return 0; +} + +static int lsapi_jailLVE( LSAPI_Request * pReq, uid_t uid, struct passwd * pw ) +{ + int ret = 0; +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + char error_msg[1024] = ""; + ret = (*fp_lve_jail)( pw, error_msg ); + if ( ret < 0 ) + { + fprintf( stderr, "LSAPI (%d): LVE jail(%d) ressult: %d, error: %s !\n", + getpid(), uid, ret, error_msg ); + LSAPI_perror_r( pReq, "LSAPI: jail() failure.", NULL ); + return -1; + } +#endif + return ret; +} + + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) +static int lsapi_initLVE() +{ + const char * pEnv; + if ( (pEnv = getenv( "LSAPI_LVE_ENABLE" ))!= NULL ) + { + s_enable_lve = atol( pEnv ); + pEnv = NULL; + } + else if ( (pEnv = getenv( "LVE_ENABLE" ))!= NULL ) + { + s_enable_lve = atol( pEnv ); + pEnv = NULL; + } + if ( s_enable_lve && !s_uid ) + { + lsapi_load_lve_lib(); + if ( s_enable_lve ) + { + return init_lve_ex(); + } + + } + return 0; +} +#endif + + +static int setUID_LVE(LSAPI_Request * pReq, uid_t uid, gid_t gid, const char * pChroot) +{ + int rv; + struct passwd * pw; + pw = getpwuid( uid ); +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if ( s_lve ) + { + if( lsapi_enterLVE( pReq, uid ) == -1 ) + return -1; + if ( pw && fp_lve_jail) + { + rv = lsapi_jailLVE( pReq, uid, pw ); + if ( rv == -1 ) + return -1; + if (( rv == 1 )&&(s_enable_lve == LSAPI_CAGEFS_NO_SUEXEC )) //this mode only use cageFS, does not use suEXEC + { + uid = s_defaultUid; + gid = s_defaultGid; + pw = getpwuid( uid ); + } + } + } +#endif + //if ( !uid || !gid ) //do not allow root + //{ + // return -1; + //} + +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ + || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) + if ( s_enable_core_dump ) + lsapi_enable_core_dump(); +#endif + + rv = setgid(gid); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: setgid()", NULL); + return -1; + } + if ( pw && (pw->pw_gid == gid )) + { + rv = initgroups( pw->pw_name, gid ); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: initgroups()", NULL); + return -1; + } + } + else + { + rv = setgroups(1, &gid); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: setgroups()", NULL); + } + } + if ( pChroot ) + { + rv = chroot( pChroot ); + if ( rv == -1 ) + { + LSAPI_perror_r(pReq, "LSAPI: chroot()", NULL); + return -1; + } + } + rv = setuid(uid); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: setuid()", NULL); + return -1; + } +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if ( s_enable_core_dump ) + lsapi_enable_core_dump(); +#endif + return 0; +} + +static int lsapi_suexec_auth( LSAPI_Request *pReq, + char * pAuth, int len, char * pUgid, int ugidLen ) +{ + lsapi_MD5_CTX md5ctx; + unsigned char achMD5[16]; + if ( len < 32 ) + return -1; + memmove( achMD5, pAuth + 16, 16 ); + memmove( pAuth + 16, s_pSecret, 16 ); + lsapi_MD5Init( &md5ctx ); + lsapi_MD5Update( &md5ctx, (unsigned char *)pAuth, 32 ); + lsapi_MD5Update( &md5ctx, (unsigned char *)pUgid, 8 ); + lsapi_MD5Final( (unsigned char *)pAuth + 16, &md5ctx); + if ( memcmp( achMD5, pAuth + 16, 16 ) == 0 ) + return 0; + return 1; +} + + +static int lsapi_changeUGid( LSAPI_Request * pReq ) +{ + int uid = s_defaultUid; + int gid = s_defaultGid; + const char * pChroot = NULL; + struct LSAPI_key_value_pair * pEnv; + struct LSAPI_key_value_pair * pAuth; + int i; + if ( s_uid ) + return 0; + //with special ID 0x00 + //authenticate the suEXEC request; + //first one should be MD5( nonce + lscgid secret ) + //remember to clear the secret after verification + //it should be set at the end of special env + i = pReq->m_pHeader->m_cntSpecialEnv - 1; + if ( i >= 0 ) + { + pEnv = pReq->m_pSpecialEnvList + i; + if (( *pEnv->pKey == '\000' )&& + ( strcmp( pEnv->pKey+1, "SUEXEC_AUTH" ) == 0 )) + { + --pReq->m_pHeader->m_cntSpecialEnv; + pAuth = pEnv--; + if (( *pEnv->pKey == '\000' )&& + ( strcmp( pEnv->pKey+1, "SUEXEC_UGID" ) == 0 )) + { + --pReq->m_pHeader->m_cntSpecialEnv; + uid = *(uint32_t *)pEnv->pValue; + gid = *(((uint32_t *)pEnv->pValue) + 1 ); + //fprintf( stderr, "LSAPI: SUEXEC_UGID set UID: %d, GID: %d\n", uid, gid ); + } + else + { + fprintf( stderr, "LSAPI: missing SUEXEC_UGID env, use default user!\n" ); + pEnv = NULL; + } + if ( pEnv&& lsapi_suexec_auth( pReq, pAuth->pValue, pAuth->valLen, pEnv->pValue, pEnv->valLen ) == 0 ) + { + //read UID, GID from specialEnv + + } + else + { + //authentication error + fprintf( stderr, "LSAPI: SUEXEC_AUTH authentication failed, use default user!\n" ); + uid = 0; + } + } + else + { + //fprintf( stderr, "LSAPI: no SUEXEC_AUTH env, use default user!\n" ); + } + } + + + if ( !uid ) + { + uid = s_defaultUid; + gid = s_defaultGid; + } + + //change uid + if ( setUID_LVE( pReq, uid, gid, pChroot ) == -1 ) + { + return -1; + } + + s_uid = uid; + + return 0; + +} + +static int parseContentLenFromHeader(LSAPI_Request * pReq) +{ + const char * pContentLen = LSAPI_GetHeader_r( pReq, H_CONTENT_LENGTH ); + if ( pContentLen ) + pReq->m_reqBodyLen = strtoll( pContentLen, NULL, 10 ); + return 0; +} + + static int parseRequest( LSAPI_Request * pReq, int totalLen ) { int shouldFixEndian; @@ -458,29 +968,28 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen ) char * pEnd = pReq->m_pReqBuf + totalLen; shouldFixEndian = ( LSAPI_ENDIAN != ( pReq->m_pHeader->m_pktHeader.m_flag & LSAPI_ENDIAN_BIT ) ); - if ( shouldFixEndian ) { + if ( shouldFixEndian ) + { fixEndian( pReq ); } if ( (pReq->m_specialEnvListSize < pReq->m_pHeader->m_cntSpecialEnv )&& allocateEnvList( &pReq->m_pSpecialEnvList, - &pReq->m_specialEnvListSize, - pReq->m_pHeader->m_cntSpecialEnv ) == -1 ) { + &pReq->m_specialEnvListSize, + pReq->m_pHeader->m_cntSpecialEnv ) == -1 ) return -1; - } if ( (pReq->m_envListSize < pReq->m_pHeader->m_cntEnv )&& allocateEnvList( &pReq->m_pEnvList, &pReq->m_envListSize, - pReq->m_pHeader->m_cntEnv ) == -1 ) { + pReq->m_pHeader->m_cntEnv ) == -1 ) return -1; - } + if ( parseEnv( pReq->m_pSpecialEnvList, - pReq->m_pHeader->m_cntSpecialEnv, - &pBegin, pEnd ) == -1 ) { + pReq->m_pHeader->m_cntSpecialEnv, + &pBegin, pEnd ) == -1 ) return -1; - } if ( parseEnv( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv, - &pBegin, pEnd ) == -1 ) { + &pBegin, pEnd ) == -1 ) return -1; - } + pReq->m_pScriptFile = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptFileOff; pReq->m_pScriptName = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptNameOff; pReq->m_pQueryString = pReq->m_pReqBuf + pReq->m_pHeader->m_queryStringOff; @@ -496,85 +1005,183 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen ) pReq->m_pHttpHeader = pBegin; pBegin += pReq->m_pHeader->m_httpHeaderLen; - if ( pBegin != pEnd ) { + if ( pBegin != pEnd ) + { + fprintf( stderr, "%d: request header does match total size, total: %d, real: %ld\n", getpid(), totalLen, + pBegin - pReq->m_pReqBuf ); return -1; } - - if ( shouldFixEndian ) { + if ( shouldFixEndian ) + { fixHeaderIndexEndian( pReq ); } - + pReq->m_reqBodyLen = pReq->m_pHeader->m_reqBodyLen; + if ( pReq->m_reqBodyLen == -2 ) + { + parseContentLenFromHeader(pReq); + } + return 0; } -static struct lsapi_packet_header ack = {'L', 'S', +//OPTIMIZATION +static char s_accept_notify = 0; +static char s_schedule_notify = 0; +static char s_notify_scheduled = 0; +static char s_notified_pid = 0; + +static struct lsapi_packet_header s_ack = {'L', 'S', LSAPI_REQ_RECEIVED, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} }; -static inline int notify_req_received( LSAPI_Request * pReq ) + + +static inline int write_req_received_notification( int fd ) { - if ( write( pReq->m_fd, &ack, LSAPI_PACKET_HEADER_LEN ) - < LSAPI_PACKET_HEADER_LEN ) { + if ( write( fd, &s_ack, LSAPI_PACKET_HEADER_LEN ) + < LSAPI_PACKET_HEADER_LEN ) return -1; + return 0; +} + +static void lsapi_sigalarm( int sig ) +{ + if ( s_notify_scheduled ) + { + s_notify_scheduled = 0; + if ( g_req.m_fd != -1 ) + write_req_received_notification( g_req.m_fd ); + } +} + +static inline int lsapi_schedule_notify() +{ + if ( !s_notify_scheduled ) + { + alarm( 2 ); + s_notify_scheduled = 1; } return 0; } +static inline int notify_req_received( int fd ) +{ + if ( s_schedule_notify ) + return lsapi_schedule_notify(); + return write_req_received_notification( fd ); + +} + + +static inline int lsapi_notify_pid( int fd ) +{ + char achBuf[16]; + lsapi_buildPacketHeader( (struct lsapi_packet_header *)achBuf, LSAPI_STDERR_STREAM, + 8 + LSAPI_PACKET_HEADER_LEN ); + memmove( &achBuf[8], "\0PID", 4 ); + *((int *)&achBuf[12]) = getpid(); + + if ( write( fd, achBuf, 16 ) < 16 ) + return -1; + return 0; +} + +static char s_conn_key_packet[16]; +static inline int init_conn_key( int fd ) +{ + struct lsapi_packet_header * pHeader = (struct lsapi_packet_header *)s_conn_key_packet; + struct timeval tv; + int i; + gettimeofday( &tv, NULL ); + srand( (tv.tv_sec % 0x1000 + tv.tv_usec) ^ rand() ); + for( i = 8; i < 16; ++i ) + { + s_conn_key_packet[i]=(int) (256.0*rand()/(RAND_MAX+1.0)); + } + lsapi_buildPacketHeader( pHeader, LSAPI_REQ_RECEIVED, + 8 + LSAPI_PACKET_HEADER_LEN ); + if ( write( fd, s_conn_key_packet, LSAPI_PACKET_HEADER_LEN+8 ) + < LSAPI_PACKET_HEADER_LEN+8 ) + return -1; + return 0; + + +} static int readReq( LSAPI_Request * pReq ) { int len; int packetLen; - if ( !pReq ) { + if ( !pReq ) return -1; - } - if ( pReq->m_reqBufSize < 8192 ) { - if ( allocateBuf( pReq, 8192 ) == -1 ) { + if ( pReq->m_reqBufSize < 8192 ) + { + if ( allocateBuf( pReq, 8192 ) == -1 ) return -1; - } } - while ( pReq->m_bufRead < LSAPI_PACKET_HEADER_LEN ) { + while ( pReq->m_bufRead < LSAPI_PACKET_HEADER_LEN ) + { len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf, pReq->m_reqBufSize ); - if ( len <= 0 ) { + if ( len <= 0 ) return -1; - } pReq->m_bufRead += len; } pReq->m_reqState = LSAPI_ST_REQ_HEADER; packetLen = verifyHeader( &pReq->m_pHeader->m_pktHeader, LSAPI_BEGIN_REQUEST ); - if ( packetLen < 0 ) { + if ( packetLen < 0 ) + { + fprintf( stderr, "%d: packetLen < 0\n", getpid() ); return -1; } - if ( packetLen > LSAPI_MAX_HEADER_LEN ) { + if ( packetLen > LSAPI_MAX_HEADER_LEN ) + { + fprintf( stderr, "%d: packetLen > %d\n", getpid(), LSAPI_MAX_HEADER_LEN ); return -1; } - if ( packetLen + 1024 > pReq->m_reqBufSize ) { - if ( allocateBuf( pReq, packetLen + 1024 ) == -1 ) { + if ( packetLen + 1024 > pReq->m_reqBufSize ) + { + if ( allocateBuf( pReq, packetLen + 1024 ) == -1 ) return -1; - } } - while( packetLen > pReq->m_bufRead ) { + while( packetLen > pReq->m_bufRead ) + { len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, packetLen - pReq->m_bufRead ); - if ( len <= 0 ) { + if ( len <= 0 ) return -1; - } pReq->m_bufRead += len; } - if ( parseRequest( pReq, packetLen ) < 0 ) { + if ( parseRequest( pReq, packetLen ) < 0 ) + { + fprintf( stderr, "%d: parseRequest error\n", getpid() ); return -1; } - pReq->m_bufProcessed = packetLen; + pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER; - return notify_req_received( pReq ); + if ( !s_uid ) + if ( lsapi_changeUGid( pReq ) ) + return -1; + pReq->m_bufProcessed = packetLen; + + //OPTIMIZATION + if ( !s_accept_notify && !s_notified_pid ) + return notify_req_received( pReq->m_fd ); + else + { + s_notified_pid = 0; + return 0; + } } int LSAPI_Init(void) { - if ( !g_inited ) { + if ( !g_inited ) + { + s_uid = geteuid(); + s_pSecret[0] = 0; lsapi_signal(SIGPIPE, lsapi_sigpipe); lsapi_signal(SIGUSR1, lsapi_siguser1); @@ -583,11 +1190,9 @@ int LSAPI_Init(void) #endif /* let STDOUT function as STDERR, just in case writing to STDOUT directly */ - dup2( 2, 1 ); - - if ( LSAPI_InitRequest( &g_req, LSAPI_SOCK_FILENO ) == -1 ) { + dup2( 2, 1 ); + if ( LSAPI_InitRequest( &g_req, LSAPI_SOCK_FILENO ) == -1 ) return -1; - } g_inited = 1; s_ppid = getppid(); } @@ -606,28 +1211,27 @@ int LSAPI_IsRunning(void) int LSAPI_InitRequest( LSAPI_Request * pReq, int fd ) { - if ( !pReq ) { + if ( !pReq ) return -1; - } memset( pReq, 0, sizeof( LSAPI_Request ) ); - if ( allocateIovec( pReq, 16 ) == -1 ) { + if ( allocateIovec( pReq, 16 ) == -1 ) return -1; - } pReq->m_pRespBuf = pReq->m_pRespBufPos = (char *)malloc( LSAPI_RESP_BUF_SIZE ); - if ( !pReq->m_pRespBuf ) { + if ( !pReq->m_pRespBuf ) return -1; - } pReq->m_pRespBufEnd = pReq->m_pRespBuf + LSAPI_RESP_BUF_SIZE; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec + 1; pReq->m_respPktHeaderEnd = &pReq->m_respPktHeader[5]; - if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 ) { + if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 ) return -1; - } - if ( isPipe( fd ) ) { + if ( isPipe( fd ) ) + { pReq->m_fdListen = -1; pReq->m_fd = fd; - } else { + } + else + { pReq->m_fdListen = fd; pReq->m_fd = -1; lsapi_set_nblock( fd, 1 ); @@ -653,38 +1257,48 @@ int LSAPI_Accept_r( LSAPI_Request * pReq ) socklen_t len; int nodelay = 1; - if ( !pReq ) { + if ( !pReq ) return -1; - } - if ( LSAPI_Finish_r( pReq ) == -1 ) { + if ( LSAPI_Finish_r( pReq ) == -1 ) return -1; - } - while( g_running ) { - if ( pReq->m_fd == -1 ) { - if ( pReq->m_fdListen != -1) { + lsapi_set_nblock( pReq->m_fdListen , 0 ); + while( g_running ) + { + if ( pReq->m_fd == -1 ) + { + if ( pReq->m_fdListen != -1) + { len = sizeof( achPeer ); pReq->m_fd = accept( pReq->m_fdListen, (struct sockaddr *)&achPeer, &len ); - if ( pReq->m_fd == -1 ) { - if (( errno == EINTR )||( errno == EAGAIN)) { + if ( pReq->m_fd == -1 ) + { + if (( errno == EINTR )||( errno == EAGAIN)) continue; - } else { + else return -1; - } - } else { + } + else + { lsapi_set_nblock( pReq->m_fd , 0 ); - if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) { + if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) + { setsockopt(pReq->m_fd, IPPROTO_TCP, TCP_NODELAY, - (char *)&nodelay, sizeof(nodelay)); + (char *)&nodelay, sizeof(nodelay)); } + //init_conn_key( pReq->m_fd ); + //OPTIMIZATION + if ( s_accept_notify ) + if ( notify_req_received( pReq->m_fd ) == -1 ) + return -1; } - } else { - return -1; } + else + return -1; } - if ( !readReq( pReq ) ) { + if ( !readReq( pReq ) ) break; - } + //abort(); lsapi_close( pReq->m_fd ); pReq->m_fd = -1; LSAPI_Reset_r( pReq ); @@ -698,15 +1312,18 @@ static struct lsapi_packet_header finish = {'L', 'S', int LSAPI_Finish_r( LSAPI_Request * pReq ) { /* finish req body */ - if ( !pReq ) { + if ( !pReq ) return -1; - } - if (pReq->m_reqState) { - if ( pReq->m_fd != -1 ) { - if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { + if (pReq->m_reqState) + { + if ( pReq->m_fd != -1 ) + { + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { LSAPI_FinalizeRespHeaders_r( pReq ); } - if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { + if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) + { Flush_RespBuf_r( pReq ); } @@ -735,18 +1352,14 @@ void LSAPI_Reset_r( LSAPI_Request * pReq ) int LSAPI_Release_r( LSAPI_Request * pReq ) { - if ( pReq->m_pReqBuf ) { + if ( pReq->m_pReqBuf ) free( pReq->m_pReqBuf ); - } - if ( pReq->m_pSpecialEnvList ) { + if ( pReq->m_pSpecialEnvList ) free( pReq->m_pSpecialEnvList ); - } - if ( pReq->m_pEnvList ) { + if ( pReq->m_pEnvList ) free( pReq->m_pEnvList ); - } - if ( pReq->m_pRespHeaderBuf ) { + if ( pReq->m_pRespHeaderBuf ) free( pReq->m_pRespHeaderBuf ); - } return 0; } @@ -754,55 +1367,48 @@ int LSAPI_Release_r( LSAPI_Request * pReq ) char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex ) { int off; - if ( !pReq || ((unsigned int)headerIndex > H_TRANSFER_ENCODING) ) { + if ( !pReq || ((unsigned int)headerIndex > H_TRANSFER_ENCODING) ) return NULL; - } off = pReq->m_pHeaderIndex->m_headerOff[ headerIndex ]; - if ( !off ) { + if ( !off ) return NULL; - } - if ( *(pReq->m_pHttpHeader + off + - pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) ) { - *( pReq->m_pHttpHeader + off + - pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0; - } + if ( *(pReq->m_pHttpHeader + off + + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) ) + *( pReq->m_pHttpHeader + off + + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0; return pReq->m_pHttpHeader + off; } static int readBodyToReqBuf( LSAPI_Request * pReq ) { - int bodyLeft; - int len = pReq->m_bufRead - pReq->m_bufProcessed; - if ( len > 0 ) { + off_t bodyLeft; + ssize_t len = pReq->m_bufRead - pReq->m_bufProcessed; + if ( len > 0 ) return len; - } pReq->m_bufRead = pReq->m_bufProcessed = pReq->m_pHeader->m_pktHeader.m_packetLen.m_iLen; - bodyLeft = pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead; + bodyLeft = pReq->m_reqBodyLen - pReq->m_reqBodyRead; len = pReq->m_reqBufSize - pReq->m_bufRead; - if ( len < 0 ) { + if ( len < 0 ) return -1; - } - if ( len > bodyLeft ) { + if ( len > bodyLeft ) len = bodyLeft; - } + len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, len ); - if ( len > 0 ) { + if ( len > 0 ) pReq->m_bufRead += len; - } return len; } int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ) { - if (!pReq || (pReq->m_fd ==-1) ) { + if (!pReq || (pReq->m_fd ==-1) ) return EOF; - } - if ( pReq->m_bufProcessed >= pReq->m_bufRead ) { - if ( readBodyToReqBuf( pReq ) <= 0 ) { + if ( pReq->m_bufProcessed >= pReq->m_bufRead ) + { + if ( readBodyToReqBuf( pReq ) <= 0 ) return EOF; - } } ++pReq->m_reqBodyRead; return (unsigned char)*(pReq->m_pReqBuf + pReq->m_bufProcessed++); @@ -810,42 +1416,43 @@ int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ) -int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *getLF ) +int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF ) { - int len; - int left; + ssize_t len; + ssize_t left; char * pBufEnd = pBuf + bufLen - 1; char * pBufCur = pBuf; char * pCur; char * p; - if (!pReq || (pReq->m_fd ==-1) ||( !pBuf )||(bufLen < 0 )|| !getLF ) { + if (!pReq || (pReq->m_fd ==-1) ||( !pBuf )||(bufLen < 0 )|| !getLF ) return -1; - } *getLF = 0; - while( (left = pBufEnd - pBufCur ) > 0 ) { + while( (left = pBufEnd - pBufCur ) > 0 ) + { len = pReq->m_bufRead - pReq->m_bufProcessed; - if ( len <= 0 ) { - if ( (len = readBodyToReqBuf( pReq )) <= 0 ) { + if ( len <= 0 ) + { + if ( (len = readBodyToReqBuf( pReq )) <= 0 ) + { *getLF = 1; break; } } - if ( len > left ) { + if ( len > left ) len = left; - } pCur = pReq->m_pReqBuf + pReq->m_bufProcessed; p = memchr( pCur, '\n', len ); - if ( p ) { + if ( p ) len = p - pCur + 1; - } memmove( pBufCur, pCur, len ); pBufCur += len; pReq->m_bufProcessed += len; pReq->m_reqBodyRead += len; - if ( p ) { + if ( p ) + { *getLF = 1; break; } @@ -856,48 +1463,47 @@ int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int * } -int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen ) +ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen ) { - int len; - int total; + ssize_t len; + off_t total; /* char *pOldBuf = pBuf; */ - if (!pReq || (pReq->m_fd ==-1) || ( !pBuf )||(bufLen < 0 )) { + if (!pReq || (pReq->m_fd ==-1) || ( !pBuf )||(bufLen < 0 )) return -1; - } - total = pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead; + + total = pReq->m_reqBodyLen - pReq->m_reqBodyRead; - if ( total <= 0 ) { + if ( total <= 0 ) return 0; - } - if ( total < bufLen ) { + if ( total < bufLen ) bufLen = total; - } total = 0; len = pReq->m_bufRead - pReq->m_bufProcessed; - if ( len > 0 ) { - if ( len > bufLen ) { + if ( len > 0 ) + { + if ( len > bufLen ) len = bufLen; - } memmove( pBuf, pReq->m_pReqBuf + pReq->m_bufProcessed, len ); pReq->m_bufProcessed += len; total += len; pBuf += len; bufLen -= len; } - while( bufLen > 0 ) { + while( bufLen > 0 ) + { len = lsapi_read( pReq->m_fd, pBuf, bufLen ); - if ( len > 0 ) { + if ( len > 0 ) + { total += len; pBuf += len; bufLen -= len; - } else { - if ( len <= 0 ) { - if ( !total) { - return -1; - } - break; - } + } + else if ( len <= 0 ) + { + if ( !total) + return -1; + break; } } pReq->m_reqBodyRead += total; @@ -906,37 +1512,52 @@ int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen ) } -int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ) +ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len ) { struct lsapi_packet_header * pHeader; const char * pEnd; const char * p; - int bufLen; - int toWrite; - int packetLen; + ssize_t bufLen; + ssize_t toWrite; + ssize_t packetLen; + int skip = 0; - if ( !pReq || !pBuf || (pReq->m_fd == -1) ) { + if ( !pReq || !pBuf || (pReq->m_fd == -1) ) return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { + LSAPI_FinalizeRespHeaders_r( pReq ); +/* + if ( *pBuf == '\r' ) + { + ++skip; + } + if ( *pBuf == '\n' ) + { + ++skip; + } +*/ } - if ( len < pReq->m_pRespBufEnd - pReq->m_pRespBufPos ) { - memmove( pReq->m_pRespBufPos, pBuf, len ); - pReq->m_pRespBufPos += len; + pReq->m_reqState |= LSAPI_ST_RESP_BODY; + + if ( (len - skip) < pReq->m_pRespBufEnd - pReq->m_pRespBufPos ) + { + memmove( pReq->m_pRespBufPos, pBuf + skip, len - skip ); + pReq->m_pRespBufPos += len - skip; return len; } - if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { - LSAPI_FinalizeRespHeaders_r( pReq ); - } - pReq->m_reqState |= LSAPI_ST_RESP_BODY; pHeader = pReq->m_respPktHeader; - p = pBuf; + p = pBuf + skip; pEnd = pBuf + len; bufLen = pReq->m_pRespBufPos - pReq->m_pRespBuf; - while( ( toWrite = pEnd - p ) > 0 ) { + while( ( toWrite = pEnd - p ) > 0 ) + { packetLen = toWrite + bufLen; - if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) { + if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) + { packetLen = LSAPI_MAX_DATA_PACKET_LEN; toWrite = packetLen - bufLen; } @@ -949,7 +1570,8 @@ int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ) pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; ++pHeader; - if ( bufLen > 0 ) { + if ( bufLen > 0 ) + { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf; pReq->m_pIovecCur->iov_len = bufLen; pReq->m_pRespBufPos = pReq->m_pRespBuf; @@ -962,21 +1584,108 @@ int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ) ++pReq->m_pIovecCur; p += toWrite; - if ( pHeader >= pReq->m_respPktHeaderEnd - 1) { - if ( LSAPI_Flush_r( pReq ) == -1 ) { + if ( pHeader >= pReq->m_respPktHeaderEnd - 1) + { + if ( LSAPI_Flush_r( pReq ) == -1 ) return -1; - } pHeader = pReq->m_respPktHeader; } } - if ( pHeader != pReq->m_respPktHeader ) { - if ( LSAPI_Flush_r( pReq ) == -1 ) { + if ( pHeader != pReq->m_respPktHeader ) + if ( LSAPI_Flush_r( pReq ) == -1 ) return -1; - } - } return p - pBuf; } +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) +ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) +{ + ssize_t ret; + off_t written; + ret = sendfile( fdIn, fdOut, *off, size, NULL, &written, 0 ); + if ( written > 0 ) + { + ret = written; + *off += ret; + } + return ret; +} +#endif + +#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) +{ + ssize_t ret; + off_t len = size; + ret = sendfile( fdIn, fdOut, *off, &len, NULL, 0 ); + if (( ret == 0 )&&( len > 0 )) + { + ret = len; + *off += len; + } + return ret; +} +#endif + +#if defined(sun) || defined(__sun) +#include +ssize_t gsendfile( int fdOut, int fdIn, off_t *off, size_t size ) +{ + int n = 0 ; + sendfilevec_t vec[1]; + + vec[n].sfv_fd = fdIn; + vec[n].sfv_flag = 0; + vec[n].sfv_off = *off; + vec[n].sfv_len = size; + ++n; + + size_t written; + ssize_t ret = sendfilev( fdOut, vec, n, &written ); + if (( !ret )||( errno == EAGAIN )) + ret = written; + if ( ret > 0 ) + *off += ret; + return ret; +} +#endif + +#if defined(linux) || defined(__linux) || defined(__linux__) || \ + defined(__gnu_linux__) +#include +#define gsendfile sendfile +#endif +#if defined(HPUX) +ssize_t gsendfile( int fdOut, int fdIn, off_t * off, size_t size ) +{ + return sendfile( fdOut, fdIn, off, size, NULL, 0 ); +} +#endif + +ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size ) +{ + struct lsapi_packet_header * pHeader = pReq->m_respPktHeader; + if ( !pReq || (pReq->m_fd == -1) || fdIn == -1 ) + return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { + LSAPI_FinalizeRespHeaders_r( pReq ); + } + pReq->m_reqState |= LSAPI_ST_RESP_BODY; + + LSAPI_Flush_r(pReq); + + lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM, + size + LSAPI_PACKET_HEADER_LEN ); + + + if (write(pReq->m_fd, (const char *) pHeader, LSAPI_PACKET_HEADER_LEN ) != LSAPI_PACKET_HEADER_LEN) + return -1; + + return gsendfile( pReq->m_fd, fdIn, off, size ); +} + + void Flush_RespBuf_r( LSAPI_Request * pReq ) { struct lsapi_packet_header * pHeader = pReq->m_respPktHeader; @@ -990,7 +1699,8 @@ void Flush_RespBuf_r( LSAPI_Request * pReq ) pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; ++pHeader; - if ( bufLen > 0 ) { + if ( bufLen > 0 ) + { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf; pReq->m_pIovecCur->iov_len = bufLen; pReq->m_pRespBufPos = pReq->m_pRespBuf; @@ -1006,32 +1716,35 @@ int LSAPI_Flush_r( LSAPI_Request * pReq ) { int ret = 0; int n; - if ( !pReq ) { + if ( !pReq ) return -1; - } n = pReq->m_pIovecCur - pReq->m_pIovecToWrite; - if (( 0 == n )&&( pReq->m_pRespBufPos == pReq->m_pRespBuf )) { + if (( 0 == n )&&( pReq->m_pRespBufPos == pReq->m_pRespBuf )) return 0; - } - if ( pReq->m_fd == -1 ) { + if ( pReq->m_fd == -1 ) + { pReq->m_pRespBufPos = pReq->m_pRespBuf; pReq->m_totalLen = 0; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec; return -1; } - if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { LSAPI_FinalizeRespHeaders_r( pReq ); } - if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { + if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) + { Flush_RespBuf_r( pReq ); } n = pReq->m_pIovecCur - pReq->m_pIovecToWrite; - if ( n > 0 ) { + if ( n > 0 ) + { ret = lsapi_writev( pReq->m_fd, &pReq->m_pIovecToWrite, n, pReq->m_totalLen ); - if ( ret < pReq->m_totalLen ) { + if ( ret < pReq->m_totalLen ) + { lsapi_close( pReq->m_fd ); pReq->m_fd = -1; ret = -1; @@ -1043,32 +1756,33 @@ int LSAPI_Flush_r( LSAPI_Request * pReq ) } -int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ) +ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len ) { struct lsapi_packet_header header; const char * pEnd; const char * p; - int packetLen; - int totalLen; + ssize_t packetLen; + ssize_t totalLen; int ret; struct iovec iov[2]; struct iovec *pIov; - if ( !pReq ) { + if ( !pReq ) return -1; - } - if (( pReq->m_fd == -1 )||(pReq->m_fd == pReq->m_fdListen )) { + if (( pReq->m_fd == -1 )||(pReq->m_fd == pReq->m_fdListen )) return write( 2, pBuf, len ); - } - if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { + if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) + { LSAPI_Flush_r( pReq ); } p = pBuf; pEnd = pBuf + len; - while( ( packetLen = pEnd - p ) > 0 ) { - if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) { + while( ( packetLen = pEnd - p ) > 0 ) + { + if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) + { packetLen = LSAPI_MAX_DATA_PACKET_LEN; } @@ -1085,7 +1799,8 @@ int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ) pIov = iov; ret = lsapi_writev( pReq->m_fd, &pIov, 2, totalLen ); - if ( ret < totalLen ) { + if ( ret < totalLen ) + { lsapi_close( pReq->m_fd ); pReq->m_fd = -1; ret = -1; @@ -1097,14 +1812,16 @@ int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ) static char * GetHeaderVar( LSAPI_Request * pReq, const char * name ) { int i; - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { - if ( strcmp( name, CGI_HEADERS[i] ) == 0 ) { + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { + if ( strcmp( name, CGI_HEADERS[i] ) == 0 ) return pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; - } } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { const char *p; char *pKey; char *pKeyEnd; @@ -1112,22 +1829,22 @@ static char * GetHeaderVar( LSAPI_Request * pReq, const char * name ) struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; pKeyEnd = pKey + keyLen; p = &name[5]; - while(( pKey < pKeyEnd )&&( *p )) { + while(( pKey < pKeyEnd )&&( *p )) + { char ch = toupper( *pKey ); - if ((ch != *p )||(( *p == '_' )&&( ch != '-'))) { + if ((ch != *p )||(( *p == '_' )&&( ch != '-'))) break; - } ++p; ++pKey; } - if (( pKey == pKeyEnd )&& (!*p )) { + if (( pKey == pKeyEnd )&& (!*p )) return pReq->m_pHttpHeader + pCur->valueOff; - } ++pCur; } } @@ -1139,21 +1856,35 @@ char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name ) { struct LSAPI_key_value_pair * pBegin = pReq->m_pEnvList; struct LSAPI_key_value_pair * pEnd = pBegin + pReq->m_pHeader->m_cntEnv; - if ( !pReq || !name ) { + if ( !pReq || !name ) return NULL; - } - if ( strncmp( name, "HTTP_", 5 ) == 0 ) { + if ( strncmp( name, "HTTP_", 5 ) == 0 ) + { return GetHeaderVar( pReq, name ); } - while( pBegin < pEnd ) { - if ( strcmp( name, pBegin->pKey ) == 0 ) { + while( pBegin < pEnd ) + { + if ( strcmp( name, pBegin->pKey ) == 0 ) return pBegin->pValue; - } ++pBegin; } return NULL; } +struct _headerInfo +{ + const char * _name; + int _nameLen; + const char * _value; + int _valueLen; +}; + +int compareValueLocation(const void * v1, const void *v2 ) +{ + return ((const struct _headerInfo *)v1)->_value - + ((const struct _headerInfo *)v2)->_value; +} + int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { @@ -1162,43 +1893,66 @@ int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq, char * pValue; int ret; int count = 0; - if ( !pReq || !fn ) { + struct _headerInfo headers[512]; + if ( !pReq || !fn ) return -1; - } - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { + + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { len = pReq->m_pHeaderIndex->m_headerLen[i]; pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; *(pValue + len ) = 0; - ret = (*fn)( HTTP_HEADERS[i], HTTP_HEADER_LEN[i], - pValue, len, arg ); + headers[count]._name = HTTP_HEADERS[i]; + headers[count]._nameLen = HTTP_HEADER_LEN[i]; + headers[count]._value = pValue; + headers[count]._valueLen = len; ++count; - if ( ret <= 0 ) { - return ret; - } + + //ret = (*fn)( HTTP_HEADERS[i], HTTP_HEADER_LEN[i], + // pValue, len, arg ); + //if ( ret <= 0 ) + // return ret; } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { char *pKey; int keyLen; struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; pValue = pReq->m_pHttpHeader + pCur->valueOff; *(pValue + pCur->valueLen ) = 0; - ret = (*fn)( pKey, keyLen, - pValue, pCur->valueLen, arg ); - if ( ret <= 0 ) { - return ret; - } + headers[count]._name = pKey; + headers[count]._nameLen = keyLen; + headers[count]._value = pValue; + headers[count]._valueLen = pCur->valueLen; + ++count; + if ( count == 512 ) + break; + //ret = (*fn)( pKey, keyLen, + // pValue, pCur->valueLen, arg ); + //if ( ret <= 0 ) + // return ret; ++pCur; } } - return count + pReq->m_pHeader->m_cntUnknownHeaders; + qsort( headers, count, sizeof( struct _headerInfo ), compareValueLocation ); + for( i = 0; i < count; ++i ) + { + ret = (*fn)( headers[i]._name, headers[i]._nameLen, + headers[i]._value, headers[i]._valueLen, arg ); + if ( ret <= 0 ) + return ret; + } + return count; } @@ -1211,23 +1965,24 @@ int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, char * pValue; int ret; int count = 0; - if ( !pReq || !fn ) { + if ( !pReq || !fn ) return -1; - } - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { len = pReq->m_pHeaderIndex->m_headerLen[i]; pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; *(pValue + len ) = 0; ret = (*fn)( CGI_HEADERS[i], CGI_HEADER_LEN[i], pValue, len, arg ); ++count; - if ( ret <= 0 ) { + if ( ret <= 0 ) return ret; - } } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { char achHeaderName[256]; char *p; char *pKey; @@ -1236,23 +1991,23 @@ int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; + if ( keyLen > 250 ) + keyLen = 250; pKeyEnd = pKey + keyLen; memcpy( achHeaderName, "HTTP_", 5 ); p = &achHeaderName[5]; - if ( keyLen > 250 ) { - keyLen = 250; - } - while( pKey < pKeyEnd ) { + while( pKey < pKeyEnd ) + { char ch = *pKey++; - if ( ch == '-' ) { + if ( ch == '-' ) *p++ = '_'; - } else { + else *p++ = toupper( ch ); - } } *p = 0; keyLen += 5; @@ -1261,9 +2016,8 @@ int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, *(pValue + pCur->valueLen ) = 0; ret = (*fn)( achHeaderName, keyLen, pValue, pCur->valueLen, arg ); - if ( ret <= 0 ) { + if ( ret <= 0 ) return ret; - } ++pCur; } } @@ -1276,15 +2030,14 @@ static int EnvForeach( struct LSAPI_key_value_pair * pEnv, { struct LSAPI_key_value_pair * pEnd = pEnv + n; int ret; - if ( !pEnv || !fn ) { + if ( !pEnv || !fn ) return -1; - } - while( pEnv < pEnd ) { + while( pEnv < pEnd ) + { ret = (*fn)( pEnv->pKey, pEnv->keyLen, pEnv->pValue, pEnv->valLen, arg ); - if ( ret <= 0 ) { + if ( ret <= 0 ) return ret; - } ++pEnv; } return n; @@ -1295,10 +2048,10 @@ static int EnvForeach( struct LSAPI_key_value_pair * pEnv, int LSAPI_ForeachEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { - if ( !pReq || !fn ) { + if ( !pReq || !fn ) return -1; - } - if ( pReq->m_pHeader->m_cntEnv > 0 ) { + if ( pReq->m_pHeader->m_cntEnv > 0 ) + { return EnvForeach( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv, fn, arg ); } @@ -1310,10 +2063,10 @@ int LSAPI_ForeachEnv_r( LSAPI_Request * pReq, int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { - if ( !pReq || !fn ) { + if ( !pReq || !fn ) return -1; - } - if ( pReq->m_pHeader->m_cntSpecialEnv > 0 ) { + if ( pReq->m_pHeader->m_cntSpecialEnv > 0 ) + { return EnvForeach( pReq->m_pSpecialEnvList, pReq->m_pHeader->m_cntSpecialEnv, fn, arg ); @@ -1326,14 +2079,13 @@ int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ) { - if ( !pReq || !pReq->m_pIovec ) { + if ( !pReq || !pReq->m_pIovec ) return -1; - } - if ( !( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) ) { + if ( !( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) ) return 0; - } pReq->m_reqState &= ~LSAPI_ST_RESP_HEADER; - if ( pReq->m_pRespHeaderBufPos > pReq->m_pRespHeaderBuf ) { + if ( pReq->m_pRespHeaderBufPos > pReq->m_pRespHeaderBuf ) + { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespHeaderBuf; pReq->m_pIovecCur->iov_len = pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf; pReq->m_totalLen += pReq->m_pIovecCur->iov_len; @@ -1352,25 +2104,87 @@ int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ) } - - -int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, char * pBuf, int len ) +int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName, + const char * pHeaderValue ) { - if ( !pReq || !pBuf || len <= 0 || len > LSAPI_RESP_HTTP_HEADER_MAX ) { + int nameLen, valLen, len; + if ( !pReq || !pHeaderName || !pHeaderValue ) + return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) + return -1; + if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) + return -1; + nameLen = strlen( pHeaderName ); + valLen = strlen( pHeaderValue ); + if ( nameLen == 0 ) return -1; + while( nameLen > 0 ) + { + char ch = *(pHeaderName + nameLen - 1 ); + if (( ch == '\n' )||( ch == '\r' )) + --nameLen; + else + break; + } + if ( nameLen <= 0 ) + return 0; + while( valLen > 0 ) + { + char ch = *(pHeaderValue + valLen - 1 ); + if (( ch == '\n' )||( ch == '\r' )) + --valLen; + else + break; } - if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) { + len = nameLen + valLen + 1; + if ( len > LSAPI_RESP_HTTP_HEADER_MAX ) return -1; + + if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) + { + int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf; + newlen -= newlen % 4096; + if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) + return -1; } - if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) { + memmove( pReq->m_pRespHeaderBufPos, pHeaderName, nameLen ); + pReq->m_pRespHeaderBufPos += nameLen; + *pReq->m_pRespHeaderBufPos++ = ':'; + memmove( pReq->m_pRespHeaderBufPos, pHeaderValue, valLen ); + pReq->m_pRespHeaderBufPos += valLen; + *pReq->m_pRespHeaderBufPos++ = 0; + ++len; /* add one byte padding for \0 */ + pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len; + ++pReq->m_respHeader.m_respInfo.m_cntHeaders; + return 0; +} + + + +int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len ) +{ + if ( !pReq || !pBuf || len <= 0 || len > LSAPI_RESP_HTTP_HEADER_MAX ) + return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) return -1; + if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) + return -1; + while( len > 0 ) + { + char ch = *(pBuf + len - 1 ); + if (( ch == '\n' )||( ch == '\r' )) + --len; + else + break; } - if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) { + if ( len <= 0 ) + return 0; + if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) + { int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf; newlen -= newlen % 4096; - if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) { + if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) return -1; - } } memmove( pReq->m_pRespHeaderBufPos, pBuf, len ); pReq->m_pRespHeaderBufPos += len; @@ -1389,7 +2203,8 @@ int LSAPI_CreateListenSock2( const struct sockaddr * pServerAddr, int backlog ) int flag = 1; int addr_len; - switch( pServerAddr->sa_family ) { + switch( pServerAddr->sa_family ) + { case AF_INET: addr_len = 16; break; @@ -1405,20 +2220,20 @@ int LSAPI_CreateListenSock2( const struct sockaddr * pServerAddr, int backlog ) } fd = socket( pServerAddr->sa_family, SOCK_STREAM, 0 ); - if ( fd == -1 ) { + if ( fd == -1 ) return -1; - } fcntl( fd, F_SETFD, FD_CLOEXEC ); if(setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, - (char *)( &flag ), sizeof(flag)) == 0) { + (char *)( &flag ), sizeof(flag)) == 0) + { ret = bind( fd, pServerAddr, addr_len ); - if ( !ret ) { + if ( !ret ) + { ret = listen( fd, backlog ); - if ( !ret ) { + if ( !ret ) return fd; - } } } @@ -1438,17 +2253,16 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) int doAddrInfo = 0; int port; - if ( !pBind ) { + if ( !pBind ) return -1; - } - while( isspace( *pBind ) ) { + while( isspace( *pBind ) ) ++pBind; - } strncpy( achAddr, pBind, 256 ); - switch( *p ) { + switch( *p ) + { case '/': pAddr->sa_family = AF_UNIX; strncpy( ((struct sockaddr_un *)pAddr)->sun_path, p, @@ -1463,7 +2277,8 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) return -1; *pEnd++ = 0; - if ( *p == '*' ) { + if ( *p == '*' ) + { strcpy( achAddr, "::" ); p = achAddr; } @@ -1473,35 +2288,35 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) default: pAddr->sa_family = AF_INET; pEnd = strchr( p, ':' ); - if ( !pEnd ) { + if ( !pEnd ) return -1; - } *pEnd++ = 0; doAddrInfo = 0; - if ( *p == '*' ) { + if ( *p == '*' ) + { ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl(INADDR_ANY); - } else { - if (!strcasecmp( p, "localhost" ) ) { - ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl( INADDR_LOOPBACK ); - } else { - ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = inet_addr( p ); - if ( ((struct sockaddr_in *)pAddr)->sin_addr.s_addr == INADDR_BROADCAST) { - doAddrInfo = 1; - } + } + else if (!strcasecmp( p, "localhost" ) ) + ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl( INADDR_LOOPBACK ); + else + { + ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = inet_addr( p ); + if ( ((struct sockaddr_in *)pAddr)->sin_addr.s_addr == INADDR_BROADCAST) + { + doAddrInfo = 1; } } break; } - if ( *pEnd == ':' ) { + if ( *pEnd == ':' ) ++pEnd; - } port = atoi( pEnd ); - if (( port <= 0 )||( port > 65535 )) { + if (( port <= 0 )||( port > 65535 )) return -1; - } - if ( doAddrInfo ) { + if ( doAddrInfo ) + { memset(&hints, 0, sizeof(hints)); @@ -1509,7 +2324,8 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; - if ( getaddrinfo(p, NULL, &hints, &res) ) { + if ( getaddrinfo(p, NULL, &hints, &res) ) + { return -1; } @@ -1517,11 +2333,10 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) freeaddrinfo(res); } - if ( pAddr->sa_family == AF_INET ) { + if ( pAddr->sa_family == AF_INET ) ((struct sockaddr_in *)pAddr)->sin_port = htons( port ); - } else { + else ((struct sockaddr_in6 *)pAddr)->sin6_port = htons( port ); - } return 0; } @@ -1532,7 +2347,8 @@ int LSAPI_CreateListenSock( const char * pBind, int backlog ) int ret; int fd = -1; ret = LSAPI_ParseSockAddr( pBind, (struct sockaddr *)serverAddr ); - if ( !ret ) { + if ( !ret ) + { fd = LSAPI_CreateListenSock2( (struct sockaddr *)serverAddr, backlog ); } return fd; @@ -1543,9 +2359,11 @@ static fn_select_t g_fnSelect = select; typedef struct _lsapi_child_status { int m_pid; + long m_tmStart; volatile short m_iKillSent; volatile short m_inProcess; + volatile int m_iReqCounter; volatile long m_tmWaitBegin; volatile long m_tmReqBegin; @@ -1575,43 +2393,42 @@ static lsapi_prefork_server * g_prefork_server = NULL; int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork ) { - if ( g_prefork_server ) { + int pid; + if ( g_prefork_server ) return 0; - } - if ( max_children <= 1 ) { + if ( max_children <= 1 ) return -1; - } - if ( max_children >= 10000) { + if ( max_children >= 10000) max_children = 10000; - } g_prefork_server = (lsapi_prefork_server *)malloc( sizeof( lsapi_prefork_server ) ); - if ( !g_prefork_server ) { + if ( !g_prefork_server ) return -1; - } memset( g_prefork_server, 0, sizeof( lsapi_prefork_server ) ); - if ( fp != NULL ) { + if ( fp != NULL ) g_fnSelect = fp; - } s_ppid = getppid(); + pid = getpid(); + setpgid( pid, pid ); g_prefork_server->m_iAvoidFork = avoidFork; g_prefork_server->m_iMaxChildren = max_children; g_prefork_server->m_iExtraChildren = ( avoidFork ) ? 0 : (max_children / 3) ; g_prefork_server->m_iMaxIdleChildren = ( avoidFork ) ? (max_children + 1) : (max_children / 3); + if ( g_prefork_server->m_iMaxIdleChildren == 0 ) + g_prefork_server->m_iMaxIdleChildren = 1; g_prefork_server->m_iChildrenMaxIdleTime = 300; - g_prefork_server->m_iMaxReqProcessTime = 300; + g_prefork_server->m_iMaxReqProcessTime = 3600; return 0; } void LSAPI_Set_Server_fd( int fd ) { - if( g_prefork_server ) { + if( g_prefork_server ) g_prefork_server->m_fd = fd; - } } @@ -1624,11 +2441,17 @@ static int lsapi_accept( int fdListen ) len = sizeof( achPeer ); fd = accept( fdListen, (struct sockaddr *)&achPeer, &len ); - if ( fd != -1 ) { - if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) { + if ( fd != -1 ) + { + if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) + { setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (char *)&nodelay, sizeof(nodelay)); } + + //OPTIMIZATION + //if ( s_accept_notify ) + // notify_req_received( fd ); } return fd; @@ -1652,10 +2475,10 @@ static lsapi_child_status * find_child_status( int pid ) { lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatus + g_prefork_server->m_iMaxChildren * 2; - while( pStatus < pEnd ) { - if ( pStatus->m_pid == pid ) { + while( pStatus < pEnd ) + { + if ( pStatus->m_pid == pid ) return pStatus; - } ++pStatus; } return NULL; @@ -1667,16 +2490,30 @@ static void lsapi_sigchild( int signal ) { int status, pid; lsapi_child_status * child_status; - while( 1 ) { + while( 1 ) + { pid = waitpid( -1, &status, WNOHANG|WUNTRACED ); - if ( pid <= 0 ) { + if ( pid <= 0 ) + { break; } + if ( WIFSIGNALED( status )) + { + int sig_num = WTERMSIG( status ); + int dump = WCOREDUMP( status ); + fprintf( stderr, "Child process with pid: %d was killed by signal: %d, core dump: %d\n", pid, sig_num, dump ); + } + if ( pid == s_pid_dump_debug_info ) + { + pid = 0; + continue; + } child_status = find_child_status( pid ); - if ( child_status ) { + if ( child_status ) + { child_status->m_pid = 0; + --g_prefork_server->m_iCurChildren; } - --g_prefork_server->m_iCurChildren; } } @@ -1690,76 +2527,108 @@ static int lsapi_init_children_status() size = (size + 4095 ) / 4096 * 4096; pBuf =( char*) mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0 ); - if ( pBuf == MAP_FAILED ) { + if ( pBuf == MAP_FAILED ) + { perror( "Anonymous mmap() failed" ); return -1; } memset( pBuf, 0, size ); - g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf; + g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf; return 0; } +static void dump_debug_info( lsapi_child_status * pStatus, long tmCur ) +{ + char achCmd[1024]; + if ( s_pid_dump_debug_info ) + { + if ( kill( s_pid_dump_debug_info, 0 ) == 0 ) + return; + } + s_pid_dump_debug_info = fork(); + + fprintf( stderr, "[%s] Possible runaway process, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld\n", + ctime(&tmCur), getpid(), pStatus->m_pid, pStatus->m_iReqCounter, + tmCur - pStatus->m_tmReqBegin, tmCur - pStatus->m_tmLastCheckPoint, tmCur - pStatus->m_tmStart ); + snprintf( achCmd, 1024, "gdb --batch -ex \"attach %d\" -ex \"set height 0\" -ex \"bt\" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2", pStatus->m_pid, pStatus->m_pid ); + if ( system( achCmd ) == -1 ) + perror( "system()" ); + exit( 0 ); +} + static void lsapi_check_child_status( long tmCur ) { int idle = 0; int tobekilled; int dying = 0; + int count = 0; lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatus + g_prefork_server->m_iMaxChildren * 2; - while( pStatus < pEnd ) { - tobekilled = pStatus->m_iKillSent; - if ( pStatus->m_pid != 0 ) { - if ( !tobekilled ) { - if ( !pStatus->m_inProcess ) { - - if (( g_prefork_server->m_iCurChildren - dying > g_prefork_server->m_iMaxChildren)|| - ( idle >= g_prefork_server->m_iMaxIdleChildren )) { - - tobekilled = 1; - } else { - if (( s_max_idle_secs> 0)&&(tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5 )) { - tobekilled = 1; - } - } - if ( !tobekilled ) { - ++idle; - } - } else { - if ( tmCur - pStatus->m_tmReqBegin > - g_prefork_server->m_iMaxReqProcessTime ) { - tobekilled = 1; - } + while( pStatus < pEnd ) + { + tobekilled = 0; + if ( pStatus->m_pid != 0 ) + { + ++count; + if ( !pStatus->m_inProcess ) + { + + if (( g_prefork_server->m_iCurChildren - dying > g_prefork_server->m_iMaxChildren)|| + ( idle > g_prefork_server->m_iMaxIdleChildren )) + { + tobekilled = SIGUSR1; } - } else { - if ( pStatus->m_inProcess ) { - tobekilled = pStatus->m_iKillSent = 0; + else + { + if (( s_max_idle_secs> 0)&&(tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5 )) + { + tobekilled = SIGUSR1; + } } + if ( !tobekilled ) + ++idle; } - if ( tobekilled ) { - tobekilled = 0; - if ( pStatus->m_iKillSent > 5 ) { - tobekilled = SIGKILL; - } else { - if ( pStatus->m_iKillSent == 3 ) { + else + { + if ( tmCur - pStatus->m_tmReqBegin > + g_prefork_server->m_iMaxReqProcessTime ) + { + if (( ( pStatus->m_iKillSent % 5 ) == 0 )&&( s_dump_debug_info )) + dump_debug_info( pStatus, tmCur ); + if ( pStatus->m_iKillSent > 5 ) + { + tobekilled = SIGKILL; + fprintf( stderr, "Force killing runaway process PID: %d with SIGKILL\n", pStatus->m_pid ); + } + else + { tobekilled = SIGTERM; - } else { - if ( pStatus->m_iKillSent == 1 ) { - tobekilled = SIGUSR1; - } + fprintf( stderr, "Killing runaway process PID: %d with SIGTERM\n", pStatus->m_pid ); } } - if ( tobekilled ) { - kill( pStatus->m_pid, tobekilled ); + } + if ( tobekilled ) + { + if (( kill( pStatus->m_pid, tobekilled ) == -1 )&&( errno == ESRCH )) + { + pStatus->m_pid = 0; + --count; + } + else + { + ++pStatus->m_iKillSent; + ++dying; } - ++pStatus->m_iKillSent; - ++dying; } - - } else { - ++dying; } ++pStatus; } + if ( abs( g_prefork_server->m_iCurChildren - count ) > 1 ) + { + fprintf( stderr, "Children tracking is wrong: PID: %d, Cur Childen: %d, count: %d, idle: %d, dying: %d\n", getpid(), + g_prefork_server->m_iCurChildren, count, idle, dying ); + + } } static int lsapi_all_children_must_die() @@ -1770,14 +2639,14 @@ static int lsapi_all_children_must_die() g_prefork_server->m_iMaxIdleChildren = -1; maxWait = 15; - while( g_prefork_server->m_iCurChildren && (sec < maxWait) ) { + while( g_prefork_server->m_iCurChildren && (sec < maxWait) ) + { lsapi_check_child_status(time(NULL)); sleep( 1 ); sec++; } - if ( g_prefork_server->m_iCurChildren != 0 ) { + if ( g_prefork_server->m_iCurChildren != 0 ) kill( -getpgrp(), SIGKILL ); - } return 0; } @@ -1796,13 +2665,17 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re fd_set readfds; struct timeval timeout; + sigset_t mask; + sigset_t orig_mask; + lsapi_init_children_status(); setsid(); act.sa_flags = 0; act.sa_handler = lsapi_sigchild; - if( sigaction( SIGCHLD, &act, &old_child ) ) { + if( sigaction( SIGCHLD, &act, &old_child ) ) + { perror( "Can't set signal handler for SIGCHILD" ); return -1; } @@ -1813,36 +2686,36 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re if( sigaction( SIGTERM, &act, &old_term ) || sigaction( SIGINT, &act, &old_int ) || sigaction( SIGUSR1, &act, &old_usr1 ) || - sigaction( SIGQUIT, &act, &old_quit )) { + sigaction( SIGQUIT, &act, &old_quit )) + { perror( "Can't set signals" ); return -1; } s_stop = 0; - while( !s_stop ) { - if ( ret ) { - curTime = time( NULL ); - } else { - ++curTime; - } - if (curTime != lastTime ) { + while( !s_stop ) + { + curTime = time( NULL ); + if (curTime != lastTime ) + { lastTime = curTime; - if (s_ppid && (getppid() != s_ppid )) { + if (s_ppid && (getppid() != s_ppid )) break; - } lsapi_check_child_status(curTime ); - if (pServer->m_iServerMaxIdle) { - if ( pServer->m_iCurChildren <= 0 ) { + if (pServer->m_iServerMaxIdle) + { + if ( pServer->m_iCurChildren <= 0 ) + { ++wait_secs; - if ( wait_secs > pServer->m_iServerMaxIdle ) { + if ( wait_secs > pServer->m_iServerMaxIdle ) return -1; - } - } else { - wait_secs = 0; } + else + wait_secs = 0; } } - if ( pServer->m_iCurChildren >= (pServer->m_iMaxChildren + pServer->m_iExtraChildren ) ) { + if ( pServer->m_iCurChildren >= (pServer->m_iMaxChildren + pServer->m_iExtraChildren ) ) + { usleep( 100000 ); continue; } @@ -1850,66 +2723,100 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re FD_ZERO( &readfds ); FD_SET( pServer->m_fd, &readfds ); timeout.tv_sec = 1; timeout.tv_usec = 0; - if ((ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout)) == 1 ) { - if ( pServer->m_iCurChildren >= 0 ) { + if ((ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout)) == 1 ) + { + /* + if ( pServer->m_iCurChildren >= 0 ) + { usleep( 10 ); FD_ZERO( &readfds ); FD_SET( pServer->m_fd, &readfds ); timeout.tv_sec = 0; timeout.tv_usec = 0; - if ( (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout) == 0 ) { - continue; - } - } - } else { - if ( ret == -1 ) { - if ( errno == EINTR ) { + if ( (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout) == 0 ) continue; - } - /* perror( "select()" ); */ - break; - } else { + }*/ + } + else if ( ret == -1 ) + { + if ( errno == EINTR ) continue; - } + /* perror( "select()" ); */ + break; + } + else + { + continue; } pReq->m_fd = lsapi_accept( pServer->m_fd ); - if ( pReq->m_fd != -1 ) { + if ( pReq->m_fd != -1 ) + { child_status = find_child_status( 0 ); + if ( child_status ) + memset( child_status, 0, sizeof( *child_status ) ); + + sigemptyset( &mask ); + sigaddset( &mask, SIGCHLD ); + + if ( sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0 ) + { + perror( "sigprocmask(SIG_BLOCK) to block SIGCHLD" ); + } + pid = fork(); - if ( !pid ) { + + if ( !pid ) + { + if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) + perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK in child" ); g_prefork_server = NULL; s_ppid = getppid(); s_req_processed = 0; s_pChildStatus = child_status; - child_status->m_iKillSent = 0; lsapi_set_nblock( pReq->m_fd, 0 ); - + if ( pReq->m_fdListen != -1 ) + { + close( pReq->m_fdListen ); + pReq->m_fdListen = -1; + } /* don't catch our signals */ sigaction( SIGCHLD, &old_child, 0 ); sigaction( SIGTERM, &old_term, 0 ); sigaction( SIGQUIT, &old_quit, 0 ); sigaction( SIGINT, &old_int, 0 ); sigaction( SIGUSR1, &old_usr1, 0 ); + //init_conn_key( pReq->m_fd ); + lsapi_notify_pid( pReq->m_fd ); + s_notified_pid = 1; + //if ( s_accept_notify ) + // return notify_req_received( pReq->m_fd ); return 0; - } else { - if ( pid == -1 ) { - perror( "fork() failed, please increase process limit" ); - } else { - ++pServer->m_iCurChildren; - if ( child_status ) { - child_status->m_pid = pid; - child_status->m_iKillSent = 0; - child_status->m_tmWaitBegin = time(NULL); - } + } + else if ( pid == -1 ) + { + perror( "fork() failed, please increase process limit" ); + } + else + { + ++pServer->m_iCurChildren; + if ( child_status ) + { + child_status->m_pid = pid; + child_status->m_tmWaitBegin = curTime; + child_status->m_tmStart = curTime; } } close( pReq->m_fd ); pReq->m_fd = -1; - } else { - if (( errno == EINTR )||( errno == EAGAIN)) { + if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) + perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK" ); + + } + else + { + if (( errno == EINTR )||( errno == EAGAIN)) continue; - } perror( "accept() failed" ); return -1; } @@ -1921,6 +2828,11 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re } +void lsapi_error( const char * pMessage, int err_no ) +{ + fprintf( stderr, "%d: %s, errno: %d (%s)\n", getpid(), pMessage, err_no, strerror( err_no ) ); +} + int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) { int fd; @@ -1932,88 +2844,105 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) LSAPI_Finish_r( pReq ); - if ( g_prefork_server ) { - if ( g_prefork_server->m_fd != -1 ) { - if ( lsapi_prefork_server_accept( g_prefork_server, pReq ) == -1 ) { + if ( g_prefork_server ) + { + if ( g_prefork_server->m_fd != -1 ) + if ( lsapi_prefork_server_accept( g_prefork_server, pReq ) == -1 ) return -1; - } - } } - if ( s_req_processed >= s_max_reqs ) { + if ( s_req_processed >= s_max_reqs ) return -1; - } - if ( s_pChildStatus ) { + if ( s_pChildStatus ) + { s_pChildStatus->m_tmWaitBegin = time( NULL ); } + - while( g_running ) { - if ( pReq->m_fd != -1 ) { + while( g_running ) + { + if ( pReq->m_fd != -1 ) + { fd = pReq->m_fd; - } else { - if ( pReq->m_fdListen != -1 ) { - fd = pReq->m_fdListen; - } else { - return -1; - } + } + else if ( pReq->m_fdListen != -1 ) + fd = pReq->m_fdListen; + else + { + break; } wait_secs = 0; - while( 1 ) { - if ( !g_running ) { + while( 1 ) + { + if ( !g_running ) return -1; - } - if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) { + if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) return -1; - } FD_ZERO( &readfds ); FD_SET( fd, &readfds ); timeout.tv_sec = 1; timeout.tv_usec = 0; ret = (*g_fnSelect)(fd+1, &readfds, NULL, NULL, &timeout); - if ( ret == 0 ) { - if ( s_pChildStatus ) { + if ( ret == 0 ) + { + if ( s_pChildStatus ) + { s_pChildStatus->m_inProcess = 0; } ++wait_secs; - if (( s_max_idle_secs > 0 )&&(wait_secs >= s_max_idle_secs )) { + if (( s_max_idle_secs > 0 )&&(wait_secs >= s_max_idle_secs )) return -1; - } - if ( s_ppid &&( getppid() != s_ppid)) { + if ( s_ppid &&( getppid() != s_ppid)) return -1; - } - } else { - if ( ret == -1 ) { - if ( errno == EINTR ) { - continue; - } else { - return -1; - } - } else { - if ( ret >= 1 ) { - if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) { - return -1; + } + else if ( ret == -1 ) + { + if ( errno == EINTR ) + continue; + else + return -1; + } + else if ( ret >= 1 ) + { + if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) + return -1; + if ( fd == pReq->m_fdListen ) + { + pReq->m_fd = lsapi_accept( pReq->m_fdListen ); + if ( pReq->m_fd != -1 ) + { + fd = pReq->m_fd; + lsapi_set_nblock( fd, 0 ); + //init_conn_key( pReq->m_fd ); + if ( !s_keepListener ) + { + close( pReq->m_fdListen ); + pReq->m_fdListen = -1; } - if ( fd == pReq->m_fdListen ) { - pReq->m_fd = lsapi_accept( pReq->m_fdListen ); - if ( pReq->m_fd != -1 ) { - fd = pReq->m_fd; - lsapi_set_nblock( fd, 0 ); - } else { - if (( errno == EINTR )||( errno == EAGAIN)) { - continue; - } + if ( s_accept_notify ) + if ( notify_req_received( pReq->m_fd ) == -1 ) return -1; - } - } else { - break; - } + } + else + { + if (( errno == EINTR )||( errno == EAGAIN)) + continue; + lsapi_error( "lsapi_accept() error", errno ); + return -1; } } + else + break; } } - if ( !readReq( pReq ) ) { - if ( s_pChildStatus ) { + + if ( !readReq( pReq ) ) + { + if ( s_pChildStatus ) + { + s_pChildStatus->m_iKillSent = 0; s_pChildStatus->m_inProcess = 1; + ++s_pChildStatus->m_iReqCounter; s_pChildStatus->m_tmReqBegin = s_pChildStatus->m_tmLastCheckPoint = time(NULL); } ++s_req_processed; @@ -2028,49 +2957,50 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) } void LSAPI_Set_Max_Reqs( int reqs ) -{ - s_max_reqs = reqs; -} +{ s_max_reqs = reqs; } void LSAPI_Set_Max_Idle( int secs ) -{ - s_max_idle_secs = secs; -} +{ s_max_idle_secs = secs; } void LSAPI_Set_Max_Children( int maxChildren ) { - if ( g_prefork_server ) { + if ( g_prefork_server ) g_prefork_server->m_iMaxChildren = maxChildren; - } } void LSAPI_Set_Extra_Children( int extraChildren ) { - if (( g_prefork_server )&&( extraChildren >= 0 )) { + if (( g_prefork_server )&&( extraChildren >= 0 )) g_prefork_server->m_iExtraChildren = extraChildren; - } } void LSAPI_Set_Max_Process_Time( int secs ) { - if (( g_prefork_server )&&( secs > 0 )) { + if (( g_prefork_server )&&( secs > 0 )) g_prefork_server->m_iMaxReqProcessTime = secs; - } } void LSAPI_Set_Max_Idle_Children( int maxIdleChld ) { - if (( g_prefork_server )&&( maxIdleChld > 0 )) { + if (( g_prefork_server )&&( maxIdleChld > 0 )) g_prefork_server->m_iMaxIdleChildren = maxIdleChld; - } } void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle ) { - if ( g_prefork_server ) { + if ( g_prefork_server ) g_prefork_server->m_iServerMaxIdle = serverMaxIdle; - } +} + +void LSAPI_Set_Slow_Req_Msecs( int msecs ) +{ + s_slow_req_msecs = msecs; +} + +int LSAPI_Get_Slow_Req_Msecs() +{ + return s_slow_req_msecs; } @@ -2092,101 +3022,419 @@ static void unset_lsapi_envs() #else env = environ; #endif - while( env != NULL && *env != NULL ) { - if ( !strncmp(*env, "LSAPI_", 6) || - !strncmp( *env, "PHP_LSAPI_", 10 ) ) { + while( env != NULL && *env != NULL ) + { + if (!strncmp(*env, "LSAPI_", 6) || !strncmp( *env, "PHP_LSAPI_", 10 ) + || (!strncmp( *env, "PHPRC=", 6 )&&(!s_uid))) + { char ** del = env; - do { + do *del = del[1]; - } while( *del++ ); - } else { - ++env; + while( *del++ ); } + else + ++env; } } -void LSAPI_Init_Env_Parameters( fn_select_t fp ) +static int lsapi_initSuEXEC() +{ + int i; + struct passwd * pw; + s_defaultUid = 0; + s_defaultGid = 0; + if ( s_uid == 0 ) + { + const char * p = getenv( "LSAPI_DEFAULT_UID" ); + if ( p ) + { + i = atoi( p ); + if ( i > 0 ) + s_defaultUid = i; + } + p = getenv( "LSAPI_DEFAULT_GID" ); + if ( p ) + { + i = atoi( p ); + if ( i > 0 ) + s_defaultGid = i; + } + p = getenv( "LSAPI_SECRET" ); + if (( !p )||( readSecret(p) == -1 )) + return -1; + if ( g_prefork_server ) + { + if ( g_prefork_server->m_iMaxChildren < 100 ) + g_prefork_server->m_iMaxChildren = 100; + } + } + if ( !s_defaultUid || !s_defaultGid ) + { + pw = getpwnam( "nobody" ); + if ( !s_defaultUid ) + s_defaultUid = pw->pw_uid; + if ( !s_defaultGid ) + s_defaultGid = pw->pw_gid; + } + return 0; +} + + +int LSAPI_Init_Env_Parameters( fn_select_t fp ) { const char *p; int n; int avoidFork = 0; p = getenv( "PHP_LSAPI_MAX_REQUESTS" ); - if ( !p ) { + if ( !p ) p = getenv( "LSAPI_MAX_REQS" ); - } - if ( p ) { + if ( p ) + { n = atoi( p ); - if ( n > 0 ) { + if ( n > 0 ) LSAPI_Set_Max_Reqs( n ); - } } p = getenv( "LSAPI_AVOID_FORK" ); - if ( p ) { + if ( p ) + { avoidFork = atoi( p ); } + p = getenv( "LSAPI_ACCEPT_NOTIFY" ); + if ( p ) + { + s_accept_notify = atoi( p ); + } + + p = getenv( "LSAPI_SLOW_REQ_MSECS" ); + if ( p ) + { + n = atoi( p ); + LSAPI_Set_Slow_Req_Msecs( n ); + } + #if defined( RLIMIT_CORE ) p = getenv( "LSAPI_ALLOW_CORE_DUMP" ); - if ( !p ) { + if ( !p ) + { struct rlimit limit = { 0, 0 }; setrlimit( RLIMIT_CORE, &limit ); } -#endif + else + s_enable_core_dump = 1; + +#endif p = getenv( "LSAPI_MAX_IDLE" ); - if ( p ) { + if ( p ) + { n = atoi( p ); LSAPI_Set_Max_Idle( n ); } - if ( LSAPI_Is_Listen() ) { + p = getenv( "LSAPI_KEEP_LISTEN" ); + if ( p ) + { + n = atoi( p ); + s_keepListener = n; + } + + + if ( LSAPI_Is_Listen() ) + { n = 0; p = getenv( "PHP_LSAPI_CHILDREN" ); - if ( !p ) { + if ( !p ) p = getenv( "LSAPI_CHILDREN" ); - } - if ( p ) { + if ( p ) n = atoi( p ); - } - if ( n > 1 ) { + if ( n > 1 ) + { LSAPI_Init_Prefork_Server( n, fp, avoidFork ); LSAPI_Set_Server_fd( g_req.m_fdListen ); } p = getenv( "LSAPI_EXTRA_CHILDREN" ); - if ( p ) { + if ( p ) LSAPI_Set_Extra_Children( atoi( p ) ); - } p = getenv( "LSAPI_MAX_IDLE_CHILDREN" ); - if ( p ) { + if ( p ) LSAPI_Set_Max_Idle_Children( atoi( p ) ); - } + p = getenv( "LSAPI_PGRP_MAX_IDLE" ); - if ( p ) { + if ( p ) + { LSAPI_Set_Server_Max_Idle_Secs( atoi( p ) ); } p = getenv( "LSAPI_MAX_PROCESS_TIME" ); - if ( p ) { + if ( p ) LSAPI_Set_Max_Process_Time( atoi( p ) ); - } - if ( getenv( "LSAPI_PPID_NO_CHECK" ) ) { + + if ( getenv( "LSAPI_PPID_NO_CHECK" ) ) + { LSAPI_No_Check_ppid(); } + + p = getenv( "LSAPI_DUMP_DEBUG_INFO" ); + if ( p ) + s_dump_debug_info = atoi( p ); + + if ( lsapi_initSuEXEC() == -1 ) + return -1; +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + lsapi_initLVE(); +#endif } unset_lsapi_envs(); + return 0; +} + + +int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders, + const char * pBody, int bodyLen ) +{ + LSAPI_SetRespStatus_r( pReq, code ); + if ( pRespHeaders ) + { + while( *pRespHeaders ) + { + LSAPI_AppendRespHeader_r( pReq, *pRespHeaders, strlen( *pRespHeaders ) ); + ++pRespHeaders; + } + } + if ( pBody &&( bodyLen > 0 )) + { + LSAPI_Write_r( pReq, pBody, bodyLen ); + } + LSAPI_Finish_r( pReq ); + return 0; +} + + +static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]); + +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse(unsigned char *buf, unsigned longs) +{ + uint32 t; + do { + t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32 *) buf = t; + buf += 4; + } while (--longs); +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void lsapi_MD5Init(struct lsapi_MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; } +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void lsapi_MD5Update(struct lsapi_MD5Context *ctx, unsigned char const *buf, unsigned len) +{ + register uint32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memmove(p, buf, len); + return; + } + memmove(p, buf, t); + byteReverse(ctx->in, 16); + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memmove(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memmove(ctx->in, buf, len); +} /* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: sw=4 ts=4 fdm=marker - * vim<600: sw=4 ts=4 + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) */ +void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *ctx) +{ + unsigned int count; + unsigned char *p; + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + ((uint32 *) ctx->in)[14] = ctx->bits[0]; + ((uint32 *) ctx->in)[15] = ctx->bits[1]; + + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + memmove(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]) +{ + register uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} diff --git a/sapi/litespeed/lsapilib.h b/sapi/litespeed/lsapilib.h index 538a170b44cd8..b0638fd436a09 100644 --- a/sapi/litespeed/lsapilib.h +++ b/sapi/litespeed/lsapilib.h @@ -1,24 +1,5 @@ - -/* - +----------------------------------------------------------------------+ - | PHP Version 5 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2013 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: George Wang | - +----------------------------------------------------------------------+ -*/ - /* -Copyright (c) 2007, Lite Speed Technologies Inc. +Copyright (c) 2013, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -49,6 +30,13 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*************************************************************************** + lsapilib.h - description + ------------------- + begin : Mon Feb 21 2005 + copyright : (C) 2005 by George Wang + email : gwang@litespeedtech.com + ***************************************************************************/ #ifndef _LSAPILIB_H_ @@ -118,7 +106,8 @@ typedef struct lsapi_request char * m_pRequestMethod; int m_totalLen; int m_reqState; - int m_reqBodyRead; + off_t m_reqBodyLen; + off_t m_reqBodyRead; int m_bufProcessed; int m_bufRead; @@ -126,6 +115,7 @@ typedef struct lsapi_request struct lsapi_resp_header m_respHeader; short m_respHeaderLen[LSAPI_MAX_RESP_HEADERS]; + void * m_pAppData; }LSAPI_Request; @@ -170,22 +160,30 @@ int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name ); -int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int len ); +ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t len ); int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ); -int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *getLF ); +int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF ); int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ); -int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ); +ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len ); -int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ); +ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size ); + +ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len ); int LSAPI_Flush_r( LSAPI_Request * pReq ); -int LSAPI_AppendRespHeader_r( LSAPI_Request * pHeader, char * pBuf, int len ); +int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len ); + +int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName, + const char * pHeaderValue ); + +int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders, + const char * pBody, int bodyLen ); static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code ) { @@ -195,6 +193,21 @@ static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code ) return 0; } +static inline int LSAPI_SetAppData_r( LSAPI_Request * pReq, void * data ) +{ + if ( !pReq ) + return -1; + pReq->m_pAppData = data; + return 0; +} + +static inline void * LSAPI_GetAppData_r( LSAPI_Request * pReq ) +{ + if ( !pReq ) + return NULL; + return pReq->m_pAppData; +} + static inline char * LSAPI_GetQueryString_r( LSAPI_Request * pReq ) { if ( pReq ) @@ -228,21 +241,22 @@ static inline char * LSAPI_GetRequestMethod_r( LSAPI_Request * pReq) -static inline int LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq ) +static inline off_t LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq ) { if ( pReq ) - return pReq->m_pHeader->m_reqBodyLen; + return pReq->m_reqBodyLen; return -1; } -static inline int LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq ) +static inline off_t LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq ) { if ( pReq ) - return pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead; + return pReq->m_reqBodyLen - pReq->m_reqBodyRead; return -1; } + int LSAPI_Is_Listen(void); static inline int LSAPI_Accept( void ) @@ -282,13 +296,13 @@ static inline char * LSAPI_GetScriptName() static inline char * LSAPI_GetRequestMethod() { return LSAPI_GetRequestMethod_r( &g_req ); } -static inline int LSAPI_GetReqBodyLen() +static inline off_t LSAPI_GetReqBodyLen() { return LSAPI_GetReqBodyLen_r( &g_req ); } -static inline int LSAPI_GetReqBodyRemain() +static inline off_t LSAPI_GetReqBodyRemain() { return LSAPI_GetReqBodyRemain_r( &g_req ); } -static inline int LSAPI_ReadReqBody( char * pBuf, int len ) +static inline ssize_t LSAPI_ReadReqBody( char * pBuf, size_t len ) { return LSAPI_ReadReqBody_r( &g_req, pBuf, len ); } static inline int LSAPI_ReqBodyGetChar() @@ -302,10 +316,15 @@ static inline int LSAPI_ReqBodyGetLine( char * pBuf, int len, int *getLF ) static inline int LSAPI_FinalizeRespHeaders(void) { return LSAPI_FinalizeRespHeaders_r( &g_req ); } -static inline int LSAPI_Write( const char * pBuf, int len ) +static inline ssize_t LSAPI_Write( const char * pBuf, ssize_t len ) { return LSAPI_Write_r( &g_req, pBuf, len ); } -static inline int LSAPI_Write_Stderr( const char * pBuf, int len ) +static inline ssize_t LSAPI_sendfile( int fdIn, off_t* off, size_t size ) +{ + return LSAPI_sendfile_r(&g_req, fdIn, off, size ); +} + +static inline ssize_t LSAPI_Write_Stderr( const char * pBuf, ssize_t len ) { return LSAPI_Write_Stderr_r( &g_req, pBuf, len ); } static inline int LSAPI_Flush() @@ -317,6 +336,9 @@ static inline int LSAPI_AppendRespHeader( char * pBuf, int len ) static inline int LSAPI_SetRespStatus( int code ) { return LSAPI_SetRespStatus_r( &g_req, code ); } +static inline int LSAPI_ErrResponse( int code, const char ** pRespHeaders, const char * pBody, int bodyLen ) +{ return LSAPI_ErrResponse_r( &g_req, code, pRespHeaders, pBody, bodyLen ); } + int LSAPI_IsRunning(void); int LSAPI_CreateListenSock( const char * pBind, int backlog ); @@ -341,7 +363,13 @@ void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle ); void LSAPI_Set_Max_Process_Time( int secs ); -void LSAPI_Init_Env_Parameters( fn_select_t fp ); +int LSAPI_Init_Env_Parameters( fn_select_t fp ); + +void LSAPI_Set_Slow_Req_Msecs( int msecs ); + +int LSAPI_Get_Slow_Req_Msecs( ); + +int LSAPI_is_suEXEC_Daemon(); #if defined (c_plusplus) || defined (__cplusplus) } From 9d75b9fb27cd93c19cd168a486ab2efe2ce2aa78 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 6 Nov 2013 16:53:45 +0800 Subject: [PATCH 0277/1256] Revert "Fixed issue #115 (path issue when using phar)." We need another better way to fix this This reverts commit 098855433dc5d609e3970f0bc9d6766c007273f3. Conflicts: ext/opcache/ZendAccelerator.c --- NEWS | 1 - ext/opcache/ZendAccelerator.c | 44 ++++------------------------------- 2 files changed, 5 insertions(+), 40 deletions(-) diff --git a/NEWS b/NEWS index 26990debce239..3a690bbafe6e4 100644 --- a/NEWS +++ b/NEWS @@ -75,7 +75,6 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: - . Fixed issue #115 (path issue when using phar). (Laruence) . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 8cee80f77693d..72b5a1b9fe7e7 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -37,7 +37,6 @@ #include "zend_API.h" #include "zend_ini.h" #include "TSRM/tsrm_virtual_cwd.h" -#include "ext/phar/php_phar.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" @@ -145,21 +144,6 @@ static inline int is_cacheable_stream_path(const char *filename) memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; } -static inline int is_phar_relative_alias_path(const char *filename, char **alias, int *alias_len) -{ - if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 - && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { - char *slash; - *alias = (char*)filename + sizeof("phar://") - 1; - slash = strstr(*alias, "/"); - if (slash) { - *alias_len = slash - *alias; - return 1; - } - } - return 0; -} - /* O+ overrides PHP chdir() function and remembers the current working directory * in ZCG(cwd) and ZCG(cwd_len). Later accel_getcwd() can use stored value and * avoid getcwd() call. @@ -1044,33 +1028,15 @@ char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_lengt } memcpy(ZCG(key) + cur_len, include_path, include_path_len); ZCG(key)[key_length] = '\0'; - } else { - /* not use_cwd */ - key_length = path_length; + } else { + /* not use_cwd */ + key_length = path_length; if ((size_t)key_length >= sizeof(ZCG(key))) { ZCG(key_len) = 0; return NULL; - } else { - char *alias; - int alias_len; - if (is_phar_relative_alias_path(file_handle->filename, &alias, &alias_len)) { - char *phar_path; - int phar_path_len; - if (phar_resolve_alias(alias, alias_len, &phar_path, &phar_path_len TSRMLS_CC) == SUCCESS) { - int filename_len = strlen(file_handle->filename); - memcpy(ZCG(key), "phar://", sizeof("phar://") -1); - memcpy(ZCG(key) + sizeof("phar://") - 1, phar_path, phar_path_len); - memcpy(ZCG(key) + sizeof("phar://") - 1 + phar_path_len, - alias + alias_len, filename_len - alias_len - sizeof("phar://") + 2); - key_length = filename_len + (phar_path_len - alias_len); - } else { - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } - } else { - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } } - } + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } *key_len = ZCG(key_len) = key_length; return ZCG(key); From c439ac6c3558363059a743941e85586e12a808de Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 10 Jul 2013 11:17:52 -0700 Subject: [PATCH 0278/1256] Cleanup temp test file --- ext/spl/tests/SplFileObject_rewind_error001.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/spl/tests/SplFileObject_rewind_error001.phpt b/ext/spl/tests/SplFileObject_rewind_error001.phpt index bdb3301e6349b..ac536a0a44af5 100644 --- a/ext/spl/tests/SplFileObject_rewind_error001.phpt +++ b/ext/spl/tests/SplFileObject_rewind_error001.phpt @@ -13,6 +13,10 @@ $fo = new SplFileObject('testdata.csv'); $fo->rewind( "invalid" ); +?> +--CLEAN-- + --EXPECTF-- Warning: SplFileObject::rewind() expects exactly 0 parameters, 1 given in %s on line %d From 9c1e1bbc0585c43c46ef450dff42b465af1a97da Mon Sep 17 00:00:00 2001 From: ptarjan Date: Thu, 26 Sep 2013 00:18:05 -0700 Subject: [PATCH 0279/1256] fix many parallel test issues While running these on HHVM I've run into a lot of parallelism issues. I'm backporting all the fixes I had to do in https://github.com/facebook/hiphop-php/blob/master/hphp/tools/import_zend_test.py#L650 to php core. Most of these changes were just filenames that were shared between tests, but I did more surgery on the fixed ports. I can apreciate port 31337 as much as the next nerd, but random ports are better for tests. --- ext/ftp/tests/ftp_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_get_large.phpt | 4 ++-- .../tests/SplFileObject_getflags_basic.phpt | 6 +++--- .../SplFileObject_getflags_error001.phpt | 6 +++--- .../SplFileObject_getflags_error002.phpt | 6 +++--- .../tests/SplFileObject_rewind_error001.phpt | 6 +++--- .../tests/file/fgets_socket_variation1.phpt | 12 +++++++++--- .../tests/file/fgets_socket_variation2.phpt | 12 +++++++++--- .../file/file_put_contents_variation9.phpt | 8 ++++---- .../tests/file/fread_socket_variation1.phpt | 9 ++++++++- .../tests/general_functions/bug41445_1.phpt | 2 +- .../tests/network/fsockopen_basic.phpt | 10 ++++++++-- .../tests/network/fsockopen_variation1.phpt | 10 ++++++++-- ext/standard/tests/network/shutdown.phpt | 18 +++++++++++++----- .../network/socket_get_status_basic.phpt | 14 +++++++++++--- ext/standard/tests/network/tcp4loop.phpt | 13 ++++++++++--- ext/standard/tests/network/tcp6loop.phpt | 14 +++++++++++--- ext/standard/tests/network/udp6loop.phpt | 14 +++++++++++--- .../streams/stream_set_timeout_error.phpt | 12 +++++++++--- .../tests/strings/vfprintf_basic1.phpt | 2 +- .../tests/strings/vfprintf_basic2.phpt | 2 +- .../tests/strings/vfprintf_basic3.phpt | 2 +- .../tests/strings/vfprintf_basic4.phpt | 2 +- .../tests/strings/vfprintf_basic5.phpt | 2 +- .../tests/strings/vfprintf_basic6.phpt | 2 +- .../tests/strings/vfprintf_basic7.phpt | 2 +- .../tests/strings/vfprintf_basic7_64bit.phpt | 2 +- .../tests/strings/vfprintf_basic8.phpt | 2 +- .../tests/strings/vfprintf_basic9.phpt | 2 +- .../tests/strings/vfprintf_variation10.phpt | Bin 2963 -> 2979 bytes .../tests/strings/vfprintf_variation11.phpt | 2 +- .../strings/vfprintf_variation11_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation12.phpt | 2 +- .../strings/vfprintf_variation12_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation13.phpt | 2 +- .../strings/vfprintf_variation13_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation14.phpt | 2 +- .../strings/vfprintf_variation14_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation15.phpt | 2 +- .../strings/vfprintf_variation15_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation16.phpt | 2 +- .../strings/vfprintf_variation16_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation17.phpt | 2 +- .../tests/strings/vfprintf_variation18.phpt | 2 +- .../tests/strings/vfprintf_variation19.phpt | 2 +- .../strings/vfprintf_variation19_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation20.phpt | 2 +- .../tests/strings/vfprintf_variation21.phpt | 2 +- .../tests/strings/vfprintf_variation3.phpt | 2 +- .../tests/strings/vfprintf_variation4.phpt | 2 +- .../strings/vfprintf_variation4_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation5.phpt | 2 +- .../tests/strings/vfprintf_variation6.phpt | 2 +- .../tests/strings/vfprintf_variation7.phpt | Bin 2391 -> 2406 bytes .../tests/strings/vfprintf_variation8.phpt | 2 +- .../tests/strings/vfprintf_variation9.phpt | Bin 1857 -> 1872 bytes ext/zlib/tests/gzeof_variation1.phpt | 2 +- ext/zlib/tests/gzfile_basic.phpt | 2 +- ext/zlib/tests/gzfile_basic2.phpt | 2 +- ext/zlib/tests/gzopen_basic2.phpt | 2 +- ext/zlib/tests/gzputs_basic.phpt | 2 +- ext/zlib/tests/gzread_variation1.phpt | 2 +- ext/zlib/tests/gzwrite_basic.phpt | 2 +- ext/zlib/tests/gzwrite_error.phpt | 2 +- ext/zlib/tests/gzwrite_error2.phpt | 2 +- ext/zlib/tests/readgzfile_basic.phpt | 2 +- ext/zlib/tests/readgzfile_basic2.phpt | 2 +- ext/zlib/tests/zlib_wrapper_fflush_basic.phpt | 2 +- .../tests/zlib_wrapper_ftruncate_basic.phpt | 2 +- 74 files changed, 185 insertions(+), 109 deletions(-) diff --git a/ext/ftp/tests/ftp_fget_basic1.phpt b/ext/ftp/tests/ftp_fget_basic1.phpt index 475f7183d2532..5909d35cef608 100644 --- a/ext/ftp/tests/ftp_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic2.phpt b/ext/ftp/tests/ftp_fget_basic2.phpt index 00a26752d9150..622cea3683b0d 100644 --- a/ext/ftp/tests/ftp_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic3.phpt b/ext/ftp/tests/ftp_fget_basic3.phpt index b7098701ab12e..9485473b1c6a3 100644 --- a/ext/ftp/tests/ftp_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_nb_fget_basic1.phpt b/ext/ftp/tests/ftp_nb_fget_basic1.phpt index cac4eec56bc99..5e6389ff1336a 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_nb_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic2.phpt b/ext/ftp/tests/ftp_nb_fget_basic2.phpt index dc92f4e23bc99..215b79ac4a986 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic3.phpt b/ext/ftp/tests/ftp_nb_fget_basic3.phpt index d1a87c4f3dfe3..66daf2ba0a030 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_get_large.phpt b/ext/ftp/tests/ftp_nb_get_large.phpt index 3fbf2a4831d14..0c354d7c1978f 100644 --- a/ext/ftp/tests/ftp_nb_get_large.phpt +++ b/ext/ftp/tests/ftp_nb_get_large.phpt @@ -18,7 +18,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_get_large.txt"; touch($local_file); ftp_nb_get($ftp, $local_file, 'fget_large.txt', FTP_BINARY, 5368709119); $fp = fopen($local_file, 'r'); @@ -29,7 +29,7 @@ fclose($fp); ?> --CLEAN-- --EXPECT-- string(1) "X" diff --git a/ext/spl/tests/SplFileObject_getflags_basic.phpt b/ext/spl/tests/SplFileObject_getflags_basic.phpt index 5addadf38046e..88cf6861a2921 100644 --- a/ext/spl/tests/SplFileObject_getflags_basic.phpt +++ b/ext/spl/tests/SplFileObject_getflags_basic.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::DROP_NEW_LINE); var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error001.phpt b/ext/spl/tests/SplFileObject_getflags_error001.phpt index 1602f88885e11..ca53c857e7e6b 100644 --- a/ext/spl/tests/SplFileObject_getflags_error001.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error001.phpt @@ -7,10 +7,10 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->setFlags(SplFileObject::DROP_NEW_LINE); @@ -20,7 +20,7 @@ var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error002.phpt b/ext/spl/tests/SplFileObject_getflags_error002.phpt index e2c8255f44960..00fd351db8cca 100644 --- a/ext/spl/tests/SplFileObject_getflags_error002.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error002.phpt @@ -5,9 +5,9 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->getFlags('fake'); @@ -15,7 +15,7 @@ $fo->getFlags('fake'); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::getFlags() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/spl/tests/SplFileObject_rewind_error001.phpt b/ext/spl/tests/SplFileObject_rewind_error001.phpt index ac536a0a44af5..5f2379aa13911 100644 --- a/ext/spl/tests/SplFileObject_rewind_error001.phpt +++ b/ext/spl/tests/SplFileObject_rewind_error001.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- rewind( "invalid" ); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::rewind() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/standard/tests/file/fgets_socket_variation1.phpt b/ext/standard/tests/file/fgets_socket_variation1.phpt index 57944d8b563c1..429ad67d69677 100644 --- a/ext/standard/tests/file/fgets_socket_variation1.phpt +++ b/ext/standard/tests/file/fgets_socket_variation1.phpt @@ -5,11 +5,17 @@ Dave Kelsey --FILE-- --FILE-- --EXPECTF-- diff --git a/ext/standard/tests/network/tcp4loop.phpt b/ext/standard/tests/network/tcp4loop.phpt index afd955918e8fb..a163cd9b35816 100644 --- a/ext/standard/tests/network/tcp4loop.phpt +++ b/ext/standard/tests/network/tcp4loop.phpt @@ -2,14 +2,21 @@ Streams Based IPv4 TCP Loopback test --FILE-- --FILE-- --FILE-- P%01CC;505bXoQ~&?~ diff --git a/ext/standard/tests/strings/vfprintf_variation11.phpt b/ext/standard/tests/strings/vfprintf_variation11.phpt index 45f1f61fa63f6..4bc38851d271e 100644 --- a/ext/standard/tests/strings/vfprintf_variation11.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt index d6549846b5a55..a55297999ee45 100644 --- a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12.phpt b/ext/standard/tests/strings/vfprintf_variation12.phpt index e95fd5bb7f972..f0fa354ea639a 100644 --- a/ext/standard/tests/strings/vfprintf_variation12.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt index a1e57bc42c7ab..fe786d3f495d2 100644 --- a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13.phpt b/ext/standard/tests/strings/vfprintf_variation13.phpt index 245feb5a2388a..fd3424242458b 100644 --- a/ext/standard/tests/strings/vfprintf_variation13.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt index bf6fcb5ec0005..68baed853745e 100644 --- a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14.phpt b/ext/standard/tests/strings/vfprintf_variation14.phpt index c714d89758cdb..0173a27fb7071 100644 --- a/ext/standard/tests/strings/vfprintf_variation14.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt index 930ee3d03de83..fb34befd3ccc5 100644 --- a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15.phpt b/ext/standard/tests/strings/vfprintf_variation15.phpt index 95667b5a81895..19e319a557d8b 100644 --- a/ext/standard/tests/strings/vfprintf_variation15.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt index d2e331c2d3b4a..7bb0d150e01e6 100644 --- a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16.phpt b/ext/standard/tests/strings/vfprintf_variation16.phpt index 21630521b8dc1..4995ab02a4243 100644 --- a/ext/standard/tests/strings/vfprintf_variation16.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt index 381e67c3397a9..16d0624018066 100644 --- a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation17.phpt b/ext/standard/tests/strings/vfprintf_variation17.phpt index 871ae98d857e6..6c17b801f6f23 100644 --- a/ext/standard/tests/strings/vfprintf_variation17.phpt +++ b/ext/standard/tests/strings/vfprintf_variation17.phpt @@ -34,7 +34,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation17.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation18.phpt b/ext/standard/tests/strings/vfprintf_variation18.phpt index 76168621c3a51..5467753dc0a3e 100644 --- a/ext/standard/tests/strings/vfprintf_variation18.phpt +++ b/ext/standard/tests/strings/vfprintf_variation18.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation18.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19.phpt b/ext/standard/tests/strings/vfprintf_variation19.phpt index 7ee01a97e16d0..26c21e1e3c0c3 100644 --- a/ext/standard/tests/strings/vfprintf_variation19.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt index 58810a811aa8c..a56357cfdf58d 100644 --- a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation20.phpt b/ext/standard/tests/strings/vfprintf_variation20.phpt index cd348d8350c35..48fea341edd31 100644 --- a/ext/standard/tests/strings/vfprintf_variation20.phpt +++ b/ext/standard/tests/strings/vfprintf_variation20.phpt @@ -84,7 +84,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation20.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation21.phpt b/ext/standard/tests/strings/vfprintf_variation21.phpt index 4dc9ed5666d4a..09bf703957ef1 100644 --- a/ext/standard/tests/strings/vfprintf_variation21.phpt +++ b/ext/standard/tests/strings/vfprintf_variation21.phpt @@ -81,7 +81,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation21.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation3.phpt b/ext/standard/tests/strings/vfprintf_variation3.phpt index 02535cefb659c..1ae945990cc82 100644 --- a/ext/standard/tests/strings/vfprintf_variation3.phpt +++ b/ext/standard/tests/strings/vfprintf_variation3.phpt @@ -45,7 +45,7 @@ $args_array = array( // and with int values from the above $args_array array /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation3.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4.phpt b/ext/standard/tests/strings/vfprintf_variation4.phpt index 72ca9fe3b9f0a..642f35c46a704 100644 --- a/ext/standard/tests/strings/vfprintf_variation4.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt index f7038ff76c256..6bf814003a3d6 100644 --- a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation5.phpt b/ext/standard/tests/strings/vfprintf_variation5.phpt index 4bac1ebe57a00..eb3646ca1f3af 100644 --- a/ext/standard/tests/strings/vfprintf_variation5.phpt +++ b/ext/standard/tests/strings/vfprintf_variation5.phpt @@ -42,7 +42,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation5.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation6.phpt b/ext/standard/tests/strings/vfprintf_variation6.phpt index 6b5425d5cff1e..b5b82bbc62b06 100644 --- a/ext/standard/tests/strings/vfprintf_variation6.phpt +++ b/ext/standard/tests/strings/vfprintf_variation6.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation6.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation7.phpt b/ext/standard/tests/strings/vfprintf_variation7.phpt index a206fd869113e4a6b21861ea638b51cb2b2831bc..ee836edc774c84a9cd9f83a9b3df8801d98126e8 100644 GIT binary patch delta 32 ncmcaE^h{_22b*wNT0v1}UP)SfSz=LUVo7Fxp7~}THg9GC%$p0C delta 17 YcmaDRbX{lz2OCRDX>P%0X*O?W068NCd;kCd diff --git a/ext/standard/tests/strings/vfprintf_variation8.phpt b/ext/standard/tests/strings/vfprintf_variation8.phpt index cda05c4d79842..a72e260e09bd6 100644 --- a/ext/standard/tests/strings/vfprintf_variation8.phpt +++ b/ext/standard/tests/strings/vfprintf_variation8.phpt @@ -60,7 +60,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation8.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation9.phpt b/ext/standard/tests/strings/vfprintf_variation9.phpt index d10c8aed506e5ccf781091912c459c6fdd7ae235..dd3093c8c9e981b6494d2e7e8cdd2fc534b0a494 100644 GIT binary patch delta 32 ncmX@ecY$w1FpF?mT0v1}UP)SfSz=LUVo7Fxp5^9nmRC#w(0dG) delta 17 Ycmcb>caU#GFbhjcX>P&hG?rIP06V+}cmMzZ diff --git a/ext/zlib/tests/gzeof_variation1.phpt b/ext/zlib/tests/gzeof_variation1.phpt index 6d1e0401dff1c..77a1eccb66bb3 100644 --- a/ext/zlib/tests/gzeof_variation1.phpt +++ b/ext/zlib/tests/gzeof_variation1.phpt @@ -9,7 +9,7 @@ if (!extension_loaded("zlib")) { --FILE-- --FILE-- Date: Thu, 26 Sep 2013 01:06:36 -0700 Subject: [PATCH 0280/1256] fix missing change from 'tcp_socket' to the more common 'server' --- ext/standard/tests/file/fread_socket_variation1.phpt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/standard/tests/file/fread_socket_variation1.phpt b/ext/standard/tests/file/fread_socket_variation1.phpt index f5086ced09122..d65565d3cc11a 100644 --- a/ext/standard/tests/file/fread_socket_variation1.phpt +++ b/ext/standard/tests/file/fread_socket_variation1.phpt @@ -12,11 +12,11 @@ for ($i=0; $i<100; $i++) { } } -socket_set_timeout($tcp_socket, 0, 1000); +socket_set_timeout($server, 0, 1000); -var_dump(fread($tcp_socket, 1)); +var_dump(fread($server, 1)); -fclose($tcp_socket); +fclose($server); ?> --EXPECT-- From 8b6b39fdcffc8486fedd391b8d8aa7700f0c7f93 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Wed, 10 Jul 2013 08:26:47 -0700 Subject: [PATCH 0281/1256] Add a couple more test cases to parse_url() tests http://::# (valid but silly) http://# (invalid) --- ext/standard/tests/url/parse_url_basic_001.phpt | 11 ++++++++++- ext/standard/tests/url/parse_url_basic_002.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_003.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_004.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_005.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_006.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_007.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_008.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_009.phpt | 4 +++- ext/standard/tests/url/urls.inc | 4 +++- 10 files changed, 37 insertions(+), 10 deletions(-) diff --git a/ext/standard/tests/url/parse_url_basic_001.phpt b/ext/standard/tests/url/parse_url_basic_001.phpt index 1edc32eabad53..4c5b0944c6603 100644 --- a/ext/standard/tests/url/parse_url_basic_001.phpt +++ b/ext/standard/tests/url/parse_url_basic_001.phpt @@ -743,6 +743,13 @@ echo "Done"; string(1) ":" } +--> http://::#: array(2) { + ["scheme"]=> + string(4) "http" + ["host"]=> + string(1) ":" +} + --> x://::6.5: array(3) { ["scheme"]=> string(1) "x" @@ -856,6 +863,8 @@ echo "Done"; --> http://?: bool(false) +--> http://#: bool(false) + --> http://?:: bool(false) --> http://:?: bool(false) @@ -863,4 +872,4 @@ echo "Done"; --> http://blah.com:123456: bool(false) --> http://blah.com:abcdef: bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_002.phpt b/ext/standard/tests/url/parse_url_basic_002.phpt index 464e977ffc7a4..ed0f08a84f534 100644 --- a/ext/standard/tests/url/parse_url_basic_002.phpt +++ b/ext/standard/tests/url/parse_url_basic_002.phpt @@ -96,6 +96,7 @@ echo "Done"; --> x:/blah.com : string(1) "x" --> x://::abc/? : bool(false) --> http://::? : string(4) "http" +--> http://::# : string(4) "http" --> x://::6.5 : string(1) "x" --> http://?:/ : string(4) "http" --> http://@?:/ : string(4) "http" @@ -118,8 +119,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_003.phpt b/ext/standard/tests/url/parse_url_basic_003.phpt index 57f182bfa311d..a2bbfa6482bd6 100644 --- a/ext/standard/tests/url/parse_url_basic_003.phpt +++ b/ext/standard/tests/url/parse_url_basic_003.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : NULL --> x://::abc/? : bool(false) --> http://::? : string(1) ":" +--> http://::# : string(1) ":" --> x://::6.5 : string(1) ":" --> http://?:/ : string(1) "?" --> http://@?:/ : string(1) "?" @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_004.phpt b/ext/standard/tests/url/parse_url_basic_004.phpt index 6abf4ed453c9e..839ebee554fff 100644 --- a/ext/standard/tests/url/parse_url_basic_004.phpt +++ b/ext/standard/tests/url/parse_url_basic_004.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : NULL --> x://::abc/? : bool(false) --> http://::? : NULL +--> http://::# : NULL --> x://::6.5 : int(6) --> http://?:/ : NULL --> http://@?:/ : NULL @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_005.phpt b/ext/standard/tests/url/parse_url_basic_005.phpt index 3bcc89106d2e4..c113461fe7591 100644 --- a/ext/standard/tests/url/parse_url_basic_005.phpt +++ b/ext/standard/tests/url/parse_url_basic_005.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : NULL --> x://::abc/? : bool(false) --> http://::? : NULL +--> http://::# : NULL --> x://::6.5 : NULL --> http://?:/ : NULL --> http://@?:/ : string(0) "" @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_006.phpt b/ext/standard/tests/url/parse_url_basic_006.phpt index 741a424a616d9..24de1cc23384f 100644 --- a/ext/standard/tests/url/parse_url_basic_006.phpt +++ b/ext/standard/tests/url/parse_url_basic_006.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : NULL --> x://::abc/? : bool(false) --> http://::? : NULL +--> http://::# : NULL --> x://::6.5 : NULL --> http://?:/ : NULL --> http://@?:/ : NULL @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_007.phpt b/ext/standard/tests/url/parse_url_basic_007.phpt index bf8f98042e63f..d4006879f4e99 100644 --- a/ext/standard/tests/url/parse_url_basic_007.phpt +++ b/ext/standard/tests/url/parse_url_basic_007.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : string(9) "/blah.com" --> x://::abc/? : bool(false) --> http://::? : NULL +--> http://::# : NULL --> x://::6.5 : NULL --> http://?:/ : string(1) "/" --> http://@?:/ : string(1) "/" @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_008.phpt b/ext/standard/tests/url/parse_url_basic_008.phpt index a61fd06943cc0..b283829c46624 100644 --- a/ext/standard/tests/url/parse_url_basic_008.phpt +++ b/ext/standard/tests/url/parse_url_basic_008.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : NULL --> x://::abc/? : bool(false) --> http://::? : NULL +--> http://::# : NULL --> x://::6.5 : NULL --> http://?:/ : NULL --> http://@?:/ : NULL @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/parse_url_basic_009.phpt b/ext/standard/tests/url/parse_url_basic_009.phpt index 5302388f6f515..a7d70f34da7ec 100644 --- a/ext/standard/tests/url/parse_url_basic_009.phpt +++ b/ext/standard/tests/url/parse_url_basic_009.phpt @@ -95,6 +95,7 @@ echo "Done"; --> x:/blah.com : NULL --> x://::abc/? : bool(false) --> http://::? : NULL +--> http://::# : NULL --> x://::6.5 : NULL --> http://?:/ : NULL --> http://@?:/ : NULL @@ -117,8 +118,9 @@ echo "Done"; --> http://@:/ : bool(false) --> http://:/ : bool(false) --> http://? : bool(false) +--> http://# : bool(false) --> http://?: : bool(false) --> http://:? : bool(false) --> http://blah.com:123456 : bool(false) --> http://blah.com:abcdef : bool(false) -Done \ No newline at end of file +Done diff --git a/ext/standard/tests/url/urls.inc b/ext/standard/tests/url/urls.inc index 27521c852007e..4192f4a869770 100644 --- a/ext/standard/tests/url/urls.inc +++ b/ext/standard/tests/url/urls.inc @@ -75,6 +75,7 @@ $urls = array( 'x:/blah.com', 'x://::abc/?', 'http://::?', +'http://::#', 'x://::6.5', 'http://?:/', 'http://@?:/', @@ -99,6 +100,7 @@ $urls = array( 'http://@:/', 'http://:/', 'http://?', +'http://#', 'http://?:', 'http://:?', 'http://blah.com:123456', @@ -106,4 +108,4 @@ $urls = array( ); -?> \ No newline at end of file +?> From 929bf11e910ec3fc85617a1c766bba31bad22c26 Mon Sep 17 00:00:00 2001 From: Ferenc Kovacs Date: Wed, 6 Nov 2013 11:17:58 +0100 Subject: [PATCH 0282/1256] bump API versions --- Zend/zend_extensions.h | 2 +- Zend/zend_modules.h | 2 +- main/php.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 83cad7f38d648..e7f289a656097 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -28,7 +28,7 @@ /* The first number is the engine version and the rest is the date. * This way engine 2/3 API no. is always greater than engine 1 API no.. */ -#define ZEND_EXTENSION_API_NO 220121212 +#define ZEND_EXTENSION_API_NO 220131106 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index d4adcf5aac982..00209a0ddc81d 100644 --- a/Zend/zend_modules.h +++ b/Zend/zend_modules.h @@ -33,7 +33,7 @@ #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module TSRMLS_DC #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module TSRMLS_CC -#define ZEND_MODULE_API_NO 20121212 +#define ZEND_MODULE_API_NO 20131106 #ifdef ZTS #define USING_ZTS 1 #else diff --git a/main/php.h b/main/php.h index f9c6f2030c839..ed8a2bb08e5dc 100644 --- a/main/php.h +++ b/main/php.h @@ -26,7 +26,7 @@ #include #endif -#define PHP_API_VERSION 20121113 +#define PHP_API_VERSION 20131106 #define PHP_HAVE_STREAMS #define YYDEBUG 0 From 1d93f396bb3a09e2e70f317b5c2b9f3235b383e7 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 6 Nov 2013 13:38:53 +0100 Subject: [PATCH 0283/1256] configure output alignment --- ext/zip/config.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/zip/config.m4 b/ext/zip/config.m4 index 83e32feca76ee..56ae6a5b29f51 100644 --- a/ext/zip/config.m4 +++ b/ext/zip/config.m4 @@ -11,10 +11,10 @@ if test -z "$PHP_ZLIB_DIR"; then fi PHP_ARG_WITH(pcre-dir, pcre install prefix, -[ --with-pcre-dir ZIP: pcre install prefix], no, no) +[ --with-pcre-dir ZIP: pcre install prefix], no, no) PHP_ARG_WITH(libzip, libzip, -[ --with-libzip[=DIR] ZIP: use libzip], no, no) +[ --with-libzip[=DIR] ZIP: use libzip], no, no) if test "$PHP_ZIP" != "no"; then From 117955daf647dbfa66e5130b9b6dda35e8288785 Mon Sep 17 00:00:00 2001 From: Ferenc Kovacs Date: Wed, 6 Nov 2013 11:17:58 +0100 Subject: [PATCH 0284/1256] bump API versions --- Zend/zend_extensions.h | 2 +- Zend/zend_modules.h | 2 +- main/php.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 83cad7f38d648..e7f289a656097 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -28,7 +28,7 @@ /* The first number is the engine version and the rest is the date. * This way engine 2/3 API no. is always greater than engine 1 API no.. */ -#define ZEND_EXTENSION_API_NO 220121212 +#define ZEND_EXTENSION_API_NO 220131106 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index d4adcf5aac982..00209a0ddc81d 100644 --- a/Zend/zend_modules.h +++ b/Zend/zend_modules.h @@ -33,7 +33,7 @@ #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module TSRMLS_DC #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module TSRMLS_CC -#define ZEND_MODULE_API_NO 20121212 +#define ZEND_MODULE_API_NO 20131106 #ifdef ZTS #define USING_ZTS 1 #else diff --git a/main/php.h b/main/php.h index f9c6f2030c839..ed8a2bb08e5dc 100644 --- a/main/php.h +++ b/main/php.h @@ -26,7 +26,7 @@ #include #endif -#define PHP_API_VERSION 20121113 +#define PHP_API_VERSION 20131106 #define PHP_HAVE_STREAMS #define YYDEBUG 0 From d17b684b912ca1ec3724883e0edbc6927ab913a9 Mon Sep 17 00:00:00 2001 From: Ferenc Kovacs Date: Wed, 6 Nov 2013 13:17:52 +0100 Subject: [PATCH 0285/1256] bump version, empty NEWS, UPGRADING and UPGRADING.INTERNALS --- NEWS | 78 +---------------------------------- UPGRADING | 72 --------------------------------- UPGRADING.INTERNALS | 99 --------------------------------------------- configure.in | 2 +- main/php_version.h | 6 +-- 5 files changed, 5 insertions(+), 252 deletions(-) diff --git a/NEWS b/NEWS index fdfaef53cb58f..5229ff4c292f8 100644 --- a/NEWS +++ b/NEWS @@ -1,81 +1,5 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 20??, PHP 5.6.0 - -- Core: - . Improved IS_VAR operands fetching. (Laruence, Dmitry) - . Implemented internal operator overloading - (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) - . Made calls from incompatible context issue an E_DEPRECATED warning instead - of E_STRICT (phase 1 of RFC: https://wiki.php.net/rfc/incompat_ctx). - (Gustavo) - . Uploads equal or greater than 2GB in size are now accepted. - (Ralf Lang, Mike) - . Reduced POST data memory usage by 200-300%. Removed INI setting - always_populate_raw_post_data and the $HTTP_RAW_POST_DATA global - variable. (Mike) - . Implemented dedicated syntax for variadic functions - (RFC: https://wiki.php.net/rfc/variadics). (Nikita) - . Fixed bug #50333 Improving multi-threaded scalability by using - emalloc/efree/estrdup (Anatol, Dmitry) - -- cURL: - . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir - or safe_mode). (Adam) - -- GMP: - . Moved GMP to use object as the underlying structure and implemented various - improvements based on this. - (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) - -- Hash: - . Added gost-crypto (CryptoPro S-box) GOST hash algo. (Manuel Mausz) - -- mysqlnd: - . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively - supported by the overlying APIs. (Andrey) - -- OPcache: - . Added an optimization pass to convert FCALL_BY_NAME into DO_FCALL. - (Laruence, Dmitry) - . Added an optimization pass to merged identical constants (and related - cache_slots) in op_array->literals table. (Laruence, Dmitry) - . Added script level constant replacement optimization pass. (Dmitry) - -- Openssl: - . Added crypto_method option for the ssl stream context. (Martin Jansen) - . Added certificate fingerprint support. (Tjerk Meesters) - . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) - . Fixed bug #65729 (CN_match gives false positive). (Tjerk Meesters) - -- PDO_pgsql: - . Fixed Bug #42614 (PDO_pgsql: add pg_get_notify support). (Matteo) - . Fixed Bug #63657 (pgsqlCopyFromFile, pgsqlCopyToArray use Postgres < 7.3 - syntax). (Matteo) - -- Session: - . Fixed Bug #65315 (session.hash_function silently fallback to default md5) - (Yasuo) - . Implemented Request #54649 (Create session_serializer_name()). (Yasuo) - . Implemented Request #17860 (Session write short circuit). (Yasuo) - . Implemented Request #20421 (session_abort() and session_reset() function). - (Yasuo) - . Implemented Request #11100 (session_gc() function). (Yasuo) - -- Standard: - . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version - 1.1). (Adam) - . Implemented Change crypt() behavior w/o salt RFC. (Yasuo) - https://wiki.php.net/rfc/crypt_function_salt - -- XMLReader: - . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). - (Mike) - -- Zip: - . update libzip to version 1.11.1. - PHP don't use any ilibzip private symbol anymore. (Pierre, Remi) - . new method ZipArchive::setPassword($password). (Pierre) - . add --with-libzip option to build with system libzip. (Remi) +?? ??? 20??, PHP 5.7.0 <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index 022918cb14594..e0861880b9ca7 100755 --- a/UPGRADING +++ b/UPGRADING @@ -20,32 +20,11 @@ PHP X.Y UPGRADE NOTES 1. Backward Incompatible Changes ======================================== -- Core: - Removed $HTTP_RAW_POST_DATA global variable. Restore backwards compatibility - by: - ======================================== 2. New Features ======================================== -- Added dedicated syntax for variadic functions. - (https://wiki.php.net/rfc/variadics) - -- The php://input stream is now re-usable and can be used concurrently with - enable_post_data_reading=0. - -- Added gost-crypto (CryptoPro S-box) hash algo. - -- Added openssl certificate fingerprint support (inclusive stream context - option). - -- Added openssl crypto method stream context option. ======================================== 2. Changes in SAPI modules @@ -56,38 +35,16 @@ PHP X.Y UPGRADE NOTES 3. Deprecated Functionality ======================================== -- Incompatible context calls: - Instance calls from an incompatible context are now deprecated and issue - E_DEPRECATED instead of E_STRICT. See https://wiki.php.net/rfc/incompat_ctx ======================================== 4. Changed Functions ======================================== -- cURL: - CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file - do not work unless it is explicitly set to false. - -- Crypt: - crypt() will now raise an E_NOTICE error if the salt parameter is omitted. - See: https://wiki.php.net/rfc/crypt_function_salt - -- XMLReader: - XMLReader::getAttributeNs and XMLReader::getAttributeNo now return NULL if - the attribute could not be found, just like XMLReader::getAttribute. ======================================== 5. New Functions ======================================== -- Openssl: - Added string openssl_x509_fingerprint($x509, $type, $binary). - -- LDAP: - Added ldap_escape($value, $ignore = "", $flags = 0). - -- Zip: - Added ZipArchive::setPassword($password) ======================================== 6. New Classes and Interfaces @@ -103,47 +60,18 @@ PHP X.Y UPGRADE NOTES 8. Other Changes to Extensions ======================================== -- GMP: - The GMP extension now uses objects as the underlying data structure, rather - than resources. GMP instances now support dumping, serialization, cloning, - casts to primitive types and have overloaded operators. - (RFC: https://wiki.php.net/rfc/operator_overloading_gmp) - -- OCI8: - - Added Implicit Result Set support for Oracle Database 12c with a - new oci_get_implicit_resultset() function. - - Using 'oci_execute($s, OCI_NO_AUTO_COMMIT)' for a SELECT no longer - unnecessarily initiates an internal ROLLBACK during connection - close. - - Added DTrace probes enabled with PHP's generic --enable-dtrace - - The oci_internal_debug() function is now a no-op. - - The phpinfo() output format for OCI8 has changed. ======================================== 9. New Global Constants ======================================== -- LDAP: - LDAP_ESCAPE_FILTER int(1) - LDAP_ESCAPE_DN int(2) ======================================== 10. Changes to INI File Handling ======================================== -- Core: - Removed always_populate_raw_post_data. ======================================== 11. Other Changes ======================================== -- File upload: - Uploads equal or greater than 2GB in size are now accepted. - -- HTTP stream wrapper: - HTTP 1.1 requests now include a Connection: close header unless explicitly - overridden by setting a Connection header via the header context option. - -- Zip: - New --with-libzip option allow to use system libzip. Version > 0.11 required. diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index d1aca29dc4533..d24aabeaabc53 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -17,108 +17,9 @@ UPGRADE NOTES - PHP X.Y 1. Internal API changes ======================== - a. Addition of do_operation and compare object handlers - - Two new object handlers have been added: - - do_operation: - typedef int (*zend_object_do_operation_t)( - zend_uchar opcode, zval *result, zval *op1, zval *op2 TSRMLS_DC - ); - - compare: - typedef int (*zend_object_compare_zvals_t)( - zval *result, zval *op1, zval *op2 TSRMLS_DC - ); - - The first handler is used to overload arithmetic operations. The first - argument specifies the opcode of the operator, result is the target zval, - op1 the first operand and op2 the second operand. For unary operations - op2 is NULL. If the handler returns FAILURE PHP falls back to the default - behavior for the operation. - - The second handler is used to perform comparison operations with - non-objects. The value written into result must be an IS_LONG with value - -1 (smaller), 0 (equal) or 1 (greater). The return value is a SUCCESS/FAILURE - return code. The difference between this handler and compare_objects is - that it will be triggered for comparisons with non-objects and objects of - different types. It takes precedence over compare_objects. - - Further docs in the RFC: https://wiki.php.net/rfc/operator_overloading_gmp - - b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros - - The return_value_ptr argument to internal functions is now always set. - Previously it was only available for functions returning by-reference. - return_value_ptr can now be used to return zvals without copying them. - For this purpose two new macros are provided: - - RETVAL_ZVAL_FAST(zv); /* analog to RETVAL_ZVAL(zv, 1, 0) */ - RETURN_ZVAL_FAST(zv); /* analog to RETURN_ZVAL(zv, 1, 0) */ - - The macros behave similarly to the non-FAST variants with copy=1 and - dtor=0, but will try to return the zval without making a copy by utilizing - return_value_ptr. - - c. POST data handling - - The sapi_request_info's members post_data, post_data_len and raw_post_data as - well as raw_post_data_len have been replaced with a temp PHP stream - request_body. - - The recommended way to access raw POST data is to open and use a php://input - stream wrapper. It is safe to be used concurrently and more than once. - - d. Arginfo changes - - The pass_rest_by_reference argument of the ZEND_BEGIN_ARG_INFO and - ZEND_BEGIN_ARG_INFO_EX() is no longer used. The value passed to it is ignored. - - Instead a variadic argument is created using ZEND_ARG_VARIADIC_INFO(): - - ZEND_ARG_VARIADIC_INFO(0, name) /* pass rest by value */ - ZEND_ARG_VARIADIC_INFO(1, name) /* pass rest by reference */ - ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, name) - /* pass rest by prefer-ref */ - - ZEND_ARG_VARIADIC_INFO() should only be used for the last argument. - - The following changes were applied to the zend_arg_info struct: - - typedef struct _zend_arg_info { - const char *class_name; - zend_uint class_name_len; - zend_uchar type_hint; - + zend_uchar pass_by_reference; - zend_bool allow_null; - - zend_bool pass_by_reference; - + zend_bool is_variadic; - } zend_arg_info; - - The following changes were applied to the zend_internal_function_info struct: - - typedef struct _zend_internal_function_info { - zend_uint required_num_args; - zend_uchar _type_hint; - zend_bool return_reference; - - zend_bool pass_rest_by_reference; - + zend_bool _allow_null; - + zend_bool _is_variadic; - } zend_internal_function_info; - - The CHECK_ARG_SEND_TYPE(), ARG_MUST_BE_SENT_BY_REF(), - ARG_SHOULD_BE_SENT_BY_REF() and ARG_MAY_BE_SENT_BY_REF() macros now assume - that the argument passed to them is a zend_function* and that it is non-NULL. ======================== 2. Build system changes ======================== - a. Unix build system changes - - The bison version check is now a blacklist instead of a whitelist. - - The bison binary can be specified through the YACC environment/configure - variable. Previously `bison` was assumed to be in $PATH. - - b. Windows build system changes - - diff --git a/configure.in b/configure.in index 805aa48f5940f..b74b385c9d076 100644 --- a/configure.in +++ b/configure.in @@ -118,7 +118,7 @@ int zend_sprintf(char *buffer, const char *format, ...); ]) PHP_MAJOR_VERSION=5 -PHP_MINOR_VERSION=6 +PHP_MINOR_VERSION=7 PHP_RELEASE_VERSION=0 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" diff --git a/main/php_version.h b/main/php_version.h index d48bf13c6f7ff..87c2e4ac4d8f7 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -1,8 +1,8 @@ /* automatically generated by configure */ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 -#define PHP_MINOR_VERSION 6 +#define PHP_MINOR_VERSION 7 #define PHP_RELEASE_VERSION 0 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.6.0-dev" -#define PHP_VERSION_ID 50600 +#define PHP_VERSION "5.7.0-dev" +#define PHP_VERSION_ID 50700 From 9647c61dc101b9d460259fedb3731026f0390eeb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 6 Nov 2013 22:21:07 +0400 Subject: [PATCH 0286/1256] Constant expressions refactoring --- Zend/zend.h | 20 +- Zend/zend_ast.c | 359 +++++++++++++++++----- Zend/zend_ast.h | 47 +-- Zend/zend_builtin_functions.c | 2 +- Zend/zend_compile.c | 17 +- Zend/zend_compile.h | 6 +- Zend/zend_execute_API.c | 341 ++++++++++---------- Zend/zend_extensions.h | 2 +- Zend/zend_language_parser.y | 80 ++--- Zend/zend_operators.c | 62 ---- Zend/zend_operators.h | 4 - Zend/zend_variables.c | 8 +- Zend/zend_vm_def.h | 1 - Zend/zend_vm_execute.h | 1 - ext/opcache/zend_accelerator_util_funcs.c | 56 ++++ ext/opcache/zend_persist.c | 29 ++ ext/opcache/zend_persist_calc.c | 27 ++ 17 files changed, 656 insertions(+), 406 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index a949c5b0b69e8..a95473b76e99a 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -579,18 +579,18 @@ typedef int (*zend_write_func_t)(const char *str, uint str_length); /* data types */ /* All data types <= IS_BOOL have their constructor/destructors skipped */ -#define IS_NULL 0 -#define IS_LONG 1 -#define IS_DOUBLE 2 -#define IS_BOOL 3 -#define IS_ARRAY 4 -#define IS_OBJECT 5 -#define IS_STRING 6 -#define IS_RESOURCE 7 -#define IS_CONSTANT 8 +#define IS_NULL 0 +#define IS_LONG 1 +#define IS_DOUBLE 2 +#define IS_BOOL 3 +#define IS_ARRAY 4 +#define IS_OBJECT 5 +#define IS_STRING 6 +#define IS_RESOURCE 7 +#define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9 #define IS_CONSTANT_AST 10 -#define IS_CALLABLE 11 +#define IS_CALLABLE 11 /* Ugly hack to support constants as static array indices */ #define IS_CONSTANT_TYPE_MASK 0x00f diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 21c08da51018b..7ebb8d2796cdf 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -13,118 +13,317 @@ | license@zend.com so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Bob Weinand | + | Dmitry Stogov | +----------------------------------------------------------------------+ */ /* $Id$ */ #include "zend_ast.h" -#include "zend_execute.h" +#include "zend_API.h" +#include "zend_operators.h" -#define COPY_ZVAL_TO_OP(nr) \ - if (op##nr) { \ - Z_AST_P(result)->ops[nr] = emalloc(sizeof(zval)); \ - *Z_AST_P(result)->ops[nr] = *op##nr; \ - } else { \ - Z_AST_P(result)->ops[nr] = NULL; \ - } - -void zend_ast_add(zval *result, intermediary_ast_function_type func, char op_count) { - zend_ast *ast = emalloc(sizeof(zend_ast) + op_count * sizeof(zval *)); - ast->op_count = op_count; - ast->ops = (zval **)(ast + 1); - ast->refcount = 1; - ast->func = func; - Z_AST_P(result) = ast; - Z_TYPE_P(result) = IS_CONSTANT_AST; +ZEND_API zend_ast *zend_ast_create_constant_node(zval *zv) +{ + zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zval)); + node->kind = ZEND_CONST; + node->children = 0; + node->u.val = (zval*)(node + 1); + INIT_PZVAL_COPY(node->u.val, zv); + return node; } -/* Do operations on constant operators at compile time (AST building time) */ - -void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0 TSRMLS_DC) { - if (!op0 || !IS_CONSTANT_TYPE(Z_TYPE_P(op0))) { - func(result, op0 TSRMLS_CC); - if (op0) zval_dtor(op0); - return; - } - - zend_ast_add(result, (intermediary_ast_function_type)func, 1); - COPY_ZVAL_TO_OP(0) +ZEND_API zend_ast* zend_ast_create_node1(uint kind, zend_ast *op0) +{ + zend_ast *node = emalloc(sizeof(zend_ast)); + node->kind = kind; + node->children = 1; + node->u.child[0] = op0; + return node; } -void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1 TSRMLS_DC) { - if ((!op0 || !IS_CONSTANT_TYPE(Z_TYPE_P(op0))) && (!op1 || !IS_CONSTANT_TYPE(Z_TYPE_P(op1)))) { - func(result, op0, op1 TSRMLS_CC); - if (op0) zval_dtor(op0); - if (op1) zval_dtor(op1); - return; - } - - zend_ast_add(result, (intermediary_ast_function_type)func, 2); - COPY_ZVAL_TO_OP(0) - COPY_ZVAL_TO_OP(1) +ZEND_API zend_ast* zend_ast_create_node2(uint kind, zend_ast *op0, zend_ast *op1) +{ + zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*)); + node->kind = kind; + node->children = 2; + node->u.child[0] = op0; + node->u.child[1] = op1; + return node; } -void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2 TSRMLS_DC) { - if ((!op0 || !IS_CONSTANT_TYPE(Z_TYPE_P(op0))) && (!op1 || !IS_CONSTANT_TYPE(Z_TYPE_P(op1))) && (!op2 || !IS_CONSTANT_TYPE(Z_TYPE_P(op2)))) { - func(result, op0, op1, op2 TSRMLS_CC); - if (op0) zval_dtor(op0); - if (op1) zval_dtor(op1); - if (op2) zval_dtor(op2); - return; - } - - zend_ast_add(result, (intermediary_ast_function_type)func, 3); - COPY_ZVAL_TO_OP(0) - COPY_ZVAL_TO_OP(1) - COPY_ZVAL_TO_OP(2) +ZEND_API zend_ast* zend_ast_create_node3(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2) +{ + zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*) * 2); + node->kind = kind; + node->children = 3; + node->u.child[0] = op0; + node->u.child[1] = op1; + node->u.child[2] = op2; + return node; } -void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) { +ZEND_API int zend_ast_is_ct_constant(zend_ast *ast) +{ int i; - zval **ops = emalloc((sizeof(zval *) + sizeof(zval)) * ast->op_count); - for (i = ast->op_count; i--;) { - if (ast->ops[i] && IS_CONSTANT_TYPE(Z_TYPE_P(ast->ops[i]))) { - ops[i] = ((zval *)(ops + ast->op_count)) + i; - *ops[i] = *ast->ops[i]; - zval_copy_ctor(ops[i]); - zval_update_constant_ex(&ops[i], (void *)1, NULL TSRMLS_CC); - } else { - ops[i] = ast->ops[i]; + if (ast->kind == ZEND_CONST) { + return !IS_CONSTANT_TYPE(Z_TYPE_P(ast->u.val)); + } else { + for (i = 0; i < ast->children; i++) { + if (ast->u.child[i]) { + if (!zend_ast_is_ct_constant(ast->u.child[i])) { + return 0; + } + } } + return 1; } +} + +ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) +{ + zval op1, op2; - switch (ast->op_count) { - case 1: - ((unary_ast_func)ast->func)(result, ops[0] TSRMLS_CC); + switch (ast->kind) { + case ZEND_ADD: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + add_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_SUB: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + sub_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_MUL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + mul_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_DIV: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + div_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_MOD: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + mod_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_SL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + shift_left_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_SR: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + shift_right_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_CONCAT: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + concat_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_BW_OR: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + bitwise_or_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); break; - case 2: - ((binary_ast_func)ast->func)(result, ops[0], ops[1] TSRMLS_CC); + case ZEND_BW_AND: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + bitwise_and_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); break; - case 3: - ((ternary_ast_func)ast->func)(result, ops[0], ops[1], ops[2] TSRMLS_CC); + case ZEND_BW_XOR: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + bitwise_xor_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); break; + case ZEND_BW_NOT: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + bitwise_not_function(result, &op1 TSRMLS_CC); + zval_dtor(&op1); + break; + case ZEND_BOOL_NOT: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + boolean_not_function(result, &op1 TSRMLS_CC); + zval_dtor(&op1); + break; + case ZEND_BOOL_XOR: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + boolean_xor_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_IS_IDENTICAL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + is_identical_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_IS_NOT_IDENTICAL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + is_not_identical_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_IS_EQUAL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + is_equal_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_IS_NOT_EQUAL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + is_not_equal_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_IS_SMALLER: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + is_smaller_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_IS_SMALLER_OR_EQUAL: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + is_smaller_or_equal_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op1); + zval_dtor(&op2); + break; + case ZEND_CONST: + *result = *ast->u.val; + zval_copy_ctor(result); + if (IS_CONSTANT_TYPE(Z_TYPE_P(result))) { + zval_update_constant(&result, (void *) 1 TSRMLS_CC); + } + break; + case ZEND_BOOL_AND: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + if (zend_is_true(&op1)) { + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + ZVAL_BOOL(result, zend_is_true(&op2)); + zval_dtor(&op2); + } else { + ZVAL_BOOL(result, 0); + } + zval_dtor(&op1); + break; + case ZEND_BOOL_OR: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + if (zend_is_true(&op1)) { + ZVAL_BOOL(result, 1); + } else { + zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + ZVAL_BOOL(result, zend_is_true(&op2)); + zval_dtor(&op2); + } + zval_dtor(&op1); + break; + case ZEND_TERNARY: + zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + if (zend_is_true(&op1)) { + if (!ast->u.child[1]) { + *result = op1; + } else { + zend_ast_evaluate(result, ast->u.child[1] TSRMLS_CC); + zval_dtor(&op1); + } + } else { + zend_ast_evaluate(result, ast->u.child[2] TSRMLS_CC); + zval_dtor(&op1); + } + break; + case ZEND_UNARY_PLUS: + ZVAL_LONG(&op1, 0); + zend_ast_evaluate(&op2, ast->u.child[0] TSRMLS_CC); + add_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op2); + break; + case ZEND_UNARY_MINUS: + ZVAL_LONG(&op1, 0); + zend_ast_evaluate(&op2, ast->u.child[0] TSRMLS_CC); + sub_function(result, &op1, &op2 TSRMLS_CC); + zval_dtor(&op2); + break; + default: + zend_error(E_ERROR, "Unsupported constant expression"); } +} - for (i = ast->op_count; i--;) { - if (ast->ops[i] != ops[i]) { - zval_dtor(ops[i]); +ZEND_API zend_ast *zend_ast_copy(zend_ast *ast) +{ + if (ast == NULL) { + return NULL; + } else if (ast->kind == ZEND_CONST) { + zend_ast *node = zend_ast_create_constant_node(ast->u.val); + zval_copy_ctor(node->u.val); + return node; + } else { + switch (ast->children) { + case 1: + return zend_ast_create_node1( + ast->kind, + zend_ast_copy(ast->u.child[0])); + case 2: + return zend_ast_create_node2( + ast->kind, + zend_ast_copy(ast->u.child[0]), + zend_ast_copy(ast->u.child[1])); + case 3: + return zend_ast_create_node3( + ast->kind, + zend_ast_copy(ast->u.child[0]), + zend_ast_copy(ast->u.child[1]), + zend_ast_copy(ast->u.child[2])); } } - - efree(ops); + return NULL; } -void zend_ast_destroy(zend_ast *ast TSRMLS_DC) { +ZEND_API void zend_ast_destroy(zend_ast *ast) +{ int i; - for (i = ast->op_count; i--;) { - if (ast->ops[i] && !Z_DELREF_P(ast->ops[i])) { - zval_dtor(ast->ops[i]); - efree(ast->ops[i]); + if (ast->kind == ZEND_CONST) { + zval_dtor(ast->u.val); + } else { + for (i = 0; i < ast->children; i++) { + if (ast->u.child[i]) { + zend_ast_destroy(ast->u.child[i]); + } } } - efree(ast); } diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 218f2c02e051f..4c94cf8ac283d 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -13,6 +13,7 @@ | license@zend.com so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Bob Weinand | + | Dmitry Stogov | +----------------------------------------------------------------------+ */ @@ -25,36 +26,36 @@ typedef struct _zend_ast zend_ast; #include "zend.h" -typedef void(*intermediary_ast_function_type)(zval *, ...); -typedef int(*unary_ast_func)(zval *result, zval *op0 TSRMLS_DC); -typedef int(*binary_ast_func)(zval *result, zval *op0, zval *op1 TSRMLS_DC); -typedef int(*ternary_ast_func)(zval *result, zval *op0, zval *op1, zval *op2 TSRMLS_DC); +typedef enum _zend_ast_node_kind { + /* first 256 node kinds are reserved for opcodes */ + ZEND_CONST = 256, + ZEND_BOOL_AND, + ZEND_BOOL_OR, + ZEND_TERNARY, + ZEND_UNARY_PLUS, + ZEND_UNARY_MINUS, +} zend_ast_ode_kind; struct _zend_ast { - char op_count; - zval **ops; - intermediary_ast_function_type func; - int refcount; + unsigned short kind; + unsigned short children; + union { + zval *val; + zend_ast *child[1]; + } u; }; -void zend_ast_add_unary(zval *result, unary_ast_func func, zval *op0 TSRMLS_DC); -void zend_ast_add_binary(zval *result, binary_ast_func func, zval *op0, zval *op1 TSRMLS_DC); -void zend_ast_add_ternary(zval *result, ternary_ast_func func, zval *op0, zval *op1, zval *op2 TSRMLS_DC); +ZEND_API zend_ast *zend_ast_create_constant_node(zval *zv); -void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC); +ZEND_API zend_ast *zend_ast_create_node1(uint kind, zend_ast *op0); +ZEND_API zend_ast *zend_ast_create_node2(uint kind, zend_ast *op0, zend_ast *op1); +ZEND_API zend_ast *zend_ast_create_node3(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2); -void zend_ast_destroy(zend_ast *ast TSRMLS_DC); +ZEND_API int zend_ast_is_ct_constant(zend_ast *ast); -#define ZEND_AST_ADD_REF(ast) ++ast->refcount +ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC); -static inline int ZEND_AST_DEL_REF(zend_ast *ast) { - if (ast->refcount == 1) { - TSRMLS_FETCH(); - - zend_ast_destroy(ast TSRMLS_CC); - return 0; - } - return --ast->refcount; -} +ZEND_API zend_ast *zend_ast_copy(zend_ast *ast); +ZEND_API void zend_ast_destroy(zend_ast *ast); #endif diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 049864c54a67e..d779e8a5ee6a3 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -946,7 +946,7 @@ static void add_class_vars(zend_class_entry *ce, int statics, zval *return_value /* this is necessary to make it able to work with default array * properties, returned to user */ - switch (IS_CONSTANT_TYPE(Z_TYPE_P(prop_copy))) { + if (IS_CONSTANT_TYPE(Z_TYPE_P(prop_copy))) { zval_update_constant(&prop_copy, 0 TSRMLS_CC); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 77da9451532a8..07a9ae88d0963 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5793,8 +5793,8 @@ void zend_do_add_static_array_element(znode *result, znode *offset, const znode key[len + 1] = 0; zend_symtable_update(Z_ARRVAL(result->u.constant), key, len + 2, &element, sizeof(zval *), NULL); efree(key); + break; } - break; case IS_STRING: zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+1, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); @@ -7133,6 +7133,21 @@ void zend_do_end_compilation(TSRMLS_D) /* {{{ */ } /* }}} */ +void zend_do_constant_expression(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ +{ + if (ast->kind == ZEND_CONST) { + result->u.constant = *ast->u.val; + efree(ast); + } else if (zend_ast_is_ct_constant(ast)) { + zend_ast_evaluate(&result->u.constant, ast TSRMLS_CC); + zend_ast_destroy(ast); + } else { + Z_TYPE(result->u.constant) = IS_CONSTANT_AST; + Z_AST(result->u.constant) = ast; + } +} +/* }}} */ + /* {{{ zend_dirname Returns directory name component of path */ ZEND_API size_t zend_dirname(char *path, size_t len) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index b80a7cb84fc6b..76b5348e377da 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -93,6 +93,7 @@ typedef struct _znode { /* used only during compilation */ znode_op op; zval constant; /* replaced by literal/zv */ zend_op_array *op_array; + zend_ast *ast; } u; zend_uint EA; /* extended attributes */ } znode; @@ -639,6 +640,7 @@ void zend_do_end_namespace(TSRMLS_D); void zend_verify_namespace(TSRMLS_D); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_end_compilation(TSRMLS_D); +void zend_do_constant_expression(znode *result, zend_ast *ast TSRMLS_DC); void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static TSRMLS_DC); @@ -722,10 +724,6 @@ int zend_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC); #define ZEND_OP_DATA 137 -/* Pseudo-opcodes for internal object overloading */ -#define ZEND_BOOL_AND -1 -#define ZEND_BOOL_OR -2 - /* END: OPCODES */ /* class fetches */ diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 12047f0518d55..769b333d9d955 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -478,205 +478,200 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco if (IS_CONSTANT_VISITED(p)) { zend_error(E_ERROR, "Cannot declare self-referencing constant '%s'", Z_STRVAL_P(p)); - return FAILURE; - } - switch (Z_TYPE_P(p) & IS_CONSTANT_TYPE_MASK) { - case IS_CONSTANT: { - int refcount; - zend_uchar is_ref; + } else if ((Z_TYPE_P(p) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + int refcount; + zend_uchar is_ref; - SEPARATE_ZVAL_IF_NOT_REF(pp); - p = *pp; + SEPARATE_ZVAL_IF_NOT_REF(pp); + p = *pp; - MARK_CONSTANT_VISITED(p); + MARK_CONSTANT_VISITED(p); - refcount = Z_REFCOUNT_P(p); - is_ref = Z_ISREF_P(p); + refcount = Z_REFCOUNT_P(p); + is_ref = Z_ISREF_P(p); - if (!zend_get_constant_ex(p->value.str.val, p->value.str.len, &const_value, scope, Z_REAL_TYPE_P(p) TSRMLS_CC)) { - char *actual = Z_STRVAL_P(p); + if (!zend_get_constant_ex(p->value.str.val, p->value.str.len, &const_value, scope, Z_REAL_TYPE_P(p) TSRMLS_CC)) { + char *actual = Z_STRVAL_P(p); - if ((colon = (char*)zend_memrchr(Z_STRVAL_P(p), ':', Z_STRLEN_P(p)))) { - zend_error(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(p)); - Z_STRLEN_P(p) -= ((colon - Z_STRVAL_P(p)) + 1); + if ((colon = (char*)zend_memrchr(Z_STRVAL_P(p), ':', Z_STRLEN_P(p)))) { + zend_error(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(p)); + Z_STRLEN_P(p) -= ((colon - Z_STRVAL_P(p)) + 1); + if (inline_change) { + colon = estrndup(colon, Z_STRLEN_P(p)); + str_efree(Z_STRVAL_P(p)); + Z_STRVAL_P(p) = colon; + } else { + Z_STRVAL_P(p) = colon + 1; + } + } else { + char *save = actual, *slash; + int actual_len = Z_STRLEN_P(p); + if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) && (slash = (char *)zend_memrchr(actual, '\\', actual_len))) { + actual = slash + 1; + actual_len -= (actual - Z_STRVAL_P(p)); if (inline_change) { - colon = estrndup(colon, Z_STRLEN_P(p)); - str_efree(Z_STRVAL_P(p)); - Z_STRVAL_P(p) = colon; - } else { - Z_STRVAL_P(p) = colon + 1; + actual = estrndup(actual, actual_len); + Z_STRVAL_P(p) = actual; + Z_STRLEN_P(p) = actual_len; } - } else { - char *save = actual, *slash; - int actual_len = Z_STRLEN_P(p); - if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) && (slash = (char *)zend_memrchr(actual, '\\', actual_len))) { - actual = slash + 1; - actual_len -= (actual - Z_STRVAL_P(p)); - if (inline_change) { - actual = estrndup(actual, actual_len); - Z_STRVAL_P(p) = actual; - Z_STRLEN_P(p) = actual_len; - } + } + if (actual[0] == '\\') { + if (inline_change) { + memmove(Z_STRVAL_P(p), Z_STRVAL_P(p)+1, Z_STRLEN_P(p)); + --Z_STRLEN_P(p); + } else { + ++actual; } - if (actual[0] == '\\') { - if (inline_change) { - memmove(Z_STRVAL_P(p), Z_STRVAL_P(p)+1, Z_STRLEN_P(p)--); - } else { - ++actual; - } - --actual_len; + --actual_len; + } + if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) == 0) { + int fix_save = 0; + if (save[0] == '\\') { + save++; + fix_save = 1; } - if ((Z_TYPE_P(p) & IS_CONSTANT_UNQUALIFIED) == 0) { - int fix_save = 0; - if (save[0] == '\\') { - save++; - fix_save = 1; - } - zend_error(E_ERROR, "Undefined constant '%s'", save); - if (fix_save) { - save--; - } - if (inline_change) { - str_efree(save); - } - save = NULL; + zend_error(E_ERROR, "Undefined constant '%s'", save); + if (fix_save) { + save--; } - if (inline_change && save && save != actual) { + if (inline_change) { str_efree(save); } - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual); - p->type = IS_STRING; - if (!inline_change) { - Z_STRVAL_P(p) = actual; - Z_STRLEN_P(p) = actual_len; - zval_copy_ctor(p); - } + save = NULL; } - } else { - if (inline_change) { - str_efree(Z_STRVAL_P(p)); + if (inline_change && save && save != actual) { + str_efree(save); } - *p = const_value; + zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual); + p->type = IS_STRING; + if (!inline_change) { + Z_STRVAL_P(p) = actual; + Z_STRLEN_P(p) = actual_len; + zval_copy_ctor(p); + } + } + } else { + if (inline_change) { + str_efree(Z_STRVAL_P(p)); } + *p = const_value; + } - Z_SET_REFCOUNT_P(p, refcount); - Z_SET_ISREF_TO_P(p, is_ref); + Z_SET_REFCOUNT_P(p, refcount); + Z_SET_ISREF_TO_P(p, is_ref); + } else if (Z_TYPE_P(p) == IS_CONSTANT_ARRAY) { + zval **element, *new_val; + char *str_index; + uint str_index_len; + ulong num_index; + int ret; + + SEPARATE_ZVAL_IF_NOT_REF(pp); + p = *pp; + Z_TYPE_P(p) = IS_ARRAY; + + if (!inline_change) { + zval *tmp; + HashTable *tmp_ht = NULL; + + ALLOC_HASHTABLE(tmp_ht); + zend_hash_init(tmp_ht, zend_hash_num_elements(Z_ARRVAL_P(p)), NULL, ZVAL_PTR_DTOR, 0); + zend_hash_copy(tmp_ht, Z_ARRVAL_P(p), (copy_ctor_func_t) zval_deep_copy, (void *) &tmp, sizeof(zval *)); + Z_ARRVAL_P(p) = tmp_ht; } - break; - - case IS_CONSTANT_ARRAY: { - zval **element, *new_val; - char *str_index; - uint str_index_len; - ulong num_index; - int ret; - - SEPARATE_ZVAL_IF_NOT_REF(pp); - p = *pp; - Z_TYPE_P(p) = IS_ARRAY; - - if (!inline_change) { - zval *tmp; - HashTable *tmp_ht = NULL; - - ALLOC_HASHTABLE(tmp_ht); - zend_hash_init(tmp_ht, zend_hash_num_elements(Z_ARRVAL_P(p)), NULL, ZVAL_PTR_DTOR, 0); - zend_hash_copy(tmp_ht, Z_ARRVAL_P(p), (copy_ctor_func_t) zval_deep_copy, (void *) &tmp, sizeof(zval *)); - Z_ARRVAL_P(p) = tmp_ht; - } - /* First go over the array and see if there are any constant indices */ - zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); - while (zend_hash_get_current_data(Z_ARRVAL_P(p), (void **) &element) == SUCCESS) { - if (!(Z_TYPE_PP(element) & IS_CONSTANT_INDEX)) { - zend_hash_move_forward(Z_ARRVAL_P(p)); - continue; - } - Z_TYPE_PP(element) &= ~IS_CONSTANT_INDEX; - if (zend_hash_get_current_key_ex(Z_ARRVAL_P(p), &str_index, &str_index_len, &num_index, 0, NULL) != HASH_KEY_IS_STRING) { - zend_hash_move_forward(Z_ARRVAL_P(p)); - continue; - } - if (str_index[str_index_len - 2] == IS_CONSTANT_AST) { - zend_ast_evaluate(&const_value, *(zend_ast **)str_index TSRMLS_CC); - ZEND_AST_DEL_REF(*(zend_ast **)str_index); - } else if (!zend_get_constant_ex(str_index, str_index_len - 3, &const_value, scope, str_index[str_index_len - 2] TSRMLS_CC)) { - char *actual; - const char *save = str_index; - if ((colon = (char*)zend_memrchr(str_index, ':', str_index_len - 3))) { - zend_error(E_ERROR, "Undefined class constant '%s'", str_index); - str_index_len -= ((colon - str_index) + 1); - str_index = colon; - } else { - if (str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) { - if ((actual = (char *)zend_memrchr(str_index, '\\', str_index_len - 3))) { - actual++; - str_index_len -= (actual - str_index); - str_index = actual; - } - } - if (str_index[0] == '\\') { - ++str_index; - --str_index_len; - } - if (save[0] == '\\') { - ++save; - } - if ((str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) == 0) { - zend_error(E_ERROR, "Undefined constant '%s'", save); + /* First go over the array and see if there are any constant indices */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); + while (zend_hash_get_current_data(Z_ARRVAL_P(p), (void **) &element) == SUCCESS) { + if (!(Z_TYPE_PP(element) & IS_CONSTANT_INDEX)) { + zend_hash_move_forward(Z_ARRVAL_P(p)); + continue; + } + Z_TYPE_PP(element) &= ~IS_CONSTANT_INDEX; + if (zend_hash_get_current_key_ex(Z_ARRVAL_P(p), &str_index, &str_index_len, &num_index, 0, NULL) != HASH_KEY_IS_STRING) { + zend_hash_move_forward(Z_ARRVAL_P(p)); + continue; + } + if (str_index[str_index_len - 2] == IS_CONSTANT_AST) { + zend_ast_evaluate(&const_value, *(zend_ast **)str_index TSRMLS_CC); + zend_ast_destroy(*(zend_ast **)str_index); + } else if (!zend_get_constant_ex(str_index, str_index_len - 3, &const_value, scope, str_index[str_index_len - 2] TSRMLS_CC)) { + char *actual; + const char *save = str_index; + if ((colon = (char*)zend_memrchr(str_index, ':', str_index_len - 3))) { + zend_error(E_ERROR, "Undefined class constant '%s'", str_index); + str_index_len -= ((colon - str_index) + 1); + str_index = colon; + } else { + if (str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) { + if ((actual = (char *)zend_memrchr(str_index, '\\', str_index_len - 3))) { + actual++; + str_index_len -= (actual - str_index); + str_index = actual; } - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", str_index, str_index); } - ZVAL_STRINGL(&const_value, str_index, str_index_len-3, 1); + if (str_index[0] == '\\') { + ++str_index; + --str_index_len; + } + if (save[0] == '\\') { + ++save; + } + if ((str_index[str_index_len - 2] & IS_CONSTANT_UNQUALIFIED) == 0) { + zend_error(E_ERROR, "Undefined constant '%s'", save); + } + zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", str_index, str_index); } + ZVAL_STRINGL(&const_value, str_index, str_index_len-3, 1); + } - if (Z_REFCOUNT_PP(element) > 1) { - ALLOC_ZVAL(new_val); - *new_val = **element; - zval_copy_ctor(new_val); - Z_SET_REFCOUNT_P(new_val, 1); - Z_UNSET_ISREF_P(new_val); - - /* preserve this bit for inheritance */ - Z_TYPE_PP(element) |= IS_CONSTANT_INDEX; - zval_ptr_dtor(element); - *element = new_val; - } + if (Z_REFCOUNT_PP(element) > 1) { + ALLOC_ZVAL(new_val); + *new_val = **element; + zval_copy_ctor(new_val); + Z_SET_REFCOUNT_P(new_val, 1); + Z_UNSET_ISREF_P(new_val); + + /* preserve this bit for inheritance */ + Z_TYPE_PP(element) |= IS_CONSTANT_INDEX; + zval_ptr_dtor(element); + *element = new_val; + } - switch (Z_TYPE(const_value)) { - case IS_STRING: - ret = zend_symtable_update_current_key(Z_ARRVAL_P(p), Z_STRVAL(const_value), Z_STRLEN(const_value) + 1, HASH_UPDATE_KEY_IF_BEFORE); - break; - case IS_BOOL: - case IS_LONG: - ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, Z_LVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL); - break; - case IS_DOUBLE: - ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, zend_dval_to_lval(Z_DVAL(const_value)), HASH_UPDATE_KEY_IF_BEFORE, NULL); - break; - case IS_NULL: - ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_STRING, "", 1, 0, HASH_UPDATE_KEY_IF_BEFORE, NULL); - break; - default: - ret = SUCCESS; - break; - } - if (ret == SUCCESS) { - zend_hash_move_forward(Z_ARRVAL_P(p)); - } - zval_dtor(&const_value); + switch (Z_TYPE(const_value)) { + case IS_STRING: + ret = zend_symtable_update_current_key(Z_ARRVAL_P(p), Z_STRVAL(const_value), Z_STRLEN(const_value) + 1, HASH_UPDATE_KEY_IF_BEFORE); + break; + case IS_BOOL: + case IS_LONG: + ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, Z_LVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL); + break; + case IS_DOUBLE: + ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL, 0, zend_dval_to_lval(Z_DVAL(const_value)), HASH_UPDATE_KEY_IF_BEFORE, NULL); + break; + case IS_NULL: + ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_STRING, "", 1, 0, HASH_UPDATE_KEY_IF_BEFORE, NULL); + break; + default: + ret = SUCCESS; + break; + } + if (ret == SUCCESS) { + zend_hash_move_forward(Z_ARRVAL_P(p)); } - zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant_inline_change, (void *) scope TSRMLS_CC); - zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); + zval_dtor(&const_value); } - break; - - case IS_CONSTANT_AST: { - zend_ast *ast = Z_AST_P(p); - - zend_ast_evaluate(p, ast TSRMLS_CC); - ZEND_AST_DEL_REF(ast); + zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant_inline_change, (void *) scope TSRMLS_CC); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(p)); + } else if (Z_TYPE_P(p) == IS_CONSTANT_AST) { + SEPARATE_ZVAL_IF_NOT_REF(pp); + p = *pp; + + zend_ast_evaluate(&const_value, Z_AST_P(p) TSRMLS_CC); + if (inline_change) { + zend_ast_destroy(Z_AST_P(p)); } + ZVAL_COPY_VALUE(p, &const_value); } return 0; } diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 83cad7f38d648..e7f289a656097 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -28,7 +28,7 @@ /* The first number is the engine version and the rest is the date. * This way engine 2/3 API no. is always greater than engine 1 API no.. */ -#define ZEND_EXTENSION_API_NO 220121212 +#define ZEND_EXTENSION_API_NO 220131106 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 19d6d839a2463..b6926ea041fe4 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -952,53 +952,53 @@ static_class_constant: ; static_scalar: /* compile-time evaluated scalars */ - static_scalar_value { $$ = $1; } - | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } - | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } + static_scalar_value { zend_do_constant_expression(&$$, $1.u.ast TSRMLS_CC); } ; static_scalar_value: - common_scalar { $$ = $1; } - | static_class_name_scalar { $$ = $1; } - | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); } - | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); } - | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); } - | static_class_constant { $$ = $1; } - | T_CLASS_C { $$ = $1; } + common_scalar { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } + | static_class_name_scalar { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } + | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } + | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } + | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } + | static_class_constant { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } + | T_CLASS_C { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } + | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } + | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } | static_operation { $$ = $1; } ; static_operation: - static_scalar_value '+' static_scalar_value { zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '-' static_scalar_value { zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '*' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mul_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '/' static_scalar_value { zend_ast_add_binary(&$$.u.constant, div_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '%' static_scalar_value { zend_ast_add_binary(&$$.u.constant, mod_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | '!' static_scalar_value { zend_ast_add_unary(&$$.u.constant, boolean_not_function, &$2.u.constant TSRMLS_CC); } - | '~' static_scalar_value { zend_ast_add_unary(&$$.u.constant, bitwise_not_function, &$2.u.constant TSRMLS_CC); } - | static_scalar_value '|' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '&' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '^' static_scalar_value { zend_ast_add_binary(&$$.u.constant, bitwise_xor_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_SL static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_left_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_SR static_scalar_value { zend_ast_add_binary(&$$.u.constant, shift_right_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '.' static_scalar_value { zend_ast_add_binary(&$$.u.constant, concat_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_LOGICAL_XOR static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_xor_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_LOGICAL_AND static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_LOGICAL_OR static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_BOOLEAN_AND static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_and_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_BOOLEAN_OR static_scalar_value { zend_ast_add_binary(&$$.u.constant, boolean_or_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_IS_IDENTICAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_identical_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_not_identical_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_IS_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_equal_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_IS_NOT_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_not_equal_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '<' static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value '>' static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_function, &$3.u.constant, &$1.u.constant TSRMLS_CC); } - | static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_or_equal_function, &$1.u.constant, &$3.u.constant TSRMLS_CC); } - | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value { zend_ast_add_binary(&$$.u.constant, is_smaller_or_equal_function, &$3.u.constant, &$1.u.constant TSRMLS_CC); } - | static_scalar_value '?' ':' static_scalar_value { zend_ast_add_ternary(&$$.u.constant, ternary_function, &$1.u.constant, NULL, &$4.u.constant TSRMLS_CC); } - | static_scalar_value '?' static_scalar_value ':' static_scalar_value { zend_ast_add_ternary(&$$.u.constant, ternary_function, &$1.u.constant, &$3.u.constant, &$5.u.constant TSRMLS_CC); } - | '+' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, add_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } - | '-' static_scalar_value { ZVAL_LONG(&$1.u.constant, 0); zend_ast_add_binary(&$$.u.constant, sub_function, &$1.u.constant, &$2.u.constant TSRMLS_CC); } + static_scalar_value '+' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_ADD, $1.u.ast, $3.u.ast); } + | static_scalar_value '-' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_SUB, $1.u.ast, $3.u.ast); } + | static_scalar_value '*' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_MUL, $1.u.ast, $3.u.ast); } + | static_scalar_value '/' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_DIV, $1.u.ast, $3.u.ast); } + | static_scalar_value '%' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_MOD, $1.u.ast, $3.u.ast); } + | '!' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_BOOL_NOT, $2.u.ast); } + | '~' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_BW_NOT, $2.u.ast); } + | static_scalar_value '|' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BW_OR, $1.u.ast, $3.u.ast); } + | static_scalar_value '&' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BW_AND, $1.u.ast, $3.u.ast); } + | static_scalar_value '^' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BW_XOR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_SL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_SL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_SR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_SR, $1.u.ast, $3.u.ast); } + | static_scalar_value '.' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_CONCAT, $1.u.ast, $3.u.ast); } + | static_scalar_value T_LOGICAL_XOR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_LOGICAL_AND static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); } + | static_scalar_value T_LOGICAL_OR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_BOOLEAN_AND static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); } + | static_scalar_value T_BOOLEAN_OR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_IDENTICAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_NOT_IDENTICAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_EQUAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_NOT_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_NOT_EQUAL, $1.u.ast, $3.u.ast); } + | static_scalar_value '<' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER, $1.u.ast, $3.u.ast); } + | static_scalar_value '>' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER, $3.u.ast, $1.u.ast); } + | static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER_OR_EQUAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER_OR_EQUAL, $3.u.ast, $1.u.ast); } + | static_scalar_value '?' ':' static_scalar_value { $$.u.ast = zend_ast_create_node3(ZEND_TERNARY, $1.u.ast, NULL, $4.u.ast); } + | static_scalar_value '?' static_scalar_value ':' static_scalar_value { $$.u.ast = zend_ast_create_node3(ZEND_TERNARY, $1.u.ast, $3.u.ast, $5.u.ast); } + | '+' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_UNARY_PLUS, $2.u.ast); } + | '-' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_UNARY_MINUS, $2.u.ast); } | '(' static_scalar_value ')' { $$ = $2; } ; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 8c083542f02f5..e8629291e545a 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1082,46 +1082,6 @@ ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) } /* }}} */ -ZEND_API int boolean_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ -{ - zval op1_copy, op2_copy; - long op1_lval; - - if (Z_TYPE_P(op1) != IS_BOOL || Z_TYPE_P(op2) != IS_BOOL) { - ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_AND); - - zendi_convert_to_boolean(op1, op1_copy, result); - op1_lval = Z_LVAL_P(op1); - zendi_convert_to_boolean(op2, op2_copy, result); - } else { - op1_lval = Z_LVAL_P(op1); - } - - ZVAL_BOOL(result, op1_lval & Z_LVAL_P(op2)); - return SUCCESS; -} -/* }}} */ - -ZEND_API int boolean_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ -{ - zval op1_copy, op2_copy; - long op1_lval; - - if (Z_TYPE_P(op1) != IS_BOOL || Z_TYPE_P(op2) != IS_BOOL) { - ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_OR); - - zendi_convert_to_boolean(op1, op1_copy, result); - op1_lval = Z_LVAL_P(op1); - zendi_convert_to_boolean(op2, op2_copy, result); - } else { - op1_lval = Z_LVAL_P(op1); - } - - ZVAL_BOOL(result, op1_lval | Z_LVAL_P(op2)); - return SUCCESS; -} -/* }}} */ - ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */ { zval op1_copy; @@ -2363,28 +2323,6 @@ ZEND_API void zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC) /* {{{ */ } /* }}} */ -#define PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(var) \ - *result = *var; \ - if (Z_REFCOUNT_P(var) == 1) { \ - Z_TYPE_P(var) = IS_NULL; \ - } - -ZEND_API int ternary_function(zval *result, zval *condition, zval *then, zval *if_not TSRMLS_DC) /* {{{ */ -{ - if (i_zend_is_true(condition)) { - if (then) { - PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(then); - } else { - PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(condition); - } - } else { - PREVENT_DTOR_IF_REFCOUNT_1_AND_ASSIGN_TO_RESULT(if_not); - } - - return SUCCESS; -} -/* }}} */ - /* * Local variables: * tab-width: 4 diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 3f0fc2ef6a0c3..ce21af3d2e755 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -50,8 +50,6 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); -ZEND_API int boolean_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); -ZEND_API int boolean_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC); ZEND_API int bitwise_not_function(zval *result, zval *op1 TSRMLS_DC); ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); @@ -378,8 +376,6 @@ ZEND_API int zend_atoi(const char *str, int str_len); ZEND_API long zend_atol(const char *str, int str_len); ZEND_API void zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC); - -ZEND_API int ternary_function(zval *result, zval *condition, zval *then, zval *if_not TSRMLS_DC); END_EXTERN_C() #define convert_to_ex_master(ppzv, lower_type, upper_type) \ diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 095c16ca9142a..3fa1b063a183f 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -49,7 +49,7 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) } break; case IS_CONSTANT_AST: - ZEND_AST_DEL_REF(Z_AST_P(zvalue)); + zend_ast_destroy(Z_AST_P(zvalue)); break; case IS_OBJECT: { @@ -85,11 +85,9 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) CHECK_ZVAL_STRING_REL(zvalue); str_free(zvalue->value.str.val); break; - case IS_CONSTANT_AST: - ZEND_AST_DEL_REF(Z_AST_P(zvalue)); - break; case IS_ARRAY: case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: case IS_OBJECT: case IS_RESOURCE: zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources"); @@ -147,7 +145,7 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) } break; case IS_CONSTANT_AST: - ZEND_AST_ADD_REF(Z_AST_P(zvalue)); + Z_AST_P(zvalue) = zend_ast_copy(Z_AST_P(zvalue)); break; case IS_OBJECT: { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 006f2ec729893..79719c8d7b73b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5200,7 +5200,6 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST) INIT_PZVAL_COPY(&c.value, val); zval_copy_ctor(&c.value); } - c.flags = CONST_CS; /* non persistent, case sensetive */ c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); c.name_len = Z_STRLEN_P(name)+1; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4f850c2978e4c..5a2c2cf9935a9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4102,7 +4102,6 @@ static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCOD INIT_PZVAL_COPY(&c.value, val); zval_copy_ctor(&c.value); } - c.flags = CONST_CS; /* non persistent, case sensetive */ c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); c.name_len = Z_STRLEN_P(name)+1; diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 894da63aaa48e..8ced274cb2ba7 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -222,6 +222,52 @@ static void zend_destroy_property_info(zend_property_info *property_info) } } +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO +static zend_ast *zend_ast_clone(zend_ast *ast TSRMLS_DC) +{ + int i; + zend_ast *node; + + if (ast->kind == ZEND_CONST) { + node = emalloc(sizeof(zend_ast) + sizeof(zval)); + node->kind = ZEND_CONST; + node->children = 0; + node->u.val = (zval*)(node + 1); + *node->u.val = *ast->u.val; + if ((Z_TYPE_P(ast->u.val) & IS_CONSTANT_TYPE_MASK) >= IS_ARRAY) { + switch ((Z_TYPE_P(ast->u.val) & IS_CONSTANT_TYPE_MASK)) { + case IS_STRING: + case IS_CONSTANT: + Z_STRVAL_P(node->u.val) = (char *) interned_estrndup(Z_STRVAL_P(ast->u.val), Z_STRLEN_P(ast->u.val)); + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + if (ast->u.val->value.ht && ast->u.val->value.ht != &EG(symbol_table)) { + ALLOC_HASHTABLE(node->u.val->value.ht); + zend_hash_clone_zval(node->u.val->value.ht, ast->u.val->value.ht, 0); + } + break; + case IS_CONSTANT_AST: + Z_AST_P(node->u.val) = zend_ast_clone(Z_AST_P(ast->u.val) TSRMLS_CC); + break; + } + } + } else { + node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*) * (ast->children - 1)); + node->kind = ast->kind; + node->children = ast->children; + for (i = 0; i < ast->children; i++) { + if (ast->u.child[i]) { + node->u.child[i] = zend_ast_clone(ast->u.child[i] TSRMLS_CC); + } else { + node->u.child[i] = NULL; + } + } + } + return node; +} +#endif + static inline zval* zend_clone_zval(zval *src, int bind TSRMLS_DC) { zval *ret, **ret_ptr = NULL; @@ -259,6 +305,11 @@ static inline zval* zend_clone_zval(zval *src, int bind TSRMLS_DC) zend_hash_clone_zval(ret->value.ht, src->value.ht, 0); } break; +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO + case IS_CONSTANT_AST: + Z_AST_P(ret) = zend_ast_clone(Z_AST_P(ret) TSRMLS_CC); + break; +#endif } } return ret; @@ -376,6 +427,11 @@ static void zend_hash_clone_zval(HashTable *ht, HashTable *source, int bind) zend_hash_clone_zval(ppz->value.ht, ((zval*)p->pDataPtr)->value.ht, 0); } break; +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO + case IS_CONSTANT_AST: + Z_AST_P(ppz) = zend_ast_clone(Z_AST_P(ppz) TSRMLS_CC); + break; +#endif } } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 9f1940e061160..bf1386566626b 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -51,6 +51,7 @@ typedef void (*zend_persist_func_t)(void * TSRMLS_DC); static void zend_persist_zval_ptr(zval **zp TSRMLS_DC); +static void zend_persist_zval(zval *z TSRMLS_DC); #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO static const Bucket *uninitialized_bucket = NULL; @@ -138,6 +139,29 @@ static void zend_hash_persist(HashTable *ht, void (*pPersistElement)(void *pElem #endif } +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO +static zend_ast *zend_persist_ast(zend_ast *ast TSRMLS_DC) +{ + int i; + zend_ast *node; + + if (ast->kind == ZEND_CONST) { + node = zend_accel_memdup(ast, sizeof(zend_ast) + sizeof(zval)); + node->u.val = (zval*)(node + 1); + zend_persist_zval(node->u.val TSRMLS_CC); + } else { + node = zend_accel_memdup(ast, sizeof(zend_ast) + sizeof(zend_ast*) * (ast->children - 1)); + for (i = 0; i < ast->children; i++) { + if (node->u.child[i]) { + node->u.child[i] = zend_persist_ast(node->u.child[i] TSRMLS_CC); + } + } + } + efree(ast); + return node; +} +#endif + static void zend_persist_zval(zval *z TSRMLS_DC) { #if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO @@ -154,6 +178,11 @@ static void zend_persist_zval(zval *z TSRMLS_DC) zend_accel_store(z->value.ht, sizeof(HashTable)); zend_hash_persist(z->value.ht, (zend_persist_func_t) zend_persist_zval_ptr, sizeof(zval**) TSRMLS_CC); break; +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO + case IS_CONSTANT_AST: + Z_AST_P(z) = zend_persist_ast(Z_AST_P(z) TSRMLS_CC); + break; +#endif } } diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 18af756f6e8c9..91438132d0154 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -45,6 +45,7 @@ #endif static uint zend_persist_zval_ptr_calc(zval **zp TSRMLS_DC); +static uint zend_persist_zval_calc(zval *z TSRMLS_DC); static uint zend_hash_persist_calc(HashTable *ht, int (*pPersistElement)(void *pElement TSRMLS_DC), size_t el_size TSRMLS_DC) { @@ -91,6 +92,27 @@ static uint zend_hash_persist_calc(HashTable *ht, int (*pPersistElement)(void *p RETURN_SIZE(); } +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO +static uint zend_persist_ast_calc(zend_ast *ast TSRMLS_DC) +{ + int i; + START_SIZE(); + + if (ast->kind == ZEND_CONST) { + ADD_SIZE(sizeof(zend_ast) + sizeof(zval)); + ADD_SIZE(zend_persist_zval_calc(ast->u.val TSRMLS_CC)); + } else { + ADD_SIZE(sizeof(zend_ast) + sizeof(zend_ast*) * (ast->children - 1)); + for (i = 0; i < ast->children; i++) { + if (ast->u.child[i]) { + ADD_SIZE(zend_persist_ast_calc(ast->u.child[i] TSRMLS_CC)); + } + } + } + RETURN_SIZE(); +} +#endif + static uint zend_persist_zval_calc(zval *z TSRMLS_DC) { START_SIZE(); @@ -109,6 +131,11 @@ static uint zend_persist_zval_calc(zval *z TSRMLS_DC) ADD_DUP_SIZE(z->value.ht, sizeof(HashTable)); ADD_SIZE(zend_hash_persist_calc(z->value.ht, (int (*)(void* TSRMLS_DC)) zend_persist_zval_ptr_calc, sizeof(zval**) TSRMLS_CC)); break; +#if ZEND_EXTENSION_API_NO > PHP_5_5_X_API_NO + case IS_CONSTANT_AST: + ADD_SIZE(zend_persist_ast_calc(Z_AST_P(z) TSRMLS_CC)); + break; +#endif } RETURN_SIZE(); } From 0d506131af470355044544d5254ac1dcbd84d7ca Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 6 Nov 2013 10:37:22 -0800 Subject: [PATCH 0287/1256] OCI8 build change: Fix source variable definition for C89 compatibility --- ext/oci8/oci8.c | 4 +++- ext/oci8/package.xml | 23 +++++++++++++++++++---- ext/oci8/php_oci8.h | 2 +- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index f8abacf3e6c6a..1e505f13e9978 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -2201,6 +2201,9 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) { sword errstatus; +#if (!((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))) + char version[256]; +#endif OCI_G(errcode) = 0; /* assume ping is successful */ @@ -2212,7 +2215,6 @@ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIPing available 10.2 onwards */ PHP_OCI_CALL_RETURN(errstatus, OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); #else - char version[256]; /* use good old OCIServerVersion() */ PHP_OCI_CALL_RETURN(errstatus, OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX)); #endif diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 7be825b895b39..8e55b9abd5c3c 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -49,8 +49,8 @@ libraries are available. - 2.0.6 - 2.0.6 + 2.0.7 + 2.0.7 stable @@ -58,8 +58,7 @@ libraries are available. PHP -Added a LICENSE file to make it easier for PECL binary distributions -to conform with the license. + Build change: Fix source variable definition for C89 compatibility @@ -458,6 +457,22 @@ to conform with the license. + + + 2.0.6 + 2.0.6 + + + stable + stable + + PHP + +Added a LICENSE file to make it easier for PECL binary distributions +to conform with the license. + + + 2.0.5 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 751041554982f..86c5abfa8989b 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -45,7 +45,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.6" +#define PHP_OCI8_VERSION "2.0.7-dev" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From e0135014c3b4edaf67312677c440a93133fe6a0c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 7 Nov 2013 10:22:49 +0400 Subject: [PATCH 0288/1256] Renaming --- Zend/zend_ast.c | 18 ++++----- Zend/zend_ast.h | 16 ++++---- Zend/zend_language_parser.y | 78 ++++++++++++++++++------------------- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 7ebb8d2796cdf..7495da38e596f 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -23,7 +23,7 @@ #include "zend_API.h" #include "zend_operators.h" -ZEND_API zend_ast *zend_ast_create_constant_node(zval *zv) +ZEND_API zend_ast *zend_ast_create_constant(zval *zv) { zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zval)); node->kind = ZEND_CONST; @@ -33,7 +33,7 @@ ZEND_API zend_ast *zend_ast_create_constant_node(zval *zv) return node; } -ZEND_API zend_ast* zend_ast_create_node1(uint kind, zend_ast *op0) +ZEND_API zend_ast* zend_ast_create_unary(uint kind, zend_ast *op0) { zend_ast *node = emalloc(sizeof(zend_ast)); node->kind = kind; @@ -42,7 +42,7 @@ ZEND_API zend_ast* zend_ast_create_node1(uint kind, zend_ast *op0) return node; } -ZEND_API zend_ast* zend_ast_create_node2(uint kind, zend_ast *op0, zend_ast *op1) +ZEND_API zend_ast* zend_ast_create_binary(uint kind, zend_ast *op0, zend_ast *op1) { zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*)); node->kind = kind; @@ -52,7 +52,7 @@ ZEND_API zend_ast* zend_ast_create_node2(uint kind, zend_ast *op0, zend_ast *op1 return node; } -ZEND_API zend_ast* zend_ast_create_node3(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2) +ZEND_API zend_ast* zend_ast_create_ternary(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2) { zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*) * 2); node->kind = kind; @@ -251,7 +251,7 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) } zval_dtor(&op1); break; - case ZEND_TERNARY: + case ZEND_SELECT: zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); if (zend_is_true(&op1)) { if (!ast->u.child[1]) { @@ -287,22 +287,22 @@ ZEND_API zend_ast *zend_ast_copy(zend_ast *ast) if (ast == NULL) { return NULL; } else if (ast->kind == ZEND_CONST) { - zend_ast *node = zend_ast_create_constant_node(ast->u.val); + zend_ast *node = zend_ast_create_constant(ast->u.val); zval_copy_ctor(node->u.val); return node; } else { switch (ast->children) { case 1: - return zend_ast_create_node1( + return zend_ast_create_unary( ast->kind, zend_ast_copy(ast->u.child[0])); case 2: - return zend_ast_create_node2( + return zend_ast_create_binary( ast->kind, zend_ast_copy(ast->u.child[0]), zend_ast_copy(ast->u.child[1])); case 3: - return zend_ast_create_node3( + return zend_ast_create_ternary( ast->kind, zend_ast_copy(ast->u.child[0]), zend_ast_copy(ast->u.child[1]), diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 4c94cf8ac283d..9cdcbf58bb6f7 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -26,15 +26,15 @@ typedef struct _zend_ast zend_ast; #include "zend.h" -typedef enum _zend_ast_node_kind { - /* first 256 node kinds are reserved for opcodes */ +typedef enum _zend_ast_kind { + /* first 256 kinds are reserved for opcodes */ ZEND_CONST = 256, ZEND_BOOL_AND, ZEND_BOOL_OR, - ZEND_TERNARY, + ZEND_SELECT, ZEND_UNARY_PLUS, ZEND_UNARY_MINUS, -} zend_ast_ode_kind; +} zend_ast_kind; struct _zend_ast { unsigned short kind; @@ -45,11 +45,11 @@ struct _zend_ast { } u; }; -ZEND_API zend_ast *zend_ast_create_constant_node(zval *zv); +ZEND_API zend_ast *zend_ast_create_constant(zval *zv); -ZEND_API zend_ast *zend_ast_create_node1(uint kind, zend_ast *op0); -ZEND_API zend_ast *zend_ast_create_node2(uint kind, zend_ast *op0, zend_ast *op1); -ZEND_API zend_ast *zend_ast_create_node3(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2); +ZEND_API zend_ast *zend_ast_create_unary(uint kind, zend_ast *op0); +ZEND_API zend_ast *zend_ast_create_binary(uint kind, zend_ast *op0, zend_ast *op1); +ZEND_API zend_ast *zend_ast_create_ternary(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2); ZEND_API int zend_ast_is_ct_constant(zend_ast *ast); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index b6926ea041fe4..8041acce152a1 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -956,49 +956,49 @@ static_scalar: /* compile-time evaluated scalars */ ; static_scalar_value: - common_scalar { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } - | static_class_name_scalar { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } - | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } - | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } - | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } - | static_class_constant { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } - | T_CLASS_C { $$.u.ast = zend_ast_create_constant_node(&$1.u.constant); } - | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } - | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant_node(&$$.u.constant); } + common_scalar { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } + | static_class_name_scalar { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } + | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } + | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } + | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } + | static_class_constant { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } + | T_CLASS_C { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } + | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant(&$$.u.constant); } + | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant(&$$.u.constant); } | static_operation { $$ = $1; } ; static_operation: - static_scalar_value '+' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_ADD, $1.u.ast, $3.u.ast); } - | static_scalar_value '-' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_SUB, $1.u.ast, $3.u.ast); } - | static_scalar_value '*' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_MUL, $1.u.ast, $3.u.ast); } - | static_scalar_value '/' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_DIV, $1.u.ast, $3.u.ast); } - | static_scalar_value '%' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_MOD, $1.u.ast, $3.u.ast); } - | '!' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_BOOL_NOT, $2.u.ast); } - | '~' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_BW_NOT, $2.u.ast); } - | static_scalar_value '|' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BW_OR, $1.u.ast, $3.u.ast); } - | static_scalar_value '&' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BW_AND, $1.u.ast, $3.u.ast); } - | static_scalar_value '^' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BW_XOR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_SL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_SL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_SR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_SR, $1.u.ast, $3.u.ast); } - | static_scalar_value '.' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_CONCAT, $1.u.ast, $3.u.ast); } - | static_scalar_value T_LOGICAL_XOR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_LOGICAL_AND static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); } - | static_scalar_value T_LOGICAL_OR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_BOOLEAN_AND static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); } - | static_scalar_value T_BOOLEAN_OR static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_IDENTICAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_NOT_IDENTICAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_EQUAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_NOT_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_NOT_EQUAL, $1.u.ast, $3.u.ast); } - | static_scalar_value '<' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER, $1.u.ast, $3.u.ast); } - | static_scalar_value '>' static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER, $3.u.ast, $1.u.ast); } - | static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER_OR_EQUAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_node2(ZEND_IS_SMALLER_OR_EQUAL, $3.u.ast, $1.u.ast); } - | static_scalar_value '?' ':' static_scalar_value { $$.u.ast = zend_ast_create_node3(ZEND_TERNARY, $1.u.ast, NULL, $4.u.ast); } - | static_scalar_value '?' static_scalar_value ':' static_scalar_value { $$.u.ast = zend_ast_create_node3(ZEND_TERNARY, $1.u.ast, $3.u.ast, $5.u.ast); } - | '+' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_UNARY_PLUS, $2.u.ast); } - | '-' static_scalar_value { $$.u.ast = zend_ast_create_node1(ZEND_UNARY_MINUS, $2.u.ast); } + static_scalar_value '+' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_ADD, $1.u.ast, $3.u.ast); } + | static_scalar_value '-' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_SUB, $1.u.ast, $3.u.ast); } + | static_scalar_value '*' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_MUL, $1.u.ast, $3.u.ast); } + | static_scalar_value '/' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_DIV, $1.u.ast, $3.u.ast); } + | static_scalar_value '%' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_MOD, $1.u.ast, $3.u.ast); } + | '!' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, $2.u.ast); } + | '~' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BW_NOT, $2.u.ast); } + | static_scalar_value '|' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BW_OR, $1.u.ast, $3.u.ast); } + | static_scalar_value '&' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BW_AND, $1.u.ast, $3.u.ast); } + | static_scalar_value '^' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BW_XOR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_SL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_SL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_SR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_SR, $1.u.ast, $3.u.ast); } + | static_scalar_value '.' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_CONCAT, $1.u.ast, $3.u.ast); } + | static_scalar_value T_LOGICAL_XOR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_LOGICAL_AND static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); } + | static_scalar_value T_LOGICAL_OR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_BOOLEAN_AND static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_AND, $1.u.ast, $3.u.ast); } + | static_scalar_value T_BOOLEAN_OR static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_BOOL_OR, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_IDENTICAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_NOT_IDENTICAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_EQUAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_NOT_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_NOT_EQUAL, $1.u.ast, $3.u.ast); } + | static_scalar_value '<' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, $1.u.ast, $3.u.ast); } + | static_scalar_value '>' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER, $3.u.ast, $1.u.ast); } + | static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, $1.u.ast, $3.u.ast); } + | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_IS_SMALLER_OR_EQUAL, $3.u.ast, $1.u.ast); } + | static_scalar_value '?' ':' static_scalar_value { $$.u.ast = zend_ast_create_ternary(ZEND_SELECT, $1.u.ast, NULL, $4.u.ast); } + | static_scalar_value '?' static_scalar_value ':' static_scalar_value { $$.u.ast = zend_ast_create_ternary(ZEND_SELECT, $1.u.ast, $3.u.ast, $5.u.ast); } + | '+' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_UNARY_PLUS, $2.u.ast); } + | '-' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_UNARY_MINUS, $2.u.ast); } | '(' static_scalar_value ')' { $$ = $2; } ; From 152898ff2872f2bdf2123a52c37f6e64c18ab88a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 7 Nov 2013 16:39:47 +0100 Subject: [PATCH 0289/1256] Moved arrays again to "static_scalar:" & little cleanup --- Zend/tests/static_variable.phpt | 2 +- Zend/zend_ast.c | 174 +++++++++++----------- Zend/zend_ast.h | 2 +- Zend/zend_extensions.h | 2 +- Zend/zend_language_parser.y | 4 +- ext/opcache/zend_accelerator_util_funcs.c | 6 +- ext/opcache/zend_persist.c | 4 +- ext/opcache/zend_persist_calc.c | 4 +- 8 files changed, 99 insertions(+), 99 deletions(-) diff --git a/Zend/tests/static_variable.phpt b/Zend/tests/static_variable.phpt index ea69a8f86b0d2..62ca565ffe693 100644 --- a/Zend/tests/static_variable.phpt +++ b/Zend/tests/static_variable.phpt @@ -7,7 +7,7 @@ const bar = 2, baz = bar + 1; function foo() { static $a = 1 + 1; static $b = [bar => 1 + 1, baz * 2 => 1 << 2]; - static $c = [1 => bar] + [3 => baz]; + static $c = [1 => bar, 3 => baz]; var_dump($a, $b, $c); } diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 7495da38e596f..fb5a7eb4032f5 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -25,42 +25,42 @@ ZEND_API zend_ast *zend_ast_create_constant(zval *zv) { - zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zval)); - node->kind = ZEND_CONST; - node->children = 0; - node->u.val = (zval*)(node + 1); - INIT_PZVAL_COPY(node->u.val, zv); - return node; + zend_ast *ast = emalloc(sizeof(zend_ast) + sizeof(zval)); + ast->kind = ZEND_CONST; + ast->children = 0; + ast->u.val = (zval*)(ast + 1); + INIT_PZVAL_COPY(ast->u.val, zv); + return ast; } ZEND_API zend_ast* zend_ast_create_unary(uint kind, zend_ast *op0) { - zend_ast *node = emalloc(sizeof(zend_ast)); - node->kind = kind; - node->children = 1; - node->u.child[0] = op0; - return node; + zend_ast *ast = emalloc(sizeof(zend_ast)); + ast->kind = kind; + ast->children = 1; + (&ast->u.child)[0] = op0; + return ast; } ZEND_API zend_ast* zend_ast_create_binary(uint kind, zend_ast *op0, zend_ast *op1) { - zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*)); - node->kind = kind; - node->children = 2; - node->u.child[0] = op0; - node->u.child[1] = op1; - return node; + zend_ast *ast = emalloc(sizeof(zend_ast) + sizeof(zend_ast*)); + ast->kind = kind; + ast->children = 2; + (&ast->u.child)[0] = op0; + (&ast->u.child)[1] = op1; + return ast; } ZEND_API zend_ast* zend_ast_create_ternary(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2) { - zend_ast *node = emalloc(sizeof(zend_ast) + sizeof(zend_ast*) * 2); - node->kind = kind; - node->children = 3; - node->u.child[0] = op0; - node->u.child[1] = op1; - node->u.child[2] = op2; - return node; + zend_ast *ast = emalloc(sizeof(zend_ast) + sizeof(zend_ast*) * 2); + ast->kind = kind; + ast->children = 3; + (&ast->u.child)[0] = op0; + (&ast->u.child)[1] = op1; + (&ast->u.child)[2] = op2; + return ast; } ZEND_API int zend_ast_is_ct_constant(zend_ast *ast) @@ -71,8 +71,8 @@ ZEND_API int zend_ast_is_ct_constant(zend_ast *ast) return !IS_CONSTANT_TYPE(Z_TYPE_P(ast->u.val)); } else { for (i = 0; i < ast->children; i++) { - if (ast->u.child[i]) { - if (!zend_ast_is_ct_constant(ast->u.child[i])) { + if ((&ast->u.child)[i]) { + if (!zend_ast_is_ct_constant((&ast->u.child)[i])) { return 0; } } @@ -87,137 +87,137 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) switch (ast->kind) { case ZEND_ADD: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); add_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_SUB: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); sub_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_MUL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); mul_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_DIV: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); div_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_MOD: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); mod_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_SL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); shift_left_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_SR: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); shift_right_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_CONCAT: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); concat_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_BW_OR: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); bitwise_or_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_BW_AND: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); bitwise_and_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_BW_XOR: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); bitwise_xor_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_BW_NOT: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); bitwise_not_function(result, &op1 TSRMLS_CC); zval_dtor(&op1); break; case ZEND_BOOL_NOT: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); boolean_not_function(result, &op1 TSRMLS_CC); zval_dtor(&op1); break; case ZEND_BOOL_XOR: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); boolean_xor_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_IS_IDENTICAL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); is_identical_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_IS_NOT_IDENTICAL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); is_not_identical_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_IS_EQUAL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); is_equal_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_IS_NOT_EQUAL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); is_not_equal_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_IS_SMALLER: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); is_smaller_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); break; case ZEND_IS_SMALLER_OR_EQUAL: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); is_smaller_or_equal_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op1); zval_dtor(&op2); @@ -230,9 +230,9 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) } break; case ZEND_BOOL_AND: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); if (zend_is_true(&op1)) { - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); ZVAL_BOOL(result, zend_is_true(&op2)); zval_dtor(&op2); } else { @@ -241,39 +241,39 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) zval_dtor(&op1); break; case ZEND_BOOL_OR: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); if (zend_is_true(&op1)) { ZVAL_BOOL(result, 1); } else { - zend_ast_evaluate(&op2, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[1] TSRMLS_CC); ZVAL_BOOL(result, zend_is_true(&op2)); zval_dtor(&op2); } zval_dtor(&op1); break; case ZEND_SELECT: - zend_ast_evaluate(&op1, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op1, (&ast->u.child)[0] TSRMLS_CC); if (zend_is_true(&op1)) { - if (!ast->u.child[1]) { + if (!(&ast->u.child)[1]) { *result = op1; } else { - zend_ast_evaluate(result, ast->u.child[1] TSRMLS_CC); + zend_ast_evaluate(result, (&ast->u.child)[1] TSRMLS_CC); zval_dtor(&op1); } } else { - zend_ast_evaluate(result, ast->u.child[2] TSRMLS_CC); + zend_ast_evaluate(result, (&ast->u.child)[2] TSRMLS_CC); zval_dtor(&op1); } break; case ZEND_UNARY_PLUS: ZVAL_LONG(&op1, 0); - zend_ast_evaluate(&op2, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[0] TSRMLS_CC); add_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op2); break; case ZEND_UNARY_MINUS: ZVAL_LONG(&op1, 0); - zend_ast_evaluate(&op2, ast->u.child[0] TSRMLS_CC); + zend_ast_evaluate(&op2, (&ast->u.child)[0] TSRMLS_CC); sub_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op2); break; @@ -284,29 +284,29 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast TSRMLS_DC) ZEND_API zend_ast *zend_ast_copy(zend_ast *ast) { - if (ast == NULL) { - return NULL; + if (ast == NULL) { + return NULL; } else if (ast->kind == ZEND_CONST) { - zend_ast *node = zend_ast_create_constant(ast->u.val); - zval_copy_ctor(node->u.val); - return node; + zend_ast *copy = zend_ast_create_constant(ast->u.val); + zval_copy_ctor(copy->u.val); + return copy; } else { switch (ast->children) { case 1: return zend_ast_create_unary( ast->kind, - zend_ast_copy(ast->u.child[0])); + zend_ast_copy((&ast->u.child)[0])); case 2: return zend_ast_create_binary( ast->kind, - zend_ast_copy(ast->u.child[0]), - zend_ast_copy(ast->u.child[1])); + zend_ast_copy((&ast->u.child)[0]), + zend_ast_copy((&ast->u.child)[1])); case 3: return zend_ast_create_ternary( ast->kind, - zend_ast_copy(ast->u.child[0]), - zend_ast_copy(ast->u.child[1]), - zend_ast_copy(ast->u.child[2])); + zend_ast_copy((&ast->u.child)[0]), + zend_ast_copy((&ast->u.child)[1]), + zend_ast_copy((&ast->u.child)[2])); } } return NULL; @@ -320,8 +320,8 @@ ZEND_API void zend_ast_destroy(zend_ast *ast) zval_dtor(ast->u.val); } else { for (i = 0; i < ast->children; i++) { - if (ast->u.child[i]) { - zend_ast_destroy(ast->u.child[i]); + if ((&ast->u.child)[i]) { + zend_ast_destroy((&ast->u.child)[i]); } } } diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 9cdcbf58bb6f7..27d595e23e916 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -41,7 +41,7 @@ struct _zend_ast { unsigned short children; union { zval *val; - zend_ast *child[1]; + zend_ast *child; } u; }; diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index e7f289a656097..e59c9ade8bd7a 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -28,7 +28,7 @@ /* The first number is the engine version and the rest is the date. * This way engine 2/3 API no. is always greater than engine 1 API no.. */ -#define ZEND_EXTENSION_API_NO 220131106 +#define ZEND_EXTENSION_API_NO 220131107 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 8041acce152a1..a71dfb09560b9 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -953,6 +953,8 @@ static_class_constant: static_scalar: /* compile-time evaluated scalars */ static_scalar_value { zend_do_constant_expression(&$$, $1.u.ast TSRMLS_CC); } + | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } + | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; } ; static_scalar_value: @@ -963,8 +965,6 @@ static_scalar_value: | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } | static_class_constant { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } | T_CLASS_C { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } - | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant(&$$.u.constant); } - | '[' static_array_pair_list ']' { $$ = $2; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; $$.u.ast = zend_ast_create_constant(&$$.u.constant); } | static_operation { $$ = $1; } ; diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 8ced274cb2ba7..279046cd9548c 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -257,10 +257,10 @@ static zend_ast *zend_ast_clone(zend_ast *ast TSRMLS_DC) node->kind = ast->kind; node->children = ast->children; for (i = 0; i < ast->children; i++) { - if (ast->u.child[i]) { - node->u.child[i] = zend_ast_clone(ast->u.child[i] TSRMLS_CC); + if ((&ast->u.child)[i]) { + (&node->u.child)[i] = zend_ast_clone((&ast->u.child)[i] TSRMLS_CC); } else { - node->u.child[i] = NULL; + (&node->u.child)[i] = NULL; } } } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index bf1386566626b..17147ac34f15e 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -152,8 +152,8 @@ static zend_ast *zend_persist_ast(zend_ast *ast TSRMLS_DC) } else { node = zend_accel_memdup(ast, sizeof(zend_ast) + sizeof(zend_ast*) * (ast->children - 1)); for (i = 0; i < ast->children; i++) { - if (node->u.child[i]) { - node->u.child[i] = zend_persist_ast(node->u.child[i] TSRMLS_CC); + if ((&node->u.child)[i]) { + (&node->u.child)[i] = zend_persist_ast((&node->u.child)[i] TSRMLS_CC); } } } diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 91438132d0154..8947c72ddc346 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -104,8 +104,8 @@ static uint zend_persist_ast_calc(zend_ast *ast TSRMLS_DC) } else { ADD_SIZE(sizeof(zend_ast) + sizeof(zend_ast*) * (ast->children - 1)); for (i = 0; i < ast->children; i++) { - if (ast->u.child[i]) { - ADD_SIZE(zend_persist_ast_calc(ast->u.child[i] TSRMLS_CC)); + if ((&ast->u.child)[i]) { + ADD_SIZE(zend_persist_ast_calc((&ast->u.child)[i] TSRMLS_CC)); } } } From 890ea8411f908ee8ab84389b42066f66d4a033e6 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 7 Nov 2013 18:05:08 -0800 Subject: [PATCH 0290/1256] Fix bug #65946 - pdo_sql_parser.c permanently converts values bound to strings --- ext/pdo/pdo_sql_parser.c | 25 ++++++++++++++----------- ext/pdo/pdo_sql_parser.re | 23 +++++++++++++---------- ext/pdo/tests/bug65946.phpt | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 ext/pdo/tests/bug65946.phpt diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 1ed78c1cc5e6a..29d69898f4f4e 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Tue Aug 20 18:02:48 2013 */ +/* Generated by re2c 0.13.5 on Thu Nov 7 18:02:29 2013 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -586,7 +586,9 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, } plc->freeq = 1; } else { - switch (Z_TYPE_P(param->parameter)) { + zval tmp_param = *param->parameter; + zval_copy_ctor(&tmp_param); + switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; plc->qlen = sizeof("NULL")-1; @@ -594,20 +596,20 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, break; case IS_BOOL: - convert_to_long(param->parameter); - + convert_to_long(&tmp_param); + /* fall through */ case IS_LONG: case IS_DOUBLE: - convert_to_string(param->parameter); - plc->qlen = Z_STRLEN_P(param->parameter); - plc->quoted = Z_STRVAL_P(param->parameter); - plc->freeq = 0; + convert_to_string(&tmp_param); + plc->qlen = Z_STRLEN(tmp_param); + plc->quoted = estrdup(Z_STRVAL(tmp_param)); + plc->freeq = 1; break; default: - convert_to_string(param->parameter); - if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL_P(param->parameter), - Z_STRLEN_P(param->parameter), &plc->quoted, &plc->qlen, + convert_to_string(&tmp_param); + if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL(tmp_param), + Z_STRLEN(tmp_param), &plc->quoted, &plc->qlen, param->param_type TSRMLS_CC)) { /* bork */ ret = -1; @@ -616,6 +618,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, } plc->freeq = 1; } + zval_dtor(&tmp_param); } } else { plc->quoted = Z_STRVAL_P(param->parameter); diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 1936a37340bb1..fa8ef187fa9a1 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -228,7 +228,9 @@ safe: } plc->freeq = 1; } else { - switch (Z_TYPE_P(param->parameter)) { + zval tmp_param = *param->parameter; + zval_copy_ctor(&tmp_param); + switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; plc->qlen = sizeof("NULL")-1; @@ -236,20 +238,20 @@ safe: break; case IS_BOOL: - convert_to_long(param->parameter); - + convert_to_long(&tmp_param); + /* fall through */ case IS_LONG: case IS_DOUBLE: - convert_to_string(param->parameter); - plc->qlen = Z_STRLEN_P(param->parameter); - plc->quoted = Z_STRVAL_P(param->parameter); - plc->freeq = 0; + convert_to_string(&tmp_param); + plc->qlen = Z_STRLEN(tmp_param); + plc->quoted = estrdup(Z_STRVAL(tmp_param)); + plc->freeq = 1; break; default: - convert_to_string(param->parameter); - if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL_P(param->parameter), - Z_STRLEN_P(param->parameter), &plc->quoted, &plc->qlen, + convert_to_string(&tmp_param); + if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL(tmp_param), + Z_STRLEN(tmp_param), &plc->quoted, &plc->qlen, param->param_type TSRMLS_CC)) { /* bork */ ret = -1; @@ -258,6 +260,7 @@ safe: } plc->freeq = 1; } + zval_dtor(&tmp_param); } } else { plc->quoted = Z_STRVAL_P(param->parameter); diff --git a/ext/pdo/tests/bug65946.phpt b/ext/pdo/tests/bug65946.phpt new file mode 100644 index 0000000000000..30261d638aa89 --- /dev/null +++ b/ext/pdo/tests/bug65946.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #65946 (pdo_sql_parser.c permanently converts values bound to strings) +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_EMULATE_PREPARES, true); +$db->exec('CREATE TABLE test(id int)'); +$db->exec('INSERT INTO test VALUES(1)'); +$db->exec('INSERT INTO test VALUES(2)'); +$stmt = $db->prepare('SELECT * FROM testtable LIMIT :limit'); +$stmt->bindValue('limit', 1, PDO::PARAM_INT); +if(!($res = $stmt->execute())) var_dump($stmt->errorInfo()); +if(!($res = $stmt->execute())) var_dump($stmt->errorInfo()); +var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); +?> +--EXPECTF-- +array(1) { + [0]=> + array(1) { + ["id"]=> + string(1) "2" + } +} From 224dc52ea99f088597a7f5d1d09ddf68dca9dfb8 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 7 Nov 2013 18:15:15 -0800 Subject: [PATCH 0291/1256] NEWS entry --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index c3e70d94a3f51..7e426956e5057 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.23 +- PDO + . Fixed bug 65946 (sql_parser permanently converts values bound to strings) ?? ??? 2013, PHP 5.4.22 From caab95155d236c0222189aaef6e49c54777257e6 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 7 Nov 2013 18:16:12 -0800 Subject: [PATCH 0292/1256] NEWS entry --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 3a690bbafe6e4..8c2b651819b1b 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ PHP NEWS - PDO: . Fixed bug #66033 (Segmentation Fault when constructor of PDO statement throws an exception). (Laruence) + . Fixed bug 65946 (sql_parser permanently converts values bound to strings) - Standard: . Fixed bug #64760 (var_export() does not use full precision for floating-point From fd3fa9b53c6bc8f34c1c8bf75141f7ee74dc8db0 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Nov 2013 15:06:36 +0800 Subject: [PATCH 0293/1256] Fixed Bug #66043 (Segfault calling bind_param() on mysqli) Although the doc said it is (unsigned int *), but it is ulong* in the libmysql 5.0 's source codes --- NEWS | 4 ++++ ext/mysqli/mysqli_api.c | 2 +- ext/mysqli/tests/bug66043.phpt | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 ext/mysqli/tests/bug66043.phpt diff --git a/NEWS b/NEWS index 7e426956e5057..091ae9aa814c0 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.23 + +- MySQLi: + . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) + - PDO . Fixed bug 65946 (sql_parser permanently converts values bound to strings) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 2cda0aa903cf4..6078a5e758d59 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -384,7 +384,7 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, /* Changed to my_bool in MySQL 5.1. See MySQL Bug #16144 */ my_bool tmp; #else - uint tmp = 0; + ulong tmp = 0; #endif stmt->result.buf[ofs].type = IS_STRING; /* diff --git a/ext/mysqli/tests/bug66043.phpt b/ext/mysqli/tests/bug66043.phpt new file mode 100644 index 0000000000000..d0e8b1c3d391f --- /dev/null +++ b/ext/mysqli/tests/bug66043.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #66043 (Segfault calling bind_param() on mysqli) +--SKIPIF-- + +--FILE-- +stmt_init(); +$stmt->prepare("SELECT User FROM user WHERE password=\"\""); +$stmt->execute(); +$stmt->bind_result($testArg); +echo "Okey"; +?> +--EXPECTF-- +Okey From f345152037b72b7d3155e366e6fbe091c228062b Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Nov 2013 15:08:07 +0800 Subject: [PATCH 0294/1256] Update NEWS --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 8c2b651819b1b..02d8b0ec3283b 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,9 @@ PHP NEWS - FPM: . Changed default listen() backlog to 65535. (Tony) +- MySQLi: + . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) + - OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) From cf2626f10c92709f8db44afa15fc09ec6a9d8b0c Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Nov 2013 15:32:28 +0800 Subject: [PATCH 0295/1256] Fixed bug #65947 (basename is no more working after fgetcsv in certain situation) previous codes: "#define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state)))# it use mbsinit there, seems try to initialize the mblen_state, but: "This function does not change the state identified by ps. Typical ways to make the state pointed by ps an initial state are: memset (ps,0,sizeof(*ps)); // ps points to zero-valued object " http://www.cplusplus.com/reference/cwchar/mbsinit/?kw=mbsinit --- NEWS | 4 ++++ ext/standard/php_string.h | 2 +- ext/standard/tests/strings/bug65947.phpt | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/strings/bug65947.phpt diff --git a/NEWS b/NEWS index 091ae9aa814c0..4689a436ca412 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.23 +- Core: + . Fixed bug #65947 (basename is no more working after fgetcsv in certain + situation). (Laruence) + - MySQLi: . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 65219f257adee..1ce98ee07a21e 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -156,7 +156,7 @@ PHPAPI char *php_strerror(int errnum); # define php_mblen(ptr, len) 1 #else # if defined(_REENTRANT) && defined(HAVE_MBRLEN) && defined(HAVE_MBSTATE_T) -# define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state))) +# define php_mblen(ptr, len) ((ptr) == NULL ? memset(&BG(mblen_state), 0, sizeof(BG(mblen_state))): (int)mbrlen(ptr, len, &BG(mblen_state))) # else # define php_mblen(ptr, len) mblen(ptr, len) # endif diff --git a/ext/standard/tests/strings/bug65947.phpt b/ext/standard/tests/strings/bug65947.phpt new file mode 100644 index 0000000000000..956aa6049a247 --- /dev/null +++ b/ext/standard/tests/strings/bug65947.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #65947 (basename is no more working after fgetcsv in certain situation) +--SKIPIF-- + Date: Fri, 8 Nov 2013 15:33:49 +0800 Subject: [PATCH 0296/1256] Update NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 02d8b0ec3283b..0fd30ced060b7 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: + . Fixed bug #65947 (basename is no more working after fgetcsv in certain + situation). (Laruence) . Improved performance of array_merge() and func_get_args() by eliminating useless copying. (Dmitry) . Fixed bug #65939 (Space before ";" breaks php.ini parsing). From 49fbe2579e9cbb4314346c8eaf959c670de0abdb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 8 Nov 2013 13:50:57 +0400 Subject: [PATCH 0297/1256] Added tests for PHAR/OPCahce incompatibilities --- ext/opcache/tests/issue0115.phpt | 48 ++++++++++++++++++++++++++++ ext/opcache/tests/issue0149.phpt | 35 ++++++++++++++++++++ ext/opcache/tests/php_cli_server.inc | 47 +++++++++++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 ext/opcache/tests/issue0115.phpt create mode 100644 ext/opcache/tests/issue0149.phpt create mode 100644 ext/opcache/tests/php_cli_server.inc diff --git a/ext/opcache/tests/issue0115.phpt b/ext/opcache/tests/issue0115.phpt new file mode 100644 index 0000000000000..a1e469ff2fec2 --- /dev/null +++ b/ext/opcache/tests/issue0115.phpt @@ -0,0 +1,48 @@ +--TEST-- +ISSUE #115 (path issue when using phar) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +phar.readonly=0 +--SKIPIF-- + + + +--FILE-- +'; +$p = new Phar(__DIR__ . '/issue0115_1.phar.php', 0, 'this'); +$p['index.php'] = 'setStub($stub); +unset($p); +$p = new Phar(__DIR__ . '/issue0115_2.phar.php', 0, 'this'); +$p['index.php'] = 'setStub($stub); +unset($p); + +include "php_cli_server.inc"; +php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0115_1.phar.php'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0115_2.phar.php'); +?> +--CLEAN-- + +--EXPECT-- +Hello from Index 1. +Hello World 1! +Hello from Index 2. +Hello World 2! diff --git a/ext/opcache/tests/issue0149.phpt b/ext/opcache/tests/issue0149.phpt new file mode 100644 index 0000000000000..7044d3938837a --- /dev/null +++ b/ext/opcache/tests/issue0149.phpt @@ -0,0 +1,35 @@ +--TEST-- +ISSUE #149 (Phar mount points not working this OPcache enabled) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +phar.readonly=0 +--SKIPIF-- + + + +--FILE-- +"; +$p = new Phar(__DIR__ . '/issue0149.phar.php', 0, 'this'); +$p['index.php'] = ""; # A Phar must have at least one file, hence this dummy +$p->setStub($stub); +unset($p); + +include "php_cli_server.inc"; +php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0149.phar.php'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0149.phar.php'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0149.phar.php'); +?> +--CLEAN-- + +--EXPECT-- +OK +OK +OK diff --git a/ext/opcache/tests/php_cli_server.inc b/ext/opcache/tests/php_cli_server.inc new file mode 100644 index 0000000000000..0878bfafc0d27 --- /dev/null +++ b/ext/opcache/tests/php_cli_server.inc @@ -0,0 +1,47 @@ + STDIN, + 1 => STDOUT, + 2 => STDERR, + ); + + if (substr(PHP_OS, 0, 3) == 'WIN') { + $cmd = "{$php_executable} -t {$doc_root} $ini -S " . PHP_CLI_SERVER_ADDRESS; + $handle = proc_open(addslashes($cmd), $descriptorspec, $pipes, $doc_root, NULL, array("bypass_shell" => true, "suppress_errors" => true)); + } else { + $cmd = "exec {$php_executable} -t {$doc_root} $ini -S " . PHP_CLI_SERVER_ADDRESS . " 2>/dev/null"; + $handle = proc_open($cmd, $descriptorspec, $pipes, $doc_root); + } + + // note: even when server prints 'Listening on localhost:8964...Press Ctrl-C to quit.' + // it might not be listening yet...need to wait until fsockopen() call returns + $i = 0; + while (($i++ < 30) && !($fp = @fsockopen(PHP_CLI_SERVER_HOSTNAME, PHP_CLI_SERVER_PORT))) { + usleep(10000); + } + + if ($fp) { + fclose($fp); + } + + register_shutdown_function( + function($handle) { + proc_terminate($handle); + }, + $handle + ); + // don't bother sleeping, server is already up + // server can take a variable amount of time to be up, so just sleeping a guessed amount of time + // does not work. this is why tests sometimes pass and sometimes fail. to get a reliable pass + // sleeping doesn't work. +} +?> + From 915c428ba1006a144c4fca45e44631ec058a5074 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 8 Nov 2013 16:35:05 +0400 Subject: [PATCH 0298/1256] Fixed issue #115 (path issue when using phar). Fixed issue #149 (Phar mount points not working with OPcache enabled). --- NEWS | 3 +++ ext/opcache/ZendAccelerator.c | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 0fd30ced060b7..d0359fe185f41 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,9 @@ PHP NEWS - OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) + . Fixed issue #115 (path issue when using phar). (Dmitry) + . Fixed issue #149 (Phar mount points not working with OPcache enabled). + (Dmitry) - ODBC . Fixed bug #65950 (Field name truncation if the field name is bigger than diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 72b5a1b9fe7e7..8eaa0a37788c6 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1196,6 +1196,8 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr /* store script structure in the hash table */ bucket = zend_accel_hash_update(&ZCSG(hash), new_persistent_script->full_path, new_persistent_script->full_path_len + 1, 0, new_persistent_script); if (bucket && + /* key may contain non-persistent PHAR aliases (see issues #115 and #149) */ + memcmp(key, "phar://", sizeof("phar://") - 1) != 0 && (new_persistent_script->full_path_len != key_length || memcmp(new_persistent_script->full_path, key, key_length) != 0)) { /* link key to the same persistent script in hash table */ @@ -1651,7 +1653,18 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type T #endif void *dummy = (void *) 1; - zend_hash_quick_add(&EG(included_files), persistent_script->full_path, persistent_script->full_path_len + 1, persistent_script->hash_value, &dummy, sizeof(void *), NULL); + if (zend_hash_quick_add(&EG(included_files), persistent_script->full_path, persistent_script->full_path_len + 1, persistent_script->hash_value, &dummy, sizeof(void *), NULL) == SUCCESS) { + /* ext/phar has to load phar's metadata into memory */ + if (strstr(persistent_script->full_path, ".phar") && !strstr(persistent_script->full_path, "://")) { + php_stream_statbuf ssb; + char *fname = emalloc(sizeof("phar://") + persistent_script->full_path_len); + + memcpy(fname, "phar://", sizeof("phar://") - 1); + memcpy(fname + sizeof("phar://") - 1, persistent_script->full_path, persistent_script->full_path_len + 1); + php_stream_stat_path(fname, &ssb); + efree(fname); + } + } } } #if ZEND_EXTENSION_API_NO < PHP_5_3_X_API_NO From 9711c58bc4236c0e2e482af9b20581e78af0c7ca Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 8 Nov 2013 20:26:46 -0500 Subject: [PATCH 0299/1256] Stop PHP from modifying the lowercase function name in place. --- Zend/zend_compile.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9c238ac67cfb3..03136637356bc 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1740,13 +1740,14 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n opline->op1.constant = zend_add_literal(CG(active_op_array), &key TSRMLS_CC); Z_HASH_P(&CONSTANT(opline->op1.constant)) = zend_hash_func(Z_STRVAL(CONSTANT(opline->op1.constant)), Z_STRLEN(CONSTANT(opline->op1.constant))); opline->op2_type = IS_CONST; - LITERAL_STRINGL(opline->op2, lcname, name_len, 0); + LITERAL_STRINGL(opline->op2, lcname, name_len, 1); CALCULATE_LITERAL_HASH(opline->op2.constant); opline->extended_value = ZEND_DECLARE_FUNCTION; zend_hash_quick_update(CG(function_table), Z_STRVAL(key), Z_STRLEN(key), Z_HASH_P(&CONSTANT(opline->op1.constant)), &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); zend_hash_add(&CG(function_filenames), lcname, strlen(lcname)+1, CG(compiled_filename), strlen(CG(compiled_filename))+1, NULL); zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context))); zend_init_compiler_context(TSRMLS_C); + str_efree(lcname); } if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) { From 1ea01f55dbfbefd3b351f05c405e85ac778cdee7 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 8 Nov 2013 21:29:23 -0500 Subject: [PATCH 0300/1256] Look in the function_table instead of function_filenames for actually declared functions. --- Zend/zend_compile.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 03136637356bc..228fe6f87dec8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7163,7 +7163,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC) /* {{{ */ { char *lookup_name; - char *filename; + zend_function *function = NULL; zval *name, *ns, tmp; zend_bool warn = 0; @@ -7210,14 +7210,16 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const efree(tmp2); } efree(c_ns_name); - } else if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **)&filename) == SUCCESS && strcmp(filename, CG(compiled_filename)) == 0) { - char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); + } else { + if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **) &function) == SUCCESS && strcmp(function->op_array.filename, CG(compiled_filename)) == 0) { + char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); - if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || - memcmp(c_tmp, lookup_name, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || + memcmp(c_tmp, lookup_name, Z_STRLEN_P(ns))) { + zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } + efree(c_tmp); } - efree(c_tmp); } if (zend_hash_add(current_import_sub, lookup_name, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { @@ -7238,7 +7240,7 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_ zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, "function", 0, CG(current_import_function), &CG(function_filenames) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, "function", 0, CG(current_import_function), CG(function_table) TSRMLS_CC); } /* }}} */ From 95675dfba9e417667e1e093084b27fd8f93d8724 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 8 Nov 2013 21:32:09 -0500 Subject: [PATCH 0301/1256] Remove now unused function_filenames struct. --- Zend/zend_compile.c | 3 --- Zend/zend_globals.h | 1 - 2 files changed, 4 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 228fe6f87dec8..bd90477efdcd1 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -206,7 +206,6 @@ void zend_init_compiler_data_structures(TSRMLS_D) /* {{{ */ CG(current_import) = NULL; CG(current_import_function) = NULL; CG(current_import_const) = NULL; - zend_hash_init(&CG(function_filenames), 0, NULL, NULL, 0); zend_hash_init(&CG(const_filenames), 0, NULL, NULL, 0); init_compiler_declarables(TSRMLS_C); zend_stack_init(&CG(context_stack)); @@ -246,7 +245,6 @@ void shutdown_compiler(TSRMLS_D) /* {{{ */ zend_stack_destroy(&CG(list_stack)); zend_hash_destroy(&CG(filenames_table)); zend_llist_destroy(&CG(open_files)); - zend_hash_destroy(&CG(function_filenames)); zend_hash_destroy(&CG(const_filenames)); zend_stack_destroy(&CG(context_stack)); } @@ -1744,7 +1742,6 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n CALCULATE_LITERAL_HASH(opline->op2.constant); opline->extended_value = ZEND_DECLARE_FUNCTION; zend_hash_quick_update(CG(function_table), Z_STRVAL(key), Z_STRLEN(key), Z_HASH_P(&CONSTANT(opline->op1.constant)), &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); - zend_hash_add(&CG(function_filenames), lcname, strlen(lcname)+1, CG(compiled_filename), strlen(CG(compiled_filename))+1, NULL); zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context))); zend_init_compiler_context(TSRMLS_C); str_efree(lcname); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 19c29c68f324e..27d471fa069a7 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -136,7 +136,6 @@ struct _zend_compiler_globals { zend_bool in_namespace; zend_bool has_bracketed_namespaces; - HashTable function_filenames; HashTable const_filenames; zend_compiler_context context; From da553a816653e7c19bbfb5454fced91b929a6075 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 8 Nov 2013 21:37:38 -0500 Subject: [PATCH 0302/1256] Fix constant resolution. --- Zend/zend_compile.c | 31 ++++++++++++++++++++++--------- Zend/zend_compile.h | 2 +- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index bd90477efdcd1..96fb77a29be80 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7157,10 +7157,9 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } /* }}} */ -void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC) /* {{{ */ +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int is_function, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC) /* {{{ */ { char *lookup_name; - zend_function *function = NULL; zval *name, *ns, tmp; zend_bool warn = 0; @@ -7202,28 +7201,42 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const if (Z_STRLEN_P(ns) != Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) || memcmp(tmp2, c_ns_name, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", is_function ? "function" : "const", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(tmp2); } efree(c_ns_name); - } else { + } else if (is_function) { + zend_function *function; + if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **) &function) == SUCCESS && strcmp(function->op_array.filename, CG(compiled_filename)) == 0) { char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || memcmp(c_tmp, lookup_name, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error(E_COMPILE_ERROR, "Cannot use function %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + } + efree(c_tmp); + } + } else { + const char *filename; + + if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **) &filename) == SUCCESS && strcmp(filename, CG(compiled_filename)) == 0) { + char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); + + if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || + memcmp(c_tmp, lookup_name, Z_STRLEN_P(ns))) { + zend_error(E_COMPILE_ERROR, "Cannot use const %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(c_tmp); } } if (zend_hash_add(current_import_sub, lookup_name, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", type, Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error(E_COMPILE_ERROR, "Cannot use %s %s as %s because the name is already in use", is_function ? "function" : "const", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } if (warn) { - zend_error(E_WARNING, "The use %s statement with non-compound name '%s' has no effect", type, Z_STRVAL_P(name)); + zend_error(E_WARNING, "The use %s statement with non-compound name '%s' has no effect", is_function ? "function" : "const", Z_STRVAL_P(name)); } efree(lookup_name); zval_dtor(name); @@ -7237,7 +7250,7 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_ zend_hash_init(CG(current_import_function), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, "function", 0, CG(current_import_function), CG(function_table) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, 1, 0, CG(current_import_function), CG(function_table) TSRMLS_CC); } /* }}} */ @@ -7248,7 +7261,7 @@ void zend_do_use_const(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) zend_hash_init(CG(current_import_const), 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_do_use_non_class(ns_name, new_name, is_global, "const", 1, CG(current_import_const), &CG(const_filenames) TSRMLS_CC); + zend_do_use_non_class(ns_name, new_name, is_global, 0, 1, CG(current_import_const), &CG(const_filenames) TSRMLS_CC); } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 55575f399436a..53bff384702dc 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -638,7 +638,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_brackets TSRMLS_D void zend_do_end_namespace(TSRMLS_D); void zend_verify_namespace(TSRMLS_D); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); -void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const char *type, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC); +void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int is_function, zend_bool case_sensitive, HashTable *current_import_sub, HashTable *lookup_table TSRMLS_DC); void zend_do_use_function(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_use_const(znode *name, znode *new_name, int is_global TSRMLS_DC); void zend_do_end_compilation(TSRMLS_D); From cc049e64500ed0f6efd9e6827e4bda1b23368c61 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 8 Nov 2013 21:49:05 -0500 Subject: [PATCH 0303/1256] Only check user functions for filenames. --- Zend/zend_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 96fb77a29be80..14a28f392be99 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7209,7 +7209,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int i } else if (is_function) { zend_function *function; - if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **) &function) == SUCCESS && strcmp(function->op_array.filename, CG(compiled_filename)) == 0) { + if (zend_hash_find(lookup_table, lookup_name, Z_STRLEN_P(name)+1, (void **) &function) == SUCCESS && function->type == ZEND_USER_FUNCTION && strcmp(function->op_array.filename, CG(compiled_filename)) == 0) { char *c_tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns)); if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || From 90d4ae4da8f5a81e136cad26d9612a8f78d14f2d Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Sat, 9 Nov 2013 12:15:37 -0500 Subject: [PATCH 0304/1256] Make all code paths in json_determine_array_type() return constants. This is a purely cosmetic change, but the current behaviour of returning PHP_JSON_OUTPUT_ARRAY and 1 looks weird. --- ext/json/json.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/json/json.c b/ext/json/json.c index 782375e3717cc..90ca50dae9404 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -190,10 +190,10 @@ static int json_determine_array_type(zval **val TSRMLS_DC) /* {{{ */ } if (i == HASH_KEY_IS_STRING) { - return 1; + return PHP_JSON_OUTPUT_OBJECT; } else { if (index != idx) { - return 1; + return PHP_JSON_OUTPUT_OBJECT; } } idx++; From 064ba179b15bda7566fa43297e2cee8033bc850f Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 9 Nov 2013 09:45:52 -0800 Subject: [PATCH 0305/1256] Fix broken test --- ext/pdo/tests/bug65946.phpt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ext/pdo/tests/bug65946.phpt b/ext/pdo/tests/bug65946.phpt index 30261d638aa89..1c4bd8d6c4287 100644 --- a/ext/pdo/tests/bug65946.phpt +++ b/ext/pdo/tests/bug65946.phpt @@ -16,8 +16,7 @@ $db = PDOTest::factory(); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $db->exec('CREATE TABLE test(id int)'); $db->exec('INSERT INTO test VALUES(1)'); -$db->exec('INSERT INTO test VALUES(2)'); -$stmt = $db->prepare('SELECT * FROM testtable LIMIT :limit'); +$stmt = $db->prepare('SELECT * FROM test LIMIT :limit'); $stmt->bindValue('limit', 1, PDO::PARAM_INT); if(!($res = $stmt->execute())) var_dump($stmt->errorInfo()); if(!($res = $stmt->execute())) var_dump($stmt->errorInfo()); @@ -28,6 +27,6 @@ array(1) { [0]=> array(1) { ["id"]=> - string(1) "2" + string(1) "1" } } From 611da37617749c81ab22b1e44a0cc1f294cc493a Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sat, 9 Nov 2013 13:48:23 -0500 Subject: [PATCH 0306/1256] use ZVAL_ZVAL to init ZVAL from ZVAL --- Zend/zend_compile.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3bee745171973..44e95adf86cf2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7055,7 +7055,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } ALLOC_ZVAL(ns); - *ns = ns_name->u.constant; + ZVAL_ZVAL(ns, &ns_name->u.constant, 0, 0); if (new_name) { name = &new_name->u.constant; } else { @@ -7068,8 +7068,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ if (p) { ZVAL_STRING(name, p+1, 1); } else { - *name = *ns; - zval_copy_ctor(name); + ZVAL_ZVAL(name, ns, 1, 0); warn = !is_global && !CG(current_namespace); } } @@ -7133,7 +7132,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int i zend_bool warn = 0; ALLOC_ZVAL(ns); - *ns = ns_name->u.constant; + ZVAL_ZVAL(ns, &ns_name->u.constant, 0, 0); if (new_name) { name = &new_name->u.constant; } else { @@ -7146,8 +7145,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int i if (p) { ZVAL_STRING(name, p+1, 1); } else { - *name = *ns; - zval_copy_ctor(name); + ZVAL_ZVAL(name, ns, 1, 0); warn = !is_global && !CG(current_namespace); } } From dac2297b1062975f5d9ac417dbea518c5823b8a6 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 9 Nov 2013 14:34:16 -0800 Subject: [PATCH 0307/1256] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000000..2fc9fdfa7b47d --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +phpdbg +====== From 2fee7dce773dc365ef720d41568bcc2914065413 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 9 Nov 2013 22:35:03 +0000 Subject: [PATCH 0308/1256] import --- Makefile.frag | 11 ++++ config.m4 | 34 +++++++++++ phpdbg.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+) create mode 100644 Makefile.frag create mode 100644 config.m4 create mode 100644 phpdbg.c diff --git a/Makefile.frag b/Makefile.frag new file mode 100644 index 0000000000000..2a56b947f8c86 --- /dev/null +++ b/Makefile.frag @@ -0,0 +1,11 @@ +phpdbg: $(BUILD_BINARY) + +$(BUILD_BINARY): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) + $(BUILD_PHPDBG) + +install-phpdbg: $(BUILD_BINARY) + @echo "Installing phpdbg binary: $(INSTALL_ROOT)$(bindir)/" + @$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) + @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/log + @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/run + @$(INSTALL) -m 0755 $(BUILD_BINARY) $(INSTALL_ROOT)$(sbindir)/$(program_prefix)phpdbg$(program_suffix)$(EXEEXT) diff --git a/config.m4 b/config.m4 new file mode 100644 index 0000000000000..94e8727330fba --- /dev/null +++ b/config.m4 @@ -0,0 +1,34 @@ +dnl +dnl $Id$ +dnl + +PHP_ARG_ENABLE(phpdbg, for phpdbg support, +[ --enable-phpdbg Build phpdbg], no, no) + +if test "$PHP_PHPDBG" != "no"; then + AC_DEFINE(HAVE_PHPDBG, 1, [ ]) + + PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg + PHP_PHPDBG_FILES=phpdbg.c + + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) + PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) + + BUILD_BINARY="sapi/phpdbg/phpdbg" + BUILD_PHPDBG="\$(LIBTOOL) --mode=link \ + \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \ + \$(PHP_GLOBAL_OBJS) \ + \$(PHP_BINARY_OBJS) \ + \$(PHP_PHPDBG_OBJS) \ + \$(EXTRA_LIBS) \ + \$(PHPDBG_EXTRA_LIBS) \ + \$(ZEND_EXTRA_LIBS) \ + -o \$(BUILD_BINARY)" + + PHP_SUBST(BUILD_BINARY) + PHP_SUBST(BUILD_PHPDBG) +fi + +dnl ## Local Variables: +dnl ## tab-width: 4 +dnl ## End: diff --git a/phpdbg.c b/phpdbg.c new file mode 100644 index 0000000000000..ba1b0a3e75a63 --- /dev/null +++ b/phpdbg.c @@ -0,0 +1,160 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ +#include "php.h" +#include "php_globals.h" +#include "php_variables.h" +#include "zend_modules.h" +#include "php.h" +#include "zend_ini_scanner.h" +#include "zend_globals.h" +#include "zend_stream.h" + +#include "SAPI.h" +#include "sapi/cgi/fastcgi.h" + +#include + +#include "php_main.h" + +static zend_module_entry sapi_server_module_entry = { + STANDARD_MODULE_HEADER, + "server", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "0.1", + STANDARD_MODULE_PROPERTIES +}; + +static inline int php_sapi_server_module_startup(sapi_module_struct *module) { /* {{{ */ + if (php_module_startup(module, &sapi_server_module_entry, 1) == FAILURE) { + return FAILURE; + } + return SUCCESS; +} /* }}} */ + +/* {{{ sapi_module_struct server_sapi_module + */ +static sapi_module_struct server_sapi_module = { + "server", /* name */ + "SAPI server", /* pretty name */ + + php_sapi_server_module_startup, /* startup */ + php_module_shutdown_wrapper, /* shutdown */ + + NULL, /* activate */ + NULL, /* deactivate */ + + NULL, /* unbuffered write */ + NULL, /* flush */ + NULL, /* get uid */ + NULL, /* getenv */ + + php_error, /* error handler */ + + NULL, /* header handler */ + NULL, /* send headers handler */ + NULL, /* send header handler */ + + NULL, /* read POST data */ + NULL, /* read Cookies */ + + NULL, /* register server variables */ + NULL, /* Log message */ + NULL, /* Get request time */ + NULL, /* Child terminate */ + STANDARD_SAPI_MODULE_PROPERTIES +}; +/* }}} */ + +static inline int zend_machine(int argc, char **argv TSRMLS_DC) { /* {{{ */ + php_printf("Hello World :)\n"); +} /* }}} */ + +int main(int argc, char **argv) { /* {{{ */ +#ifdef ZTS + void ***tsrm_ls; + { + tsrm_startup( + 1, 1, 0, NULL); + + tsrm_ls = ts_resource(0); + } +#endif + + sapi_startup(&server_sapi_module); + + if (server_sapi_module.startup(&server_sapi_module) == SUCCESS) + { + zend_activate(TSRMLS_C); + +#ifdef ZEND_SIGNALS + zend_try { + zend_signals_activate(TSRMLS_C); + } zend_end_try(); +#endif + + PG(modules_activated)=0; + + zend_try { + zend_activate_modules(TSRMLS_C); + } zend_end_try(); + + /* START: ZEND INITIALIZED */ + { + /* do the thing */ + zend_machine(argc, argv TSRMLS_CC); + } + /* END: ZEND BLOCK */ + + if (PG(modules_activated)) { + zend_try { + zend_deactivate_modules(TSRMLS_C); + } zend_end_try(); + } + + zend_deactivate(TSRMLS_C); + + zend_try { + zend_post_deactivate_modules(TSRMLS_C); + } zend_end_try(); + +#ifdef ZEND_SIGNALS + zend_try { + zend_signal_deactivate(TSRMLS_C); + } zend_end_try(); +#endif + + zend_try { + shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); + } zend_end_try(); + + php_module_shutdown(TSRMLS_C); + + sapi_shutdown(); + } + +#ifdef ZTS + tsrm_shutdown(); +#endif + + return 0; +} /* }}} */ From 60ee0cc74cbe43aa2452c97b1c687320d41b4c59 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 9 Nov 2013 22:47:39 +0000 Subject: [PATCH 0309/1256] change server->phpdbg --- phpdbg.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index ba1b0a3e75a63..9223824193f44 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -31,9 +31,9 @@ #include "php_main.h" -static zend_module_entry sapi_server_module_entry = { +static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, - "server", + "phpdbg", NULL, NULL, NULL, @@ -44,20 +44,20 @@ static zend_module_entry sapi_server_module_entry = { STANDARD_MODULE_PROPERTIES }; -static inline int php_sapi_server_module_startup(sapi_module_struct *module) { /* {{{ */ - if (php_module_startup(module, &sapi_server_module_entry, 1) == FAILURE) { +static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) { /* {{{ */ + if (php_module_startup(module, &sapi_phpdbg_module_entry, 1) == FAILURE) { return FAILURE; } return SUCCESS; } /* }}} */ -/* {{{ sapi_module_struct server_sapi_module +/* {{{ sapi_module_struct phpdbg_sapi_module */ -static sapi_module_struct server_sapi_module = { - "server", /* name */ - "SAPI server", /* pretty name */ +static sapi_module_struct phpdbg_sapi_module = { + "phpdbg", /* name */ + "phpdbg", /* pretty name */ - php_sapi_server_module_startup, /* startup */ + php_sapi_phpdbg_module_startup, /* startup */ php_module_shutdown_wrapper, /* shutdown */ NULL, /* activate */ @@ -100,9 +100,16 @@ int main(int argc, char **argv) { /* {{{ */ } #endif - sapi_startup(&server_sapi_module); +#ifdef PHP_WIN32 + _fmode = _O_BINARY; /*sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ +#endif + + sapi_startup(&phpdbg_sapi_module); - if (server_sapi_module.startup(&server_sapi_module) == SUCCESS) + if (phpdbg_sapi_module.startup(&phpdbg_sapi_module) == SUCCESS) { zend_activate(TSRMLS_C); From 1dd5d42bd80a5fa1f14b9f2046cfa042ff5e6195 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 9 Nov 2013 22:53:27 +0000 Subject: [PATCH 0310/1256] cleanup --- phpdbg.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 9223824193f44..7a9b419b9f88d 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -25,7 +25,6 @@ #include "zend_stream.h" #include "SAPI.h" -#include "sapi/cgi/fastcgi.h" #include @@ -99,17 +98,20 @@ int main(int argc, char **argv) { /* {{{ */ tsrm_ls = ts_resource(0); } #endif - + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + #ifdef PHP_WIN32 - _fmode = _O_BINARY; /*sets default for file streams to binary */ - setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ + _fmode = _O_BINARY; /*sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - sapi_startup(&phpdbg_sapi_module); + phpdbg->executable_location = argv[0]; + + sapi_startup(phpdbg); - if (phpdbg_sapi_module.startup(&phpdbg_sapi_module) == SUCCESS) + if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); From 19a5ac93b40016ccb166e674a9c55cd297f5b1bf Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 21:07:04 -0200 Subject: [PATCH 0311/1256] - WS changes --- phpdbg.c | 169 +++++++++++++++++++++++++++---------------------------- 1 file changed, 83 insertions(+), 86 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 7a9b419b9f88d..36319df2ed70b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -15,6 +15,7 @@ | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ + #include "php.h" #include "php_globals.h" #include "php_variables.h" @@ -23,11 +24,8 @@ #include "zend_ini_scanner.h" #include "zend_globals.h" #include "zend_stream.h" - #include "SAPI.h" - #include - #include "php_main.h" static zend_module_entry sapi_phpdbg_module_entry = { @@ -43,7 +41,8 @@ static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_PROPERTIES }; -static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) { /* {{{ */ +static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* {{{ */ +{ if (php_module_startup(module, &sapi_phpdbg_module_entry, 1) == FAILURE) { return FAILURE; } @@ -53,117 +52,115 @@ static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) { / /* {{{ sapi_module_struct phpdbg_sapi_module */ static sapi_module_struct phpdbg_sapi_module = { - "phpdbg", /* name */ - "phpdbg", /* pretty name */ + "phpdbg", /* name */ + "phpdbg", /* pretty name */ php_sapi_phpdbg_module_startup, /* startup */ php_module_shutdown_wrapper, /* shutdown */ - NULL, /* activate */ - NULL, /* deactivate */ + NULL, /* activate */ + NULL, /* deactivate */ - NULL, /* unbuffered write */ - NULL, /* flush */ - NULL, /* get uid */ - NULL, /* getenv */ + NULL, /* unbuffered write */ + NULL, /* flush */ + NULL, /* get uid */ + NULL, /* getenv */ - php_error, /* error handler */ + php_error, /* error handler */ - NULL, /* header handler */ - NULL, /* send headers handler */ - NULL, /* send header handler */ + NULL, /* header handler */ + NULL, /* send headers handler */ + NULL, /* send header handler */ - NULL, /* read POST data */ - NULL, /* read Cookies */ + NULL, /* read POST data */ + NULL, /* read Cookies */ - NULL, /* register server variables */ - NULL, /* Log message */ - NULL, /* Get request time */ - NULL, /* Child terminate */ + NULL, /* register server variables */ + NULL, /* Log message */ + NULL, /* Get request time */ + NULL, /* Child terminate */ STANDARD_SAPI_MODULE_PROPERTIES }; /* }}} */ -static inline int zend_machine(int argc, char **argv TSRMLS_DC) { /* {{{ */ +static inline int zend_machine(int argc, char **argv TSRMLS_DC) /* {{{ */ +{ php_printf("Hello World :)\n"); } /* }}} */ -int main(int argc, char **argv) { /* {{{ */ +int main(int argc, char **argv) /* {{{ */ +{ #ifdef ZTS - void ***tsrm_ls; - { - tsrm_startup( - 1, 1, 0, NULL); - - tsrm_ls = ts_resource(0); - } + void ***tsrm_ls; + tsrm_startup(1, 1, 0, NULL); + + tsrm_ls = ts_resource(0); #endif - sapi_module_struct *phpdbg = &phpdbg_sapi_module; - + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + #ifdef PHP_WIN32 - _fmode = _O_BINARY; /*sets default for file streams to binary */ - setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ + _fmode = _O_BINARY; /* sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - phpdbg->executable_location = argv[0]; - - sapi_startup(phpdbg); + phpdbg->executable_location = argv[0]; + + sapi_startup(phpdbg); + + if (phpdbg->startup(phpdbg) == SUCCESS) { + zend_activate(TSRMLS_C); - if (phpdbg->startup(phpdbg) == SUCCESS) - { - zend_activate(TSRMLS_C); - #ifdef ZEND_SIGNALS - zend_try { - zend_signals_activate(TSRMLS_C); - } zend_end_try(); + zend_try { + zend_signals_activate(TSRMLS_C); + } zend_end_try(); #endif - PG(modules_activated)=0; - - zend_try { - zend_activate_modules(TSRMLS_C); - } zend_end_try(); - - /* START: ZEND INITIALIZED */ - { - /* do the thing */ - zend_machine(argc, argv TSRMLS_CC); - } - /* END: ZEND BLOCK */ - - if (PG(modules_activated)) { - zend_try { - zend_deactivate_modules(TSRMLS_C); - } zend_end_try(); - } - - zend_deactivate(TSRMLS_C); - - zend_try { - zend_post_deactivate_modules(TSRMLS_C); - } zend_end_try(); - + PG(modules_activated) = 0; + + zend_try { + zend_activate_modules(TSRMLS_C); + } zend_end_try(); + + /* START: ZEND INITIALIZED */ + { + /* do the thing */ + zend_machine(argc, argv TSRMLS_CC); + } + /* END: ZEND BLOCK */ + + if (PG(modules_activated)) { + zend_try { + zend_deactivate_modules(TSRMLS_C); + } zend_end_try(); + } + + zend_deactivate(TSRMLS_C); + + zend_try { + zend_post_deactivate_modules(TSRMLS_C); + } zend_end_try(); + #ifdef ZEND_SIGNALS - zend_try { - zend_signal_deactivate(TSRMLS_C); - } zend_end_try(); + zend_try { + zend_signal_deactivate(TSRMLS_C); + } zend_end_try(); #endif - zend_try { - shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); - } zend_end_try(); - - php_module_shutdown(TSRMLS_C); - - sapi_shutdown(); - } - + zend_try { + shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); + } zend_end_try(); + + php_module_shutdown(TSRMLS_C); + + sapi_shutdown(); + } + #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return 0; + return 0; } /* }}} */ From 8ac55d018cfeeca07c58df392eb1f961b4c3e514 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 21:08:01 -0200 Subject: [PATCH 0312/1256] - Added .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000..2969ad7f15c8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.libs/ +phpdbg +phpdbg.lo +phpdbg.o + From f16ccad2ffb3a00b74277f2c38779212528bfc6a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 21:33:43 -0200 Subject: [PATCH 0313/1256] - Fixed unexpected memory leak warning --- phpdbg.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 36319df2ed70b..ba4da21907913 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -149,10 +149,6 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); #endif - zend_try { - shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); - } zend_end_try(); - php_module_shutdown(TSRMLS_C); sapi_shutdown(); From 1c7ae5f1a69686eba3acac66f7fe45318befe19d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 22:34:38 -0200 Subject: [PATCH 0314/1256] - Declaration first --- phpdbg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index ba4da21907913..375e4ff8b8d75 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -90,13 +90,13 @@ static inline int zend_machine(int argc, char **argv TSRMLS_DC) /* {{{ */ int main(int argc, char **argv) /* {{{ */ { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; #ifdef ZTS void ***tsrm_ls; tsrm_startup(1, 1, 0, NULL); tsrm_ls = ts_resource(0); #endif - sapi_module_struct *phpdbg = &phpdbg_sapi_module; #ifdef PHP_WIN32 _fmode = _O_BINARY; /* sets default for file streams to binary */ From 612d6b258243968db00a79eab2876a4eaa94aa86 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 23:30:32 -0200 Subject: [PATCH 0315/1256] - Added initial code for a simple prompt --- .gitignore | 4 +-- config.m4 | 8 +++--- phpdbg.c | 14 +++------- phpdbg_prompt.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_prompt.h | 43 +++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 phpdbg_prompt.c create mode 100644 phpdbg_prompt.h diff --git a/.gitignore b/.gitignore index 2969ad7f15c8c..a9e84f897bfca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .libs/ phpdbg -phpdbg.lo -phpdbg.o +*.lo +*.o diff --git a/config.m4 b/config.m4 index 94e8727330fba..d2dac4acb3d6e 100644 --- a/config.m4 +++ b/config.m4 @@ -7,13 +7,13 @@ PHP_ARG_ENABLE(phpdbg, for phpdbg support, if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) - + PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES=phpdbg.c + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c" - PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) - + BUILD_BINARY="sapi/phpdbg/phpdbg" BUILD_PHPDBG="\$(LIBTOOL) --mode=link \ \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \ diff --git a/phpdbg.c b/phpdbg.c index 375e4ff8b8d75..b29a79929d4db 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -83,11 +83,6 @@ static sapi_module_struct phpdbg_sapi_module = { }; /* }}} */ -static inline int zend_machine(int argc, char **argv TSRMLS_DC) /* {{{ */ -{ - php_printf("Hello World :)\n"); -} /* }}} */ - int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; @@ -124,12 +119,9 @@ int main(int argc, char **argv) /* {{{ */ zend_activate_modules(TSRMLS_C); } zend_end_try(); - /* START: ZEND INITIALIZED */ - { - /* do the thing */ - zend_machine(argc, argv TSRMLS_CC); - } - /* END: ZEND BLOCK */ + zend_try { + phpdbg_iteractive(argc, argv); + } zend_end_try(); if (PG(modules_activated)) { zend_try { diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c new file mode 100644 index 0000000000000..475cbc38e6daa --- /dev/null +++ b/phpdbg_prompt.c @@ -0,0 +1,72 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + +----------------------------------------------------------------------+ +*/ + +#include +#include +#include "zend.h" +#include "phpdbg_prompt.h" + +void do_quit(const char *params) /* {{{ */ +{ + zend_bailout(); +} /* }}} */ + +static const phpdbg_command prompt_commands[] = { + {PHPDBG_STRL("quit"), do_quit}, + {NULL, 0, 0} +}; + +static void do_cmd(char *cmd_line) /* {{{ */ +{ + const phpdbg_command *command = prompt_commands; + char *params = NULL; + const char *cmd = strtok_r(cmd_line, " ", ¶ms); + size_t cmd_len = cmd ? strlen(cmd) : 0; + + while (command && command->name) { + if (command->name_len == cmd_len + && memcmp(cmd, command->name, cmd_len) == 0) { + /* Command find */ + command->handler(params); + return; + } + ++command; + } + + printf("command not found!\n"); + +} /* }}} */ + +void phpdbg_iteractive(int argc, char **argv) /* {{{ */ +{ + char cmd[PHPDBG_MAX_CMD]; + + printf("phpdbg> "); + + while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + size_t cmd_len = strlen(cmd) - 1; + + if (cmd[cmd_len] == '\n') { + cmd[cmd_len] = 0; + } + if (cmd_len) { + do_cmd(cmd); + } + printf("phpdbg> "); + } +} /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h new file mode 100644 index 0000000000000..0740a940ba603 --- /dev/null +++ b/phpdbg_prompt.h @@ -0,0 +1,43 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_PROMPT_H +#define PHPDBG_PROMPT_H + +/** + * Maximum command length + */ +#define PHPDBG_MAX_CMD 500 + +#define PHPDBG_STRL(s) s, sizeof(s)-1 + +/** + * Command handler + */ +typedef void (*phpdbg_command_handler)(const char*); + +/** + * Command representation + */ +typedef struct _phpdbg_command { + const char *name; /* Command name */ + size_t name_len; /* Command name length */ + phpdbg_command_handler handler; /* Command handler */ +} phpdbg_command; + +#endif From 19c16083a71be15638828b60c2e9bce697fa13cc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 23:38:17 -0200 Subject: [PATCH 0316/1256] - WS change --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 475cbc38e6daa..73a18eb818376 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -58,7 +58,7 @@ void phpdbg_iteractive(int argc, char **argv) /* {{{ */ printf("phpdbg> "); - while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; if (cmd[cmd_len] == '\n') { From 2bda09abc6c938b6c964052a43b830e591a7ede9 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 23:42:41 -0200 Subject: [PATCH 0317/1256] - Added prototype for non-static function, fixed typo and staticfy command handler --- phpdbg_prompt.c | 4 ++-- phpdbg_prompt.h | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 73a18eb818376..79544921897e0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -21,7 +21,7 @@ #include "zend.h" #include "phpdbg_prompt.h" -void do_quit(const char *params) /* {{{ */ +static void do_quit(const char *params) /* {{{ */ { zend_bailout(); } /* }}} */ @@ -41,7 +41,7 @@ static void do_cmd(char *cmd_line) /* {{{ */ while (command && command->name) { if (command->name_len == cmd_len && memcmp(cmd, command->name, cmd_len) == 0) { - /* Command find */ + /* Command found! */ command->handler(params); return; } diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 0740a940ba603..09a5028a36171 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -40,4 +40,6 @@ typedef struct _phpdbg_command { phpdbg_command_handler handler; /* Command handler */ } phpdbg_command; -#endif +void phpdbg_iteractive(int, char**); + +#endif /* PHPDBG_PROMPT_H */ From 6997b8793d0fa6e41976dd692c378f0a450de2a5 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Sun, 10 Nov 2013 07:10:36 +0100 Subject: [PATCH 0318/1256] missing 'config.h' in 5dc37b3 --- ext/zip/lib/config.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 ext/zip/lib/config.h diff --git a/ext/zip/lib/config.h b/ext/zip/lib/config.h new file mode 100644 index 0000000000000..f9132ba439c41 --- /dev/null +++ b/ext/zip/lib/config.h @@ -0,0 +1,25 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Pierre-Alain Joye | + +----------------------------------------------------------------------+ +*/ +#ifdef HAVE_CONFIG_H +/* Building in PECL */ +#include "../config.h" + +#else +/* Building in PHP tree */ +#include "php_config.h" +#endif From 39263cbfb1169a95352a5ed868fd5e63c9c2cdfb Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 08:20:57 +0000 Subject: [PATCH 0319/1256] header in main --- phpdbg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/phpdbg.c b/phpdbg.c index b29a79929d4db..d1f127d032737 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ #include "SAPI.h" #include #include "php_main.h" +#include "phpdbg_prompt.h" static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, From 2089caed53dd3e4e83b847b6786cb5969edd5b49 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 10:44:42 +0000 Subject: [PATCH 0320/1256] bit more work on menu implement helper menu name some macros to help with declarations (sorry Felipe :)) --- config.m4 | 2 +- phpdbg.c | 45 ++++++++++++++++--------- phpdbg_help.c | 38 +++++++++++++++++++++ phpdbg_help.h | 46 ++++++++++++++++++++++++++ phpdbg_prompt.c | 88 +++++++++++++++++++++++++++++++++++++++---------- phpdbg_prompt.h | 26 ++++++++++++--- 6 files changed, 205 insertions(+), 40 deletions(-) create mode 100644 phpdbg_help.c create mode 100644 phpdbg_help.h diff --git a/config.m4 b/config.m4 index d2dac4acb3d6e..b62d099ad4065 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c" PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) diff --git a/phpdbg.c b/phpdbg.c index d1f127d032737..b5ba10a232d53 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -16,27 +16,40 @@ +----------------------------------------------------------------------+ */ -#include "php.h" -#include "php_globals.h" -#include "php_variables.h" -#include "zend_modules.h" -#include "php.h" -#include "zend_ini_scanner.h" -#include "zend_globals.h" -#include "zend_stream.h" -#include "SAPI.h" -#include -#include "php_main.h" -#include "phpdbg_prompt.h" +#include "phpdbg.h" + +ZEND_DECLARE_MODULE_GLOBALS(phpdbg); + +static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) {} + +static PHP_MINIT_FUNCTION(phpdbg) { + ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); + + return SUCCESS; +} + +static inline void php_phpdbg_destroy_break(void *brake) { + +} + +static PHP_RINIT_FUNCTION(phpdbg) { + zend_hash_init(&PHPDBG_G(breaks), 8, NULL, php_phpdbg_destroy_break, 0); + + return SUCCESS; +} + +static PHP_RSHUTDOWN_FUNCTION(phpdbg) { + zend_hash_destroy(&PHPDBG_G(breaks)); +} static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, "phpdbg", NULL, + PHP_MINIT(phpdbg), NULL, - NULL, - NULL, - NULL, + PHP_RINIT(phpdbg), + PHP_RSHUTDOWN(phpdbg), NULL, "0.1", STANDARD_MODULE_PROPERTIES @@ -121,7 +134,7 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); zend_try { - phpdbg_iteractive(argc, argv); + phpdbg_interactive(argc, argv TSRMLS_CC); } zend_end_try(); if (PG(modules_activated)) { diff --git a/phpdbg_help.c b/phpdbg_help.c new file mode 100644 index 0000000000000..5cb2d209d60f4 --- /dev/null +++ b/phpdbg_help.c @@ -0,0 +1,38 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include +#include "zend.h" +#include "phpdbg.h" +#include "phpdbg_help.h" + +PHPDBG_HELP(print) /* {{{ */ +{ + printf("doing print help: %s\n", expr); + + return SUCCESS; +} /* }}} */ + +PHPDBG_HELP(brake) /* {{{ */ +{ + printf("doing brake help: %s\n", expr); + + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h new file mode 100644 index 0000000000000..f2a2e2dd88e1b --- /dev/null +++ b/phpdbg_help.h @@ -0,0 +1,46 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_HELP_H +#define PHPDBG_HELP_H + +/** + * Command Declarators + */ +#define PHPDBG_HELP_D(name, tip) \ + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_help_##name} +#define PHPDBG_HELP(name) \ + int phpdbg_do_help_##name(const char *expr, size_t expr_len TSRMLS_DC) + +/** + * Helper Forward Declarations + */ +PHPDBG_HELP(print); +PHPDBG_HELP(brake); + +/** + * Commands + */ +static const phpdbg_command_t phpdbg_help_commands[] = { + PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), + PHPDBG_HELP_D(brake, "brake points allow execution interruption"), + {NULL, 0, 0} +}; + +#endif /* PHPDBG_HELP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 79544921897e0..be33353a99579 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -13,46 +13,94 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Felipe Pena | + | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ #include #include #include "zend.h" -#include "phpdbg_prompt.h" +#include "phpdbg.h" +#include "phpdbg_help.h" -static void do_quit(const char *params) /* {{{ */ +static const phpdbg_command_t phpdbg_prompt_commands[]; + +static PHPDBG_COMMAND(print) { /* {{{ */ + printf("%s", expr); + + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(brake) { /* {{{ */ + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(quit) /* {{{ */ { zend_bailout(); + + return SUCCESS; } /* }}} */ -static const phpdbg_command prompt_commands[] = { - {PHPDBG_STRL("quit"), do_quit}, +static PHPDBG_COMMAND(help) /* {{{ */ +{ + printf("Welcome to phpdbg, the interactive PHP debugger.\n"); + if (!expr_len) { + printf("To get help regarding a specific command type \"help command\"\n"); + printf("Commands:\n"); + { + const phpdbg_command_t *command = phpdbg_prompt_commands; + while (command && command->name) { + printf( + "\t%s\t%s\n", command->name, command->tip); + command++; + } + } + printf("Helpers Loaded:\n"); + { + const phpdbg_command_t *command = phpdbg_help_commands; + while (command && command->name) { + printf( + "\t%s\t%s\n", command->name, command->tip); + command++; + } + } + } else { + if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { + printf("failed to find help command: %s\n", expr); + } + } + printf("Please report bugs to \n"); + + return SUCCESS; +} /* }}} */ + +static const phpdbg_command_t phpdbg_prompt_commands[] = { + PHPDBG_COMMAND_D(print, "print something"), + PHPDBG_COMMAND_D(brake, "set brake point"), + PHPDBG_COMMAND_D(help, "show help menu"), + PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} }; -static void do_cmd(char *cmd_line) /* {{{ */ +int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { - const phpdbg_command *command = prompt_commands; char *params = NULL; const char *cmd = strtok_r(cmd_line, " ", ¶ms); - size_t cmd_len = cmd ? strlen(cmd) : 0; - + size_t expr_len = cmd != NULL ? strlen(cmd) : 0; + while (command && command->name) { - if (command->name_len == cmd_len - && memcmp(cmd, command->name, cmd_len) == 0) { - /* Command found! */ - command->handler(params); - return; + if (command->name_len == expr_len + && memcmp(cmd, command->name, expr_len) == 0) { + return command->handler(params, cmd_len - expr_len TSRMLS_CC); } ++command; } - printf("command not found!\n"); - + return FAILURE; } /* }}} */ -void phpdbg_iteractive(int argc, char **argv) /* {{{ */ +void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -61,12 +109,16 @@ void phpdbg_iteractive(int argc, char **argv) /* {{{ */ while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; - if (cmd[cmd_len] == '\n') { + while (cmd[cmd_len] == '\n') { cmd[cmd_len] = 0; } + if (cmd_len) { - do_cmd(cmd); + if (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC) == FAILURE) { + printf("error executing %s !\n", cmd); + } } + printf("phpdbg> "); } } /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 09a5028a36171..b1238ece64008 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Felipe Pena | + | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ @@ -29,17 +30,32 @@ /** * Command handler */ -typedef void (*phpdbg_command_handler)(const char*); +typedef int (*phpdbg_command_handler_t)(const char* expr, size_t expr_len TSRMLS_DC); /** * Command representation */ -typedef struct _phpdbg_command { +typedef struct _phpdbg_command_t { const char *name; /* Command name */ size_t name_len; /* Command name length */ - phpdbg_command_handler handler; /* Command handler */ -} phpdbg_command; + const char *tip; /* Menu tip */ + size_t tip_len; /* Menu tip length */ + phpdbg_command_handler_t handler; /* Command handler */ +} phpdbg_command_t; -void phpdbg_iteractive(int, char**); +/** + * Command Executor + */ +int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC); + +/** + * Command Declarators + */ +#define PHPDBG_COMMAND_D(name, tip) \ + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name} +#define PHPDBG_COMMAND(name) \ + int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) + +void phpdbg_interactive(int argc, char** argv TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From ad3aa32a2f3c4b13135cabdcc8605bf9f3409f16 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 10:46:18 +0000 Subject: [PATCH 0321/1256] woops --- phpdbg.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 phpdbg.h diff --git a/phpdbg.h b/phpdbg.h new file mode 100644 index 0000000000000..4a40c72fa204b --- /dev/null +++ b/phpdbg.h @@ -0,0 +1,43 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ +#include "php.h" +#include "php_globals.h" +#include "php_variables.h" +#include "zend_modules.h" +#include "zend_ini_scanner.h" +#include "zend_globals.h" +#include "zend_stream.h" +#include "SAPI.h" +#include +#include "php_main.h" + +#ifdef ZTS +# include "TSRM.h" +#endif + +#ifdef ZTS +# define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v) +#else +# define PHPDBG_G(v) (phpdbg_globals.v) +#endif + +ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + HashTable breaks; +ZEND_END_MODULE_GLOBALS(phpdbg) + +#include "phpdbg_prompt.h" From 6df19b3aa25b4384ab806841ebbafa8f4fe95962 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 11:03:29 +0000 Subject: [PATCH 0322/1256] ... --- phpdbg.c | 7 ++++++- phpdbg.h | 2 ++ phpdbg_help.c | 7 +++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 24 +++++++++++++++++++++--- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index b5ba10a232d53..88d6eaddaebf6 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -20,7 +20,9 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); -static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) {} +static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { + pg->exec = NULL; +} static PHP_MINIT_FUNCTION(phpdbg) { ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); @@ -40,6 +42,9 @@ static PHP_RINIT_FUNCTION(phpdbg) { static PHP_RSHUTDOWN_FUNCTION(phpdbg) { zend_hash_destroy(&PHPDBG_G(breaks)); + if (PHPDBG_G(exec)) { + efree(PHPDBG_G(exec)); + } } static zend_module_entry sapi_phpdbg_module_entry = { diff --git a/phpdbg.h b/phpdbg.h index 4a40c72fa204b..94ee7201b84d6 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -38,6 +38,8 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable breaks; + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index 5cb2d209d60f4..586cd68cf4f76 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -23,6 +23,13 @@ #include "phpdbg.h" #include "phpdbg_help.h" +PHPDBG_HELP(exec) /* {{{ */ +{ + printf("doing exec help: %s\n", expr); + + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(print) /* {{{ */ { printf("doing print help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index f2a2e2dd88e1b..b3dfb228fdfb1 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -31,6 +31,7 @@ /** * Helper Forward Declarations */ +PHPDBG_HELP(exec); PHPDBG_HELP(print); PHPDBG_HELP(brake); @@ -38,6 +39,7 @@ PHPDBG_HELP(brake); * Commands */ static const phpdbg_command_t phpdbg_help_commands[] = { + PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(brake, "brake points allow execution interruption"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index be33353a99579..6fc59a050671a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -25,9 +25,26 @@ static const phpdbg_command_t phpdbg_prompt_commands[]; -static PHPDBG_COMMAND(print) { /* {{{ */ - printf("%s", expr); +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +static PHPDBG_COMMAND(exec) { /* {{{ */ + if (PHPDBG_G(exec)) { + printf( + "Unsetting old execution context: %s\n", PHPDBG_G(exec)); + efree(PHPDBG_G(exec)); + } + PHPDBG_G(exec) = estrndup( + expr, PHPDBG_G(exec_len)=expr_len); + + printf( + "Set execution context: %s\n", PHPDBG_G(exec)); +} /* }}} */ + +static PHPDBG_COMMAND(print) { /* {{{ */ + printf( + "%s\n", expr); + return SUCCESS; } /* }}} */ @@ -75,7 +92,8 @@ static PHPDBG_COMMAND(help) /* {{{ */ return SUCCESS; } /* }}} */ -static const phpdbg_command_t phpdbg_prompt_commands[] = { +static const phpdbg_command_t phpdbg_prompt_commands[] = { + PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(brake, "set brake point"), PHPDBG_COMMAND_D(help, "show help menu"), From b978c20f63d911a07cd8288839e56119748a1a90 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 11:35:59 +0000 Subject: [PATCH 0323/1256] +compile --- phpdbg.c | 7 ++++++ phpdbg.h | 5 ++-- phpdbg_help.c | 26 +++++++++++++++----- phpdbg_help.h | 8 ++++--- phpdbg_prompt.c | 64 +++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 92 insertions(+), 18 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 88d6eaddaebf6..b416a54fa6401 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -22,6 +22,7 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; + pg->ops = NULL; } static PHP_MINIT_FUNCTION(phpdbg) { @@ -42,9 +43,15 @@ static PHP_RINIT_FUNCTION(phpdbg) { static PHP_RSHUTDOWN_FUNCTION(phpdbg) { zend_hash_destroy(&PHPDBG_G(breaks)); + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } + + if (PHPDBG_G(ops)) { + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } } static zend_module_entry sapi_phpdbg_module_entry = { diff --git a/phpdbg.h b/phpdbg.h index 94ee7201b84d6..ba3ea5d533839 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -38,8 +38,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable breaks; - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index 586cd68cf4f76..48d32a2db346d 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -25,21 +25,35 @@ PHPDBG_HELP(exec) /* {{{ */ { - printf("doing exec help: %s\n", expr); - + printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); + printf("The execution context must be set before execution can take place\n"); + return SUCCESS; +} /* }}} */ + +PHPDBG_HELP(compile) /* {{{ */ +{ + printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); + printf("The execution context must be set for compilation to succeed\n"); + printf("If errors occur during compilation they must be resolved before execution can take place.\n"); + printf("You do not need to exit phpdbg to retry compilation\n"); return SUCCESS; } /* }}} */ PHPDBG_HELP(print) /* {{{ */ { - printf("doing print help: %s\n", expr); + printf("By default, print will show information about the current execution environment\n"); + printf("To show specific information pass an expression to print, for example:\n"); + printf("\tprint opcodes[0]\n"); + printf("Will show the opline @ 0\n"); + printf("Available print commands:\n"); + printf("\tNone\n"); return SUCCESS; } /* }}} */ PHPDBG_HELP(brake) /* {{{ */ { - printf("doing brake help: %s\n", expr); - - return SUCCESS; + printf("doing brake help: %s\n", expr); + + return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index b3dfb228fdfb1..87462ca1354cb 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -32,6 +32,7 @@ * Helper Forward Declarations */ PHPDBG_HELP(exec); +PHPDBG_HELP(compile); PHPDBG_HELP(print); PHPDBG_HELP(brake); @@ -39,9 +40,10 @@ PHPDBG_HELP(brake); * Commands */ static const phpdbg_command_t phpdbg_help_commands[] = { - PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), - PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), - PHPDBG_HELP_D(brake, "brake points allow execution interruption"), + PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), + PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), + PHPDBG_HELP_D(brake, "brake points allow execution interruption"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 6fc59a050671a..809273886b63c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -32,6 +32,15 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ printf( "Unsetting old execution context: %s\n", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); + PHPDBG_G(exec) = NULL; + } + + if (PHPDBG_G(ops)) { + printf( + "Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; } PHPDBG_G(exec) = estrndup( @@ -39,11 +48,51 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ printf( "Set execution context: %s\n", PHPDBG_G(exec)); + + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(compile) { /* {{{ */ + zend_file_handle fh; + + if (PHPDBG_G(exec)) { + + if (PHPDBG_G(ops)) { + printf("Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } + + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file( + &fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; + } else { + printf("Could not open file %s\n", PHPDBG_G(exec)); + return FAILURE; + } + } else { + printf("No execution context\n"); + return FAILURE; + } } /* }}} */ static PHPDBG_COMMAND(print) { /* {{{ */ - printf( - "%s\n", expr); + if (!expr_len) { + printf("Showing Execution Context Information:\n"); + printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); + if (PHPDBG_G(ops)) { + printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last-1); + printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + } + } else { + printf( + "%s\n", expr); + } return SUCCESS; } /* }}} */ @@ -93,11 +142,12 @@ static PHPDBG_COMMAND(help) /* {{{ */ } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { - PHPDBG_COMMAND_D(exec, "set execution context"), - PHPDBG_COMMAND_D(print, "print something"), - PHPDBG_COMMAND_D(brake, "set brake point"), - PHPDBG_COMMAND_D(help, "show help menu"), - PHPDBG_COMMAND_D(quit, "exit phpdbg"), + PHPDBG_COMMAND_D(exec, "set execution context"), + PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), + PHPDBG_COMMAND_D(print, "print something"), + PHPDBG_COMMAND_D(brake, "set brake point"), + PHPDBG_COMMAND_D(help, "show help menu"), + PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} }; From 9dd3e54351ad3e72c3f55811a3820845aa7ad413 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 09:36:57 -0200 Subject: [PATCH 0324/1256] - Cosmetic changes --- phpdbg_prompt.c | 18 +++++++++--------- phpdbg_prompt.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 6fc59a050671a..9d30193cd2168 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -33,10 +33,10 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ "Unsetting old execution context: %s\n", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); } - + PHPDBG_G(exec) = estrndup( expr, PHPDBG_G(exec_len)=expr_len); - + printf( "Set execution context: %s\n", PHPDBG_G(exec)); } /* }}} */ @@ -55,7 +55,7 @@ static PHPDBG_COMMAND(brake) { /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { zend_bailout(); - + return SUCCESS; } /* }}} */ @@ -88,13 +88,13 @@ static PHPDBG_COMMAND(help) /* {{{ */ } } printf("Please report bugs to \n"); - + return SUCCESS; } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { - PHPDBG_COMMAND_D(exec, "set execution context"), - PHPDBG_COMMAND_D(print, "print something"), + PHPDBG_COMMAND_D(exec, "set execution context"), + PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(brake, "set brake point"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), @@ -106,7 +106,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le char *params = NULL; const char *cmd = strtok_r(cmd_line, " ", ¶ms); size_t expr_len = cmd != NULL ? strlen(cmd) : 0; - + while (command && command->name) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { @@ -130,13 +130,13 @@ void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ while (cmd[cmd_len] == '\n') { cmd[cmd_len] = 0; } - + if (cmd_len) { if (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC) == FAILURE) { printf("error executing %s !\n", cmd); } } - + printf("phpdbg> "); } } /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index b1238ece64008..590358bf4404b 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -56,6 +56,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #define PHPDBG_COMMAND(name) \ int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) -void phpdbg_interactive(int argc, char** argv TSRMLS_DC); +void phpdbg_interactive(int argc, char **argv TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From c6cb411d3905a790f9eb059c0ff0dd39fba4017a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 13:01:46 +0000 Subject: [PATCH 0325/1256] execution --- phpdbg.c | 31 +++++++++------ phpdbg.h | 1 + phpdbg_prompt.c | 100 +++++++++++++++++++++++++++++++++++++++++------- phpdbg_prompt.h | 1 + test.php | 3 ++ 5 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 test.php diff --git a/phpdbg.c b/phpdbg.c index b416a54fa6401..3b1a93b172ff4 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -20,15 +20,21 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); +void (*zend_execute_old)(zend_execute_data *execute_data TSRMLS_DC); +void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC); + static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { - pg->exec = NULL; - pg->ops = NULL; + pg->exec = NULL; + pg->ops = NULL; } static PHP_MINIT_FUNCTION(phpdbg) { - ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); + ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); + + zend_execute_old = zend_execute_ex; + zend_execute_ex = phpdbg_execute_ex; - return SUCCESS; + return SUCCESS; } static inline void php_phpdbg_destroy_break(void *brake) { @@ -42,16 +48,17 @@ static PHP_RINIT_FUNCTION(phpdbg) { } static PHP_RSHUTDOWN_FUNCTION(phpdbg) { - zend_hash_destroy(&PHPDBG_G(breaks)); + zend_hash_destroy(&PHPDBG_G(breaks)); - if (PHPDBG_G(exec)) { - efree(PHPDBG_G(exec)); - } + if (PHPDBG_G(exec)) { + efree(PHPDBG_G(exec)); + } - if (PHPDBG_G(ops)) { - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - } + if (PHPDBG_G(ops)) { + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } + return SUCCESS; } static zend_module_entry sapi_phpdbg_module_entry = { diff --git a/phpdbg.h b/phpdbg.h index ba3ea5d533839..a3da778520d42 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -41,6 +41,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a1f9685066bd7..31722665b3ed1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -20,6 +20,7 @@ #include #include #include "zend.h" +#include "zend_compile.h" #include "phpdbg.h" #include "phpdbg_help.h" @@ -52,9 +53,23 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(compile) { /* {{{ */ - zend_file_handle fh; +static inline int phpdbg_compile(TSRMLS_D) { + zend_file_handle fh; + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file( + &fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; + } else { + printf("Could not open file %s\n", PHPDBG_G(exec)); + return FAILURE; + } +} + +static PHPDBG_COMMAND(compile) { /* {{{ */ if (PHPDBG_G(exec)) { if (PHPDBG_G(ops)) { @@ -63,23 +78,39 @@ static PHPDBG_COMMAND(compile) { /* {{{ */ efree(PHPDBG_G(ops)); } - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file( - &fh, ZEND_INCLUDE TSRMLS_CC); - zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); - return SUCCESS; - } else { - printf("Could not open file %s\n", PHPDBG_G(exec)); - return FAILURE; - } + return phpdbg_compile(TSRMLS_C); } else { printf("No execution context\n"); return FAILURE; } } /* }}} */ +static PHPDBG_COMMAND(run) { /* {{{ */ + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { + if (!PHPDBG_G(ops)) { + if (phpdbg_compile(TSRMLS_C) == FAILURE) { + printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); + return FAILURE; + } + } + + EG(active_op_array) = PHPDBG_G(ops); + EG(return_value_ptr_ptr) = &PHPDBG_G(retval); + + zend_try { + zend_execute(EG(active_op_array) TSRMLS_CC); + } zend_catch { + printf("Caught excetion in VM\n"); + return FAILURE; + } zend_end_try(); + + return SUCCESS; + } else { + printf("Nothing to execute !"); + return FAILURE; + } +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -144,6 +175,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), + PHPDBG_COMMAND_D(run, "attempt execution"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(help, "show help menu"), @@ -190,3 +222,45 @@ void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ printf("phpdbg> "); } } /* }}} */ + +void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) +{ + zend_bool original_in_execution; + + original_in_execution = EG(in_execution); + EG(in_execution) = 1; + + if (0) { +zend_vm_enter: + execute_data = zend_create_execute_data_from_op_array(EG(active_op_array), 1 TSRMLS_CC); + } + + while (1) { + int ret; +#ifdef ZEND_WIN32 + if (EG(timed_out)) { + zend_timeout(0); + } +#endif + + printf("[OPLINE: %p]\n", execute_data->opline); + + if ((ret = execute_data->opline->handler(execute_data TSRMLS_CC)) > 0) { + switch (ret) { + case 1: + EG(in_execution) = original_in_execution; + return; + case 2: + goto zend_vm_enter; + break; + case 3: + execute_data = EG(current_execute_data); + break; + default: + break; + } + } + + } + zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); +} diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 590358bf4404b..028f2c080afa0 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -57,5 +57,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) void phpdbg_interactive(int argc, char **argv TSRMLS_DC); +void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ diff --git a/test.php b/test.php new file mode 100644 index 0000000000000..2f3600c6a0c24 --- /dev/null +++ b/test.php @@ -0,0 +1,3 @@ + From 8043d1ee5fe07b37a6154362095a206c97aa610f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 13:06:57 +0000 Subject: [PATCH 0326/1256] run help --- phpdbg_help.c | 7 +++++++ phpdbg_help.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpdbg_help.c b/phpdbg_help.c index 38ae6c36f3916..d5ec6fd40c3ed 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -51,6 +51,13 @@ PHPDBG_HELP(print) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(run) /* {{{ */ +{ + printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); + printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(break) /* {{{ */ { printf("doing break help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index dba58d7dc486d..1ab558725ce90 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -33,6 +33,7 @@ */ PHPDBG_HELP(exec); PHPDBG_HELP(compile); +PHPDBG_HELP(run); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -42,6 +43,7 @@ PHPDBG_HELP(break); static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), {NULL, 0, 0} From 5c866a9f1357bfab56824935287e51199d9ea3a7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:28:14 +0000 Subject: [PATCH 0327/1256] stepping --- phpdbg.c | 1 + phpdbg.h | 4 ++++ phpdbg_help.c | 16 +++++++++++++++- phpdbg_help.h | 4 ++++ phpdbg_prompt.c | 47 ++++++++++++++++++++++++++++++++++++++--------- phpdbg_prompt.h | 2 +- 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3b1a93b172ff4..1379b6b7bf208 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -26,6 +26,7 @@ void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcal static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; pg->ops = NULL; + pg->stepping = 0; } static PHP_MINIT_FUNCTION(phpdbg) { diff --git a/phpdbg.h b/phpdbg.h index a3da778520d42..0b1f2daa88508 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -36,12 +36,16 @@ # define PHPDBG_G(v) (phpdbg_globals.v) #endif +#define PHPDBG_NEXT 2 + ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable breaks; char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ + zend_bool stepping; /* stepping */ + int vmret; /* return from last opcode handler execution */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index d5ec6fd40c3ed..a72f53fd13c6a 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -30,6 +30,20 @@ PHPDBG_HELP(exec) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(step) { /* {{{ */ + printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); + printf("For example:\n"); + printf("phpdbg> stepping 1\n"); + printf("Will enable stepping\n"); + printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); + return SUCCESS; +} /* }}} */ + +PHPDBG_HELP(next) { /* {{{ */ + printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(compile) /* {{{ */ { printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); @@ -43,7 +57,7 @@ PHPDBG_HELP(print) /* {{{ */ { printf("By default, print will show information about the current execution environment\n"); printf("To show specific information pass an expression to print, for example:\n"); - printf("\tprint opcodes[0]\n"); + printf("\tphpdbg> print opcodes[0]\n"); printf("Will show the opline @ 0\n"); printf("Available print commands:\n"); printf("\tNone\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index 1ab558725ce90..69b710f782ddf 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -33,6 +33,8 @@ */ PHPDBG_HELP(exec); PHPDBG_HELP(compile); +PHPDBG_HELP(step); +PHPDBG_HELP(next); PHPDBG_HELP(run); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -43,6 +45,8 @@ PHPDBG_HELP(break); static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), + PHPDBG_HELP_D(next, "execute the next opcode"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 31722665b3ed1..0dfe14b1befd3 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -85,6 +85,15 @@ static PHPDBG_COMMAND(compile) { /* {{{ */ } } /* }}} */ +static PHPDBG_COMMAND(step) { /* {{{ */ + PHPDBG_G(stepping) = atoi(expr); + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(next) { /* {{{ */ + return PHPDBG_NEXT; +} /* }}} */ + static PHPDBG_COMMAND(run) { /* {{{ */ if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { @@ -116,9 +125,12 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Showing Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); + printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); if (PHPDBG_G(ops)) { - printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last-1); - printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); + if (PHPDBG_G(ops)->last_var) { + printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + } else printf("Variables\tNone\n"); } } else { printf( @@ -175,6 +187,8 @@ static PHPDBG_COMMAND(help) /* {{{ */ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), + PHPDBG_COMMAND_D(step, "step through execution"), + PHPDBG_COMMAND_D(next, "next opcode"), PHPDBG_COMMAND_D(run, "attempt execution"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), @@ -200,7 +214,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ +int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -214,13 +228,20 @@ void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } if (cmd_len) { - if (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC) == FAILURE) { - printf("error executing %s !\n", cmd); - } + switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { + case FAILURE: + printf("error executing %s !\n", cmd); + break; + + case PHPDBG_NEXT: + return PHPDBG_NEXT; + } } printf("phpdbg> "); } + + return SUCCESS; } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) @@ -236,7 +257,6 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) } while (1) { - int ret; #ifdef ZEND_WIN32 if (EG(timed_out)) { zend_timeout(0); @@ -245,8 +265,17 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) printf("[OPLINE: %p]\n", execute_data->opline); - if ((ret = execute_data->opline->handler(execute_data TSRMLS_CC)) > 0) { - switch (ret) { + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); + + if (PHPDBG_G(stepping)) { + while (phpdbg_interactive( + 0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + + if (PHPDBG_G(vmret) > 0) { + switch (PHPDBG_G(vmret)) { case 1: EG(in_execution) = original_in_execution; return; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 028f2c080afa0..b6921d671e446 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -56,7 +56,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #define PHPDBG_COMMAND(name) \ int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) -void phpdbg_interactive(int argc, char **argv TSRMLS_DC); +int phpdbg_interactive(int argc, char **argv TSRMLS_DC); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From d7720099213aed7e75dd7c8d8c49c815e5bf5d5f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 12:36:30 -0200 Subject: [PATCH 0328/1256] - Breakpoint initial work --- phpdbg.c | 20 +++++++++++--------- phpdbg.h | 12 +++++++----- phpdbg_prompt.c | 40 ++++++++++++++++++++++++++++++++++------ phpdbg_prompt.h | 16 ++++++++++++++++ 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3b1a93b172ff4..b484c83d4ecd5 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -30,30 +30,32 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { static PHP_MINIT_FUNCTION(phpdbg) { ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); - + zend_execute_old = zend_execute_ex; zend_execute_ex = phpdbg_execute_ex; - + return SUCCESS; } static inline void php_phpdbg_destroy_break(void *brake) { - + } static PHP_RINIT_FUNCTION(phpdbg) { - zend_hash_init(&PHPDBG_G(breaks), 8, NULL, php_phpdbg_destroy_break, 0); - - return SUCCESS; + zend_hash_init(&PHPDBG_G(break_files), 8, NULL, php_phpdbg_destroy_break, 0); + zend_hash_init(&PHPDBG_G(break_symbols), 8, NULL, php_phpdbg_destroy_break, 0); + + return SUCCESS; } static PHP_RSHUTDOWN_FUNCTION(phpdbg) { - zend_hash_destroy(&PHPDBG_G(breaks)); - + zend_hash_destroy(&PHPDBG_G(break_files)); + zend_hash_destroy(&PHPDBG_G(break_symbols)); + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } - + if (PHPDBG_G(ops)) { destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); diff --git a/phpdbg.h b/phpdbg.h index a3da778520d42..8dbf89fe6291e 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -37,11 +37,13 @@ #endif ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable breaks; - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ - zend_op_array *ops; /* op_array */ - zval *retval; /* return value */ + HashTable break_files; + HashTable break_symbols; + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ + zend_bool has_breakpoint; /* breakpoint has been set */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 31722665b3ed1..1af00badcf4b7 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -93,17 +93,17 @@ static PHPDBG_COMMAND(run) { /* {{{ */ return FAILURE; } } - + EG(active_op_array) = PHPDBG_G(ops); EG(return_value_ptr_ptr) = &PHPDBG_G(retval); - + zend_try { zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { printf("Caught excetion in VM\n"); return FAILURE; } zend_end_try(); - + return SUCCESS; } else { printf("Nothing to execute !"); @@ -128,8 +128,27 @@ static PHPDBG_COMMAND(print) { /* {{{ */ return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(break) { /* {{{ */ - return SUCCESS; +static PHPDBG_COMMAND(break) /* {{{ */ +{ + const char *line_pos = zend_memrchr(expr, ':', expr_len); + + if (line_pos) { + long line_num = strtol(line_pos+1, NULL, 0); + phpdbg_breakfile_t new_break; + zend_llist break_files; + + new_break.filename = estrndup(expr, line_pos - expr); + new_break.line = line_num; + + PHPDBG_G(has_breakpoint) = 1; + + if (zend_hash_find(&PHPDBG_G(break_files), new_break.filename, line_pos - expr, &break_files) == FAILURE) { + zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), NULL, 0); + } + zend_llist_add_element(&break_files, &new_break); + } + + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(quit) /* {{{ */ @@ -200,6 +219,11 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ +void phpdbg_breakpoint(zend_op_array *op_array) /* {{{ */ +{ + printf(">> %s\n", op_array->filename); +} /* }}} */ + void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -244,7 +268,11 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) #endif printf("[OPLINE: %p]\n", execute_data->opline); - + + if (PHPDBG_G(has_breakpoint)) { + phpdbg_breakpoint(execute_data->op_array); + } + if ((ret = execute_data->opline->handler(execute_data TSRMLS_CC)) > 0) { switch (ret) { case 1: diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 028f2c080afa0..01d3f26c0b233 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -43,6 +43,22 @@ typedef struct _phpdbg_command_t { phpdbg_command_handler_t handler; /* Command handler */ } phpdbg_command_t; + +/** + * Breakpoint file-based representation + */ +typedef struct _phpdbg_breakfile_t { + const char *filename; + long line; +} phpdbg_breakfile_t; + +/** + * Breakpoint symbol-based representation + */ +typedef struct _phpdbg_breaksymbol_t { + const char *symbol; +} phpdbg_breaksymbol_t; + /** * Command Executor */ From 2977840a4a1325ba5d94f20ac8adc1ffecd3a54c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:43:46 +0000 Subject: [PATCH 0329/1256] eval() --- phpdbg.c | 1 + phpdbg_help.c | 6 ++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 23 ++++++++++++++++++++++- test.php | 3 +++ 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 1379b6b7bf208..282588967fc9c 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; pg->ops = NULL; pg->stepping = 0; + pg->vmret = 0; } static PHP_MINIT_FUNCTION(phpdbg) { diff --git a/phpdbg_help.c b/phpdbg_help.c index a72f53fd13c6a..b3971988417c0 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -72,6 +72,12 @@ PHPDBG_HELP(run) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(eval) /* {{{ */ +{ + printf("Access to eval() allows you to change the environment during execution, careful though !!"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(break) /* {{{ */ { printf("doing break help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index 69b710f782ddf..7359812b700a7 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -36,6 +36,7 @@ PHPDBG_HELP(compile); PHPDBG_HELP(step); PHPDBG_HELP(next); PHPDBG_HELP(run); +PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -48,6 +49,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), PHPDBG_HELP_D(next, "execute the next opcode"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), + PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 0dfe14b1befd3..326aa442a0fc8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -115,11 +115,27 @@ static PHPDBG_COMMAND(run) { /* {{{ */ return SUCCESS; } else { - printf("Nothing to execute !"); + printf("Nothing to execute !\n"); return FAILURE; } } /* }}} */ +static PHPDBG_COMMAND(eval) { /* {{{ */ + zval retval; + + if (expr) { + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + printf("Success\n"); + zval_dtor(&retval); + } + } else { + printf("No expression provided !\n"); + return FAILURE; + } + + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -132,6 +148,10 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); } else printf("Variables\tNone\n"); } + printf("Executing\t:%s\n", EG(in_execution) ? "yes" : "no"); + if (EG(in_execution)) { + printf("VM Return\t%d\n", PHPDBG_G(vmret)); + } } else { printf( "%s\n", expr); @@ -190,6 +210,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(step, "step through execution"), PHPDBG_COMMAND_D(next, "next opcode"), PHPDBG_COMMAND_D(run, "attempt execution"), + PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(help, "show help menu"), diff --git a/test.php b/test.php index 2f3600c6a0c24..cbb2641e4faa7 100644 --- a/test.php +++ b/test.php @@ -1,3 +1,6 @@ From ac5063468ae3fac6616ff929454641da050a9ec7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:49:52 +0000 Subject: [PATCH 0330/1256] ... --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 326aa442a0fc8..f61f8d408f9e4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -148,7 +148,7 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); } else printf("Variables\tNone\n"); } - printf("Executing\t:%s\n", EG(in_execution) ? "yes" : "no"); + printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); if (EG(in_execution)) { printf("VM Return\t%d\n", PHPDBG_G(vmret)); } From 2f9b34d4b639b79a82d75f4ed509bfbc0e72e9de Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:16:45 +0000 Subject: [PATCH 0331/1256] backtrace --- phpdbg_prompt.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f61f8d408f9e4..3be2753ce9c55 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -136,6 +136,21 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(back) { /* {{{ */ + if (EG(in_execution)) { + const zend_execute_data *current = EG(current_execute_data); + if (current) { + do { + printf("%d\n", current->opline->opcode); + } while ((current = current->prev_execute_data)); + } + return SUCCESS; + } else { + printf("Not executing !\n"); + return FAILURE; + } +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -213,6 +228,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), + PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} @@ -267,9 +283,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) { - zend_bool original_in_execution; + zend_bool original_in_execution = EG(in_execution); - original_in_execution = EG(in_execution); EG(in_execution) = 1; if (0) { From 9552817864350cad7e25926e6e66aaee9684364e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 13:21:20 -0200 Subject: [PATCH 0332/1256] - Get the realpath on break command --- phpdbg_prompt.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 05cf32242a51d..d99dbd346626c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -122,7 +122,7 @@ static PHPDBG_COMMAND(run) { /* {{{ */ static PHPDBG_COMMAND(eval) { /* {{{ */ zval retval; - + if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { printf("Success\n"); @@ -132,7 +132,7 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ printf("No expression provided !\n"); return FAILURE; } - + return SUCCESS; } /* }}} */ @@ -165,13 +165,21 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { + char resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); phpdbg_breakfile_t new_break; zend_llist *break_files_ptr; + size_t name_len; + char *path = estrndup(expr, line_pos - expr); - size_t name_len = line_pos - expr; + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + efree(path); + return FAILURE; + } + efree(path); - new_break.filename = estrndup(expr, name_len); + name_len = strlen(resolved_name); + new_break.filename = estrndup(resolved_name, name_len + 1); new_break.line = line_num; PHPDBG_G(has_file_bp) = 1; @@ -182,7 +190,8 @@ static PHPDBG_COMMAND(break) /* {{{ */ zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), NULL, 0); zend_hash_update(&PHPDBG_G(break_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); + new_break.filename, name_len, &break_files, sizeof(zend_llist), + (void**)&break_files_ptr); } zend_llist_add_element(break_files_ptr, &new_break); } From 48f9db90dd9b6ac98a419a06645c79ec6a82d8ad Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:32:24 +0000 Subject: [PATCH 0333/1256] cont --- phpdbg_help.c | 30 +++++++++++++++++++++--------- phpdbg_help.h | 2 ++ phpdbg_prompt.c | 5 +++++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index b3971988417c0..4edc20bb55da2 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -55,14 +55,14 @@ PHPDBG_HELP(compile) /* {{{ */ PHPDBG_HELP(print) /* {{{ */ { - printf("By default, print will show information about the current execution environment\n"); - printf("To show specific information pass an expression to print, for example:\n"); - printf("\tphpdbg> print opcodes[0]\n"); - printf("Will show the opline @ 0\n"); - printf("Available print commands:\n"); - printf("\tNone\n"); + printf("By default, print will show information about the current execution environment\n"); + printf("To show specific information pass an expression to print, for example:\n"); + printf("\tphpdbg> print opcodes[0]\n"); + printf("Will show the opline @ 0\n"); + printf("Available print commands:\n"); + printf("\tNone\n"); - return SUCCESS; + return SUCCESS; } /* }}} */ PHPDBG_HELP(run) /* {{{ */ @@ -80,7 +80,19 @@ PHPDBG_HELP(eval) /* {{{ */ PHPDBG_HELP(break) /* {{{ */ { - printf("doing break help: %s\n", expr); + printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); + printf("\tfile:line\n"); + printf("[more to come]\n"); + printf("For example:\n"); + printf("\tphpdbg> break test.php:1\n"); + printf("Will break execution on line 1 of test.php\n"); + + return SUCCESS; +} /* }}} */ - return SUCCESS; +PHPDBG_HELP(cont) /* {{{ */ +{ + printf("Continues execution after a breakpoint is met\n"); + printf("[Warnings about using stepping and break points here]\n"); + return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 7359812b700a7..ca510b942a5d7 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -39,6 +39,7 @@ PHPDBG_HELP(run); PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); +PHPDBG_HELP(cont); /** * Commands @@ -52,6 +53,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), + PHPDBG_HELP_D(cont, "use continue when a break point is met"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 54fa53f18fa05..50a7fef922b29 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -94,6 +94,10 @@ static PHPDBG_COMMAND(next) { /* {{{ */ return PHPDBG_NEXT; } /* }}} */ +static PHPDBG_COMMAND(cont) { /* {{{ */ + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(run) { /* {{{ */ if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { @@ -263,6 +267,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), + PHPDBG_COMMAND_D(cont, "continue execution"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 6069121e234a7b70c2c8f9154759e1e583735946 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 13:47:28 -0200 Subject: [PATCH 0334/1256] - Added llist dtor --- phpdbg.c | 27 ++++++++++++++++----------- phpdbg_prompt.c | 11 ++++++++++- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index ea7e3564650a2..a0419f313eabc 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -23,34 +23,39 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); void (*zend_execute_old)(zend_execute_data *execute_data TSRMLS_DC); void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC); -static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { +static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ +{ pg->exec = NULL; pg->ops = NULL; pg->stepping = 0; pg->vmret = 0; -} +} /* }}} */ -static PHP_MINIT_FUNCTION(phpdbg) { +static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ +{ ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); zend_execute_old = zend_execute_ex; zend_execute_ex = phpdbg_execute_ex; return SUCCESS; -} - -static inline void php_phpdbg_destroy_break(void *brake) { +} /* }}} */ -} +static void php_phpdbg_destroy_break(void *brake) /* {{{ */ +{ + zend_llist_destroy((zend_llist*)brake); +} /* }}} */ -static PHP_RINIT_FUNCTION(phpdbg) { +static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ +{ zend_hash_init(&PHPDBG_G(break_files), 8, NULL, php_phpdbg_destroy_break, 0); zend_hash_init(&PHPDBG_G(break_symbols), 8, NULL, php_phpdbg_destroy_break, 0); return SUCCESS; -} +} /* }}} */ -static PHP_RSHUTDOWN_FUNCTION(phpdbg) { +static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ +{ zend_hash_destroy(&PHPDBG_G(break_files)); zend_hash_destroy(&PHPDBG_G(break_symbols)); @@ -63,7 +68,7 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) { efree(PHPDBG_G(ops)); } return SUCCESS; -} +} /* }}} */ static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d99dbd346626c..12c3cc512050c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -28,6 +28,13 @@ static const phpdbg_command_t phpdbg_prompt_commands[]; ZEND_EXTERN_MODULE_GLOBALS(phpdbg); +static void phpdbg_llist_breakfile_dtor(void *data) +{ + phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; + + efree(bp->filename); +} + static PHPDBG_COMMAND(exec) { /* {{{ */ if (PHPDBG_G(exec)) { printf( @@ -187,7 +194,9 @@ static PHPDBG_COMMAND(break) /* {{{ */ if (zend_hash_find(&PHPDBG_G(break_files), new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; - zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), NULL, 0); + + zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), + phpdbg_llist_breakfile_dtor, 0); zend_hash_update(&PHPDBG_G(break_files), new_break.filename, name_len, &break_files, sizeof(zend_llist), From 940f4e27de7d1babd48f3adb4ea284e57efde015 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:49:35 +0000 Subject: [PATCH 0335/1256] backtrace --- phpdbg_prompt.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 50a7fef922b29..387ce74fd575e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -142,12 +142,28 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ static PHPDBG_COMMAND(back) { /* {{{ */ if (EG(in_execution)) { - const zend_execute_data *current = EG(current_execute_data); - if (current) { - do { - printf("%d\n", current->opline->opcode); - } while ((current = current->prev_execute_data)); + zval zbacktrace; + zval **tmp; + HashPosition position; + int i = 0; + int limit = (expr != NULL) ? atoi(expr) : 0; + + zend_fetch_debug_backtrace( + &zbacktrace, 0, 0, limit TSRMLS_CC); + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); + zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { + if (i++) { + printf(",\n"); + } + zend_print_flat_zval_r(*tmp TSRMLS_CC); } + + printf("\n"); + + zval_dtor(&zbacktrace); + return SUCCESS; } else { printf("Not executing !\n"); From 4ef6705a747826052d83d2470e4f85db8a514a2e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:54:19 +0000 Subject: [PATCH 0336/1256] correction to headers backtrace help --- phpdbg.h | 1 + phpdbg_help.c | 8 ++++++++ phpdbg_help.h | 2 ++ 3 files changed, 11 insertions(+) diff --git a/phpdbg.h b/phpdbg.h index 26fb118f4a473..f34fa4c84e008 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -22,6 +22,7 @@ #include "zend_ini_scanner.h" #include "zend_globals.h" #include "zend_stream.h" +#include "zend_builtin_functions.h" #include "SAPI.h" #include #include "php_main.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index 4edc20bb55da2..b3467a4eaae0d 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -96,3 +96,11 @@ PHPDBG_HELP(cont) /* {{{ */ printf("[Warnings about using stepping and break points here]\n"); return SUCCESS; } /* }}} */ + +PHPDBG_HELP(back) { /* {{{ */ + printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); + printf("You can set the limit on the trace, for example:\n"); + printf("phpdbg> back 5\n"); + printf("Will limit the number of frames to 5, the default is no limit\n"); + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index ca510b942a5d7..597dfdca8661c 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -40,6 +40,7 @@ PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); PHPDBG_HELP(cont); +PHPDBG_HELP(back); /** * Commands @@ -54,6 +55,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), PHPDBG_HELP_D(cont, "use continue when a break point is met"), + PHPDBG_HELP_D(back, "show debug backtrace information during execution"), {NULL, 0, 0} }; From 72a60589ece2a198c9bc75e24da1335dc917a1fa Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:55:53 +0000 Subject: [PATCH 0337/1256] consistent help --- phpdbg_help.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index b3467a4eaae0d..916764d5fc6f2 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -33,7 +33,7 @@ PHPDBG_HELP(exec) /* {{{ */ PHPDBG_HELP(step) { /* {{{ */ printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); printf("For example:\n"); - printf("phpdbg> stepping 1\n"); + printf("\tphpdbg> stepping 1\n"); printf("Will enable stepping\n"); printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); return SUCCESS; @@ -100,7 +100,7 @@ PHPDBG_HELP(cont) /* {{{ */ PHPDBG_HELP(back) { /* {{{ */ printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); printf("You can set the limit on the trace, for example:\n"); - printf("phpdbg> back 5\n"); + printf("\tphpdbg> back 5\n"); printf("Will limit the number of frames to 5, the default is no limit\n"); return SUCCESS; } /* }}} */ From 2f4acda67b9fd7659b8424345789f90061c141a8 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:05:15 +0000 Subject: [PATCH 0338/1256] ... --- README.md | 22 ++++++++++++++++++++-- phpdbg.png | Bin 0 -> 116358 bytes 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 phpdbg.png diff --git a/README.md b/README.md index 2fc9fdfa7b47d..c18ca71ca177f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ -phpdbg -====== +phpdbg - The interactive PHP debugger +===================================== + +phpdbg is an interactive debugger for PHP. + +Implemented as a SAPI module, phpdbg can excert complete control over the environment without impacting the functionality or performance of your code. + +Features +======== + + - step through debugging + - setting break points + - showing debug backtraces + - access to eval during execution + - sapi agnositicism, easy integration + +Screeny +======= + +screenshot diff --git a/phpdbg.png b/phpdbg.png new file mode 100644 index 0000000000000000000000000000000000000000..96768f7834ac4a7cde8792a09299e79d44464fce GIT binary patch literal 116358 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 Orl)NLt-5|U>i+=#Sr{n* literal 0 HcmV?d00001 From 9a15ea4d5870603ed456a23e2879051a71f5398f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:06:15 +0000 Subject: [PATCH 0339/1256] ... --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 990f9c652d180..4a145ac78a2a3 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -32,7 +32,7 @@ static void phpdbg_llist_breakfile_dtor(void *data) { phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; - efree(bp->filename); + efree((char*)bp->filename); } static PHPDBG_COMMAND(exec) { /* {{{ */ From 5971ab299be15c57367d3ab642969a07e609483d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:06:57 +0000 Subject: [PATCH 0340/1256] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c18ca71ca177f..42c66cf984254 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ phpdbg - The interactive PHP debugger phpdbg is an interactive debugger for PHP. -Implemented as a SAPI module, phpdbg can excert complete control over the environment without impacting the functionality or performance of your code. +Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. Features ======== From c060093acf5f1732938dc06eae0c76d39d375827 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 14:12:43 -0200 Subject: [PATCH 0341/1256] - WS change --- phpdbg_help.h | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/phpdbg_help.h b/phpdbg_help.h index 597dfdca8661c..1051d61fc9321 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -24,9 +24,9 @@ * Command Declarators */ #define PHPDBG_HELP_D(name, tip) \ - {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_help_##name} + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_help_##name} #define PHPDBG_HELP(name) \ - int phpdbg_do_help_##name(const char *expr, size_t expr_len TSRMLS_DC) + int phpdbg_do_help_##name(const char *expr, size_t expr_len TSRMLS_DC) /** * Helper Forward Declarations @@ -46,17 +46,18 @@ PHPDBG_HELP(back); * Commands */ static const phpdbg_command_t phpdbg_help_commands[] = { - PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), - PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), - PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), - PHPDBG_HELP_D(next, "execute the next opcode"), - PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), - PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), - PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), - PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), - PHPDBG_HELP_D(cont, "use continue when a break point is met"), - PHPDBG_HELP_D(back, "show debug backtrace information during execution"), - {NULL, 0, 0} + PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), + PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), + PHPDBG_HELP_D(next, "execute the next opcode"), + PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), + PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), + PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), + PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), + PHPDBG_HELP_D(cont, "use continue when a break point is met"), + PHPDBG_HELP_D(back, "show debug backtrace information during execution"), + + {NULL, 0, 0} }; #endif /* PHPDBG_HELP_H */ From 8532076c6465e73e7b437f43601c43a70560bf85 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 14:16:52 -0200 Subject: [PATCH 0342/1256] - WS changes --- phpdbg_help.c | 87 ++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 916764d5fc6f2..978f7ae5c0f47 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -25,12 +25,13 @@ PHPDBG_HELP(exec) /* {{{ */ { - printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); - printf("The execution context must be set before execution can take place\n"); - return SUCCESS; + printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); + printf("The execution context must be set before execution can take place\n"); + return SUCCESS; } /* }}} */ -PHPDBG_HELP(step) { /* {{{ */ +PHPDBG_HELP(step) /* {{{ */ +{ printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); printf("For example:\n"); printf("\tphpdbg> stepping 1\n"); @@ -39,68 +40,68 @@ PHPDBG_HELP(step) { /* {{{ */ return SUCCESS; } /* }}} */ -PHPDBG_HELP(next) { /* {{{ */ - printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); - return SUCCESS; +PHPDBG_HELP(next) /* {{{ */ +{ + printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(compile) /* {{{ */ { - printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); - printf("The execution context must be set for compilation to succeed\n"); - printf("If errors occur during compilation they must be resolved before execution can take place.\n"); - printf("You do not need to exit phpdbg to retry compilation\n"); - return SUCCESS; + printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); + printf("The execution context must be set for compilation to succeed\n"); + printf("If errors occur during compilation they must be resolved before execution can take place.\n"); + printf("You do not need to exit phpdbg to retry compilation\n"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(print) /* {{{ */ { - printf("By default, print will show information about the current execution environment\n"); - printf("To show specific information pass an expression to print, for example:\n"); - printf("\tphpdbg> print opcodes[0]\n"); - printf("Will show the opline @ 0\n"); - printf("Available print commands:\n"); - printf("\tNone\n"); - - return SUCCESS; + printf("By default, print will show information about the current execution environment\n"); + printf("To show specific information pass an expression to print, for example:\n"); + printf("\tphpdbg> print opcodes[0]\n"); + printf("Will show the opline @ 0\n"); + printf("Available print commands:\n"); + printf("\tNone\n"); + return SUCCESS; } /* }}} */ -PHPDBG_HELP(run) /* {{{ */ +PHPDBG_HELP(run) /* {{{ */ { - printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); - printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); - return SUCCESS; + printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); + printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(eval) /* {{{ */ { - printf("Access to eval() allows you to change the environment during execution, careful though !!"); - return SUCCESS; + printf("Access to eval() allows you to change the environment during execution, careful though !!"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(break) /* {{{ */ { - printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); - printf("\tfile:line\n"); - printf("[more to come]\n"); - printf("For example:\n"); - printf("\tphpdbg> break test.php:1\n"); - printf("Will break execution on line 1 of test.php\n"); - - return SUCCESS; + printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); + printf("\tfile:line\n"); + printf("[more to come]\n"); + printf("For example:\n"); + printf("\tphpdbg> break test.php:1\n"); + printf("Will break execution on line 1 of test.php\n"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(cont) /* {{{ */ { - printf("Continues execution after a breakpoint is met\n"); - printf("[Warnings about using stepping and break points here]\n"); - return SUCCESS; + printf("Continues execution after a breakpoint is met\n"); + printf("[Warnings about using stepping and break points here]\n"); + return SUCCESS; } /* }}} */ -PHPDBG_HELP(back) { /* {{{ */ - printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); - printf("You can set the limit on the trace, for example:\n"); - printf("\tphpdbg> back 5\n"); - printf("Will limit the number of frames to 5, the default is no limit\n"); - return SUCCESS; +PHPDBG_HELP(back) /* {{{ */ +{ + printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); + printf("You can set the limit on the trace, for example:\n"); + printf("\tphpdbg> back 5\n"); + printf("Will limit the number of frames to 5, the default is no limit\n"); + return SUCCESS; } /* }}} */ From 5cca4190f42e5ba41927e66645ff6902188dc2d7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:30:36 +0000 Subject: [PATCH 0343/1256] fix interference while quitting --- phpdbg.c | 1 + phpdbg.h | 3 ++- phpdbg_prompt.c | 11 ++++++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a0419f313eabc..fc780bfed924b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -29,6 +29,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->ops = NULL; pg->stepping = 0; pg->vmret = 0; + pg->quitting = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index f34fa4c84e008..5721ff5fd52b4 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -46,9 +46,10 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ - zend_bool stepping; /* stepping */ + int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ + zend_bool quitting; /* quitting flag */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4a145ac78a2a3..e5c3142eda880 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -120,8 +120,10 @@ static PHPDBG_COMMAND(run) { /* {{{ */ zend_try { zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { - printf("Caught excetion in VM\n"); - return FAILURE; + if (!PHPDBG_G(quitting)) { + printf("Caught excetion in VM\n"); + return FAILURE; + } else return SUCCESS; } zend_end_try(); return SUCCESS; @@ -245,6 +247,8 @@ static PHPDBG_COMMAND(break) /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { + PHPDBG_G(quitting)=1; + zend_bailout(); return SUCCESS; @@ -344,7 +348,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ printf("phpdbg> "); - while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + while (!PHPDBG_G(quitting) && + fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; while (cmd[cmd_len] == '\n') { From 782ea75c9e8833ffd32a84875ab9c3c2712c4b0a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:33:35 +0000 Subject: [PATCH 0344/1256] ... --- phpdbg_prompt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e5c3142eda880..a176be4c9e1d5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -367,7 +367,9 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } } - printf("phpdbg> "); + if (!PHPDBG_G(quitting)) { + printf("phpdbg> "); + } } return SUCCESS; From 5f6c416b1463286f56bd14e22b8abe7bb9609032 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:34:12 +0000 Subject: [PATCH 0345/1256] consistency --- phpdbg_prompt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a176be4c9e1d5..4566fc7ef264b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -359,7 +359,10 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ if (cmd_len) { switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: - printf("error executing %s !\n", cmd); + if (!PHPDBG_G(quitting)) { + printf( + "Failed to execute %s !\n", cmd); + } break; case PHPDBG_NEXT: From c6f443db2ecbd4207498ed07715f432ee0f0ef25 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:47:39 +0000 Subject: [PATCH 0346/1256] improve output from eval() --- phpdbg_prompt.c | 7 +++++-- test.php | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4566fc7ef264b..51c160582f881 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -135,10 +135,13 @@ static PHPDBG_COMMAND(run) { /* {{{ */ static PHPDBG_COMMAND(eval) { /* {{{ */ zval retval; - + if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - printf("Success\n"); + printf("Success: "); + zend_print_zval_r( + &retval, 0 TSRMLS_CC); + printf("\n"); zval_dtor(&retval); } } else { diff --git a/test.php b/test.php index cbb2641e4faa7..e907c3b6bf276 100644 --- a/test.php +++ b/test.php @@ -3,4 +3,5 @@ if (isset($greeting)) { echo $greeting; } +return true; ?> From 3716646d3ccd1eb1861fb54e5eda7115a5d8ce60 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 17:45:06 +0000 Subject: [PATCH 0347/1256] ... --- phpdbg.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- phpdbg.h | 1 + 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index fc780bfed924b..45377503898f1 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -126,9 +126,36 @@ static sapi_module_struct phpdbg_sapi_module = { }; /* }}} */ +const opt_struct OPTIONS[] = { /* }}} */ + {'c', 1, "ini path override"}, + {'d', 1, "define ini entry on command line"}, + {'-', 0, NULL} +}; /* }}} */ + +/* overwriteable ini defaults must be set in phpdbg_ini_defaults() */ +#define INI_DEFAULT(name,value)\ + Z_SET_REFCOUNT(tmp, 0);\ + Z_UNSET_ISREF(tmp); \ + ZVAL_STRINGL(&tmp, zend_strndup(value, sizeof(value)-1), sizeof(value)-1, 0);\ + zend_hash_update(configuration_hash, name, sizeof(name), &tmp, sizeof(zval), NULL);\ + +void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ + zval tmp; + INI_DEFAULT("report_zend_debug", "0"); + INI_DEFAULT("display_errors", "1"); +} /* }}} */ + int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *ini_file = NULL; + char *ini_entries = NULL; + int ini_entries_len = 0; + char *ini_path_override = NULL; + char *php_optarg = NULL; + int php_optind = 0; + int opt; + #ifdef ZTS void ***tsrm_ls; tsrm_startup(1, 1, 0, NULL); @@ -143,10 +170,59 @@ int main(int argc, char **argv) /* {{{ */ setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - phpdbg->executable_location = argv[0]; - + while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 1, 1)) != -1) { + switch (opt) { + case 'c': + if (ini_path_override) { + free(ini_path_override); + } + ini_path_override = strdup(php_optarg); + break; + case 'd': { + int len = strlen(php_optarg); + char *val; + + if ((val = strchr(php_optarg, '='))) { + val++; + if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { + ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\"\"\n\0")); + memcpy(ini_entries + ini_entries_len, php_optarg, (val - php_optarg)); + ini_entries_len += (val - php_optarg); + memcpy(ini_entries + ini_entries_len, "\"", 1); + ini_entries_len++; + memcpy(ini_entries + ini_entries_len, val, len - (val - php_optarg)); + ini_entries_len += len - (val - php_optarg); + memcpy(ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); + ini_entries_len += sizeof("\n\0\"") - 2; + } else { + ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\n\0")); + memcpy(ini_entries + ini_entries_len, php_optarg, len); + memcpy(ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); + ini_entries_len += len + sizeof("\n\0") - 2; + } + } else { + ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("=1\n\0")); + memcpy(ini_entries + ini_entries_len, php_optarg, len); + memcpy(ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); + ini_entries_len += len + sizeof("=1\n\0") - 2; + } + } break; + } + } + + phpdbg->ini_defaults = phpdbg_ini_defaults; + phpdbg->php_ini_path_override = ini_path_override; + phpdbg->phpinfo_as_text = 1; + phpdbg->php_ini_ignore_cwd = 1; + sapi_startup(phpdbg); + phpdbg->executable_location = argv[0]; + phpdbg->phpinfo_as_text = 1; + phpdbg->php_ini_ignore_cwd = 0; + phpdbg->php_ini_ignore = 0; + phpdbg->ini_entries = ini_entries; + if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); @@ -165,6 +241,14 @@ int main(int argc, char **argv) /* {{{ */ zend_try { phpdbg_interactive(argc, argv TSRMLS_CC); } zend_end_try(); + + if (ini_file) { + pefree(ini_file, 1); + } + + if (ini_entries) { + free(ini_entries); + } if (PG(modules_activated)) { zend_try { diff --git a/phpdbg.h b/phpdbg.h index 5721ff5fd52b4..087323009e439 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -18,6 +18,7 @@ #include "php.h" #include "php_globals.h" #include "php_variables.h" +#include "php_getopt.h" #include "zend_modules.h" #include "zend_ini_scanner.h" #include "zend_globals.h" From 16930d85f84d5e8c26fa40d951c751237e2a140f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 15:49:25 -0200 Subject: [PATCH 0348/1256] - Initial code for breakpoint on function --- phpdbg.h | 5 +-- phpdbg_prompt.c | 83 +++++++++++++++++++++++++++++++++++++++++++------ phpdbg_prompt.h | 1 + test.php | 8 +++-- 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index f34fa4c84e008..68c987a429519 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -40,8 +40,8 @@ #define PHPDBG_NEXT 2 ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable break_files; - HashTable break_symbols; + HashTable bp_files; + HashTable bp_symbols; char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ @@ -49,6 +49,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ + zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4a145ac78a2a3..c941fc94836e4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -35,6 +35,13 @@ static void phpdbg_llist_breakfile_dtor(void *data) efree((char*)bp->filename); } +static void phpdbg_llist_breaksym_dtor(void *data) +{ + phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; + + efree((char*)bp->symbol); +} + static PHPDBG_COMMAND(exec) { /* {{{ */ if (PHPDBG_G(exec)) { printf( @@ -154,10 +161,10 @@ static PHPDBG_COMMAND(back) { /* {{{ */ HashPosition position; int i = 0; int limit = (expr != NULL) ? atoi(expr) : 0; - + zend_fetch_debug_backtrace( &zbacktrace, 0, 0, limit TSRMLS_CC); - + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { @@ -166,11 +173,11 @@ static PHPDBG_COMMAND(back) { /* {{{ */ } zend_print_flat_zval_r(*tmp TSRMLS_CC); } - + printf("\n"); - + zval_dtor(&zbacktrace); - + return SUCCESS; } else { printf("Not executing !\n"); @@ -226,18 +233,42 @@ static PHPDBG_COMMAND(break) /* {{{ */ PHPDBG_G(has_file_bp) = 1; - if (zend_hash_find(&PHPDBG_G(break_files), + if (zend_hash_find(&PHPDBG_G(bp_files), new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); - zend_hash_update(&PHPDBG_G(break_files), + zend_hash_update(&PHPDBG_G(bp_files), new_break.filename, name_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } zend_llist_add_element(break_files_ptr, &new_break); + } else { + const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); + long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; + phpdbg_breaksymbol_t new_break; + zend_llist *break_sym_ptr; + size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + + new_break.symbol = estrndup(expr, name_len); + new_break.opline_num = opline_num; + + PHPDBG_G(has_sym_bp) = 1; + + if (zend_hash_find(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { + zend_llist break_syms; + + zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), + phpdbg_llist_breaksym_dtor, 0); + + zend_hash_update(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, &break_syms, sizeof(zend_llist), + (void**)&break_sym_ptr); + } + zend_llist_add_element(break_sym_ptr, &new_break); } return SUCCESS; @@ -316,12 +347,12 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -int phpdbg_breakpoint(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); zend_llist *break_list; - if (zend_hash_find(&PHPDBG_G(break_files), op_array->filename, name_len, + if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, (void**)&break_list) == SUCCESS) { zend_llist_element *le; @@ -338,6 +369,30 @@ int phpdbg_breakpoint(zend_op_array *op_array TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ +int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) +{ + const char *fname; + zend_llist *break_list; + + if (fbc->type != ZEND_USER_FUNCTION) { + return FAILURE; + } + + fname = ((zend_op_array*)fbc)->function_name; + + if (!fname) { + fname = "main"; + } + + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), + (void**)&break_list) == SUCCESS) { + printf("breakpoint reached!\n"); + return SUCCESS; + } + + return FAILURE; +} + int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -389,7 +444,15 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) printf("[OPLINE: %p]\n", execute_data->opline); if (PHPDBG_G(has_file_bp) - && phpdbg_breakpoint(execute_data->op_array TSRMLS_CC) == SUCCESS) { + && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + + if (PHPDBG_G(has_sym_bp) + && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) + && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 8a4dfad675fd6..0f938e0051eb2 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -57,6 +57,7 @@ typedef struct _phpdbg_breakfile_t { */ typedef struct _phpdbg_breaksymbol_t { const char *symbol; + long opline_num; } phpdbg_breaksymbol_t; /** diff --git a/test.php b/test.php index cbb2641e4faa7..0a10de16a93eb 100644 --- a/test.php +++ b/test.php @@ -1,6 +1,8 @@ From 307897e6027fde67138d1ecc70503b0bd9ff759d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 17:51:48 +0000 Subject: [PATCH 0349/1256] instructions --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 42c66cf984254..a15e556226f11 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,21 @@ Features - access to eval during execution - sapi agnositicism, easy integration +Installation +============ + +To install **phpdbg**, you must compile the source against your PHP installation sources, and enable the SAPI with the configure command. + +``` +cd /usr/src/php-src/sapi +git clone https://github.com/krakjoe/phpdbg +cd ../ +./buildconf --force +./config.nice +make -j8 +make install-phpdbg +``` + Screeny ======= From 4d127e4afbff3f751208f2881a16a56e745d16a4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:05:11 +0000 Subject: [PATCH 0350/1256] print_opline function to decode opline --- phpdbg_prompt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fe81c8cb9dd69..d60bafa4abcc2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -436,6 +436,13 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ +static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ + zend_op *opline = execute_data->opline; + + printf( + "[OPLINE: %p:%d]\n", opline, opline->opcode); +} /* }}} */ + void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) { zend_bool original_in_execution = EG(in_execution); @@ -454,7 +461,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) } #endif - printf("[OPLINE: %p]\n", execute_data->opline); + phpdbg_print_opline(execute_data TSRMLS_CC); if (PHPDBG_G(has_file_bp) && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { From defc4c318022cb8d56d38b90dbbd55a195c8529e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:06:41 -0200 Subject: [PATCH 0351/1256] - Added separated file to handle breakpoint feature --- config.m4 | 2 +- phpdbg.h | 6 +- phpdbg_bp.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_bp.h | 39 +++++++++++++ phpdbg_help.h | 2 + phpdbg_prompt.c | 121 ++------------------------------------- phpdbg_prompt.h | 17 ------ 7 files changed, 200 insertions(+), 134 deletions(-) create mode 100644 phpdbg_bp.c create mode 100644 phpdbg_bp.h diff --git a/config.m4 b/config.m4 index b62d099ad4065..4f98bb92bf71c 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c" PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) diff --git a/phpdbg.h b/phpdbg.h index 427d22aa968d4..437fe8a244136 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -15,6 +15,10 @@ | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ + +#ifndef PHPDBG_H +#define PHPDBG_H + #include "php.h" #include "php_globals.h" #include "php_variables.h" @@ -54,4 +58,4 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool quitting; /* quitting flag */ ZEND_END_MODULE_GLOBALS(phpdbg) -#include "phpdbg_prompt.h" +#endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c new file mode 100644 index 0000000000000..a45ab164f7ecb --- /dev/null +++ b/phpdbg_bp.c @@ -0,0 +1,147 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include "zend.h" +#include "zend_hash.h" +#include "phpdbg.h" +#include "phpdbg_bp.h" + +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ +{ + phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; + + efree((char*)bp->filename); +} /* }}} */ + +static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ +{ + phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; + + efree((char*)bp->symbol); +} /* }}} */ + +void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC) /* {{{ */ +{ + char resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + phpdbg_breakfile_t new_break; + zend_llist *break_files_ptr; + size_t name_len; + char *path = estrndup(expr, line_pos - expr); + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + efree(path); + return; + } + efree(path); + + name_len = strlen(resolved_name); + new_break.filename = estrndup(resolved_name, name_len + 1); + new_break.line = line_num; + + PHPDBG_G(has_file_bp) = 1; + + if (zend_hash_find(&PHPDBG_G(bp_files), + new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { + zend_llist break_files; + + zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), + phpdbg_llist_breakfile_dtor, 0); + + zend_hash_update(&PHPDBG_G(bp_files), + new_break.filename, name_len, &break_files, sizeof(zend_llist), + (void**)&break_files_ptr); + } + zend_llist_add_element(break_files_ptr, &new_break); +} /* }}} */ + +void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos TSRMLS_DC) /* {{{ */ +{ + long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; + phpdbg_breaksymbol_t new_break; + zend_llist *break_sym_ptr; + size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + + new_break.symbol = estrndup(expr, name_len); + new_break.opline_num = opline_num; + + PHPDBG_G(has_sym_bp) = 1; + + if (zend_hash_find(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { + zend_llist break_syms; + + zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), + phpdbg_llist_breaksym_dtor, 0); + + zend_hash_update(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, &break_syms, sizeof(zend_llist), + (void**)&break_sym_ptr); + } + zend_llist_add_element(break_sym_ptr, &new_break); +} /* }}} */ + +int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +{ + size_t name_len = strlen(op_array->filename); + zend_llist *break_list; + + if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, + (void**)&break_list) == SUCCESS) { + zend_llist_element *le; + + for (le = break_list->head; le; le = le->next) { + phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) le->data; + + if (bp->line == (*EG(opline_ptr))->lineno) { + printf("breakpoint reached!\n"); + return SUCCESS; + } + } + } + + return FAILURE; +} /* }}} */ + +int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ +{ + const char *fname; + zend_llist *break_list; + + if (fbc->type != ZEND_USER_FUNCTION) { + return FAILURE; + } + + fname = ((zend_op_array*)fbc)->function_name; + + if (!fname) { + fname = "main"; + } + + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), + (void**)&break_list) == SUCCESS) { + printf("breakpoint reached!\n"); + return SUCCESS; + } + + return FAILURE; +} +/* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h new file mode 100644 index 0000000000000..87aea82d0f9ac --- /dev/null +++ b/phpdbg_bp.h @@ -0,0 +1,39 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_BP_H +#define PHPDBG_BP_H + +/** + * Breakpoint file-based representation + */ +typedef struct _phpdbg_breakfile_t { + const char *filename; + long line; +} phpdbg_breakfile_t; + +/** + * Breakpoint symbol-based representation + */ +typedef struct _phpdbg_breaksymbol_t { + const char *symbol; + long opline_num; +} phpdbg_breaksymbol_t; + +#endif /* PHPDBG_BP_H */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 1051d61fc9321..8ce6f9691d260 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -20,6 +20,8 @@ #ifndef PHPDBG_HELP_H #define PHPDBG_HELP_H +#include "phpdbg_prompt.h" + /** * Command Declarators */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fe81c8cb9dd69..5e795b624b355 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -23,25 +23,12 @@ #include "zend_compile.h" #include "phpdbg.h" #include "phpdbg_help.h" +#include "phpdbg_bp.h" static const phpdbg_command_t phpdbg_prompt_commands[]; ZEND_EXTERN_MODULE_GLOBALS(phpdbg); -static void phpdbg_llist_breakfile_dtor(void *data) -{ - phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; - - efree((char*)bp->filename); -} - -static void phpdbg_llist_breaksym_dtor(void *data) -{ - phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; - - efree((char*)bp->symbol); -} - static PHPDBG_COMMAND(exec) { /* {{{ */ if (PHPDBG_G(exec)) { printf( @@ -142,7 +129,7 @@ static PHPDBG_COMMAND(run) { /* {{{ */ static PHPDBG_COMMAND(eval) { /* {{{ */ zval retval; - + if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { printf("Success: "); @@ -219,61 +206,11 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { - char resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); - phpdbg_breakfile_t new_break; - zend_llist *break_files_ptr; - size_t name_len; - char *path = estrndup(expr, line_pos - expr); - - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - efree(path); - return FAILURE; - } - efree(path); - - name_len = strlen(resolved_name); - new_break.filename = estrndup(resolved_name, name_len + 1); - new_break.line = line_num; - - PHPDBG_G(has_file_bp) = 1; - - if (zend_hash_find(&PHPDBG_G(bp_files), - new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { - zend_llist break_files; - - zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), - phpdbg_llist_breakfile_dtor, 0); - - zend_hash_update(&PHPDBG_G(bp_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), - (void**)&break_files_ptr); - } - zend_llist_add_element(break_files_ptr, &new_break); + phpdbg_set_breakpoint_file(expr, line_pos TSRMLS_CC); } else { const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); - long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; - phpdbg_breaksymbol_t new_break; - zend_llist *break_sym_ptr; - size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); - - new_break.symbol = estrndup(expr, name_len); - new_break.opline_num = opline_num; - - PHPDBG_G(has_sym_bp) = 1; - if (zend_hash_find(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { - zend_llist break_syms; - - zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), - phpdbg_llist_breaksym_dtor, 0); - - zend_hash_update(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, &break_syms, sizeof(zend_llist), - (void**)&break_sym_ptr); - } - zend_llist_add_element(break_sym_ptr, &new_break); + phpdbg_set_breakpoint_symbol(expr, opline_num_pos TSRMLS_CC); } return SUCCESS; @@ -282,7 +219,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { PHPDBG_G(quitting)=1; - + zend_bailout(); return SUCCESS; @@ -354,59 +291,13 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ -{ - size_t name_len = strlen(op_array->filename); - zend_llist *break_list; - - if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, - (void**)&break_list) == SUCCESS) { - zend_llist_element *le; - - for (le = break_list->head; le; le = le->next) { - phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) le->data; - - if (bp->line == (*EG(opline_ptr))->lineno) { - printf("breakpoint reached!\n"); - return SUCCESS; - } - } - } - - return FAILURE; -} /* }}} */ - -int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) -{ - const char *fname; - zend_llist *break_list; - - if (fbc->type != ZEND_USER_FUNCTION) { - return FAILURE; - } - - fname = ((zend_op_array*)fbc)->function_name; - - if (!fname) { - fname = "main"; - } - - if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), - (void**)&break_list) == SUCCESS) { - printf("breakpoint reached!\n"); - return SUCCESS; - } - - return FAILURE; -} - int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; printf("phpdbg> "); - while (!PHPDBG_G(quitting) && + while (!PHPDBG_G(quitting) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 0f938e0051eb2..b6921d671e446 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -43,23 +43,6 @@ typedef struct _phpdbg_command_t { phpdbg_command_handler_t handler; /* Command handler */ } phpdbg_command_t; - -/** - * Breakpoint file-based representation - */ -typedef struct _phpdbg_breakfile_t { - const char *filename; - long line; -} phpdbg_breakfile_t; - -/** - * Breakpoint symbol-based representation - */ -typedef struct _phpdbg_breaksymbol_t { - const char *symbol; - long opline_num; -} phpdbg_breaksymbol_t; - /** * Command Executor */ From 4bfbdf55dce16eb2e25defa9d3fbe1b68a9ec38c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:08:08 +0000 Subject: [PATCH 0352/1256] next not quitting when not stepping --- phpdbg_prompt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 7e4f46d093aa2..252af0a16f47a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -314,8 +314,10 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: if (PHPDBG_G(stepping)) { return PHPDBG_NEXT; + } + } } From 7d43677b1f87567d334562cb8bc04c998d63cd94 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:10:23 -0200 Subject: [PATCH 0353/1256] - Fix code --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5e795b624b355..02bb377af504a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -301,7 +301,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; - while (cmd[cmd_len] == '\n') { + if (cmd[cmd_len] == '\n') { cmd[cmd_len] = 0; } From 226052fb8ace69330a154da160af7f8bbf590459 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:15:00 -0200 Subject: [PATCH 0354/1256] - Simplify code --- phpdbg_prompt.c | 52 +++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cec6abb245d47..cb24a3e7b3491 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -177,28 +177,34 @@ static PHPDBG_COMMAND(back) { /* {{{ */ } } /* }}} */ -static PHPDBG_COMMAND(print) { /* {{{ */ - if (!expr_len) { - printf("Showing Execution Context Information:\n"); - printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); - printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); - printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); - if (PHPDBG_G(ops)) { - printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); - if (PHPDBG_G(ops)->last_var) { - printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); - } else printf("Variables\tNone\n"); - } - printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); - if (EG(in_execution)) { - printf("VM Return\t%d\n", PHPDBG_G(vmret)); - } - } else { - printf( - "%s\n", expr); - } +static PHPDBG_COMMAND(print) /* {{{ */ +{ + if (expr_len) { + printf("%s\n", expr); + return SUCCESS; + } - return SUCCESS; + printf("Showing Execution Context Information:\n"); + printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); + printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); + + if (PHPDBG_G(ops)) { + printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); + + if (PHPDBG_G(ops)->last_var) { + printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + } else { + printf("Variables\tNone\n"); + } + } + printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); + + if (EG(in_execution)) { + printf("VM Return\t%d\n", PHPDBG_G(vmret)); + } + + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(break) /* {{{ */ @@ -317,7 +323,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ case PHPDBG_NEXT: if (PHPDBG_G(stepping)) { return PHPDBG_NEXT; } - + } } @@ -331,7 +337,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ zend_op *opline = execute_data->opline; - + printf( "[OPLINE: %p:%d]\n", opline, opline->opcode); } /* }}} */ From ddf5c42e2db8d3320ce4ba48240f64d0dddbfad0 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:21:49 -0200 Subject: [PATCH 0355/1256] - Cosmetic changes --- phpdbg_prompt.c | 109 +++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 57 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cb24a3e7b3491..ba6cebcd32dae 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -146,35 +146,32 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(back) { /* {{{ */ - if (EG(in_execution)) { - zval zbacktrace; - zval **tmp; - HashPosition position; - int i = 0; - int limit = (expr != NULL) ? atoi(expr) : 0; - - zend_fetch_debug_backtrace( - &zbacktrace, 0, 0, limit TSRMLS_CC); - - for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); - zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; - zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { - if (i++) { - printf(",\n"); - } - zend_print_flat_zval_r(*tmp TSRMLS_CC); - } - - printf("\n"); +static PHPDBG_COMMAND(back) /* {{{ */ +{ + if (!EG(in_execution)) { + printf("Not executing !\n"); + return FAILURE; + } + zval zbacktrace; + zval **tmp; + HashPosition position; + int i = 0, limit = (expr != NULL) ? atoi(expr) : 0; + + zend_fetch_debug_backtrace(&zbacktrace, 0, 0, limit TSRMLS_CC); + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); + zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { + if (i++) { + printf(",\n"); + } + zend_print_flat_zval_r(*tmp TSRMLS_CC); + } - zval_dtor(&zbacktrace); + printf("\n"); + zval_dtor(&zbacktrace); - return SUCCESS; - } else { - printf("Not executing !\n"); - return FAILURE; - } + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(print) /* {{{ */ @@ -233,35 +230,33 @@ static PHPDBG_COMMAND(quit) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("Welcome to phpdbg, the interactive PHP debugger.\n"); - if (!expr_len) { - printf("To get help regarding a specific command type \"help command\"\n"); - printf("Commands:\n"); - { - const phpdbg_command_t *command = phpdbg_prompt_commands; - while (command && command->name) { - printf( - "\t%s\t%s\n", command->name, command->tip); - command++; - } - } - printf("Helpers Loaded:\n"); - { - const phpdbg_command_t *command = phpdbg_help_commands; - while (command && command->name) { - printf( - "\t%s\t%s\n", command->name, command->tip); - command++; - } - } - } else { - if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { - printf("failed to find help command: %s\n", expr); - } - } - printf("Please report bugs to \n"); + printf("Welcome to phpdbg, the interactive PHP debugger.\n"); - return SUCCESS; + if (!expr_len) { + const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; + const phpdbg_command_t *help_command = phpdbg_help_commands; + + printf("To get help regarding a specific command type \"help command\"\n"); + + printf("Commands:\n"); + while (prompt_command && prompt_command->name) { + printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); + ++prompt_command; + } + + printf("Helpers Loaded:\n"); + while (help_command && help_command->name) { + printf("\t%s\t%s\n", help_command->name, help_command->tip); + ++help_command; + } + } else { + if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { + printf("failed to find help command: %s\n", expr); + } + } + printf("Please report bugs to \n"); + + return SUCCESS; } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { @@ -342,7 +337,7 @@ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* "[OPLINE: %p:%d]\n", opline, opline->opcode); } /* }}} */ -void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) +void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { zend_bool original_in_execution = EG(in_execution); @@ -404,4 +399,4 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) } zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); -} +} /* }}} */ From 7752077b63af0a9c52a46b8a8e2aeb8796bec3e7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:24:08 -0200 Subject: [PATCH 0356/1256] - Added prototype for breakpoint funcs --- phpdbg_bp.h | 3 +++ phpdbg_help.c | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 87aea82d0f9ac..78909d2ae368d 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -36,4 +36,7 @@ typedef struct _phpdbg_breaksymbol_t { long opline_num; } phpdbg_breaksymbol_t; +void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); + #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_help.c b/phpdbg_help.c index 978f7ae5c0f47..26811d0c395ea 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -18,7 +18,6 @@ */ #include -#include #include "zend.h" #include "phpdbg.h" #include "phpdbg_help.h" From cc85f285c6eb1de28c5f259d1fb99a40ee443ba3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:28:50 +0000 Subject: [PATCH 0357/1256] print opcode names --- phpdbg_prompt.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 252af0a16f47a..39ad020310b04 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -329,11 +329,184 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ +static const char *phpdbg_decode_opcode(zend_uchar opcode TSRMLS_DC) { /* {{{ */ + switch (opcode) { + case ZEND_NOP: return "ZEND_NOP"; + case ZEND_ADD: return "ZEND_ADD"; + case ZEND_SUB: return "ZEND_SUB"; + case ZEND_MUL: return "ZEND_MUL"; + case ZEND_DIV: return "ZEND_DIV"; + case ZEND_MOD: return "ZEND_MOD"; + case ZEND_SL: return "ZEND_SL"; + case ZEND_SR: return "ZEND_SR"; + case ZEND_CONCAT: return "ZEND_CONCAT"; + case ZEND_BW_OR: return "ZEND_BW_OR"; + case ZEND_BW_AND: return "ZEND_BW_AND"; + case ZEND_BW_XOR: return "ZEND_BW_XOR"; + case ZEND_BW_NOT: return "ZEND_BW_NOT"; + case ZEND_BOOL_NOT: return "ZEND_BOOL_NOT"; + case ZEND_BOOL_XOR: return "ZEND_BOOL_XOR"; + case ZEND_IS_IDENTICAL: return "ZEND_IS_IDENTICAL"; + case ZEND_IS_NOT_IDENTICAL: return "ZEND_IS_NOT_IDENTICAL"; + case ZEND_IS_EQUAL: return "ZEND_IS_EQUAL"; + case ZEND_IS_NOT_EQUAL: return "ZEND_IS_NOT_EQUAL"; + case ZEND_IS_SMALLER: return "ZEND_IS_SMALLER"; + case ZEND_IS_SMALLER_OR_EQUAL: return "ZEND_IS_SMALLER_OR_EQUAL"; + case ZEND_CAST: return "ZEND_CAST"; + case ZEND_QM_ASSIGN: return "ZEND_QM_ASSIGN"; + case ZEND_ASSIGN_ADD: return "ZEND_ASSIGN_ADD"; + case ZEND_ASSIGN_SUB: return "ZEND_ASSIGN_SUB"; + case ZEND_ASSIGN_MUL: return "ZEND_ASSIGN_MUL"; + case ZEND_ASSIGN_DIV: return "ZEND_ASSIGN_DIV"; + case ZEND_ASSIGN_MOD: return "ZEND_ASSIGN_MOD"; + case ZEND_ASSIGN_SL: return "ZEND_ASSIGN_SL"; + case ZEND_ASSIGN_SR: return "ZEND_ASSIGN_SR"; + case ZEND_ASSIGN_CONCAT: return "ZEND_ASSIGN_CONCAT"; + case ZEND_ASSIGN_BW_OR: return "ZEND_ASSIGN_BW_OR"; + case ZEND_ASSIGN_BW_AND: return "ZEND_ASSIGN_BW_AND"; + case ZEND_ASSIGN_BW_XOR: return "ZEND_ASSIGN_BW_XOR"; + case ZEND_PRE_INC: return "ZEND_PRE_INC"; + case ZEND_PRE_DEC: return "ZEND_PRE_DEC"; + case ZEND_POST_INC: return "ZEND_POST_INC"; + case ZEND_POST_DEC: return "ZEND_POST_DEC"; + case ZEND_ASSIGN: return "ZEND_ASSIGN"; + case ZEND_ASSIGN_REF: return "ZEND_ASSIGN_REF"; + case ZEND_ECHO: return "ZEND_ECHO"; + case ZEND_PRINT: return "ZEND_PRINT"; + case ZEND_JMP: return "ZEND_JMP"; + case ZEND_JMPZ: return "ZEND_JMPZ"; + case ZEND_JMPNZ: return "ZEND_JMPNZ"; + case ZEND_JMPZNZ: return "ZEND_JMPZNZ"; + case ZEND_JMPZ_EX: return "ZEND_JMPZ_EX"; + case ZEND_JMPNZ_EX: return "ZEND_JMPNZ_EX"; + case ZEND_CASE: return "ZEND_CASE"; + case ZEND_SWITCH_FREE: return "ZEND_SWITCH_FREE"; + case ZEND_BRK: return "ZEND_BRK"; + case ZEND_CONT: return "ZEND_CONT"; + case ZEND_BOOL: return "ZEND_BOOL"; + case ZEND_INIT_STRING: return "ZEND_INIT_STRING"; + case ZEND_ADD_CHAR: return "ZEND_ADD_CHAR"; + case ZEND_ADD_STRING: return "ZEND_ADD_STRING"; + case ZEND_ADD_VAR: return "ZEND_ADD_VAR"; + case ZEND_BEGIN_SILENCE: return "ZEND_BEGIN_SILENCE"; + case ZEND_END_SILENCE: return "ZEND_END_SILENCE"; + case ZEND_INIT_FCALL_BY_NAME: return "ZEND_INIT_FCALL_BY_NAME"; + case ZEND_DO_FCALL: return "ZEND_DO_FCALL"; + case ZEND_DO_FCALL_BY_NAME: return "ZEND_DO_FCALL_BY_NAME"; + case ZEND_RETURN: return "ZEND_RETURN"; + case ZEND_RECV: return "ZEND_RECV"; + case ZEND_RECV_INIT: return "ZEND_RECV_INIT"; + case ZEND_SEND_VAL: return "ZEND_SEND_VAL"; + case ZEND_SEND_VAR: return "ZEND_SEND_VAR"; + case ZEND_SEND_REF: return "ZEND_SEND_REF"; + case ZEND_NEW: return "ZEND_NEW"; + case ZEND_INIT_NS_FCALL_BY_NAME: return "ZEND_INIT_NS_FCALL_BY_NAME"; + case ZEND_FREE: return "ZEND_FREE"; + case ZEND_INIT_ARRAY: return "ZEND_INIT_ARRAY"; + case ZEND_ADD_ARRAY_ELEMENT: return "ZEND_ADD_ARRAY_ELEMENT"; + case ZEND_INCLUDE_OR_EVAL: return "ZEND_INCLUDE_OR_EVAL"; + case ZEND_UNSET_VAR: return "ZEND_UNSET_VAR"; + case ZEND_UNSET_DIM: return "ZEND_UNSET_DIM"; + case ZEND_UNSET_OBJ: return "ZEND_UNSET_OBJ"; + case ZEND_FE_RESET: return "ZEND_FE_RESET"; + case ZEND_FE_FETCH: return "ZEND_FE_FETCH"; + case ZEND_EXIT: return "ZEND_EXIT"; + case ZEND_FETCH_R: return "ZEND_FETCH_R"; + case ZEND_FETCH_DIM_R: return "ZEND_FETCH_DIM_R"; + case ZEND_FETCH_OBJ_R: return "ZEND_FETCH_OBJ_R"; + case ZEND_FETCH_W: return "ZEND_FETCH_W"; + case ZEND_FETCH_DIM_W: return "ZEND_FETCH_DIM_W"; + case ZEND_FETCH_OBJ_W: return "ZEND_FETCH_OBJ_W"; + case ZEND_FETCH_RW: return "ZEND_FETCH_RW"; + case ZEND_FETCH_DIM_RW: return "ZEND_FETCH_DIM_RW"; + case ZEND_FETCH_OBJ_RW: return "ZEND_FETCH_OBJ_RW"; + case ZEND_FETCH_IS: return "ZEND_FETCH_IS"; + case ZEND_FETCH_DIM_IS: return "ZEND_FETCH_DIM_IS"; + case ZEND_FETCH_OBJ_IS: return "ZEND_FETCH_OBJ_IS"; + case ZEND_FETCH_FUNC_ARG: return "ZEND_FETCH_FUNC_ARG"; + case ZEND_FETCH_DIM_FUNC_ARG: return "ZEND_FETCH_DIM_FUNC_ARG"; + case ZEND_FETCH_OBJ_FUNC_ARG: return "ZEND_FETCH_OBJ_FUNC_ARG"; + case ZEND_FETCH_UNSET: return "ZEND_FETCH_UNSET"; + case ZEND_FETCH_DIM_UNSET: return "ZEND_FETCH_DIM_UNSET"; + case ZEND_FETCH_OBJ_UNSET: return "ZEND_FETCH_OBJ_UNSET"; + case ZEND_FETCH_DIM_TMP_VAR: return "ZEND_FETCH_DIM_TMP_VAR"; + case ZEND_FETCH_CONSTANT: return "ZEND_FETCH_CONSTANT"; + case ZEND_GOTO: return "ZEND_GOTO"; + case ZEND_EXT_STMT: return "ZEND_EXT_STMT"; + case ZEND_EXT_FCALL_BEGIN: return "ZEND_EXT_FCALL_BEGIN"; + case ZEND_EXT_FCALL_END: return "ZEND_EXT_FCALL_END"; + case ZEND_EXT_NOP: return "ZEND_EXT_NOP"; + case ZEND_TICKS: return "ZEND_TICKS"; + case ZEND_SEND_VAR_NO_REF: return "ZEND_SEND_VAR_NO_REF"; + case ZEND_CATCH: return "ZEND_CATCH"; + case ZEND_THROW: return "ZEND_THROW"; + case ZEND_FETCH_CLASS: return "ZEND_FETCH_CLASS"; + case ZEND_CLONE: return "ZEND_CLONE"; + case ZEND_RETURN_BY_REF: return "ZEND_RETURN_BY_REF"; + case ZEND_INIT_METHOD_CALL: return "ZEND_INIT_METHOD_CALL"; + case ZEND_INIT_STATIC_METHOD_CALL: return "ZEND_INIT_STATIC_METHOD_CALL"; + case ZEND_ISSET_ISEMPTY_VAR: return "ZEND_ISSET_ISEMPTY_VAR"; + case ZEND_ISSET_ISEMPTY_DIM_OBJ: return "ZEND_ISSET_ISEMPTY_DIM_OBJ"; + case ZEND_PRE_INC_OBJ: return "ZEND_PRE_INC_OBJ"; + case ZEND_PRE_DEC_OBJ: return "ZEND_PRE_DEC_OBJ"; + case ZEND_POST_INC_OBJ: return "ZEND_POST_INC_OBJ"; + case ZEND_POST_DEC_OBJ: return "ZEND_POST_DEC_OBJ"; + case ZEND_ASSIGN_OBJ: return "ZEND_ASSIGN_OBJ"; + case ZEND_INSTANCEOF: return "ZEND_INSTANCEOF"; + case ZEND_DECLARE_CLASS: return "ZEND_DECLARE_CLASS"; + case ZEND_DECLARE_INHERITED_CLASS: return "ZEND_DECLARE_INHERITED_CLASS"; + case ZEND_DECLARE_FUNCTION: return "ZEND_DECLARE_FUNCTION"; + case ZEND_RAISE_ABSTRACT_ERROR: return "ZEND_RAISE_ABSTRACT_ERROR"; + case ZEND_DECLARE_CONST: return "ZEND_DECLARE_CONST"; + case ZEND_ADD_INTERFACE: return "ZEND_ADD_INTERFACE"; + case ZEND_DECLARE_INHERITED_CLASS_DELAYED: return "ZEND_DECLARE_INHERITED_CLASS_DELAYED"; + case ZEND_VERIFY_ABSTRACT_CLASS: return "ZEND_VERIFY_ABSTRACT_CLASS"; + case ZEND_ASSIGN_DIM: return "ZEND_ASSIGN_DIM"; + case ZEND_ISSET_ISEMPTY_PROP_OBJ: return "ZEND_ISSET_ISEMPTY_PROP_OBJ"; + case ZEND_HANDLE_EXCEPTION: return "ZEND_HANDLE_EXCEPTION"; + case ZEND_USER_OPCODE: return "ZEND_USER_OPCODE"; +#ifdef ZEND_JMP_SET + case ZEND_JMP_SET: return "ZEND_JMP_SET"; +#endif + case ZEND_DECLARE_LAMBDA_FUNCTION: return "ZEND_DECLARE_LAMBDA_FUNCTION"; +#ifdef ZEND_ADD_TRAIT + case ZEND_ADD_TRAIT: return "ZEND_ADD_TRAIT"; +#endif +#ifdef ZEND_BIND_TRAITS + case ZEND_BIND_TRAITS: return "ZEND_BIND_TRAITS"; +#endif +#ifdef ZEND_SEPARATE + case ZEND_SEPARATE: return "ZEND_SEPARATE"; +#endif +#ifdef ZEND_QM_ASSIGN_VAR + case ZEND_QM_ASSIGN_VAR: return "ZEND_QM_ASSIGN_VAR"; +#endif +#ifdef ZEND_JMP_SET_VAR + case ZEND_JMP_SET_VAR: return "ZEND_JMP_SET_VAR"; +#endif + case ZEND_DISCARD_EXCEPTION: return "ZEND_DISCARD_EXCEPTION"; + case ZEND_YIELD: return "ZEND_YIELD"; + case ZEND_GENERATOR_RETURN: return "ZEND_GENERATOR_RETURN"; +#ifdef ZEND_FAST_CALL + case ZEND_FAST_CALL: return "ZEND_FAST_CALL"; +#endif +#ifdef ZEND_FAST_RET + case ZEND_FAST_RET: return "ZEND_FAST_RET"; +#endif +#ifdef ZEND_RECV_VARIADIC + case ZEND_RECV_VARIADIC: return "ZEND_RECV_VARIADIC"; +#endif + case ZEND_OP_DATA: return "ZEND_OP_DATA"; + + default: return "UNKNOWN"; + } +} /* }}} */ + static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ zend_op *opline = execute_data->opline; printf( - "[OPLINE: %p:%d]\n", opline, opline->opcode); + "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode TSRMLS_CC)); } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) From aedf45252f20ff68800a72dc4e486b924ba0086f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:29:05 -0200 Subject: [PATCH 0358/1256] - WS changes --- phpdbg_prompt.c | 191 ++++++++++++++++++++++++------------------------ 1 file changed, 97 insertions(+), 94 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index ba6cebcd32dae..8c8482c4fad0b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -29,121 +29,124 @@ static const phpdbg_command_t phpdbg_prompt_commands[]; ZEND_EXTERN_MODULE_GLOBALS(phpdbg); -static PHPDBG_COMMAND(exec) { /* {{{ */ - if (PHPDBG_G(exec)) { - printf( - "Unsetting old execution context: %s\n", PHPDBG_G(exec)); - efree(PHPDBG_G(exec)); - PHPDBG_G(exec) = NULL; - } +static PHPDBG_COMMAND(exec) /* {{{ */ +{ + if (PHPDBG_G(exec)) { + printf("Unsetting old execution context: %s\n", PHPDBG_G(exec)); + efree(PHPDBG_G(exec)); + PHPDBG_G(exec) = NULL; + } - if (PHPDBG_G(ops)) { - printf( - "Destroying compiled opcodes\n"); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops) = NULL; - } + if (PHPDBG_G(ops)) { + printf("Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; + } - PHPDBG_G(exec) = estrndup( - expr, PHPDBG_G(exec_len)=expr_len); + PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf( - "Set execution context: %s\n", PHPDBG_G(exec)); + printf("Set execution context: %s\n", PHPDBG_G(exec)); - return SUCCESS; + return SUCCESS; } /* }}} */ -static inline int phpdbg_compile(TSRMLS_D) { - zend_file_handle fh; - - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file( - &fh, ZEND_INCLUDE TSRMLS_CC); - zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); - return SUCCESS; - } else { - printf("Could not open file %s\n", PHPDBG_G(exec)); - return FAILURE; - } -} +static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ +{ + zend_file_handle fh; -static PHPDBG_COMMAND(compile) { /* {{{ */ - if (PHPDBG_G(exec)) { + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - if (PHPDBG_G(ops)) { - printf("Destroying compiled opcodes\n"); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, + USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; } - return phpdbg_compile(TSRMLS_C); - } else { - printf("No execution context\n"); - return FAILURE; - } + printf("Could not open file %s\n", PHPDBG_G(exec)); + return FAILURE; } /* }}} */ -static PHPDBG_COMMAND(step) { /* {{{ */ - PHPDBG_G(stepping) = atoi(expr); - return SUCCESS; +static PHPDBG_COMMAND(compile) /* {{{ */ +{ + if (PHPDBG_G(exec)) { + if (PHPDBG_G(ops)) { + printf("Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } + + return phpdbg_compile(TSRMLS_C); + } else { + printf("No execution context\n"); + return FAILURE; + } } /* }}} */ -static PHPDBG_COMMAND(next) { /* {{{ */ - return PHPDBG_NEXT; +static PHPDBG_COMMAND(step) /* {{{ */ +{ + PHPDBG_G(stepping) = atoi(expr); + return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(cont) { /* {{{ */ - return SUCCESS; +static PHPDBG_COMMAND(next) /* {{{ */ +{ + return PHPDBG_NEXT; } /* }}} */ -static PHPDBG_COMMAND(run) { /* {{{ */ - if (PHPDBG_G(ops) || PHPDBG_G(exec)) { - if (!PHPDBG_G(ops)) { - if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); - return FAILURE; - } - } - - EG(active_op_array) = PHPDBG_G(ops); - EG(return_value_ptr_ptr) = &PHPDBG_G(retval); - - zend_try { - zend_execute(EG(active_op_array) TSRMLS_CC); - } zend_catch { - if (!PHPDBG_G(quitting)) { - printf("Caught excetion in VM\n"); - return FAILURE; - } else return SUCCESS; - } zend_end_try(); - - return SUCCESS; - } else { - printf("Nothing to execute !\n"); - return FAILURE; - } +static PHPDBG_COMMAND(cont) /* {{{ */ +{ + return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(eval) { /* {{{ */ - zval retval; - - if (expr) { - if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - printf("Success: "); - zend_print_zval_r( - &retval, 0 TSRMLS_CC); - printf("\n"); - zval_dtor(&retval); - } - } else { - printf("No expression provided !\n"); - return FAILURE; - } +static PHPDBG_COMMAND(run) /* {{{ */ +{ + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { + if (!PHPDBG_G(ops)) { + if (phpdbg_compile(TSRMLS_C) == FAILURE) { + printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); + return FAILURE; + } + } - return SUCCESS; + EG(active_op_array) = PHPDBG_G(ops); + EG(return_value_ptr_ptr) = &PHPDBG_G(retval); + + zend_try { + zend_execute(EG(active_op_array) TSRMLS_CC); + } zend_catch { + if (!PHPDBG_G(quitting)) { + printf("Caught excetion in VM\n"); + return FAILURE; + } else return SUCCESS; + } zend_end_try(); + + return SUCCESS; + } else { + printf("Nothing to execute !\n"); + return FAILURE; + } +} /* }}} */ + +static PHPDBG_COMMAND(eval) /* {{{ */ +{ + zval retval; + + if (expr) { + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + printf("Success: "); + zend_print_zval_r(&retval, 0 TSRMLS_CC); + printf("\n"); + zval_dtor(&retval); + } + } else { + printf("No expression provided !\n"); + return FAILURE; + } + + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(back) /* {{{ */ From 663a13635ac00b139d4882daeea44214b04cb9ba Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:56:19 +0000 Subject: [PATCH 0359/1256] fix symbol breakpoints --- phpdbg_bp.c | 2 +- phpdbg_help.c | 4 +++- phpdbg_prompt.c | 36 ++++++++++++++++++++++++++---------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a45ab164f7ecb..52f0a243fda2b 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -135,7 +135,7 @@ int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (!fname) { fname = "main"; } - + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), (void**)&break_list) == SUCCESS) { printf("breakpoint reached!\n"); diff --git a/phpdbg_help.c b/phpdbg_help.c index 26811d0c395ea..370c15eba0fdd 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -82,10 +82,12 @@ PHPDBG_HELP(break) /* {{{ */ { printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); - printf("[more to come]\n"); + printf("\tfunction\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); + printf("\tphpdbg> break my_function\n"); + printf("Will break execution on entry to my_function\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index dee88d2534f82..a5fa359290d75 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -531,8 +531,6 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } #endif - phpdbg_print_opline(execute_data TSRMLS_CC); - if (PHPDBG_G(has_file_bp) && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { @@ -540,15 +538,33 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } } - if (PHPDBG_G(has_sym_bp) - && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) - && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { - continue; - } - } - + if (PHPDBG_G(has_sym_bp)) { + zend_execute_data *previous = execute_data->prev_execute_data; + if (previous && (previous != execute_data)) { + if (previous->opline) { + if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + } + } + } else { + if (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + } + } + } + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); + + phpdbg_print_opline( + execute_data TSRMLS_CC); if (PHPDBG_G(stepping)) { while (phpdbg_interactive( From 1fcc54a6b822c1f1acb7349f9d683403c100e08a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 17:15:32 -0200 Subject: [PATCH 0360/1256] - Added breakpoint counter --- phpdbg.c | 2 ++ phpdbg.h | 1 + phpdbg_bp.c | 21 +++++++++++++-------- phpdbg_bp.h | 2 ++ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 48b5728d77a8e..feed5ecd398ce 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -17,6 +17,7 @@ */ #include "phpdbg.h" +#include "phpdbg_prompt.h" ZEND_DECLARE_MODULE_GLOBALS(phpdbg); @@ -30,6 +31,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->stepping = 0; pg->vmret = 0; pg->quitting = 0; + pg->bp_count = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index 437fe8a244136..c2f949bc8998c 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -51,6 +51,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ + size_t bp_count; /* breakpoint count */ int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a45ab164f7ecb..a531f4f1af340 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -70,6 +70,8 @@ void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC new_break.filename, name_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } + + new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ @@ -96,6 +98,8 @@ void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos T new_break.symbol, name_len, &break_syms, sizeof(zend_llist), (void**)&break_sym_ptr); } + + new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_sym_ptr, &new_break); } /* }}} */ @@ -103,18 +107,19 @@ int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); zend_llist *break_list; + zend_llist_element *le; if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, - (void**)&break_list) == SUCCESS) { - zend_llist_element *le; + (void**)&break_list) == FAILURE) { + return FAILURE; + } - for (le = break_list->head; le; le = le->next) { - phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) le->data; + for (le = break_list->head; le; le = le->next) { + const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; - if (bp->line == (*EG(opline_ptr))->lineno) { - printf("breakpoint reached!\n"); - return SUCCESS; - } + if (bp->line == (*EG(opline_ptr))->lineno) { + printf("Breakpoint #%d at %s:%ld\n", bp->id, bp->filename, bp->line); + return SUCCESS; } } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 78909d2ae368d..c6d057c280662 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -26,6 +26,7 @@ typedef struct _phpdbg_breakfile_t { const char *filename; long line; + size_t id; } phpdbg_breakfile_t; /** @@ -34,6 +35,7 @@ typedef struct _phpdbg_breakfile_t { typedef struct _phpdbg_breaksymbol_t { const char *symbol; long opline_num; + size_t id; } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); From 20f37407e149bc4a815b67c92fbd6ab84c28d763 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:01:09 -0200 Subject: [PATCH 0361/1256] - Added separated file to opcode decode function --- config.m4 | 2 +- phpdbg_opcode.c | 195 ++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_opcode.h | 27 +++++++ phpdbg_prompt.c | 177 +------------------------------------------ 4 files changed, 225 insertions(+), 176 deletions(-) create mode 100644 phpdbg_opcode.c create mode 100644 phpdbg_opcode.h diff --git a/config.m4 b/config.m4 index 4f98bb92bf71c..f3671f4b10d0a 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c" PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c new file mode 100644 index 0000000000000..b77cfb730bd2e --- /dev/null +++ b/phpdbg_opcode.c @@ -0,0 +1,195 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include "phpdbg_opcode.h" +#include "zend_vm_opcodes.h" + +const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ +{ +#define CASE(s) return #s + switch (opcode) { + CASE(ZEND_NOP); + CASE(ZEND_ADD); + CASE(ZEND_SUB); + CASE(ZEND_MUL); + CASE(ZEND_DIV); + CASE(ZEND_MOD); + CASE(ZEND_SL); + CASE(ZEND_SR); + CASE(ZEND_CONCAT); + CASE(ZEND_BW_OR); + CASE(ZEND_BW_AND); + CASE(ZEND_BW_XOR); + CASE(ZEND_BW_NOT); + CASE(ZEND_BOOL_NOT); + CASE(ZEND_BOOL_XOR); + CASE(ZEND_IS_IDENTICAL); + CASE(ZEND_IS_NOT_IDENTICAL); + CASE(ZEND_IS_EQUAL); + CASE(ZEND_IS_NOT_EQUAL); + CASE(ZEND_IS_SMALLER); + CASE(ZEND_IS_SMALLER_OR_EQUAL); + CASE(ZEND_CAST); + CASE(ZEND_QM_ASSIGN); + CASE(ZEND_ASSIGN_ADD); + CASE(ZEND_ASSIGN_SUB); + CASE(ZEND_ASSIGN_MUL); + CASE(ZEND_ASSIGN_DIV); + CASE(ZEND_ASSIGN_MOD); + CASE(ZEND_ASSIGN_SL); + CASE(ZEND_ASSIGN_SR); + CASE(ZEND_ASSIGN_CONCAT); + CASE(ZEND_ASSIGN_BW_OR); + CASE(ZEND_ASSIGN_BW_AND); + CASE(ZEND_ASSIGN_BW_XOR); + CASE(ZEND_PRE_INC); + CASE(ZEND_PRE_DEC); + CASE(ZEND_POST_INC); + CASE(ZEND_POST_DEC); + CASE(ZEND_ASSIGN); + CASE(ZEND_ASSIGN_REF); + CASE(ZEND_ECHO); + CASE(ZEND_PRINT); + CASE(ZEND_JMP); + CASE(ZEND_JMPZ); + CASE(ZEND_JMPNZ); + CASE(ZEND_JMPZNZ); + CASE(ZEND_JMPZ_EX); + CASE(ZEND_JMPNZ_EX); + CASE(ZEND_CASE); + CASE(ZEND_SWITCH_FREE); + CASE(ZEND_BRK); + CASE(ZEND_CONT); + CASE(ZEND_BOOL); + CASE(ZEND_INIT_STRING); + CASE(ZEND_ADD_CHAR); + CASE(ZEND_ADD_STRING); + CASE(ZEND_ADD_VAR); + CASE(ZEND_BEGIN_SILENCE); + CASE(ZEND_END_SILENCE); + CASE(ZEND_INIT_FCALL_BY_NAME); + CASE(ZEND_DO_FCALL); + CASE(ZEND_DO_FCALL_BY_NAME); + CASE(ZEND_RETURN); + CASE(ZEND_RECV); + CASE(ZEND_RECV_INIT); + CASE(ZEND_SEND_VAL); + CASE(ZEND_SEND_VAR); + CASE(ZEND_SEND_REF); + CASE(ZEND_NEW); + CASE(ZEND_INIT_NS_FCALL_BY_NAME); + CASE(ZEND_FREE); + CASE(ZEND_INIT_ARRAY); + CASE(ZEND_ADD_ARRAY_ELEMENT); + CASE(ZEND_INCLUDE_OR_EVAL); + CASE(ZEND_UNSET_VAR); + CASE(ZEND_UNSET_DIM); + CASE(ZEND_UNSET_OBJ); + CASE(ZEND_FE_RESET); + CASE(ZEND_FE_FETCH); + CASE(ZEND_EXIT); + CASE(ZEND_FETCH_R); + CASE(ZEND_FETCH_DIM_R); + CASE(ZEND_FETCH_OBJ_R); + CASE(ZEND_FETCH_W); + CASE(ZEND_FETCH_DIM_W); + CASE(ZEND_FETCH_OBJ_W); + CASE(ZEND_FETCH_RW); + CASE(ZEND_FETCH_DIM_RW); + CASE(ZEND_FETCH_OBJ_RW); + CASE(ZEND_FETCH_IS); + CASE(ZEND_FETCH_DIM_IS); + CASE(ZEND_FETCH_OBJ_IS); + CASE(ZEND_FETCH_FUNC_ARG); + CASE(ZEND_FETCH_DIM_FUNC_ARG); + CASE(ZEND_FETCH_OBJ_FUNC_ARG); + CASE(ZEND_FETCH_UNSET); + CASE(ZEND_FETCH_DIM_UNSET); + CASE(ZEND_FETCH_OBJ_UNSET); + CASE(ZEND_FETCH_DIM_TMP_VAR); + CASE(ZEND_FETCH_CONSTANT); + CASE(ZEND_GOTO); + CASE(ZEND_EXT_STMT); + CASE(ZEND_EXT_FCALL_BEGIN); + CASE(ZEND_EXT_FCALL_END); + CASE(ZEND_EXT_NOP); + CASE(ZEND_TICKS); + CASE(ZEND_SEND_VAR_NO_REF); + CASE(ZEND_CATCH); + CASE(ZEND_THROW); + CASE(ZEND_FETCH_CLASS); + CASE(ZEND_CLONE); + CASE(ZEND_RETURN_BY_REF); + CASE(ZEND_INIT_METHOD_CALL); + CASE(ZEND_INIT_STATIC_METHOD_CALL); + CASE(ZEND_ISSET_ISEMPTY_VAR); + CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ); + CASE(ZEND_PRE_INC_OBJ); + CASE(ZEND_PRE_DEC_OBJ); + CASE(ZEND_POST_INC_OBJ); + CASE(ZEND_POST_DEC_OBJ); + CASE(ZEND_ASSIGN_OBJ); + CASE(ZEND_INSTANCEOF); + CASE(ZEND_DECLARE_CLASS); + CASE(ZEND_DECLARE_INHERITED_CLASS); + CASE(ZEND_DECLARE_FUNCTION); + CASE(ZEND_RAISE_ABSTRACT_ERROR); + CASE(ZEND_DECLARE_CONST); + CASE(ZEND_ADD_INTERFACE); + CASE(ZEND_DECLARE_INHERITED_CLASS_DELAYED); + CASE(ZEND_VERIFY_ABSTRACT_CLASS); + CASE(ZEND_ASSIGN_DIM); + CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ); + CASE(ZEND_HANDLE_EXCEPTION); + CASE(ZEND_USER_OPCODE); +#ifdef ZEND_JMP_SET + CASE(ZEND_JMP_SET); +#endif + CASE(ZEND_DECLARE_LAMBDA_FUNCTION); +#ifdef ZEND_ADD_TRAIT + CASE(ZEND_ADD_TRAIT); +#endif +#ifdef ZEND_BIND_TRAITS + CASE(ZEND_BIND_TRAITS); +#endif +#ifdef ZEND_SEPARATE + CASE(ZEND_SEPARATE); +#endif +#ifdef ZEND_QM_ASSIGN_VAR + CASE(ZEND_QM_ASSIGN_VAR); +#endif +#ifdef ZEND_JMP_SET_VAR + CASE(ZEND_JMP_SET_VAR); +#endif + CASE(ZEND_DISCARD_EXCEPTION); + CASE(ZEND_YIELD); + CASE(ZEND_GENERATOR_RETURN); +#ifdef ZEND_FAST_CALL + CASE(ZEND_FAST_CALL); +#endif +#ifdef ZEND_FAST_RET + CASE(ZEND_FAST_RET); +#endif +#ifdef ZEND_RECV_VARIADIC + CASE(ZEND_RECV_VARIADIC); +#endif + CASE(ZEND_OP_DATA); + default: return "UNKNOWN"; + } +} /* }}} */ diff --git a/phpdbg_opcode.h b/phpdbg_opcode.h new file mode 100644 index 0000000000000..28fc806c1c099 --- /dev/null +++ b/phpdbg_opcode.h @@ -0,0 +1,27 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_OPCODE_H +#define PHPDBG_OPCODE_H + +#include "zend_types.h" + +const char *phpdbg_decode_opcode(zend_uchar); + +#endif /* PHPDBG_OPCODE_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index dee88d2534f82..cd432fbf612fb 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -24,6 +24,7 @@ #include "phpdbg.h" #include "phpdbg_help.h" #include "phpdbg_bp.h" +#include "phpdbg_opcode.h" static const phpdbg_command_t phpdbg_prompt_commands[]; @@ -333,184 +334,10 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ -static const char *phpdbg_decode_opcode(zend_uchar opcode TSRMLS_DC) { /* {{{ */ - switch (opcode) { - case ZEND_NOP: return "ZEND_NOP"; - case ZEND_ADD: return "ZEND_ADD"; - case ZEND_SUB: return "ZEND_SUB"; - case ZEND_MUL: return "ZEND_MUL"; - case ZEND_DIV: return "ZEND_DIV"; - case ZEND_MOD: return "ZEND_MOD"; - case ZEND_SL: return "ZEND_SL"; - case ZEND_SR: return "ZEND_SR"; - case ZEND_CONCAT: return "ZEND_CONCAT"; - case ZEND_BW_OR: return "ZEND_BW_OR"; - case ZEND_BW_AND: return "ZEND_BW_AND"; - case ZEND_BW_XOR: return "ZEND_BW_XOR"; - case ZEND_BW_NOT: return "ZEND_BW_NOT"; - case ZEND_BOOL_NOT: return "ZEND_BOOL_NOT"; - case ZEND_BOOL_XOR: return "ZEND_BOOL_XOR"; - case ZEND_IS_IDENTICAL: return "ZEND_IS_IDENTICAL"; - case ZEND_IS_NOT_IDENTICAL: return "ZEND_IS_NOT_IDENTICAL"; - case ZEND_IS_EQUAL: return "ZEND_IS_EQUAL"; - case ZEND_IS_NOT_EQUAL: return "ZEND_IS_NOT_EQUAL"; - case ZEND_IS_SMALLER: return "ZEND_IS_SMALLER"; - case ZEND_IS_SMALLER_OR_EQUAL: return "ZEND_IS_SMALLER_OR_EQUAL"; - case ZEND_CAST: return "ZEND_CAST"; - case ZEND_QM_ASSIGN: return "ZEND_QM_ASSIGN"; - case ZEND_ASSIGN_ADD: return "ZEND_ASSIGN_ADD"; - case ZEND_ASSIGN_SUB: return "ZEND_ASSIGN_SUB"; - case ZEND_ASSIGN_MUL: return "ZEND_ASSIGN_MUL"; - case ZEND_ASSIGN_DIV: return "ZEND_ASSIGN_DIV"; - case ZEND_ASSIGN_MOD: return "ZEND_ASSIGN_MOD"; - case ZEND_ASSIGN_SL: return "ZEND_ASSIGN_SL"; - case ZEND_ASSIGN_SR: return "ZEND_ASSIGN_SR"; - case ZEND_ASSIGN_CONCAT: return "ZEND_ASSIGN_CONCAT"; - case ZEND_ASSIGN_BW_OR: return "ZEND_ASSIGN_BW_OR"; - case ZEND_ASSIGN_BW_AND: return "ZEND_ASSIGN_BW_AND"; - case ZEND_ASSIGN_BW_XOR: return "ZEND_ASSIGN_BW_XOR"; - case ZEND_PRE_INC: return "ZEND_PRE_INC"; - case ZEND_PRE_DEC: return "ZEND_PRE_DEC"; - case ZEND_POST_INC: return "ZEND_POST_INC"; - case ZEND_POST_DEC: return "ZEND_POST_DEC"; - case ZEND_ASSIGN: return "ZEND_ASSIGN"; - case ZEND_ASSIGN_REF: return "ZEND_ASSIGN_REF"; - case ZEND_ECHO: return "ZEND_ECHO"; - case ZEND_PRINT: return "ZEND_PRINT"; - case ZEND_JMP: return "ZEND_JMP"; - case ZEND_JMPZ: return "ZEND_JMPZ"; - case ZEND_JMPNZ: return "ZEND_JMPNZ"; - case ZEND_JMPZNZ: return "ZEND_JMPZNZ"; - case ZEND_JMPZ_EX: return "ZEND_JMPZ_EX"; - case ZEND_JMPNZ_EX: return "ZEND_JMPNZ_EX"; - case ZEND_CASE: return "ZEND_CASE"; - case ZEND_SWITCH_FREE: return "ZEND_SWITCH_FREE"; - case ZEND_BRK: return "ZEND_BRK"; - case ZEND_CONT: return "ZEND_CONT"; - case ZEND_BOOL: return "ZEND_BOOL"; - case ZEND_INIT_STRING: return "ZEND_INIT_STRING"; - case ZEND_ADD_CHAR: return "ZEND_ADD_CHAR"; - case ZEND_ADD_STRING: return "ZEND_ADD_STRING"; - case ZEND_ADD_VAR: return "ZEND_ADD_VAR"; - case ZEND_BEGIN_SILENCE: return "ZEND_BEGIN_SILENCE"; - case ZEND_END_SILENCE: return "ZEND_END_SILENCE"; - case ZEND_INIT_FCALL_BY_NAME: return "ZEND_INIT_FCALL_BY_NAME"; - case ZEND_DO_FCALL: return "ZEND_DO_FCALL"; - case ZEND_DO_FCALL_BY_NAME: return "ZEND_DO_FCALL_BY_NAME"; - case ZEND_RETURN: return "ZEND_RETURN"; - case ZEND_RECV: return "ZEND_RECV"; - case ZEND_RECV_INIT: return "ZEND_RECV_INIT"; - case ZEND_SEND_VAL: return "ZEND_SEND_VAL"; - case ZEND_SEND_VAR: return "ZEND_SEND_VAR"; - case ZEND_SEND_REF: return "ZEND_SEND_REF"; - case ZEND_NEW: return "ZEND_NEW"; - case ZEND_INIT_NS_FCALL_BY_NAME: return "ZEND_INIT_NS_FCALL_BY_NAME"; - case ZEND_FREE: return "ZEND_FREE"; - case ZEND_INIT_ARRAY: return "ZEND_INIT_ARRAY"; - case ZEND_ADD_ARRAY_ELEMENT: return "ZEND_ADD_ARRAY_ELEMENT"; - case ZEND_INCLUDE_OR_EVAL: return "ZEND_INCLUDE_OR_EVAL"; - case ZEND_UNSET_VAR: return "ZEND_UNSET_VAR"; - case ZEND_UNSET_DIM: return "ZEND_UNSET_DIM"; - case ZEND_UNSET_OBJ: return "ZEND_UNSET_OBJ"; - case ZEND_FE_RESET: return "ZEND_FE_RESET"; - case ZEND_FE_FETCH: return "ZEND_FE_FETCH"; - case ZEND_EXIT: return "ZEND_EXIT"; - case ZEND_FETCH_R: return "ZEND_FETCH_R"; - case ZEND_FETCH_DIM_R: return "ZEND_FETCH_DIM_R"; - case ZEND_FETCH_OBJ_R: return "ZEND_FETCH_OBJ_R"; - case ZEND_FETCH_W: return "ZEND_FETCH_W"; - case ZEND_FETCH_DIM_W: return "ZEND_FETCH_DIM_W"; - case ZEND_FETCH_OBJ_W: return "ZEND_FETCH_OBJ_W"; - case ZEND_FETCH_RW: return "ZEND_FETCH_RW"; - case ZEND_FETCH_DIM_RW: return "ZEND_FETCH_DIM_RW"; - case ZEND_FETCH_OBJ_RW: return "ZEND_FETCH_OBJ_RW"; - case ZEND_FETCH_IS: return "ZEND_FETCH_IS"; - case ZEND_FETCH_DIM_IS: return "ZEND_FETCH_DIM_IS"; - case ZEND_FETCH_OBJ_IS: return "ZEND_FETCH_OBJ_IS"; - case ZEND_FETCH_FUNC_ARG: return "ZEND_FETCH_FUNC_ARG"; - case ZEND_FETCH_DIM_FUNC_ARG: return "ZEND_FETCH_DIM_FUNC_ARG"; - case ZEND_FETCH_OBJ_FUNC_ARG: return "ZEND_FETCH_OBJ_FUNC_ARG"; - case ZEND_FETCH_UNSET: return "ZEND_FETCH_UNSET"; - case ZEND_FETCH_DIM_UNSET: return "ZEND_FETCH_DIM_UNSET"; - case ZEND_FETCH_OBJ_UNSET: return "ZEND_FETCH_OBJ_UNSET"; - case ZEND_FETCH_DIM_TMP_VAR: return "ZEND_FETCH_DIM_TMP_VAR"; - case ZEND_FETCH_CONSTANT: return "ZEND_FETCH_CONSTANT"; - case ZEND_GOTO: return "ZEND_GOTO"; - case ZEND_EXT_STMT: return "ZEND_EXT_STMT"; - case ZEND_EXT_FCALL_BEGIN: return "ZEND_EXT_FCALL_BEGIN"; - case ZEND_EXT_FCALL_END: return "ZEND_EXT_FCALL_END"; - case ZEND_EXT_NOP: return "ZEND_EXT_NOP"; - case ZEND_TICKS: return "ZEND_TICKS"; - case ZEND_SEND_VAR_NO_REF: return "ZEND_SEND_VAR_NO_REF"; - case ZEND_CATCH: return "ZEND_CATCH"; - case ZEND_THROW: return "ZEND_THROW"; - case ZEND_FETCH_CLASS: return "ZEND_FETCH_CLASS"; - case ZEND_CLONE: return "ZEND_CLONE"; - case ZEND_RETURN_BY_REF: return "ZEND_RETURN_BY_REF"; - case ZEND_INIT_METHOD_CALL: return "ZEND_INIT_METHOD_CALL"; - case ZEND_INIT_STATIC_METHOD_CALL: return "ZEND_INIT_STATIC_METHOD_CALL"; - case ZEND_ISSET_ISEMPTY_VAR: return "ZEND_ISSET_ISEMPTY_VAR"; - case ZEND_ISSET_ISEMPTY_DIM_OBJ: return "ZEND_ISSET_ISEMPTY_DIM_OBJ"; - case ZEND_PRE_INC_OBJ: return "ZEND_PRE_INC_OBJ"; - case ZEND_PRE_DEC_OBJ: return "ZEND_PRE_DEC_OBJ"; - case ZEND_POST_INC_OBJ: return "ZEND_POST_INC_OBJ"; - case ZEND_POST_DEC_OBJ: return "ZEND_POST_DEC_OBJ"; - case ZEND_ASSIGN_OBJ: return "ZEND_ASSIGN_OBJ"; - case ZEND_INSTANCEOF: return "ZEND_INSTANCEOF"; - case ZEND_DECLARE_CLASS: return "ZEND_DECLARE_CLASS"; - case ZEND_DECLARE_INHERITED_CLASS: return "ZEND_DECLARE_INHERITED_CLASS"; - case ZEND_DECLARE_FUNCTION: return "ZEND_DECLARE_FUNCTION"; - case ZEND_RAISE_ABSTRACT_ERROR: return "ZEND_RAISE_ABSTRACT_ERROR"; - case ZEND_DECLARE_CONST: return "ZEND_DECLARE_CONST"; - case ZEND_ADD_INTERFACE: return "ZEND_ADD_INTERFACE"; - case ZEND_DECLARE_INHERITED_CLASS_DELAYED: return "ZEND_DECLARE_INHERITED_CLASS_DELAYED"; - case ZEND_VERIFY_ABSTRACT_CLASS: return "ZEND_VERIFY_ABSTRACT_CLASS"; - case ZEND_ASSIGN_DIM: return "ZEND_ASSIGN_DIM"; - case ZEND_ISSET_ISEMPTY_PROP_OBJ: return "ZEND_ISSET_ISEMPTY_PROP_OBJ"; - case ZEND_HANDLE_EXCEPTION: return "ZEND_HANDLE_EXCEPTION"; - case ZEND_USER_OPCODE: return "ZEND_USER_OPCODE"; -#ifdef ZEND_JMP_SET - case ZEND_JMP_SET: return "ZEND_JMP_SET"; -#endif - case ZEND_DECLARE_LAMBDA_FUNCTION: return "ZEND_DECLARE_LAMBDA_FUNCTION"; -#ifdef ZEND_ADD_TRAIT - case ZEND_ADD_TRAIT: return "ZEND_ADD_TRAIT"; -#endif -#ifdef ZEND_BIND_TRAITS - case ZEND_BIND_TRAITS: return "ZEND_BIND_TRAITS"; -#endif -#ifdef ZEND_SEPARATE - case ZEND_SEPARATE: return "ZEND_SEPARATE"; -#endif -#ifdef ZEND_QM_ASSIGN_VAR - case ZEND_QM_ASSIGN_VAR: return "ZEND_QM_ASSIGN_VAR"; -#endif -#ifdef ZEND_JMP_SET_VAR - case ZEND_JMP_SET_VAR: return "ZEND_JMP_SET_VAR"; -#endif - case ZEND_DISCARD_EXCEPTION: return "ZEND_DISCARD_EXCEPTION"; - case ZEND_YIELD: return "ZEND_YIELD"; - case ZEND_GENERATOR_RETURN: return "ZEND_GENERATOR_RETURN"; -#ifdef ZEND_FAST_CALL - case ZEND_FAST_CALL: return "ZEND_FAST_CALL"; -#endif -#ifdef ZEND_FAST_RET - case ZEND_FAST_RET: return "ZEND_FAST_RET"; -#endif -#ifdef ZEND_RECV_VARIADIC - case ZEND_RECV_VARIADIC: return "ZEND_RECV_VARIADIC"; -#endif - case ZEND_OP_DATA: return "ZEND_OP_DATA"; - - default: return "UNKNOWN"; - } -} /* }}} */ - static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ zend_op *opline = execute_data->opline; - printf( - "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode TSRMLS_CC)); + printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ From 5b6982796d6d535ec868b3e07585d44423b725dc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:06:19 -0200 Subject: [PATCH 0362/1256] - Renamed breakpoint find functions --- phpdbg_bp.c | 4 ++-- phpdbg_bp.h | 3 +++ phpdbg_prompt.c | 9 +++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a531f4f1af340..2db30d33663d3 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -103,7 +103,7 @@ void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos T zend_llist_add_element(break_sym_ptr, &new_break); } /* }}} */ -int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); zend_llist *break_list; @@ -126,7 +126,7 @@ int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ { const char *fname; zend_llist *break_list; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index c6d057c280662..e8cb84b92e60c 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -41,4 +41,7 @@ typedef struct _phpdbg_breaksymbol_t { void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); +int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); +int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); + #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cd432fbf612fb..fc559dd2df502 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -254,7 +254,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ ++help_command; } } else { - if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { + if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { printf("failed to find help command: %s\n", expr); } } @@ -334,7 +334,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ -static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ +static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ +{ zend_op *opline = execute_data->opline; printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); @@ -361,7 +362,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ phpdbg_print_opline(execute_data TSRMLS_CC); if (PHPDBG_G(has_file_bp) - && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { + && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } @@ -369,7 +370,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(has_sym_bp) && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) - && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { + && phpdbg_find_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } From 972550a1206f02bc3fa6774c1ce740704729e8b0 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:07:56 -0200 Subject: [PATCH 0363/1256] - Change header inclusion order --- phpdbg_opcode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c index b77cfb730bd2e..60d4075625443 100644 --- a/phpdbg_opcode.c +++ b/phpdbg_opcode.c @@ -17,8 +17,8 @@ +----------------------------------------------------------------------+ */ -#include "phpdbg_opcode.h" #include "zend_vm_opcodes.h" +#include "phpdbg_opcode.h" const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ { From eaf5d892928f7ca4af42cdd98bfb9f0f9adc06d3 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:10:54 -0200 Subject: [PATCH 0364/1256] - Change breakpoint id to int --- phpdbg.h | 2 +- phpdbg_bp.c | 1 + phpdbg_bp.h | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index c2f949bc8998c..c5f6104cefbd7 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -51,7 +51,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ - size_t bp_count; /* breakpoint count */ + int bp_count; /* breakpoint count */ int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 2db30d33663d3..7114ff0530c93 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -19,6 +19,7 @@ #include "zend.h" #include "zend_hash.h" +#include "zend_llist.h" #include "phpdbg.h" #include "phpdbg_bp.h" diff --git a/phpdbg_bp.h b/phpdbg_bp.h index e8cb84b92e60c..38b9c6174c677 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -26,7 +26,7 @@ typedef struct _phpdbg_breakfile_t { const char *filename; long line; - size_t id; + int id; } phpdbg_breakfile_t; /** @@ -35,7 +35,7 @@ typedef struct _phpdbg_breakfile_t { typedef struct _phpdbg_breaksymbol_t { const char *symbol; long opline_num; - size_t id; + int id; } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); From 341468055759c4cd0247b460536d25a44a11551b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:24:13 -0200 Subject: [PATCH 0365/1256] - Improved phpdbg_set_breakpoint_file function --- phpdbg_bp.c | 20 +++++--------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 7114ff0530c93..5229a0b7b5539 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -39,36 +39,26 @@ static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ efree((char*)bp->symbol); } /* }}} */ -void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { - char resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); phpdbg_breakfile_t new_break; zend_llist *break_files_ptr; - size_t name_len; - char *path = estrndup(expr, line_pos - expr); + size_t path_len = strlen(path); - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - efree(path); - return; - } - efree(path); - - name_len = strlen(resolved_name); - new_break.filename = estrndup(resolved_name, name_len + 1); + new_break.filename = estrndup(path, path_len + 1); new_break.line = line_num; PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), - new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { + new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); zend_hash_update(&PHPDBG_G(bp_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), + new_break.filename, path_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 38b9c6174c677..49035be550c64 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -38,7 +38,7 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; -void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fc559dd2df502..5e3b968b9f25a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -213,7 +213,17 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { - phpdbg_set_breakpoint_file(expr, line_pos TSRMLS_CC); + char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + return FAILURE; + } + + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); From fb4f94c52c81fc7be5b16d814c362de310deff38 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:30:24 -0200 Subject: [PATCH 0366/1256] - Improved phpdbg_set_breakpoint_symbol function --- phpdbg_bp.c | 7 +++---- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 5229a0b7b5539..9085533c0ca2c 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -66,14 +66,13 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ -void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_symbol(const char *name, long opline_num TSRMLS_DC) /* {{{ */ { - long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; phpdbg_breaksymbol_t new_break; zend_llist *break_sym_ptr; - size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + size_t name_len = strlen(name); - new_break.symbol = estrndup(expr, name_len); + new_break.symbol = estrndup(name, name_len + 1); new_break.opline_num = opline_num; PHPDBG_G(has_sym_bp) = 1; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 49035be550c64..45f4239eafd5e 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -39,7 +39,7 @@ typedef struct _phpdbg_breaksymbol_t { } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); -void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char*, long TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5e3b968b9f25a..8591d02945ac0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -225,9 +225,15 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); + char name[200]; + const char *opnum_pos = zend_memrchr(expr, '#', expr_len); + long opline_num = opnum_pos ? strtol(opnum_pos+1, NULL, 0) : 0; + size_t name_len = opnum_pos ? opnum_pos - expr : strlen(expr); - phpdbg_set_breakpoint_symbol(expr, opline_num_pos TSRMLS_CC); + memcpy(name, expr, name_len); + name[name_len] = 0; + + phpdbg_set_breakpoint_symbol(name, opline_num TSRMLS_CC); } return SUCCESS; From c9cfd98bcdcd92aa0efebda6ab8a3db5605a6796 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Sun, 10 Nov 2013 15:46:31 -0500 Subject: [PATCH 0367/1256] Update NEWS and remove the unnecessary UPGRADING note. --- NEWS | 4 ++++ UPGRADING | 10 ---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index 4689a436ca412..029e975b64cc9 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #65947 (basename is no more working after fgetcsv in certain situation). (Laruence) +- JSON + . Fixed whitespace part of bug #64874 ("json_decode handles whitespace and + case-sensitivity incorrectly"). (Andrea Faulds) + - MySQLi: . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) diff --git a/UPGRADING b/UPGRADING index edcaa17b30524..e6f582a4a8b13 100755 --- a/UPGRADING +++ b/UPGRADING @@ -492,16 +492,6 @@ b. Extensions with changed behavior - the output of the tiger hash family has been corrected, see https://bugs.php.net/61307 - - JSON extension - - Fixed whitespace part of bug #64874 ("json_decode handles whitespace and - case-sensitivity incorrectly") - This means that leading and trailing whitespace when deserialising lone - JSON null, true, false, string and number values no longer causes an - error. Please note that this only applies to the deserialising of strings - containing only a null, true, false, string or number value. Leading and - trailing whitespace around and inside objects and arrays has never caused - an error. - =========================== 10. Changes in SAPI support =========================== From ac0ecc476c6b5a562b98026acc76390c2597392b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:00:58 -0200 Subject: [PATCH 0368/1256] - Fix code --- phpdbg_opcode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c index 60d4075625443..5796678cad13a 100644 --- a/phpdbg_opcode.c +++ b/phpdbg_opcode.c @@ -18,11 +18,12 @@ */ #include "zend_vm_opcodes.h" +#include "zend_compile.h" #include "phpdbg_opcode.h" const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ { -#define CASE(s) return #s +#define CASE(s) case s: return #s switch (opcode) { CASE(ZEND_NOP); CASE(ZEND_ADD); From 05c9f82a159a674f9ccf2178c05d2e84c78963e9 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 20:59:35 +0000 Subject: [PATCH 0369/1256] ... --- phpdbg.c | 4 +++- phpdbg_prompt.c | 29 ++++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index feed5ecd398ce..c15c718b9d196 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -241,7 +241,9 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); zend_try { - phpdbg_interactive(argc, argv TSRMLS_CC); + do { + phpdbg_interactive(argc, argv TSRMLS_CC); + } while(!PHPDBG_G(quitting)); } zend_end_try(); if (ini_file) { diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 6a43d0edf7922..9ef5ecfd358a9 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -59,7 +59,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ printf("Attempting compilation of %s\n", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, - USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); printf("Success\n"); @@ -335,9 +335,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: if (PHPDBG_G(stepping)) { + case PHPDBG_NEXT: return PHPDBG_NEXT; - } } } @@ -375,20 +374,28 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } #endif - if (PHPDBG_G(has_file_bp) + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } } - if (PHPDBG_G(has_sym_bp) - && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) - && phpdbg_find_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { - continue; - } - } + if (PHPDBG_G(has_sym_bp)) { + zend_execute_data *previous = execute_data->prev_execute_data; + if (previous && (previous != execute_data)) { + if (previous->opline) { + if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + printf("out\n"); + } + } + } + } + } PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); From 6203c96061501091ba6851fca655c5c02252581d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:07:29 +0000 Subject: [PATCH 0370/1256] ... --- phpdbg_prompt.c | 29 ++++++++++++++++++----------- test.php | 3 +++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9ef5ecfd358a9..483835f4b9646 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -56,17 +56,23 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ { zend_file_handle fh; - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - - if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, - USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); - zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); - return SUCCESS; - } - - printf("Could not open file %s\n", PHPDBG_G(exec)); + if (!EG(in_execution)) { + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, + USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file( + &fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; + } else { + printf("Could not open file %s\n", PHPDBG_G(exec)); + } + } else { + printf("Cannot compile while in execution\n"); + } + return FAILURE; } /* }}} */ @@ -77,6 +83,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ printf("Destroying compiled opcodes\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); + PHPDBG_G(ops)=NULL; } return phpdbg_compile(TSRMLS_C); diff --git a/test.php b/test.php index d67540e1ed97e..a433605823bc4 100644 --- a/test.php +++ b/test.php @@ -2,6 +2,9 @@ function test() { echo "Hello World\n"; } +function test2() { + echo "Hello World 2\n"; +} if (!isset($greeting)) { echo test(); } From 1591b0e5f6c495f29e0f2394505e62300dfe512a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:09:35 +0000 Subject: [PATCH 0371/1256] remove cont --- phpdbg_help.c | 9 +-------- phpdbg_help.h | 4 +--- phpdbg_prompt.c | 8 +------- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 370c15eba0fdd..f1e7cc7568d6d 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -41,7 +41,7 @@ PHPDBG_HELP(step) /* {{{ */ PHPDBG_HELP(next) /* {{{ */ { - printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); + printf("While stepping through execution, or after a breakpoint, use the next command to step back into the vm and execute the next opcode\n"); return SUCCESS; } /* }}} */ @@ -91,13 +91,6 @@ PHPDBG_HELP(break) /* {{{ */ return SUCCESS; } /* }}} */ -PHPDBG_HELP(cont) /* {{{ */ -{ - printf("Continues execution after a breakpoint is met\n"); - printf("[Warnings about using stepping and break points here]\n"); - return SUCCESS; -} /* }}} */ - PHPDBG_HELP(back) /* {{{ */ { printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index 8ce6f9691d260..4b683b6893b3f 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -41,7 +41,6 @@ PHPDBG_HELP(run); PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); -PHPDBG_HELP(cont); PHPDBG_HELP(back); /** @@ -51,12 +50,11 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), - PHPDBG_HELP_D(next, "execute the next opcode"), + PHPDBG_HELP_D(next, "continue executing while stepping or after breaking"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), - PHPDBG_HELP_D(cont, "use continue when a break point is met"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 483835f4b9646..407a20416849f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -104,11 +104,6 @@ static PHPDBG_COMMAND(next) /* {{{ */ return PHPDBG_NEXT; } /* }}} */ -static PHPDBG_COMMAND(cont) /* {{{ */ -{ - return SUCCESS; -} /* }}} */ - static PHPDBG_COMMAND(run) /* {{{ */ { if (PHPDBG_G(ops) || PHPDBG_G(exec)) { @@ -290,12 +285,11 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), PHPDBG_COMMAND_D(step, "step through execution"), - PHPDBG_COMMAND_D(next, "next opcode"), + PHPDBG_COMMAND_D(next, "continue execution"), PHPDBG_COMMAND_D(run, "attempt execution"), PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), - PHPDBG_COMMAND_D(cont, "continue execution"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 7d99241455639e2333572f285a7a449fa2d7af10 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:12:41 +0000 Subject: [PATCH 0372/1256] ... --- phpdbg_prompt.c | 1 - 1 file changed, 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 407a20416849f..284f32d861919 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -391,7 +391,6 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } - printf("out\n"); } } } From 26ec44350e6dc9ae489c04d51f1bfa5ccaad66e3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:15:45 +0000 Subject: [PATCH 0373/1256] ... --- phpdbg.png | Bin 116358 -> 109358 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/phpdbg.png b/phpdbg.png index 96768f7834ac4a7cde8792a09299e79d44464fce..85f9815526f2344bdb29b76c70bf97db1111639a 100644 GIT binary patch literal 109358 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

JRH8w|Af?=*M7$=o)|Ed8@2)n1O?w_+xaR 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

!}>49 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 literal 116358 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 Orl)NLt-5|U>i+=#Sr{n* From 9ba19e82240ec3a37f861f2400d1702ecdc4e655 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:23:18 +0000 Subject: [PATCH 0374/1256] quiet --- phpdbg.c | 1 + phpdbg.h | 1 + phpdbg_help.c | 12 ++++++++++++ phpdbg_help.h | 3 ++- phpdbg_prompt.c | 12 ++++++++++-- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index c15c718b9d196..e07cb4ad36b48 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -32,6 +32,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->vmret = 0; pg->quitting = 0; pg->bp_count = 0; + pg->quiet = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index c5f6104cefbd7..c9f3e5ee3df35 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -57,6 +57,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool has_file_bp; /* file-based breakpoint has been set */ zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ zend_bool quitting; /* quitting flag */ + int quiet; /* quiet */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_help.c b/phpdbg_help.c index f1e7cc7568d6d..4b218f31d2ff4 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -91,6 +91,18 @@ PHPDBG_HELP(break) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(quiet) /* {{{ */ +{ + printf("Setting quietness on will stop the OPLINE output during execution\n"); + printf("For example:\n"); + printf("\tphpdbg> quiet 1\n"); + printf("Will silence OPLINE output, while\n"); + printf("\tphpdbg> quiet 0\n"); + printf("Will enable OPLINE output again\n"); + + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(back) /* {{{ */ { printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index 4b683b6893b3f..ed67a3fec21fa 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -42,6 +42,7 @@ PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); PHPDBG_HELP(back); +PHPDBG_HELP(quiet); /** * Commands @@ -56,7 +57,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), - + PHPDBG_HELP_D(quiet, "be quiet during execution"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 284f32d861919..55bf0482ec4ba 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -281,6 +281,11 @@ static PHPDBG_COMMAND(help) /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(quiet) { /* {{{ */ + PHPDBG_G(quiet) = atoi(expr); + return SUCCESS; +} /* }}} */ + static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), @@ -292,6 +297,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), + PHPDBG_COMMAND_D(quiet, "silence some output"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} }; @@ -352,9 +358,11 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { - zend_op *opline = execute_data->opline; + if (!PHPDBG_G(quiet)) { + zend_op *opline = execute_data->opline; - printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + } } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ From fedd47e383c9a747560dd506e9b81a6bd231d9f2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:28:12 +0000 Subject: [PATCH 0375/1256] ... --- phpdbg.c | 1 + phpdbg_prompt.c | 4 ++-- test.php | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index e07cb4ad36b48..997c273836620 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcal static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ { pg->exec = NULL; + pg->exec_len = 0; pg->ops = NULL; pg->stepping = 0; pg->vmret = 0; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 55bf0482ec4ba..7671b2234b0f9 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -383,7 +383,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } #endif - if (PHPDBG_G(has_file_bp) + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; @@ -393,7 +393,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(has_sym_bp)) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && (previous != execute_data)) { - if (previous->opline) { + if (previous->opline && execute_data->opline->opcode != ZEND_RETURN) { if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { diff --git a/test.php b/test.php index a433605823bc4..bed99d3e9b7e7 100644 --- a/test.php +++ b/test.php @@ -5,8 +5,11 @@ function test() { function test2() { echo "Hello World 2\n"; } + if (!isset($greeting)) { echo test(); } + +test2(); return true; ?> From 493e81e4c70e28e440544df372536c5171089fff Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:29:14 +0000 Subject: [PATCH 0376/1256] ... --- phpdbg_prompt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 7671b2234b0f9..684e88c64b560 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -390,10 +390,10 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } } - if (PHPDBG_G(has_sym_bp)) { + if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && (previous != execute_data)) { - if (previous->opline && execute_data->opline->opcode != ZEND_RETURN) { + if (previous->opline) { if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { From d141bf4ea873d40cc2ee7daa554ff394bcf28356 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:38:58 -0200 Subject: [PATCH 0377/1256] - Get rid llist from symbol breakpoint --- phpdbg.c | 12 +++++++++--- phpdbg_bp.c | 42 +++++++++++++----------------------------- phpdbg_bp.h | 3 +-- phpdbg_prompt.c | 39 +++++++++++++++++++-------------------- 4 files changed, 42 insertions(+), 54 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index c15c718b9d196..1a62bcac612be 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -18,6 +18,7 @@ #include "phpdbg.h" #include "phpdbg_prompt.h" +#include "phpdbg_bp.h" ZEND_DECLARE_MODULE_GLOBALS(phpdbg); @@ -44,15 +45,20 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ return SUCCESS; } /* }}} */ -static void php_phpdbg_destroy_break(void *brake) /* {{{ */ +static void php_phpdbg_destroy_bp_file(void *brake) /* {{{ */ { zend_llist_destroy((zend_llist*)brake); } /* }}} */ +static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ +{ + efree(((phpdbg_breaksymbol_t*)brake)->symbol); +} /* }}} */ + static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { - zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_break, 0); - zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_break, 0); + zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); + zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); return SUCCESS; } /* }}} */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index d3787349600f7..4680e3ab50593 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -32,13 +32,6 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ efree((char*)bp->filename); } /* }}} */ -static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ -{ - phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; - - efree((char*)bp->symbol); -} /* }}} */ - void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { phpdbg_breakfile_t new_break; @@ -66,31 +59,21 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ -void phpdbg_set_breakpoint_symbol(const char *name, long opline_num TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ { - phpdbg_breaksymbol_t new_break; - zend_llist *break_sym_ptr; size_t name_len = strlen(name); - new_break.symbol = estrndup(name, name_len + 1); - new_break.opline_num = opline_num; - - PHPDBG_G(has_sym_bp) = 1; + if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) { + phpdbg_breaksymbol_t new_break; - if (zend_hash_find(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { - zend_llist break_syms; + PHPDBG_G(has_sym_bp) = 1; - zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), - phpdbg_llist_breaksym_dtor, 0); + new_break.symbol = estrndup(name, name_len + 1); + new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, &break_syms, sizeof(zend_llist), - (void**)&break_sym_ptr); + zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, + name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); } - - new_break.id = PHPDBG_G(bp_count)++; - zend_llist_add_element(break_sym_ptr, &new_break); } /* }}} */ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ @@ -119,7 +102,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ { const char *fname; - zend_llist *break_list; + phpdbg_breaksymbol_t *bp; if (fbc->type != ZEND_USER_FUNCTION) { return FAILURE; @@ -130,10 +113,11 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (!fname) { fname = "main"; } - + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), - (void**)&break_list) == SUCCESS) { - printf("breakpoint reached!\n"); + (void**)&bp) == SUCCESS) { + printf("Breakpoint #%d in %s() at %s\n", bp->id, bp->symbol, + zend_get_executed_filename(TSRMLS_C)); return SUCCESS; } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 45f4239eafd5e..104e9d0c1d9aa 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -34,12 +34,11 @@ typedef struct _phpdbg_breakfile_t { */ typedef struct _phpdbg_breaksymbol_t { const char *symbol; - long opline_num; int id; } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); -void phpdbg_set_breakpoint_symbol(const char*, long TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 284f32d861919..d064d2dd378f4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -72,7 +72,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ } else { printf("Cannot compile while in execution\n"); } - + return FAILURE; } /* }}} */ @@ -228,14 +228,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { char name[200]; - const char *opnum_pos = zend_memrchr(expr, '#', expr_len); - long opline_num = opnum_pos ? strtol(opnum_pos+1, NULL, 0) : 0; - size_t name_len = opnum_pos ? opnum_pos - expr : strlen(expr); + size_t name_len = strlen(expr); + name_len = MIN(name_len, 200); memcpy(name, expr, name_len); name[name_len] = 0; - phpdbg_set_breakpoint_symbol(name, opline_num TSRMLS_CC); + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); } return SUCCESS; @@ -336,7 +335,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: return PHPDBG_NEXT; } @@ -375,7 +374,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } #endif - if (PHPDBG_G(has_file_bp) + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; @@ -384,21 +383,21 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(has_sym_bp)) { zend_execute_data *previous = execute_data->prev_execute_data; - if (previous && (previous != execute_data)) { - if (previous->opline) { - if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { - if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { - continue; - } - } - } - } - } + if (previous && previous != execute_data && previous->opline) { + if (previous->opline->opcode == ZEND_DO_FCALL + || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_find_breakpoint_symbol( + previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + } + } } - + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - + phpdbg_print_opline( execute_data TSRMLS_CC); From 587003ee488189e78585047149c751c2e815d7be Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:49:37 +0000 Subject: [PATCH 0378/1256] exec last command automatically on enter --- phpdbg.c | 3 +++ phpdbg.h | 5 +++++ phpdbg_prompt.c | 11 +++++++++-- phpdbg_prompt.h | 4 ++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 997c273836620..744565fb48d05 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -34,6 +34,9 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->quitting = 0; pg->bp_count = 0; pg->quiet = 0; + pg->last = NULL; + pg->last_params = NULL; + pg->last_params_len = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index c9f3e5ee3df35..0ac807d987413 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -44,6 +44,8 @@ #define PHPDBG_NEXT 2 +typedef struct _phpdbg_command_t phpdbg_command_t; + ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable bp_files; HashTable bp_symbols; @@ -58,6 +60,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ zend_bool quitting; /* quitting flag */ int quiet; /* quiet */ + phpdbg_command_t *last; /* last command */ + const char *last_params;/* last expression */ + size_t last_params_len; /* last expression length */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 684e88c64b560..4c5b51712e1dd 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -58,7 +58,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ if (!EG(in_execution)) { printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( @@ -310,7 +310,10 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le while (command && command->name) { if (command->name_len == expr_len - && memcmp(cmd, command->name, expr_len) == 0) { + && memcmp(cmd, command->name, expr_len) == 0) { + PHPDBG_G(last) = command; + PHPDBG_G(last_params) = params; + PHPDBG_G(last_params_len) = cmd_len - expr_len; return command->handler(params, cmd_len - expr_len TSRMLS_CC); } ++command; @@ -346,11 +349,15 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return PHPDBG_NEXT; } + } else if (PHPDBG_G(last)) { + PHPDBG_G(last)->handler( + PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } if (!PHPDBG_G(quitting)) { printf("phpdbg> "); } + } return SUCCESS; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index b6921d671e446..c0590e2597092 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -35,13 +35,13 @@ typedef int (*phpdbg_command_handler_t)(const char* expr, size_t expr_len TSRMLS /** * Command representation */ -typedef struct _phpdbg_command_t { +struct _phpdbg_command_t { const char *name; /* Command name */ size_t name_len; /* Command name length */ const char *tip; /* Menu tip */ size_t tip_len; /* Menu tip length */ phpdbg_command_handler_t handler; /* Command handler */ -} phpdbg_command_t; +} ; /** * Command Executor From e1931c14a5ae9f37bf13e7bccc06390d298d3e3d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:51:44 -0200 Subject: [PATCH 0379/1256] - Move PHPDBG_NEXT to prompt header --- phpdbg.h | 2 -- phpdbg_prompt.h | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index c9f3e5ee3df35..acfabafb5dfe2 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -42,8 +42,6 @@ # define PHPDBG_G(v) (phpdbg_globals.v) #endif -#define PHPDBG_NEXT 2 - ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable bp_files; HashTable bp_symbols; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index b6921d671e446..f14b656541eba 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -27,6 +27,8 @@ #define PHPDBG_STRL(s) s, sizeof(s)-1 +#define PHPDBG_NEXT 2 + /** * Command handler */ @@ -52,9 +54,9 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le * Command Declarators */ #define PHPDBG_COMMAND_D(name, tip) \ - {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name} + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name} #define PHPDBG_COMMAND(name) \ - int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) + int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) int phpdbg_interactive(int argc, char **argv TSRMLS_DC); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); From 7886665b520cae75861f87ba0c8b9a2a32beb88a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:57:43 -0200 Subject: [PATCH 0380/1256] - Cosmetic changes --- phpdbg_bp.c | 3 +-- phpdbg_prompt.c | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4680e3ab50593..4ae8863534b66 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -122,5 +122,4 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ } return FAILURE; -} -/* }}} */ +} /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index de28d8f559b43..2a2cf81a2b529 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -138,7 +138,8 @@ static PHPDBG_COMMAND(eval) /* {{{ */ zval retval; if (expr) { - if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + if (zend_eval_stringl((char*)expr, expr_len-1, + &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { printf("Success: "); zend_print_zval_r(&retval, 0 TSRMLS_CC); printf("\n"); From f45f2ab8f88858dea62b756276cdcc569d3f1e69 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 20:01:40 -0200 Subject: [PATCH 0381/1256] - Fix comment --- phpdbg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 8454780193719..73108d799f088 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -136,7 +136,7 @@ static sapi_module_struct phpdbg_sapi_module = { }; /* }}} */ -const opt_struct OPTIONS[] = { /* }}} */ +const opt_struct OPTIONS[] = { /* {{{ */ {'c', 1, "ini path override"}, {'d', 1, "define ini entry on command line"}, {'-', 0, NULL} From 8ffa4025fbbca506b15fb71ee12804e50cf7defb Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 20:04:22 -0200 Subject: [PATCH 0382/1256] - Cosmetics --- phpdbg_prompt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 2a2cf81a2b529..a4812c0bd31a0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -411,8 +411,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ execute_data TSRMLS_CC); if (PHPDBG_G(stepping)) { - while (phpdbg_interactive( - 0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } } From 7de0b76ba89cf3eb46080e2d314e9b582082f4ad Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 22:44:28 +0000 Subject: [PATCH 0383/1256] ... --- config.m4 | 7 ++-- phpdbg.c | 90 ++++++++++++++++++++++++++++++++++++++++++------- phpdbg_prompt.c | 2 +- 3 files changed, 83 insertions(+), 16 deletions(-) diff --git a/config.m4 b/config.m4 index f3671f4b10d0a..33ea65b3963d6 100644 --- a/config.m4 +++ b/config.m4 @@ -8,9 +8,12 @@ PHP_ARG_ENABLE(phpdbg, for phpdbg support, if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) - PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg + PHP_PHPDBG_CFLAGS="-I$abc_srcdir" PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c" + PHP_SUBST(PHP_PHPDBG_CFLAGS) + PHP_SUBST(PHP_PHPDBG_FILES) + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) @@ -24,7 +27,7 @@ if test "$PHP_PHPDBG" != "no"; then \$(PHPDBG_EXTRA_LIBS) \ \$(ZEND_EXTRA_LIBS) \ -o \$(BUILD_BINARY)" - + PHP_SUBST(BUILD_BINARY) PHP_SUBST(BUILD_PHPDBG) fi diff --git a/phpdbg.c b/phpdbg.c index 744565fb48d05..491b55b5f4be1 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -99,6 +99,46 @@ static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* return SUCCESS; } /* }}} */ +static char* php_sapi_phpdbg_read_cookies(TSRMLS_D) { /* {{{ */ + return NULL; +} /* }}} */ + +static int php_sapi_phpdbg_header_handler(sapi_header_struct *h, sapi_header_op_enum op, sapi_headers_struct *s TSRMLS_DC) /* {{{ */ +{ + return 0; +} +/* }}} */ + +static int php_sapi_phpdbg_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) /* {{{ */ +{ + /* We do nothing here, this function is needed to prevent that the fallback + * header handling is called. */ + return SAPI_HEADER_SENT_SUCCESSFULLY; +} +/* }}} */ + +static void php_sapi_phpdbg_send_header(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC) /* {{{ */ +{ +} +/* }}} */ + +static void php_sapi_phpdbg_log_message(char *message TSRMLS_DC) /* {{{ */ +{ + fprintf(stderr, "%s\n", message); +} +/* }}} */ + +static int php_sapi_phpdbg_deactivate(TSRMLS_D) /* {{{ */ +{ + fflush(stdout); + if(SG(request_info).argv0) { + free(SG(request_info).argv0); + SG(request_info).argv0 = NULL; + } + return SUCCESS; +} +/* }}} */ + /* {{{ sapi_module_struct phpdbg_sapi_module */ static sapi_module_struct phpdbg_sapi_module = { @@ -109,7 +149,7 @@ static sapi_module_struct phpdbg_sapi_module = { php_module_shutdown_wrapper, /* shutdown */ NULL, /* activate */ - NULL, /* deactivate */ + php_sapi_phpdbg_deactivate, /* deactivate */ NULL, /* unbuffered write */ NULL, /* flush */ @@ -118,27 +158,35 @@ static sapi_module_struct phpdbg_sapi_module = { php_error, /* error handler */ - NULL, /* header handler */ - NULL, /* send headers handler */ - NULL, /* send header handler */ + php_sapi_phpdbg_header_handler, /* header handler */ + php_sapi_phpdbg_send_headers, /* send headers handler */ + php_sapi_phpdbg_send_header, /* send header handler */ NULL, /* read POST data */ - NULL, /* read Cookies */ + php_sapi_phpdbg_read_cookies, /* read Cookies */ NULL, /* register server variables */ - NULL, /* Log message */ + php_sapi_phpdbg_log_message, /* Log message */ NULL, /* Get request time */ NULL, /* Child terminate */ STANDARD_SAPI_MODULE_PROPERTIES }; /* }}} */ -const opt_struct OPTIONS[] = { /* }}} */ +const opt_struct phpdbg_options[] = { /* }}} */ {'c', 1, "ini path override"}, {'d', 1, "define ini entry on command line"}, {'-', 0, NULL} }; /* }}} */ +const char phpdbg_ini_hardcoded[] = + "html_errors=0\n" + "register_argc_argv=1\n" + "implicit_flush=1\n" + "output_buffering=0\n" + "max_execution_time=0\n" + "max_input_time=-1\n\0"; + /* overwriteable ini defaults must be set in phpdbg_ini_defaults() */ #define INI_DEFAULT(name,value)\ Z_SET_REFCOUNT(tmp, 0);\ @@ -152,7 +200,7 @@ void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ INI_DEFAULT("display_errors", "1"); } /* }}} */ -int main(int argc, char **argv) /* {{{ */ +int main(int argc, char *argv[]) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *ini_file = NULL; @@ -162,12 +210,9 @@ int main(int argc, char **argv) /* {{{ */ char *php_optarg = NULL; int php_optind = 0; int opt; - + #ifdef ZTS void ***tsrm_ls; - tsrm_startup(1, 1, 0, NULL); - - tsrm_ls = ts_resource(0); #endif #ifdef PHP_WIN32 @@ -177,7 +222,14 @@ int main(int argc, char **argv) /* {{{ */ setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 1, 1)) != -1) { +#ifdef ZTS + tsrm_startup(1, 1, 0, NULL); + + tsrm_ls = ts_resource(0); +#endif + + while ((opt = php_getopt(argc, argv, phpdbg_options, &php_optarg, &php_optind, 0, 2)) != -1) { + printf("OPT: %d\n", opt); switch (opt) { case 'c': if (ini_path_override) { @@ -228,6 +280,18 @@ int main(int argc, char **argv) /* {{{ */ phpdbg->phpinfo_as_text = 1; phpdbg->php_ini_ignore_cwd = 0; phpdbg->php_ini_ignore = 0; + + if (ini_entries) { + ini_entries = realloc(ini_entries, ini_entries_len + sizeof(phpdbg_ini_hardcoded)); + memmove(ini_entries + sizeof(phpdbg_ini_hardcoded) - 2, ini_entries, ini_entries_len + 1); + memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded) - 2); + } else { + ini_entries = malloc(sizeof(phpdbg_ini_hardcoded)); + memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded)); + } + ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; + printf("ini_entries: %d\n", ini_entries_len); + phpdbg->ini_entries = ini_entries; if (phpdbg->startup(phpdbg) == SUCCESS) { diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4c5b51712e1dd..a5bca2d142f4a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -345,7 +345,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: return PHPDBG_NEXT; } From 4f9f86a15dbbec28c37a9f7ade85545124d2c764 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 22:55:07 +0000 Subject: [PATCH 0384/1256] update to default on --- config.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.m4 b/config.m4 index 33ea65b3963d6..bb9719015e527 100644 --- a/config.m4 +++ b/config.m4 @@ -3,7 +3,7 @@ dnl $Id$ dnl PHP_ARG_ENABLE(phpdbg, for phpdbg support, -[ --enable-phpdbg Build phpdbg], no, no) +[ --enable-phpdbg Build phpdbg], yes, yes) if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) From 92c0fbebeda49a9e5d327f4b08e89df2d1af98ff Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:06:20 +0000 Subject: [PATCH 0385/1256] ini working --- phpdbg.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 2ebc518484287..a4984bb7aa7ee 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -214,7 +214,7 @@ int main(int argc, char *argv[]) /* {{{ */ int ini_entries_len = 0; char *ini_path_override = NULL; char *php_optarg = NULL; - int php_optind = 0; + int php_optind = 1; int opt; #ifdef ZTS @@ -235,7 +235,6 @@ int main(int argc, char *argv[]) /* {{{ */ #endif while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { - printf("OPT: %d\n", opt); switch (opt) { case 'c': if (ini_path_override) { From 4f5096af3ceaf5670050353fc8a41d164b8b058b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:30:52 +0000 Subject: [PATCH 0386/1256] register server vars --- phpdbg.c | 60 ++++++++++++++++++++++++++++++++++++++++++++------------ phpdbg.h | 5 +++-- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a4984bb7aa7ee..e7cb57d10c723 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -38,6 +38,8 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->last = NULL; pg->last_params = NULL; pg->last_params_len = 0; + pg->has_file_bp = 0; + pg->has_sym_bp = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -145,6 +147,40 @@ static int php_sapi_phpdbg_deactivate(TSRMLS_D) /* {{{ */ } /* }}} */ +static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* {{{ */ +{ + unsigned int len; + char *docroot = ""; + + /* In phpdbg mode, we consider the environment to be a part of the server variables + */ + php_import_environment_variables(track_vars_array TSRMLS_CC); + + if (PHPDBG_G(exec)) { + len = PHPDBG_G(exec_len); + if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PHP_SELF", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + if (sapi_module.input_filter(PARSE_SERVER, "PATH_TRANSLATED", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + } + + /* any old docroot will doo */ + len = 0U; + if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", &docroot, len, &len TSRMLS_CC)) { + php_register_variable("DOCUMENT_ROOT", docroot, track_vars_array TSRMLS_CC); + } +} +/* }}} */ + /* {{{ sapi_module_struct phpdbg_sapi_module */ static sapi_module_struct phpdbg_sapi_module = { @@ -171,7 +207,7 @@ static sapi_module_struct phpdbg_sapi_module = { NULL, /* read POST data */ php_sapi_phpdbg_read_cookies, /* read Cookies */ - NULL, /* register server variables */ + php_sapi_phpdbg_register_vars, /* register server variables */ php_sapi_phpdbg_log_message, /* Log message */ NULL, /* Get request time */ NULL, /* Child terminate */ @@ -182,6 +218,8 @@ static sapi_module_struct phpdbg_sapi_module = { const opt_struct OPTIONS[] = { /* {{{ */ {'c', 1, "ini path override"}, {'d', 1, "define ini entry on command line"}, + {'n', 0, "no php.ini"}, + {'z', 1, "load zend_extension"}, {'-', 0, NULL} }; /* }}} */ @@ -209,10 +247,8 @@ void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ int main(int argc, char *argv[]) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; - char *ini_file = NULL; char *ini_entries = NULL; int ini_entries_len = 0; - char *ini_path_override = NULL; char *php_optarg = NULL; int php_optind = 1; int opt; @@ -236,11 +272,14 @@ int main(int argc, char *argv[]) /* {{{ */ while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (opt) { + case 'n': + phpdbg->php_ini_ignore = 1; + break; case 'c': - if (ini_path_override) { - free(ini_path_override); + if (phpdbg->php_ini_path_override) { + free(phpdbg->php_ini_path_override); } - ini_path_override = strdup(php_optarg); + phpdbg->php_ini_path_override = strdup(php_optarg); break; case 'd': { int len = strlen(php_optarg); @@ -271,11 +310,13 @@ int main(int argc, char *argv[]) /* {{{ */ ini_entries_len += len + sizeof("=1\n\0") - 2; } } break; + case 'z': + zend_load_extension(php_optarg); + break; } } phpdbg->ini_defaults = phpdbg_ini_defaults; - phpdbg->php_ini_path_override = ini_path_override; phpdbg->phpinfo_as_text = 1; phpdbg->php_ini_ignore_cwd = 1; @@ -283,7 +324,6 @@ int main(int argc, char *argv[]) /* {{{ */ phpdbg->executable_location = argv[0]; phpdbg->phpinfo_as_text = 1; - phpdbg->php_ini_ignore_cwd = 0; phpdbg->php_ini_ignore = 0; if (ini_entries) { @@ -319,10 +359,6 @@ int main(int argc, char *argv[]) /* {{{ */ } while(!PHPDBG_G(quitting)); } zend_end_try(); - if (ini_file) { - pefree(ini_file, 1); - } - if (ini_entries) { free(ini_entries); } diff --git a/phpdbg.h b/phpdbg.h index 0ac807d987413..e8c02da70ad3c 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -23,11 +23,12 @@ #include "php_globals.h" #include "php_variables.h" #include "php_getopt.h" +#include "zend_builtin_functions.h" +#include "zend_extensions.h" #include "zend_modules.h" -#include "zend_ini_scanner.h" #include "zend_globals.h" +#include "zend_ini_scanner.h" #include "zend_stream.h" -#include "zend_builtin_functions.h" #include "SAPI.h" #include #include "php_main.h" From a6864679a2866e69a3659e29e9b112353764560d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:38:55 +0000 Subject: [PATCH 0387/1256] ... --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index a15e556226f11..78d811f5759ba 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,16 @@ make -j8 make install-phpdbg ``` +Command Line Options +==================== + +The following switches are implemented (just like cli SAPI): + + - -n ignore php ini + - -c search for php ini in path + - -z load zend extension + - -d define php ini entry + Screeny ======= From f745c841b8e9104874a1f4c83b603d4e090b1be3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:40:57 +0000 Subject: [PATCH 0388/1256] ... --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 78d811f5759ba..5fd6514d69219 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ Features ======== - step through debugging - - setting break points + - break at function entry or file:line - showing debug backtraces - - access to eval during execution + - easy manipulation of the environment with built-in eval() - sapi agnositicism, easy integration Installation From b5da4267761367f0c8eecdad6fe830e784e74bdc Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:44:16 +0000 Subject: [PATCH 0389/1256] ... --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5fd6514d69219..51f7be3041fbd 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -phpdbg - The interactive PHP debugger -===================================== +The interactive PHP debugger +============================ phpdbg is an interactive debugger for PHP. Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. +phpdbg aims to be a lightweight, easy to use debugging platform for PHP5.5+ + Features ======== @@ -14,6 +16,13 @@ Features - easy manipulation of the environment with built-in eval() - sapi agnositicism, easy integration +Planned +======= + + - mocking server environments/requests + - userland script-ability + - improve everything + Installation ============ From b77508f25094684f0197e1a2337ddec6143512ec Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 08:02:04 +0000 Subject: [PATCH 0390/1256] noquit on fatal errors clean command to clear environment --- phpdbg.c | 14 ++++++++------ phpdbg_help.c | 7 +++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 25 +++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index e7cb57d10c723..3d4908cf62b8c 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -353,12 +353,14 @@ int main(int argc, char *argv[]) /* {{{ */ zend_activate_modules(TSRMLS_C); } zend_end_try(); - zend_try { - do { - phpdbg_interactive(argc, argv TSRMLS_CC); - } while(!PHPDBG_G(quitting)); - } zend_end_try(); - + do { + zend_try { + phpdbg_interactive(argc, argv TSRMLS_CC); + } zend_catch { + + } zend_end_try(); + } while(!PHPDBG_G(quitting)); + if (ini_entries) { free(ini_entries); } diff --git a/phpdbg_help.c b/phpdbg_help.c index 4b218f31d2ff4..11430916c8046 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -91,6 +91,13 @@ PHPDBG_HELP(break) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(clean) /* {{{ */ +{ + printf("While debugging you may experience errors because of attempts to redeclare classes, constants or functions.\n"); + printf("Cleaning the environment cleans these tables, so that files can be recompiled without exiting phpdbg.\n"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(quiet) /* {{{ */ { printf("Setting quietness on will stop the OPLINE output during execution\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index ed67a3fec21fa..b48409f487e18 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -41,6 +41,7 @@ PHPDBG_HELP(run); PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); +PHPDBG_HELP(clean); PHPDBG_HELP(back); PHPDBG_HELP(quiet); @@ -56,6 +57,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), + PHPDBG_HELP_D(clean, "resetting the environment is useful while debugging and recompiling"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9c0517119e095..f8a203c50ecbb 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -250,6 +250,30 @@ static PHPDBG_COMMAND(quit) /* {{{ */ return SUCCESS; } /* }}} */ +static int clean_non_persistent_constant_full(const zend_constant *c TSRMLS_DC) /* {{{ */ +{ + return (c->flags & CONST_PERSISTENT) ? 0 : 1; +} /* }}} */ + +static int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC) /* {{{ */ +{ + return ((*ce)->type == ZEND_INTERNAL_CLASS) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE; +} /* }}} */ + +static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) /* {{{ */ +{ + return (function->type == ZEND_INTERNAL_FUNCTION) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE; +} /* }}} */ + +static PHPDBG_COMMAND(clean) /* {{{ */ +{ + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_destroy(&EG(included_files)); + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(help) /* {{{ */ { printf("Welcome to phpdbg, the interactive PHP debugger.\n"); @@ -296,6 +320,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), + PHPDBG_COMMAND_D(clean, "clean the execution environment"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quiet, "silence some output"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 5f82f002f0d72d948c1e52f79a2a66d5d00a3581 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 08:08:26 +0000 Subject: [PATCH 0391/1256] clean not destroy included files remove argc, argv from phpdbg_interactive, unused --- phpdbg.c | 2 +- phpdbg_prompt.c | 10 +++++----- phpdbg_prompt.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3d4908cf62b8c..bae33aab91b3b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -355,7 +355,7 @@ int main(int argc, char *argv[]) /* {{{ */ do { zend_try { - phpdbg_interactive(argc, argv TSRMLS_CC); + phpdbg_interactive(TSRMLS_C); } zend_catch { } zend_end_try(); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f8a203c50ecbb..8238ea32cf6db 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -270,7 +270,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); - zend_hash_destroy(&EG(included_files)); + zend_hash_clean(&EG(included_files)); return SUCCESS; } /* }}} */ @@ -347,7 +347,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ +int phpdbg_interactive(TSRMLS_D) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -417,7 +417,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { continue; } } @@ -429,7 +429,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { if (phpdbg_find_breakpoint_symbol( previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { continue; } } @@ -443,7 +443,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ execute_data TSRMLS_CC); if (PHPDBG_G(stepping)) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { continue; } } diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 6675624dbd135..bddc7f99f7da5 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -58,7 +58,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #define PHPDBG_COMMAND(name) \ int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) -int phpdbg_interactive(int argc, char **argv TSRMLS_DC); +int phpdbg_interactive(TSRMLS_D); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From 3955dcf67313053ced77706e48d96c3f01eda631 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 09:14:30 +0000 Subject: [PATCH 0392/1256] more output on setting break points output breaks with print command --- phpdbg_bp.c | 11 ++++++-- phpdbg_prompt.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4ae8863534b66..236c0b4e0ebff 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -38,9 +38,9 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist *break_files_ptr; size_t path_len = strlen(path); - new_break.filename = estrndup(path, path_len + 1); + new_break.filename = estrndup(path, path_len); new_break.line = line_num; - + PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), @@ -57,6 +57,9 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); + + printf( + "Breakpoint #%d added at %s:%d\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -73,6 +76,10 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); + + printf("Breakpoint #%d added at %s\n", new_break.id, new_break.symbol); + } else { + printf("Breakpoint exists at %s\n", name); } } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 8238ea32cf6db..cc109e8f8b071 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -187,8 +187,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("%s\n", expr); return SUCCESS; } - - printf("Showing Execution Context Information:\n"); + + printf("--------------------------------------\n"); + printf("Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); @@ -203,11 +204,59 @@ static PHPDBG_COMMAND(print) /* {{{ */ } } printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); - if (EG(in_execution)) { printf("VM Return\t%d\n", PHPDBG_G(vmret)); } - + printf("Classes\t\t%d\n", zend_hash_num_elements(EG(class_table))); + printf("Functions\t%d\n", zend_hash_num_elements(EG(function_table))); + printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); + printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); + + if (PHPDBG_G(has_file_bp)) { + HashPosition position; + zend_llist *points; + + printf("--------------------------------------\n"); + printf("File Break Point Information:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_files), &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp_files), (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp_files), &position)) { + zend_llist_position lposition; + phpdbg_breakfile_t *brake; + + if ((brake = zend_llist_get_first_ex(points, &lposition))) { + printf("%s:\n", brake->filename); + do { + printf("\t%lu\n", brake->line); + } while ((brake = zend_llist_get_next_ex(points, &lposition))); + } + } + } + +#if 0 + if (PHPDBG_G(has_sym_bp)) { + HashPosition position; + zend_llist *points; + + printf("--------------------------------------\n"); + printf("Symbol Break Point Information:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_symbols), &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp_symbols), (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp_symbols), &position)) { + zend_llist_position lposition; + phpdbg_breaksymbol_t *brake; + + if ((brake = zend_llist_get_first_ex(points, &lposition))) { + printf("%s:\n", brake->symbol); + do { + printf("\t%d\n", brake->id); + } while ((brake = zend_llist_get_next_ex(points, &lposition))); + } + } + } +#endif + + printf("--------------------------------------\n"); return SUCCESS; } /* }}} */ @@ -267,10 +316,23 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { + printf("Cleaning Environment:\n"); + printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); + printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); + printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); + printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); + + printf("Clean Environment:\n"); + printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); + printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); + printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); + printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + return SUCCESS; } /* }}} */ From cb24989f0633e02156c3e56e2c3f2bbbda601b9c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 09:36:33 +0000 Subject: [PATCH 0393/1256] updates to break setting --- phpdbg_prompt.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cc109e8f8b071..283b66bebd440 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -140,7 +140,6 @@ static PHPDBG_COMMAND(eval) /* {{{ */ if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - printf("Success: "); zend_print_zval_r(&retval, 0 TSRMLS_CC); printf("\n"); zval_dtor(&retval); @@ -263,19 +262,25 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { const char *line_pos = zend_memrchr(expr, ':', expr_len); - + if (line_pos) { char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); + + if (line_num) { + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + printf("Failed to expand path %s\n", path); + return FAILURE; + } - memcpy(path, expr, line_pos - expr); - path[line_pos - expr] = 0; - - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - return FAILURE; + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); + } else { + printf("No line specified in expression %s\n", expr); + return FAILURE; } - - phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { char name[200]; size_t name_len = strlen(expr); From 67dc98732ea2ff0edda1d5d1440a0e1d593aa949 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 11:54:41 +0000 Subject: [PATCH 0394/1256] break on opline --- phpdbg.c | 7 +++++-- phpdbg.h | 30 ++++++++++++++++-------------- phpdbg_bp.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- phpdbg_bp.h | 10 ++++++++++ phpdbg_prompt.c | 34 +++++++++++++++++++++++++--------- 5 files changed, 102 insertions(+), 26 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index bae33aab91b3b..3aa8c03524135 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -40,6 +40,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->last_params_len = 0; pg->has_file_bp = 0; pg->has_sym_bp = 0; + pg->has_opline_bp = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -66,7 +67,8 @@ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - + zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, NULL, 0); + return SUCCESS; } /* }}} */ @@ -74,7 +76,8 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ { zend_hash_destroy(&PHPDBG_G(bp_files)); zend_hash_destroy(&PHPDBG_G(bp_symbols)); - + zend_hash_destroy(&PHPDBG_G(bp_oplines)); + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } diff --git a/phpdbg.h b/phpdbg.h index e8c02da70ad3c..8adc69cf4f23f 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -50,20 +50,22 @@ typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable bp_files; HashTable bp_symbols; - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ - zend_op_array *ops; /* op_array */ - zval *retval; /* return value */ - int bp_count; /* breakpoint count */ - int stepping; /* stepping */ - int vmret; /* return from last opcode handler execution */ - zend_bool has_file_bp; /* file-based breakpoint has been set */ - zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ - zend_bool quitting; /* quitting flag */ - int quiet; /* quiet */ - phpdbg_command_t *last; /* last command */ - const char *last_params;/* last expression */ - size_t last_params_len; /* last expression length */ + HashTable bp_oplines; + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ + int bp_count; /* breakpoint count */ + int stepping; /* stepping */ + int vmret; /* return from last opcode handler execution */ + zend_bool has_file_bp; /* file-based breakpoint has been set */ + zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ + zend_bool has_opline_bp; /* opline-based breakpoint has been set */ + zend_bool quitting; /* quitting flag */ + int quiet; /* quiet */ + phpdbg_command_t *last; /* last command */ + const char *last_params; /* last expression */ + size_t last_params_len; /* last expression length */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 236c0b4e0ebff..b8b2d35113e44 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -59,7 +59,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "Breakpoint #%d added at %s:%d\n", new_break.id, new_break.filename, new_break.line); + "Breakpoint #%d added at %s:%ld\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -83,6 +83,29 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ +void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ +{ + size_t name_len = strlen(name); + + if (!zend_hash_exists(&PHPDBG_G(bp_oplines), name, name_len)) { + phpdbg_breakline_t new_break; + + PHPDBG_G(has_opline_bp) = 1; + + sscanf( + name, "%x", &new_break.opline); + + new_break.id = PHPDBG_G(bp_count)++; + + zend_hash_update(&PHPDBG_G(bp_oplines), name, + name_len, &new_break, sizeof(phpdbg_breakline_t), NULL); + + printf("Breakpoint #%d added at 0x%x\n", new_break.id, new_break.opline); + } else { + printf("Breakpoint exists at %s\n", name); + } +} /* }}} */ + int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); @@ -130,3 +153,25 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ + +int phpdbg_find_breakpoint_opline(void *opline TSRMLS_DC) /* {{{ */ +{ + char *opstring = NULL; + size_t opstring_len; + phpdbg_breakline_t *bp; + + opstring_len = asprintf( + &opstring, "0x%x", (unsigned int) opline); + + if (zend_hash_find(&PHPDBG_G(bp_oplines), opstring, opstring_len, + (void**)&bp) == SUCCESS) { + printf("Breakpoint #%d in 0x%x at %s\n", bp->id, bp->opline, + zend_get_executed_filename(TSRMLS_C)); + free(opstring); + + return SUCCESS; + } + + free(opstring); + return FAILURE; +} /* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 104e9d0c1d9aa..3ab00048d954a 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -37,10 +37,20 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; +/** + * Breakpoint opline based representation + */ +typedef struct _phpdbg_breakline_t { + zend_uint opline; + int id; +} phpdbg_breakline_t; + void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); +int phpdbg_find_breakpoint_opline(void * TSRMLS_DC); #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 283b66bebd440..9ab039e476b58 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -80,7 +80,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ { if (PHPDBG_G(exec)) { if (PHPDBG_G(ops)) { - printf("Destroying compiled opcodes\n"); + printf("Destroying previously compiled opcodes\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops)=NULL; @@ -96,6 +96,8 @@ static PHPDBG_COMMAND(compile) /* {{{ */ static PHPDBG_COMMAND(step) /* {{{ */ { PHPDBG_G(stepping) = atoi(expr); + printf( + "Stepping %s\n", PHPDBG_G(stepping) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -186,7 +188,10 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("%s\n", expr); return SUCCESS; } - +#ifdef HAVE_READLINE_H + printf("HAVE READLINE\n"); +#endif + printf("--------------------------------------\n"); printf("Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); @@ -282,14 +287,18 @@ static PHPDBG_COMMAND(break) /* {{{ */ return FAILURE; } } else { - char name[200]; - size_t name_len = strlen(expr); + if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') { + phpdbg_set_breakpoint_opline(expr TSRMLS_CC); + } else { + char name[200]; + size_t name_len = strlen(expr); - name_len = MIN(name_len, 200); - memcpy(name, expr, name_len); - name[name_len] = 0; + name_len = MIN(name_len, 200); + memcpy(name, expr, name_len); + name[name_len] = 0; - phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + } } return SUCCESS; @@ -403,7 +412,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le while (command && command->name) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { - PHPDBG_G(last) = command; + PHPDBG_G(last) = (phpdbg_command_t*) command; PHPDBG_G(last_params) = params; PHPDBG_G(last_params_len) = cmd_len - expr_len; return command->handler(params, cmd_len - expr_len TSRMLS_CC); @@ -503,6 +512,13 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } } } + + if (PHPDBG_G(has_opline_bp) + && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + continue; + } + } PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); From 28848919cf19edcb8035b1709e465173ab679b0a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 12:07:11 +0000 Subject: [PATCH 0395/1256] break opline help --- phpdbg_help.c | 3 +++ phpdbg_prompt.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/phpdbg_help.c b/phpdbg_help.c index 11430916c8046..9fbd7bd1379f7 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -83,11 +83,14 @@ PHPDBG_HELP(break) /* {{{ */ printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); printf("\tfunction\n"); + printf("\t0x12345678\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); printf("\tphpdbg> break my_function\n"); printf("Will break execution on entry to my_function\n"); + printf("\tphpdbg> break 0x4c79a40\n"); + printf("Will break at the opline with the address provided\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9ab039e476b58..e6b17912e8045 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -259,6 +259,19 @@ static PHPDBG_COMMAND(print) /* {{{ */ } } #endif + + if (PHPDBG_G(has_opline_bp)) { + HashPosition position; + phpdbg_breakline_t *brake; + + printf("--------------------------------------\n"); + printf("Opline Break Point Information:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp_oplines), (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp_oplines), &position)) { + printf("#%d\t0x%x\n", brake->id, brake->opline); + } + } printf("--------------------------------------\n"); return SUCCESS; From 616cb9c35f2b0a54300e0484a180090570485f1f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 12:09:57 +0000 Subject: [PATCH 0396/1256] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51f7be3041fbd..8dbc386139448 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Features ======== - step through debugging - - break at function entry or file:line + - break at function entry, file:line or address - showing debug backtraces - easy manipulation of the environment with built-in eval() - sapi agnositicism, easy integration From 764d7d492cfdb406df21108ce5e2280a9b077c10 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 13:04:21 +0000 Subject: [PATCH 0397/1256] fix break on opline --- phpdbg.c | 7 ++++++- phpdbg_bp.c | 35 ++++++++++++++--------------------- phpdbg_bp.h | 5 +++-- phpdbg_prompt.c | 2 +- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3aa8c03524135..214a6fb0fba4e 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -63,11 +63,16 @@ static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ efree((char*)((phpdbg_breaksymbol_t*)brake)->symbol); } /* }}} */ +static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ +{ + efree((char*)((phpdbg_breakline_t*)brake)->name); +} /* }}} */ + static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, NULL, 0); + zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, php_phpdbg_destroy_bp_opline, 0); return SUCCESS; } /* }}} */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index b8b2d35113e44..799ea11357cbb 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -85,22 +85,20 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { - size_t name_len = strlen(name); - - if (!zend_hash_exists(&PHPDBG_G(bp_oplines), name, name_len)) { + zend_ulong opline = strtoul(name, 0, 16); + + if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { phpdbg_breakline_t new_break; PHPDBG_G(has_opline_bp) = 1; - - sscanf( - name, "%x", &new_break.opline); - + + new_break.name = estrdup(name); + new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(&PHPDBG_G(bp_oplines), name, - name_len, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("Breakpoint #%d added at 0x%x\n", new_break.id, new_break.opline); + printf("Breakpoint #%d added at %s\n", new_break.id, new_break.name); } else { printf("Breakpoint exists at %s\n", name); } @@ -154,24 +152,19 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -int phpdbg_find_breakpoint_opline(void *opline TSRMLS_DC) /* {{{ */ +typedef struct _zend_op *zend_op_ptr; + +int phpdbg_find_breakpoint_opline(zend_op_ptr opline TSRMLS_DC) /* {{{ */ { - char *opstring = NULL; - size_t opstring_len; phpdbg_breakline_t *bp; - opstring_len = asprintf( - &opstring, "0x%x", (unsigned int) opline); - - if (zend_hash_find(&PHPDBG_G(bp_oplines), opstring, opstring_len, - (void**)&bp) == SUCCESS) { - printf("Breakpoint #%d in 0x%x at %s\n", bp->id, bp->opline, + if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, + (void**)&bp) == SUCCESS) { + printf("Breakpoint #%d in %s at %s\n", bp->id, bp->name, zend_get_executed_filename(TSRMLS_C)); - free(opstring); return SUCCESS; } - free(opstring); return FAILURE; } /* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 3ab00048d954a..164ff48facbd8 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -41,7 +41,8 @@ typedef struct _phpdbg_breaksymbol_t { * Breakpoint opline based representation */ typedef struct _phpdbg_breakline_t { - zend_uint opline; + const char *name; + zend_ulong opline; int id; } phpdbg_breakline_t; @@ -51,6 +52,6 @@ void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); -int phpdbg_find_breakpoint_opline(void * TSRMLS_DC); +int phpdbg_find_breakpoint_opline(zend_op* TSRMLS_DC); #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e6b17912e8045..5f8c56a0c5dd6 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -269,7 +269,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp_oplines), (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp_oplines), &position)) { - printf("#%d\t0x%x\n", brake->id, brake->opline); + printf("#%d\t%s\n", brake->id, brake->name); } } From be460647ef869b602ca3cd98ae2560446547500f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 13:07:02 +0000 Subject: [PATCH 0398/1256] ... --- phpdbg_bp.c | 4 +--- phpdbg_bp.h | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 799ea11357cbb..c261ecc1060e5 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -152,9 +152,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -typedef struct _zend_op *zend_op_ptr; - -int phpdbg_find_breakpoint_opline(zend_op_ptr opline TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ { phpdbg_breakline_t *bp; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 164ff48facbd8..f6a8b6bcd7c97 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -20,6 +20,9 @@ #ifndef PHPDBG_BP_H #define PHPDBG_BP_H +/* {{{ */ +typedef struct _zend_op *phpdbg_opline_ptr_t; /* }}} */ + /** * Breakpoint file-based representation */ @@ -52,6 +55,6 @@ void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); -int phpdbg_find_breakpoint_opline(zend_op* TSRMLS_DC); +int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); #endif /* PHPDBG_BP_H */ From 207e54a1c5c32c71ef8fe0a036f105b9286d1f4f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 13:31:41 +0000 Subject: [PATCH 0399/1256] ... --- phpdbg_help.c | 14 +++++++++++--- phpdbg_help.h | 2 ++ phpdbg_prompt.c | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 9fbd7bd1379f7..711dffa74a71f 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -50,6 +50,7 @@ PHPDBG_HELP(compile) /* {{{ */ printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); printf("The execution context must be set for compilation to succeed\n"); printf("If errors occur during compilation they must be resolved before execution can take place.\n"); + printf("It is a good idea to clean the environment between each compilation with the clean command\n"); printf("You do not need to exit phpdbg to retry compilation\n"); return SUCCESS; } /* }}} */ @@ -83,14 +84,14 @@ PHPDBG_HELP(break) /* {{{ */ printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); printf("\tfunction\n"); - printf("\t0x12345678\n"); + printf("\t0x16\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); printf("\tphpdbg> break my_function\n"); printf("Will break execution on entry to my_function\n"); - printf("\tphpdbg> break 0x4c79a40\n"); - printf("Will break at the opline with the address provided\n"); + printf("\tphpdbg> break 0x7ff68f570e08\n"); + printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); return SUCCESS; } /* }}} */ @@ -101,6 +102,13 @@ PHPDBG_HELP(clean) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(clear) /* {{{ */ +{ + printf("Clearing breakpoints means you can once again run code without interruption\n"); + printf("Careful though, all breakpoints are lost; be sure debugging is complete before clearing\n"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(quiet) /* {{{ */ { printf("Setting quietness on will stop the OPLINE output during execution\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index b48409f487e18..449f4d1c5860e 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -42,6 +42,7 @@ PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); PHPDBG_HELP(clean); +PHPDBG_HELP(clear); PHPDBG_HELP(back); PHPDBG_HELP(quiet); @@ -58,6 +59,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), PHPDBG_HELP_D(clean, "resetting the environment is useful while debugging and recompiling"), + PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5f8c56a0c5dd6..abc2b7fc775e7 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -363,6 +363,20 @@ static PHPDBG_COMMAND(clean) /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(clear) /* {{{ */ +{ + printf("Clearing Breakpoints:\n"); + printf("\tFile\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); + printf("\tSymbols\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); + printf("\tOplines\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); + + zend_hash_clean(&PHPDBG_G(bp_files)); + zend_hash_clean(&PHPDBG_G(bp_symbols)); + zend_hash_clean(&PHPDBG_G(bp_oplines)); + + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(help) /* {{{ */ { printf("Welcome to phpdbg, the interactive PHP debugger.\n"); @@ -410,6 +424,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(clean, "clean the execution environment"), + PHPDBG_COMMAND_D(clear, "clear breakpoints"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quiet, "silence some output"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 56957d9e2596853b2c67c90011f408c8b5745dab Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:03:14 +0000 Subject: [PATCH 0400/1256] output [] around phpdbg text --- phpdbg_bp.c | 16 ++++++------ phpdbg_prompt.c | 68 ++++++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index c261ecc1060e5..8185196bd12fa 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -59,7 +59,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "Breakpoint #%d added at %s:%ld\n", new_break.id, new_break.filename, new_break.line); + "[Breakpoint #%d added at %s:%ld]\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -77,9 +77,9 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - printf("Breakpoint #%d added at %s\n", new_break.id, new_break.symbol); + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); } else { - printf("Breakpoint exists at %s\n", name); + printf("[Breakpoint exists at %s]\n", name); } } /* }}} */ @@ -98,9 +98,9 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("Breakpoint #%d added at %s\n", new_break.id, new_break.name); + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); } else { - printf("Breakpoint exists at %s\n", name); + printf("[Breakpoint exists at %s]\n", name); } } /* }}} */ @@ -119,7 +119,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("Breakpoint #%d at %s:%ld\n", bp->id, bp->filename, bp->line); + printf("[Breakpoint #%d at %s:%ld]\n", bp->id, bp->filename, bp->line); return SUCCESS; } } @@ -144,7 +144,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("Breakpoint #%d in %s() at %s\n", bp->id, bp->symbol, + printf("[Breakpoint #%d in %s() at %s]\n", bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C)); return SUCCESS; } @@ -158,7 +158,7 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("Breakpoint #%d in %s at %s\n", bp->id, bp->name, + printf("[Breakpoint #%d in %s at %s]\n", bp->id, bp->name, zend_get_executed_filename(TSRMLS_C)); return SUCCESS; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index abc2b7fc775e7..24199067c70a6 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -33,13 +33,13 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - printf("Unsetting old execution context: %s\n", PHPDBG_G(exec)); + printf("[Unsetting old execution context: %s]\n", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - printf("Destroying compiled opcodes\n"); + printf("[Destroying compiled opcodes]\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops) = NULL; @@ -47,7 +47,7 @@ static PHPDBG_COMMAND(exec) /* {{{ */ PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf("Set execution context: %s\n", PHPDBG_G(exec)); + printf("[Set execution context: %s]\n", PHPDBG_G(exec)); return SUCCESS; } /* }}} */ @@ -57,20 +57,20 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + printf("[Attempting compilation of %s]\n", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( &fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); + printf("[Success]\n"); return SUCCESS; } else { - printf("Could not open file %s\n", PHPDBG_G(exec)); + printf("[Could not open file %s]\n", PHPDBG_G(exec)); } } else { - printf("Cannot compile while in execution\n"); + printf("[Cannot compile while in execution]\n"); } return FAILURE; @@ -80,7 +80,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ { if (PHPDBG_G(exec)) { if (PHPDBG_G(ops)) { - printf("Destroying previously compiled opcodes\n"); + printf("[Destroying previously compiled opcodes]\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops)=NULL; @@ -88,7 +88,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ return phpdbg_compile(TSRMLS_C); } else { - printf("No execution context\n"); + printf("[No execution context]\n"); return FAILURE; } } /* }}} */ @@ -97,7 +97,7 @@ static PHPDBG_COMMAND(step) /* {{{ */ { PHPDBG_G(stepping) = atoi(expr); printf( - "Stepping %s\n", PHPDBG_G(stepping) ? "on" : "off"); + "[Stepping %s]\n", PHPDBG_G(stepping) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -111,7 +111,7 @@ static PHPDBG_COMMAND(run) /* {{{ */ if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); + printf("[Failed to compile %s, cannot run]\n", PHPDBG_G(exec)); return FAILURE; } } @@ -123,14 +123,14 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { if (!PHPDBG_G(quitting)) { - printf("Caught excetion in VM\n"); + printf("[Caught excetion in VM]\n"); return FAILURE; } else return SUCCESS; } zend_end_try(); return SUCCESS; } else { - printf("Nothing to execute !\n"); + printf("[Nothing to execute !]\n"); return FAILURE; } } /* }}} */ @@ -147,7 +147,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ zval_dtor(&retval); } } else { - printf("No expression provided !\n"); + printf("[No expression provided !]\n"); return FAILURE; } @@ -157,7 +157,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ static PHPDBG_COMMAND(back) /* {{{ */ { if (!EG(in_execution)) { - printf("Not executing !\n"); + printf("[Not executing !]\n"); return FAILURE; } zval zbacktrace; @@ -290,13 +290,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("Failed to expand path %s\n", path); + printf("[Failed to expand path %s]\n", path); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("No line specified in expression %s\n", expr); + printf("[No line specified in expression %s]\n", expr); return FAILURE; } } else { @@ -343,32 +343,32 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { - printf("Cleaning Environment:\n"); - printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); - printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); - printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); - printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + printf("[Cleaning Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); - printf("Clean Environment:\n"); - printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); - printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); - printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); - printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + printf("[Clean Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(clear) /* {{{ */ { - printf("Clearing Breakpoints:\n"); - printf("\tFile\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); - printf("\tSymbols\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); - printf("\tOplines\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); + printf("[Clearing Breakpoints:]\n"); + printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); + printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); + printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); @@ -379,7 +379,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("Welcome to phpdbg, the interactive PHP debugger.\n"); + printf("[Welcome to phpdbg, the interactive PHP debugger.]\n"); if (!expr_len) { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -403,7 +403,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("failed to find help command: %s\n", expr); } } - printf("Please report bugs to \n"); + printf("[Please report bugs to ]\n"); return SUCCESS; } /* }}} */ @@ -470,7 +470,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ case FAILURE: if (!PHPDBG_G(quitting)) { printf( - "Failed to execute %s !\n", cmd); + "[Failed to execute %s !]\n", cmd); } break; From 5fdae4612b817c39655f10e7619465d655c349e5 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:07:07 +0000 Subject: [PATCH 0401/1256] ... --- phpdbg_prompt.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 24199067c70a6..8db72ed44a06f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -79,11 +79,13 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ static PHPDBG_COMMAND(compile) /* {{{ */ { if (PHPDBG_G(exec)) { - if (PHPDBG_G(ops)) { - printf("[Destroying previously compiled opcodes]\n"); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops)=NULL; + if (!EG(in_execution)) { + if (PHPDBG_G(ops)) { + printf("[Destroying previously compiled opcodes]\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops)=NULL; + } } return phpdbg_compile(TSRMLS_C); From dc3ef209641194e5ccea7ad493c1587b5f74ec4f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:11:06 +0000 Subject: [PATCH 0402/1256] ... --- phpdbg_help.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpdbg_help.c b/phpdbg_help.c index 711dffa74a71f..6cbac92fa9201 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -92,6 +92,8 @@ PHPDBG_HELP(break) /* {{{ */ printf("Will break execution on entry to my_function\n"); printf("\tphpdbg> break 0x7ff68f570e08\n"); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); + printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); + printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); return SUCCESS; } /* }}} */ From 34ae94ad9a080b0a4862344a51fa0da8dfd4d80f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:33:53 +0000 Subject: [PATCH 0403/1256] phpdbg_break userland --- phpdbg.c | 19 ++++++++++++++++++- phpdbg_bp.c | 19 +++++++++++++++++++ phpdbg_bp.h | 1 + phpdbg_prompt.c | 4 ++++ test.php | 2 ++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 214a6fb0fba4e..6ed4e654df594 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -94,10 +94,27 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ return SUCCESS; } /* }}} */ +static PHP_FUNCTION(phpdbg_break) /* {{{ */ +{ + if (EG(active_op_array)) { + phpdbg_set_breakpoint_opline_ex( + EG(active_op_array)->opcodes TSRMLS_CC); + } +} /* }}} */ + +zend_function_entry phpdbg_user_functions[] = { + PHP_FE(phpdbg_break, NULL) +#ifdef PHP_FE_END + PHP_FE_END +#else + {NULL,NULL,NULL} +#endif +}; + static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, "phpdbg", - NULL, + phpdbg_user_functions, PHP_MINIT(phpdbg), NULL, PHP_RINIT(phpdbg), diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 8185196bd12fa..e17608c609002 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -104,6 +104,24 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ +void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ +{ + if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), (zend_ulong) opline)) { + phpdbg_breakline_t new_break; + + PHPDBG_G(has_opline_bp) = 1; + + asprintf((char**)&new_break.name, "%#x", opline); + + new_break.opline = opline; + new_break.id = PHPDBG_G(bp_count)++; + + zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + + printf("[Breakpoint #%d added at %#x]\n", new_break.id, new_break.opline); + } +} /* }}} */ + int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); @@ -166,3 +184,4 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * return FAILURE; } /* }}} */ + diff --git a/phpdbg_bp.h b/phpdbg_bp.h index f6a8b6bcd7c97..1f04af9f6c637 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -52,6 +52,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 8db72ed44a06f..f0f299ec51c9a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -376,6 +376,10 @@ static PHPDBG_COMMAND(clear) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); + PHPDBG_G(has_file_bp) = 0; + PHPDBG_G(has_sym_bp) = 0; + PHPDBG_G(has_opline_bp) = 0; + return SUCCESS; } /* }}} */ diff --git a/test.php b/test.php index bed99d3e9b7e7..3ac566ce761e7 100644 --- a/test.php +++ b/test.php @@ -10,6 +10,8 @@ function test2() { echo test(); } +phpdbg_break(); + test2(); return true; ?> From 97fda0eaf29310df1224e2eb826eb1d41a076e0e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:38:11 +0000 Subject: [PATCH 0404/1256] precise break from userland --- phpdbg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 6ed4e654df594..f686c1ac4d24a 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -96,9 +96,9 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ static PHP_FUNCTION(phpdbg_break) /* {{{ */ { - if (EG(active_op_array)) { + if (EG(current_execute_data)) { phpdbg_set_breakpoint_opline_ex( - EG(active_op_array)->opcodes TSRMLS_CC); + EG(current_execute_data)->opline TSRMLS_CC); } } /* }}} */ From e8c98020efcd9534830758bc458f4189496b54fc Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:55:36 +0000 Subject: [PATCH 0405/1256] fix breakpoint in userland --- phpdbg.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index f686c1ac4d24a..2845add3c017a 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -96,9 +96,11 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ static PHP_FUNCTION(phpdbg_break) /* {{{ */ { - if (EG(current_execute_data)) { + if (EG(current_execute_data) && EG(active_op_array)) { + zend_ulong opline_num = EG(current_execute_data)->opline - EG(active_op_array)->opcodes; + phpdbg_set_breakpoint_opline_ex( - EG(current_execute_data)->opline TSRMLS_CC); + &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); } } /* }}} */ From 632c89b65aea9315b218ba766f092131d54f690b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:59:51 +0000 Subject: [PATCH 0406/1256] fix output from userland break point insertion --- phpdbg_bp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index e17608c609002..2bbb12f44bdad 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -111,14 +111,15 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ PHPDBG_G(has_opline_bp) = 1; - asprintf((char**)&new_break.name, "%#x", opline); + asprintf( + (char**)&new_break.name, "%p", (zend_op*) opline); - new_break.opline = opline; + new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp_oplines), (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("[Breakpoint #%d added at %#x]\n", new_break.id, new_break.opline); + printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); } } /* }}} */ From da065d6fb2ad54450daf8f1b50d2934c6880a546 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 15:14:37 +0000 Subject: [PATCH 0407/1256] no estrdup on opline breakpoints --- phpdbg.c | 18 +++++++++++++++--- phpdbg_bp.c | 2 +- test.php | 4 ++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 2845add3c017a..351bdc6ba2650 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -65,7 +65,7 @@ static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ { - efree((char*)((phpdbg_breakline_t*)brake)->name); + free((char*)((phpdbg_breakline_t*)brake)->name); } /* }}} */ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ @@ -94,17 +94,29 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ return SUCCESS; } /* }}} */ -static PHP_FUNCTION(phpdbg_break) /* {{{ */ +/* {{{ proto void phpdbg_break(void) + instructs phpdbg to insert a breakpoint at the next opcode */ +static PHP_FUNCTION(phpdbg_break) { if (EG(current_execute_data) && EG(active_op_array)) { - zend_ulong opline_num = EG(current_execute_data)->opline - EG(active_op_array)->opcodes; + zend_ulong opline_num = (EG(current_execute_data)->opline - EG(active_op_array)->opcodes); phpdbg_set_breakpoint_opline_ex( &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); } } /* }}} */ +/* {{{ proto void phpdbg_clear(void) + instructs phpdbg to clear breakpoints */ +static PHP_FUNCTION(phpdbg_clear) +{ + zend_hash_clean(&PHPDBG_G(bp_files)); + zend_hash_clean(&PHPDBG_G(bp_symbols)); + zend_hash_clean(&PHPDBG_G(bp_oplines)); +} /* }}} */ + zend_function_entry phpdbg_user_functions[] = { + PHP_FE(phpdbg_clear, NULL) PHP_FE(phpdbg_break, NULL) #ifdef PHP_FE_END PHP_FE_END diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 2bbb12f44bdad..6f615992d0e31 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -92,7 +92,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ PHPDBG_G(has_opline_bp) = 1; - new_break.name = estrdup(name); + new_break.name = strdup(name); new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; diff --git a/test.php b/test.php index 3ac566ce761e7..938d7d8323df8 100644 --- a/test.php +++ b/test.php @@ -1,6 +1,10 @@ Date: Mon, 11 Nov 2013 15:54:33 +0000 Subject: [PATCH 0408/1256] stop multiple executions from occuring at once, #5 --- phpdbg.c | 2 +- phpdbg_prompt.c | 23 ++++++++++++++++++----- test.php | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 351bdc6ba2650..d24016275c7ba 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -396,7 +396,7 @@ int main(int argc, char *argv[]) /* {{{ */ zend_try { phpdbg_interactive(TSRMLS_C); } zend_catch { - + } zend_end_try(); } while(!PHPDBG_G(quitting)); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f0f299ec51c9a..3e3929ec437e9 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -110,6 +110,11 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { + if (EG(in_execution)) { + printf("[Cannot start another execution while on is in progress]\n"); + return FAILURE; + } + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { @@ -528,7 +533,9 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } @@ -540,7 +547,9 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (phpdbg_find_breakpoint_symbol( previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } } @@ -550,10 +559,12 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(has_opline_bp) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } - + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); phpdbg_print_opline( @@ -561,7 +572,9 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ if (PHPDBG_G(stepping)) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } diff --git a/test.php b/test.php index 938d7d8323df8..20fc66c7c5bee 100644 --- a/test.php +++ b/test.php @@ -6,6 +6,7 @@ function test() { $hidden = "variable"; phpdbg_break(); } + function test2() { echo "Hello World 2\n"; } From 3c644612af9f896789da4dc094b7d39193185a8f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:01:33 +0000 Subject: [PATCH 0409/1256] typo --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3e3929ec437e9..797df423dcdb0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -111,7 +111,7 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { if (EG(in_execution)) { - printf("[Cannot start another execution while on is in progress]\n"); + printf("[Cannot start another execution while one is in progress]\n"); return FAILURE; } From f62b47c9ff3856681314495dbe3c02d8cb8a7b2f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:06:30 +0000 Subject: [PATCH 0410/1256] fix opcode missing on eval --- phpdbg_prompt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 797df423dcdb0..a690f5226802c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -530,6 +530,9 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } #endif + phpdbg_print_opline( + execute_data TSRMLS_CC); + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { @@ -567,9 +570,6 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - phpdbg_print_opline( - execute_data TSRMLS_CC); - if (PHPDBG_G(stepping)) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { if (!PHPDBG_G(quitting)) { From fb815caf7af1a570806f32c906aee5ee9018f1b0 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:09:08 +0000 Subject: [PATCH 0411/1256] fix segfault on empty eval --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a690f5226802c..2377a14f07fe1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -146,7 +146,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ { zval retval; - if (expr) { + if (expr_len) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r(&retval, 0 TSRMLS_CC); From 5ef19b1b455f1ed503c73807182ae3d3bf49e806 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:12:31 +0000 Subject: [PATCH 0412/1256] ws --- phpdbg_prompt.c | 99 ++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 2377a14f07fe1..1fdf7c8e7a71e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -534,66 +534,65 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ execute_data TSRMLS_CC); if (PHPDBG_G(has_file_bp) - && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } + && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && previous != execute_data && previous->opline) { - if (previous->opline->opcode == ZEND_DO_FCALL - || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { - if (phpdbg_find_breakpoint_symbol( - previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } - } - } + if (previous->opline->opcode == ZEND_DO_FCALL + || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_find_breakpoint_symbol( + previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } + } + } } - + if (PHPDBG_G(has_opline_bp) - && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } - - PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - - if (PHPDBG_G(stepping)) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } + && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } - if (PHPDBG_G(vmret) > 0) { - switch (PHPDBG_G(vmret)) { - case 1: - EG(in_execution) = original_in_execution; - return; - case 2: - goto zend_vm_enter; - break; - case 3: - execute_data = EG(current_execute_data); - break; - default: + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); + + if (PHPDBG_G(stepping)) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } + + if (PHPDBG_G(vmret) > 0) { + switch (PHPDBG_G(vmret)) { + case 1: + EG(in_execution) = original_in_execution; + return; + case 2: + goto zend_vm_enter; + break; + case 3: + execute_data = EG(current_execute_data); + break; + default: break; } } - } zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); } /* }}} */ From 42eaa989afd524a23cf53edc2b7876bdf14d6ca4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:19:05 +0000 Subject: [PATCH 0413/1256] separation etc --- phpdbg_bp.c | 12 ++++++++++++ phpdbg_bp.h | 2 ++ phpdbg_prompt.c | 12 +++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 6f615992d0e31..4918ff99074bb 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -186,3 +186,15 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * return FAILURE; } /* }}} */ +void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ +{ + zend_hash_clean(&PHPDBG_G(bp_files)); + zend_hash_clean(&PHPDBG_G(bp_symbols)); + zend_hash_clean(&PHPDBG_G(bp_oplines)); + + PHPDBG_G(has_file_bp) = 0; + PHPDBG_G(has_sym_bp) = 0; + PHPDBG_G(has_opline_bp) = 0; + PHPDBG_G(bp_count) = 0; +} /* }}} */ + diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 1f04af9f6c637..4f1a2e237f3fa 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -58,4 +58,6 @@ int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); +void phpdbg_clear_breakpoints(TSRMLS_D); + #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 1fdf7c8e7a71e..e47810be3405e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -377,13 +377,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - zend_hash_clean(&PHPDBG_G(bp_files)); - zend_hash_clean(&PHPDBG_G(bp_symbols)); - zend_hash_clean(&PHPDBG_G(bp_oplines)); - - PHPDBG_G(has_file_bp) = 0; - PHPDBG_G(has_sym_bp) = 0; - PHPDBG_G(has_opline_bp) = 0; + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; } /* }}} */ @@ -421,6 +415,10 @@ static PHPDBG_COMMAND(help) /* {{{ */ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(quiet) = atoi(expr); + + printf( + "[Quietness %s]\n", PHPDBG_G(quiet) ? "enabled" : "disabled"); + return SUCCESS; } /* }}} */ From bce3481ed3f000f7fe7b013e08f9811f77be724d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:37:59 +0000 Subject: [PATCH 0414/1256] update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8dbc386139448..6557b750bf8c1 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,13 @@ Features - break at function entry, file:line or address - showing debug backtraces - easy manipulation of the environment with built-in eval() + - userland API - sapi agnositicism, easy integration - + Planned ======= - mocking server environments/requests - - userland script-ability - improve everything Installation From de3daf55c5ec79249cb492550e8de9f7082521b6 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 21:51:45 +0000 Subject: [PATCH 0415/1256] ... --- phpdbg_help.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 6cbac92fa9201..ef8b6208b95e6 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -75,7 +75,8 @@ PHPDBG_HELP(run) /* {{{ */ PHPDBG_HELP(eval) /* {{{ */ { - printf("Access to eval() allows you to change the environment during execution, careful though !!"); + printf("Access to eval() allows you to change the environment during execution, careful though !!\n"); + printf("Note: When using eval in phpdbg do not prefix the code with return.\n"); return SUCCESS; } /* }}} */ From dd4e962c56b62c8c3f1d2d2bac1b6b0eb08b067c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 20:02:34 -0200 Subject: [PATCH 0416/1256] - WS --- phpdbg_prompt.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e47810be3405e..306e929c5a1c7 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -58,7 +58,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ if (!EG(in_execution)) { printf("[Attempting compilation of %s]\n", PHPDBG_G(exec)); - + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( @@ -114,7 +114,7 @@ static PHPDBG_COMMAND(run) /* {{{ */ printf("[Cannot start another execution while one is in progress]\n"); return FAILURE; } - + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { @@ -197,7 +197,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ } #ifdef HAVE_READLINE_H printf("HAVE READLINE\n"); -#endif +#endif printf("--------------------------------------\n"); printf("Execution Context Information:\n"); @@ -222,11 +222,11 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Functions\t%d\n", zend_hash_num_elements(EG(function_table))); printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); - + if (PHPDBG_G(has_file_bp)) { HashPosition position; zend_llist *points; - + printf("--------------------------------------\n"); printf("File Break Point Information:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_files), &position); @@ -234,7 +234,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ zend_hash_move_forward_ex(&PHPDBG_G(bp_files), &position)) { zend_llist_position lposition; phpdbg_breakfile_t *brake; - + if ((brake = zend_llist_get_first_ex(points, &lposition))) { printf("%s:\n", brake->filename); do { @@ -243,12 +243,12 @@ static PHPDBG_COMMAND(print) /* {{{ */ } } } - + #if 0 if (PHPDBG_G(has_sym_bp)) { HashPosition position; zend_llist *points; - + printf("--------------------------------------\n"); printf("Symbol Break Point Information:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_symbols), &position); @@ -256,7 +256,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ zend_hash_move_forward_ex(&PHPDBG_G(bp_symbols), &position)) { zend_llist_position lposition; phpdbg_breaksymbol_t *brake; - + if ((brake = zend_llist_get_first_ex(points, &lposition))) { printf("%s:\n", brake->symbol); do { @@ -270,7 +270,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ if (PHPDBG_G(has_opline_bp)) { HashPosition position; phpdbg_breakline_t *brake; - + printf("--------------------------------------\n"); printf("Opline Break Point Information:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); @@ -279,7 +279,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("#%d\t%s\n", brake->id, brake->name); } } - + printf("--------------------------------------\n"); return SUCCESS; } /* }}} */ @@ -287,11 +287,11 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { const char *line_pos = zend_memrchr(expr, ':', expr_len); - + if (line_pos) { char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); - + if (line_num) { memcpy(path, expr, line_pos - expr); path[line_pos - expr] = 0; @@ -357,8 +357,8 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); printf("[Clean Environment:]\n"); @@ -366,7 +366,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - + return SUCCESS; } /* }}} */ @@ -376,9 +376,9 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - + phpdbg_clear_breakpoints(TSRMLS_C); - + return SUCCESS; } /* }}} */ @@ -415,10 +415,10 @@ static PHPDBG_COMMAND(help) /* {{{ */ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(quiet) = atoi(expr); - + printf( "[Quietness %s]\n", PHPDBG_G(quiet) ? "enabled" : "disabled"); - + return SUCCESS; } /* }}} */ From b5b7935d40ed6dc2d7dc84eea18496c34152919f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 20:06:36 -0200 Subject: [PATCH 0417/1256] - Added lineno to breakpoint message --- phpdbg_bp.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4918ff99074bb..2949f971898e3 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -40,7 +40,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.filename = estrndup(path, path_len); new_break.line = line_num; - + PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), @@ -57,7 +57,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); - + printf( "[Breakpoint #%d added at %s:%ld]\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ @@ -76,7 +76,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); } else { printf("[Breakpoint exists at %s]\n", name); @@ -86,18 +86,18 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { zend_ulong opline = strtoul(name, 0, 16); - + if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { phpdbg_breakline_t new_break; PHPDBG_G(has_opline_bp) = 1; - + new_break.name = strdup(name); new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; - + zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); } else { printf("[Breakpoint exists at %s]\n", name); @@ -110,15 +110,15 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ phpdbg_breakline_t new_break; PHPDBG_G(has_opline_bp) = 1; - + asprintf( (char**)&new_break.name, "%p", (zend_op*) opline); - + new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; - + zend_hash_index_update(&PHPDBG_G(bp_oplines), (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - + printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); } } /* }}} */ @@ -163,8 +163,9 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s() at %s]\n", bp->id, bp->symbol, - zend_get_executed_filename(TSRMLS_C)); + printf("[Breakpoint #%d in %s() at %s:%u]\n", bp->id, bp->symbol, + zend_get_executed_filename(TSRMLS_C), + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } @@ -177,12 +178,13 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s at %s]\n", bp->id, bp->name, - zend_get_executed_filename(TSRMLS_C)); - + printf("[Breakpoint #%d in %s at %s:%u]\n", bp->id, bp->name, + zend_get_executed_filename(TSRMLS_C), + zend_get_executed_lineno(TSRMLS_C)); + return SUCCESS; } - + return FAILURE; } /* }}} */ @@ -191,7 +193,7 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); - + PHPDBG_G(has_file_bp) = 0; PHPDBG_G(has_sym_bp) = 0; PHPDBG_G(has_opline_bp) = 0; From 91779db95b21bf23a565f9bae6025abe52e9a27c Mon Sep 17 00:00:00 2001 From: Andrea Faulds Date: Tue, 17 Sep 2013 19:12:29 +0000 Subject: [PATCH 0418/1256] Fixed case part of bug #64874 ("json_decode handles whitespace and case-sensitivity incorrectly") --- NEWS | 4 ++ UPGRADING | 8 ++++ ext/json/json.c | 6 +-- ext/json/tests/bug64874_part2.phpt | 69 ++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 ext/json/tests/bug64874_part2.phpt diff --git a/NEWS b/NEWS index fdfaef53cb58f..cfaafd0699e77 100644 --- a/NEWS +++ b/NEWS @@ -31,6 +31,10 @@ PHP NEWS - Hash: . Added gost-crypto (CryptoPro S-box) GOST hash algo. (Manuel Mausz) +- JSON: + . Fixed case part of bug #64874 ("json_decode handles whitespace and + case-sensitivity incorrectly") + - mysqlnd: . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively supported by the overlying APIs. (Andrey) diff --git a/UPGRADING b/UPGRADING index 022918cb14594..b680a9fbe5f97 100755 --- a/UPGRADING +++ b/UPGRADING @@ -30,6 +30,14 @@ PHP X.Y UPGRADE NOTES } ?> +- JSON: + json_decode() no longer accepts non-lowercase variants of lone JSON true, + false or null values. For example, True or FALSE will now cause json_decode to + return NULL and set an error value you can fetch with json_last_error(). + This affects JSON texts consisting solely of true, false or null. Text + containing non-lowercase values inside JSON arrays or objects has never been + accepted. + ======================================== 2. New Features ======================================== diff --git a/ext/json/json.c b/ext/json/json.c index c3664b9ee9418..80bbef7b7c79a 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -712,14 +712,14 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, RETVAL_NULL(); if (trim_len == 4) { - if (!strncasecmp(trim, "null", trim_len)) { + if (!strncmp(trim, "null", trim_len)) { /* We need to explicitly clear the error because its an actual NULL and not an error */ jp->error_code = PHP_JSON_ERROR_NONE; RETVAL_NULL(); - } else if (!strncasecmp(trim, "true", trim_len)) { + } else if (!strncmp(trim, "true", trim_len)) { RETVAL_BOOL(1); } - } else if (trim_len == 5 && !strncasecmp(trim, "false", trim_len)) { + } else if (trim_len == 5 && !strncmp(trim, "false", trim_len)) { RETVAL_BOOL(0); } diff --git a/ext/json/tests/bug64874_part2.phpt b/ext/json/tests/bug64874_part2.phpt new file mode 100644 index 0000000000000..338fc1141abbe --- /dev/null +++ b/ext/json/tests/bug64874_part2.phpt @@ -0,0 +1,69 @@ +--TEST-- +Case-sensitivity part of bug #64874 ("json_decode handles whitespace and case-sensitivity incorrectly") +--SKIPIF-- + +--FILE-- + + bool(true) +} +SUCCESS +NULL +ERROR + +bool(false) +SUCCESS +NULL +ERROR +array(1) { + [0]=> + bool(false) +} +SUCCESS +NULL +ERROR + +NULL +SUCCESS +NULL +ERROR +array(1) { + [0]=> + NULL +} +SUCCESS +NULL +ERROR + +Done From 36d2329187074fa9fda2bfbc56c3c4360cd389b5 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 21:40:03 -0200 Subject: [PATCH 0419/1256] - Added initial code for list command --- config.m4 | 4 +-- phpdbg_help.c | 9 ++++++- phpdbg_help.h | 3 +++ phpdbg_list.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_list.h | 25 +++++++++++++++++ phpdbg_prompt.c | 14 ++++++++++ 6 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 phpdbg_list.c create mode 100644 phpdbg_list.h diff --git a/config.m4 b/config.m4 index bb9719015e527..1a99db0f24d88 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS="-I$abc_srcdir" - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c" PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) @@ -27,7 +27,7 @@ if test "$PHP_PHPDBG" != "no"; then \$(PHPDBG_EXTRA_LIBS) \ \$(ZEND_EXTRA_LIBS) \ -o \$(BUILD_BINARY)" - + PHP_SUBST(BUILD_BINARY) PHP_SUBST(BUILD_PHPDBG) fi diff --git a/phpdbg_help.c b/phpdbg_help.c index ef8b6208b95e6..d91625e09e174 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -120,7 +120,6 @@ PHPDBG_HELP(quiet) /* {{{ */ printf("Will silence OPLINE output, while\n"); printf("\tphpdbg> quiet 0\n"); printf("Will enable OPLINE output again\n"); - return SUCCESS; } /* }}} */ @@ -132,3 +131,11 @@ PHPDBG_HELP(back) /* {{{ */ printf("Will limit the number of frames to 5, the default is no limit\n"); return SUCCESS; } /* }}} */ + +PHPDBG_HELP(list) /* {{{ */ +{ + printf("The list command displays N line from current context file.\n"); + printf("\tphpdbg> list 2\n"); + printf("Will print next 2 lines from the current file\n"); + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 449f4d1c5860e..9e187a8b395ae 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -20,6 +20,7 @@ #ifndef PHPDBG_HELP_H #define PHPDBG_HELP_H +#include "TSRM.h" #include "phpdbg_prompt.h" /** @@ -45,6 +46,7 @@ PHPDBG_HELP(clean); PHPDBG_HELP(clear); PHPDBG_HELP(back); PHPDBG_HELP(quiet); +PHPDBG_HELP(list); /** * Commands @@ -62,6 +64,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), + PHPDBG_HELP_D(list, "list specified line"), {NULL, 0, 0} }; diff --git a/phpdbg_list.c b/phpdbg_list.c new file mode 100644 index 0000000000000..9102a797fc670 --- /dev/null +++ b/phpdbg_list.c @@ -0,0 +1,72 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include +#include +#include +#include +#include +#include "phpdbg_list.h" + +void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ +{ + unsigned char *mem, *pos, *last_pos, *end_pos; + struct stat st; + int fd, all_content = (count == 0); + unsigned int line = 0, displayed = 0; + + if ((fd = open(filename, O_RDONLY)) == -1) { + printf("[Failed to open file to list]\n"); + return; + } + + fstat(fd, &st); + + last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + end_pos = mem + st.st_size; + + while (1) { + pos = memchr(last_pos, '\n', end_pos - last_pos); + + if (!pos) { + /* No more line breaks */ + break; + } + + ++line; + + if (!offset || offset <= line) { + /* Without offset, or offset reached */ + printf("%05u: %.*s\n", line, (int)(pos - last_pos), last_pos); + ++displayed; + } + + last_pos = pos + 1; + + if (!all_content && displayed == count) { + /* Reached max line to display */ + break; + } + } + + munmap(mem, st.st_size); + close(fd); + +} /* }}} */ diff --git a/phpdbg_list.h b/phpdbg_list.h new file mode 100644 index 0000000000000..4531a65d10645 --- /dev/null +++ b/phpdbg_list.h @@ -0,0 +1,25 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_LIST_H +#define PHPDBG_LIST_H + +void phpdbg_list_file(const char*, long, long); + +#endif /* PHPDBG_LIST_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 306e929c5a1c7..ab04a68eedab5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -422,6 +422,19 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(list) /* {{{ */ +{ + long offset = 0, count = strtol(expr, NULL, 0); + const char *filename = PHPDBG_G(exec); + + if (zend_is_executing(TSRMLS_C)) { + filename = zend_get_executed_filename(TSRMLS_C); + offset = zend_get_executed_lineno(TSRMLS_C); + } + + phpdbg_list_file(filename, count, offset); +} /* }}} */ + static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), @@ -432,6 +445,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), + PHPDBG_COMMAND_D(list, "list specified line"), PHPDBG_COMMAND_D(clean, "clean the execution environment"), PHPDBG_COMMAND_D(clear, "clear breakpoints"), PHPDBG_COMMAND_D(help, "show help menu"), From bbc35b60f9564d556f1c0c154f69108201b4913c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 22:24:24 -0200 Subject: [PATCH 0420/1256] - Added check for no context file --- phpdbg_prompt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index ab04a68eedab5..a73459e9a809d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -25,6 +25,7 @@ #include "phpdbg_help.h" #include "phpdbg_bp.h" #include "phpdbg_opcode.h" +#include "phpdbg_list.h" static const phpdbg_command_t phpdbg_prompt_commands[]; @@ -430,9 +431,14 @@ static PHPDBG_COMMAND(list) /* {{{ */ if (zend_is_executing(TSRMLS_C)) { filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); + } else if (!filename) { + printf("[No file to list]\n"); + return SUCCESS; } phpdbg_list_file(filename, count, offset); + + return SUCCESS; } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { From e0cbd92fa484dea3549e708ffc0d8402600271fb Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:27:48 +0000 Subject: [PATCH 0421/1256] break on class methods don't dtor eval'd retval more reliable break on methods --- phpdbg.c | 9 +++ phpdbg.h | 8 ++- phpdbg_bp.c | 83 ++++++++++++++++++++++++++- phpdbg_bp.h | 13 +++++ phpdbg_help.c | 3 + phpdbg_prompt.c | 150 ++++++++++++++++++++++++++++++++---------------- test.php | 16 ++---- 7 files changed, 218 insertions(+), 64 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index d24016275c7ba..a37781b245367 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -41,6 +41,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->has_file_bp = 0; pg->has_sym_bp = 0; pg->has_opline_bp = 0; + pg->has_method_bp = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -68,11 +69,17 @@ static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ free((char*)((phpdbg_breakline_t*)brake)->name); } /* }}} */ +static void php_phpdbg_destroy_bp_methods(void *brake) /* {{{ */ +{ + zend_hash_destroy((HashTable*)brake); +} /* }}} */ + static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, php_phpdbg_destroy_bp_opline, 0); + zend_hash_init(&PHPDBG_G(bp_methods), 8, NULL, php_phpdbg_destroy_bp_methods, 0); return SUCCESS; } /* }}} */ @@ -82,6 +89,7 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ zend_hash_destroy(&PHPDBG_G(bp_files)); zend_hash_destroy(&PHPDBG_G(bp_symbols)); zend_hash_destroy(&PHPDBG_G(bp_oplines)); + zend_hash_destroy(&PHPDBG_G(bp_methods)); if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); @@ -113,6 +121,7 @@ static PHP_FUNCTION(phpdbg_clear) zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); + zend_hash_clean(&PHPDBG_G(bp_methods)); } /* }}} */ zend_function_entry phpdbg_user_functions[] = { diff --git a/phpdbg.h b/phpdbg.h index 8adc69cf4f23f..7477c40111651 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -48,9 +48,10 @@ typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable bp_files; - HashTable bp_symbols; - HashTable bp_oplines; + HashTable bp_files; /* file breakpoints */ + HashTable bp_symbols; /* symbol breakpoints */ + HashTable bp_oplines; /* opline breakpoints */ + HashTable bp_methods; /* method breakpoints */ char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ @@ -61,6 +62,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool has_file_bp; /* file-based breakpoint has been set */ zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ zend_bool has_opline_bp; /* opline-based breakpoint has been set */ + zend_bool has_method_bp; /* method-based breakpoint has been set */ zend_bool quitting; /* quitting flag */ int quiet; /* quiet */ phpdbg_command_t *last; /* last command */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 2949f971898e3..c6ebef3f7321d 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -32,6 +32,15 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ efree((char*)bp->filename); } /* }}} */ + +static void phpdbg_class_breaks_dtor(void *data) /* {{{ */ +{ + phpdbg_breakmethod_t *bp = (phpdbg_breakmethod_t*) data; + + efree((char*)bp->class_name); + efree((char*)bp->func_name); +} /* }}} */ + void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { phpdbg_breakfile_t new_break; @@ -83,6 +92,42 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ +void phpdbg_set_breakpoint_method(const char* class_name, + size_t class_len, + const char* func_name, + size_t func_len TSRMLS_DC) /* {{{ */ +{ + HashTable class_breaks, *class_table; + + if (zend_hash_find(&PHPDBG_G(bp_methods), class_name, class_len, (void**)&class_table) != SUCCESS) { + zend_hash_init( + &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); + zend_hash_update( + &PHPDBG_G(bp_methods), + class_name, class_len, + (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); + } + + if (!zend_hash_exists(class_table, func_name, func_len)) { + phpdbg_breakmethod_t new_break; + + PHPDBG_G(has_method_bp) = 1; + + new_break.class_name = class_name; + new_break.class_len = class_len; + new_break.func_name = func_name; + new_break.func_len = func_len; + new_break.id = PHPDBG_G(bp_count)++; + + zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); + printf( + "[Breakpoint #%d added at %s::%s]\n", new_break.id, class_name, func_name); + } else { + printf( + "[Breakpoint exists at %s::%s]\n", class_name, func_name); + } +} /* }}} */ + void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { zend_ulong opline = strtoul(name, 0, 16); @@ -172,6 +217,40 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ +int phpdbg_find_breakpoint_method(zend_function *fbc TSRMLS_DC) /* {{{ */ +{ + HashTable *class_table; + phpdbg_breakmethod_t *bp; + zend_op_array *ops = NULL; + + if (fbc->type != ZEND_USER_FUNCTION) { + return FAILURE; + } + + ops = ((zend_op_array*)fbc); + + if (!ops->scope) { + return FAILURE; + } + + if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, + (void**)&class_table) == SUCCESS) { + if (zend_hash_find( + class_table, + ops->function_name, + strlen(ops->function_name), (void**)&bp) == SUCCESS) { + + printf( + "[Breakpoint #%d in %s::%s() at %s:%u]\n", bp->id, bp->class_name, bp->func_name, + zend_get_executed_filename(TSRMLS_C), + zend_get_executed_lineno(TSRMLS_C)); + return SUCCESS; + } + } + + return FAILURE; +} /* }}} */ + int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ { phpdbg_breakline_t *bp; @@ -193,10 +272,12 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); - + zend_hash_clean(&PHPDBG_G(bp_methods)); + PHPDBG_G(has_file_bp) = 0; PHPDBG_G(has_sym_bp) = 0; PHPDBG_G(has_opline_bp) = 0; + PHPDBG_G(has_method_bp) = 0; PHPDBG_G(bp_count) = 0; } /* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 4f1a2e237f3fa..77dfd4861e19a 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -40,6 +40,17 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; +/** + * Breakpoint method based representation + */ +typedef struct _phpdbg_breakmethod_t { + const char *class_name; + size_t class_len; + const char *func_name; + size_t func_len; + int id; +} phpdbg_breakmethod_t; + /** * Breakpoint opline based representation */ @@ -51,11 +62,13 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); +int phpdbg_find_breakpoint_method(zend_function* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); void phpdbg_clear_breakpoints(TSRMLS_D); diff --git a/phpdbg_help.c b/phpdbg_help.c index ef8b6208b95e6..00404a446b7ce 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -85,12 +85,15 @@ PHPDBG_HELP(break) /* {{{ */ printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); printf("\tfunction\n"); + printf("\t\\my\\class::method\n"); printf("\t0x16\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); printf("\tphpdbg> break my_function\n"); printf("Will break execution on entry to my_function\n"); + printf("\tphpdbg> break \\my\\class::method\n"); + printf("Will break execution on entry to \\my\\class::method\n"); printf("\tphpdbg> break 0x7ff68f570e08\n"); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 306e929c5a1c7..a29bc75c1c40e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -149,9 +149,9 @@ static PHPDBG_COMMAND(eval) /* {{{ */ if (expr_len) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - zend_print_zval_r(&retval, 0 TSRMLS_CC); + zend_print_zval_r( + &retval, 0 TSRMLS_CC); printf("\n"); - zval_dtor(&retval); } } else { printf("[No expression provided !]\n"); @@ -286,25 +286,57 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { - const char *line_pos = zend_memrchr(expr, ':', expr_len); - + char *line_pos = NULL; + char *func_pos = NULL; + + if (!expr_len) { + printf( + "[No expression found]\n"); + return FAILURE; + } + + line_pos = strchr(expr, ':'); + if (line_pos) { - char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); - - if (line_num) { - memcpy(path, expr, line_pos - expr); - path[line_pos - expr] = 0; - - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("[Failed to expand path %s]\n", path); - return FAILURE; + if (!(func_pos=strchr(line_pos+1, ':'))) { + char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + + if (line_num) { + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + printf("[Failed to expand path %s]\n", path); + return FAILURE; + } + + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); + } else { + printf("[No line specified in expression %s]\n", expr); + return FAILURE; + } + } else { + char *class; + char *func; + + size_t func_len = strlen(func_pos+1), + class_len = (line_pos - expr); + + if (func_len) { + class = emalloc(class_len+1); + func = emalloc(func_len+1); + + memcpy(class, expr, class_len); + class[class_len]='\0'; + memcpy(func, func_pos+1, func_len); + func[func_len]='\0'; + + phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); + } else { + printf("[No function found in method expression %s]\n", expr); + return FAILURE; } - - phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); - } else { - printf("[No line specified in expression %s]\n", expr); - return FAILURE; } } else { if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') { @@ -313,11 +345,16 @@ static PHPDBG_COMMAND(break) /* {{{ */ char name[200]; size_t name_len = strlen(expr); - name_len = MIN(name_len, 200); - memcpy(name, expr, name_len); - name[name_len] = 0; + if (name_len) { + name_len = MIN(name_len, 200); + memcpy(name, expr, name_len); + name[name_len] = 0; - phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + } else { + printf("[Malformed break command found]\n"); + return FAILURE; + } } } @@ -350,22 +387,28 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { - printf("[Cleaning Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - - zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); - zend_hash_clean(&EG(included_files)); - - printf("[Clean Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + if (!EG(in_execution)) { + printf("[Cleaning Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_clean(&EG(included_files)); + + printf("[Clean Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + } else { + printf( + "[Cannot clean environment while executing]\n"); + return FAILURE; + } return SUCCESS; } /* }}} */ @@ -376,7 +419,8 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - + printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_methods))); + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; @@ -540,23 +584,29 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } } - if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) { + if ((PHPDBG_G(has_sym_bp)||PHPDBG_G(has_method_bp))) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && previous != execute_data && previous->opline) { - if (previous->opline->opcode == ZEND_DO_FCALL - || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { - if (phpdbg_find_breakpoint_symbol( - previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; + /* check we are the beginning of a function entry */ + if (execute_data->opline == EG(active_op_array)->opcodes) { + switch (previous->opline->opcode) { + case ZEND_DO_FCALL: + case ZEND_DO_FCALL_BY_NAME: + case ZEND_INIT_STATIC_METHOD_CALL: { + if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS || + phpdbg_find_breakpoint_method(previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } } - } + } break; } } } } - + if (PHPDBG_G(has_opline_bp) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { diff --git a/test.php b/test.php index 20fc66c7c5bee..457e487db703d 100644 --- a/test.php +++ b/test.php @@ -1,22 +1,18 @@ method()); -test2(); return true; ?> From 217c906ea57fecdf78469048bb1384c0e1ff2a19 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 22:33:17 -0200 Subject: [PATCH 0422/1256] - Improve error message and added check for fstat return --- phpdbg_list.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index 9102a797fc670..d460315531202 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -33,11 +33,14 @@ void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ unsigned int line = 0, displayed = 0; if ((fd = open(filename, O_RDONLY)) == -1) { - printf("[Failed to open file to list]\n"); + printf("[Failed to open file %s to list]\n", filename); return; } - fstat(fd, &st); + if (fstat(fd, &st) == -1) { + printf("[Failed to stat file %s]\n", filename); + goto out; + } last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); end_pos = mem + st.st_size; @@ -67,6 +70,6 @@ void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ } munmap(mem, st.st_size); +out: close(fd); - } /* }}} */ From 179debd730113fc628047951d3f8a214447d0520 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:36:00 +0000 Subject: [PATCH 0423/1256] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6557b750bf8c1..dcfd3317d23a3 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Features ======== - step through debugging - - break at function entry, file:line or address + - break at method/function entry, file:line or address - showing debug backtraces - easy manipulation of the environment with built-in eval() - userland API From ef134e585f9c85e0f94f11b75b7da16ddb56bfbf Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:40:40 +0000 Subject: [PATCH 0424/1256] ... --- phpdbg_bp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index c6ebef3f7321d..44428ddf1b869 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -194,11 +194,19 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ { const char *fname; + zend_op_array *ops; phpdbg_breaksymbol_t *bp; if (fbc->type != ZEND_USER_FUNCTION) { return FAILURE; } + + ops = (zend_op_array*)fbc; + + if (ops->scope) { + /* do not check class methods */ + return FAILURE; + } fname = ((zend_op_array*)fbc)->function_name; From 0a6804a9866f781d10c5f12e0a45406374c0bd00 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:47:27 +0000 Subject: [PATCH 0425/1256] ... --- phpdbg_bp.c | 20 +++++--------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 3 +-- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 44428ddf1b869..ab4bf55a0b75c 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -204,11 +204,12 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ ops = (zend_op_array*)fbc; if (ops->scope) { - /* do not check class methods */ - return FAILURE; + /* find method breaks here */ + return phpdbg_find_breakpoint_method( + ops TSRMLS_CC); } - fname = ((zend_op_array*)fbc)->function_name; + fname = ops->function_name; if (!fname) { fname = "main"; @@ -225,22 +226,11 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -int phpdbg_find_breakpoint_method(zend_function *fbc TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ { HashTable *class_table; phpdbg_breakmethod_t *bp; - zend_op_array *ops = NULL; - - if (fbc->type != ZEND_USER_FUNCTION) { - return FAILURE; - } - ops = ((zend_op_array*)fbc); - - if (!ops->scope) { - return FAILURE; - } - if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 77dfd4861e19a..3eaa6e695e023 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -68,7 +68,7 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); -int phpdbg_find_breakpoint_method(zend_function* TSRMLS_DC); +int phpdbg_find_breakpoint_method(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); void phpdbg_clear_breakpoints(TSRMLS_D); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index df224e6ccdeb3..27caeddcbc388 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -613,8 +613,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ case ZEND_DO_FCALL: case ZEND_DO_FCALL_BY_NAME: case ZEND_INIT_STATIC_METHOD_CALL: { - if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS || - phpdbg_find_breakpoint_method(previous->function_state.function TSRMLS_CC) == SUCCESS) { + if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { if (!PHPDBG_G(quitting)) { continue; From 749e0cfc36aa0056eb672f3b7ec9762e9d59e5dd Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:24:53 +0000 Subject: [PATCH 0426/1256] condense globals introduce flags sensible silence and stepping --- phpdbg.c | 10 ++------ phpdbg.h | 18 +++++++------ phpdbg_bp.c | 15 +++++------ phpdbg_prompt.c | 67 ++++++++++++++++++++++++++++++++----------------- 4 files changed, 63 insertions(+), 47 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a37781b245367..794f6479c195c 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -30,18 +30,12 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->exec = NULL; pg->exec_len = 0; pg->ops = NULL; - pg->stepping = 0; pg->vmret = 0; - pg->quitting = 0; pg->bp_count = 0; - pg->quiet = 0; pg->last = NULL; pg->last_params = NULL; pg->last_params_len = 0; - pg->has_file_bp = 0; - pg->has_sym_bp = 0; - pg->has_opline_bp = 0; - pg->has_method_bp = 0; + pg->flags = PHPDBG_IS_QUIET; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -407,7 +401,7 @@ int main(int argc, char *argv[]) /* {{{ */ } zend_catch { } zend_end_try(); - } while(!PHPDBG_G(quitting)); + } while(!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)); if (ini_entries) { free(ini_entries); diff --git a/phpdbg.h b/phpdbg.h index 7477c40111651..457d682ce6745 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -45,6 +45,16 @@ #define PHPDBG_NEXT 2 +/* {{{ flags */ +#define PHPDBG_HAS_FILE_BP 0x00000001 +#define PHPDBG_HAS_SYM_BP 0x00000010 +#define PHPDBG_HAS_OPLINE_BP 0x00000100 +#define PHPDBG_HAS_METHOD_BP 0x00001000 + +#define PHPDBG_IS_STEPPING 0x00010000 +#define PHPDBG_IS_QUIET 0x00100000 +#define PHPDBG_IS_QUITTING 0x01000000 /* }}} */ + typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) @@ -57,17 +67,11 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_op_array *ops; /* op_array */ zval *retval; /* return value */ int bp_count; /* breakpoint count */ - int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ - zend_bool has_file_bp; /* file-based breakpoint has been set */ - zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ - zend_bool has_opline_bp; /* opline-based breakpoint has been set */ - zend_bool has_method_bp; /* method-based breakpoint has been set */ - zend_bool quitting; /* quitting flag */ - int quiet; /* quiet */ phpdbg_command_t *last; /* last command */ const char *last_params; /* last expression */ size_t last_params_len; /* last expression length */ + zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index ab4bf55a0b75c..e1138193d302b 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -50,7 +50,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.filename = estrndup(path, path_len); new_break.line = line_num; - PHPDBG_G(has_file_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP; if (zend_hash_find(&PHPDBG_G(bp_files), new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { @@ -78,7 +78,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) { phpdbg_breaksymbol_t new_break; - PHPDBG_G(has_sym_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_SYM_BP; new_break.symbol = estrndup(name, name_len + 1); new_break.id = PHPDBG_G(bp_count)++; @@ -111,7 +111,7 @@ void phpdbg_set_breakpoint_method(const char* class_name, if (!zend_hash_exists(class_table, func_name, func_len)) { phpdbg_breakmethod_t new_break; - PHPDBG_G(has_method_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_METHOD_BP; new_break.class_name = class_name; new_break.class_len = class_len; @@ -135,7 +135,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { phpdbg_breakline_t new_break; - PHPDBG_G(has_opline_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; new_break.name = strdup(name); new_break.opline = opline; @@ -154,7 +154,7 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), (zend_ulong) opline)) { phpdbg_breakline_t new_break; - PHPDBG_G(has_opline_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; asprintf( (char**)&new_break.name, "%p", (zend_op*) opline); @@ -272,10 +272,7 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_oplines)); zend_hash_clean(&PHPDBG_G(bp_methods)); - PHPDBG_G(has_file_bp) = 0; - PHPDBG_G(has_sym_bp) = 0; - PHPDBG_G(has_opline_bp) = 0; - PHPDBG_G(has_method_bp) = 0; + PHPDBG_G(flags) &= ~(PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP); PHPDBG_G(bp_count) = 0; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 27caeddcbc388..eb087e00b7bc3 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -98,9 +98,14 @@ static PHPDBG_COMMAND(compile) /* {{{ */ static PHPDBG_COMMAND(step) /* {{{ */ { - PHPDBG_G(stepping) = atoi(expr); + if (atoi(expr)) { + PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; + } else { + PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; + } + printf( - "[Stepping %s]\n", PHPDBG_G(stepping) ? "on" : "off"); + "[Stepping %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -130,7 +135,7 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_try { zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf("[Caught excetion in VM]\n"); return FAILURE; } else return SUCCESS; @@ -146,14 +151,24 @@ static PHPDBG_COMMAND(run) /* {{{ */ static PHPDBG_COMMAND(eval) /* {{{ */ { zval retval; - + if (expr_len) { + zend_bool stepping = (PHPDBG_G(flags) & PHPDBG_IS_STEPPING); + + /* disable stepping while eval() in progress */ + PHPDBG_G(flags) &= ~ PHPDBG_IS_STEPPING; + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r( &retval, 0 TSRMLS_CC); printf("\n"); } + + /* switch stepping back on */ + if (stepping) { + PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; + } } else { printf("[No expression provided !]\n"); return FAILURE; @@ -204,7 +219,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); - printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); + printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); if (PHPDBG_G(ops)) { printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); @@ -224,7 +239,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); - if (PHPDBG_G(has_file_bp)) { + if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { HashPosition position; zend_llist *points; @@ -268,7 +283,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ } #endif - if (PHPDBG_G(has_opline_bp)) { + if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { HashPosition position; phpdbg_breakline_t *brake; @@ -364,7 +379,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { - PHPDBG_G(quitting)=1; + PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; zend_bailout(); @@ -459,10 +474,14 @@ static PHPDBG_COMMAND(help) /* {{{ */ } /* }}} */ static PHPDBG_COMMAND(quiet) { /* {{{ */ - PHPDBG_G(quiet) = atoi(expr); + if (atoi(expr)) { + PHPDBG_G(flags) |= PHPDBG_IS_QUIET; + } else { + PHPDBG_G(flags) &= ~PHPDBG_IS_QUIET; + } printf( - "[Quietness %s]\n", PHPDBG_G(quiet) ? "enabled" : "disabled"); + "[Quietness %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); return SUCCESS; } /* }}} */ @@ -530,7 +549,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ printf("phpdbg> "); - while (!PHPDBG_G(quitting) && + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; @@ -541,7 +560,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ if (cmd_len) { switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf( "[Failed to execute %s !]\n", cmd); } @@ -556,7 +575,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf("phpdbg> "); } @@ -567,10 +586,12 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { - if (!PHPDBG_G(quiet)) { + /* force out a line while stepping so the user knows what is happening */ + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING)) { zend_op *opline = execute_data->opline; - printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + printf( + "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); } } /* }}} */ @@ -595,16 +616,16 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ phpdbg_print_opline( execute_data TSRMLS_CC); - if (PHPDBG_G(has_file_bp) + if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } } - if ((PHPDBG_G(has_sym_bp)||PHPDBG_G(has_method_bp))) { + if ((PHPDBG_G(flags) & (PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_SYM_BP))) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && previous != execute_data && previous->opline) { /* check we are the beginning of a function entry */ @@ -615,7 +636,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ case ZEND_INIT_STATIC_METHOD_CALL: { if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } @@ -626,10 +647,10 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } } - if (PHPDBG_G(has_opline_bp) + if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } @@ -637,9 +658,9 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - if (PHPDBG_G(stepping)) { + if ((PHPDBG_G(flags) & PHPDBG_IS_STEPPING)) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } From 8586a1b4cc6bae64812f51f7e75863352ebc5f5b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:27:48 +0000 Subject: [PATCH 0427/1256] ... --- phpdbg_prompt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index eb087e00b7bc3..69c64a1bf4950 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -220,7 +220,8 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); - + printf("Quietness\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); + if (PHPDBG_G(ops)) { printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); From 8de21cb2e295751ec96e1a9b20ca79605cb252af Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:31:51 +0000 Subject: [PATCH 0428/1256] [Not running] --- README.md | 2 -- phpdbg_prompt.c | 7 ++++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dcfd3317d23a3..580538f20e99c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ The interactive PHP debugger ============================ -phpdbg is an interactive debugger for PHP. - Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. phpdbg aims to be a lightweight, easy to use debugging platform for PHP5.5+ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 69c64a1bf4950..9565ee61e817b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -567,8 +567,13 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: { + if (!EG(in_execution)) { + printf("[Not running]\n"); + } return PHPDBG_NEXT; + } + } } else if (PHPDBG_G(last)) { From 8ec5d30097e83ec753153a9504c8755f719c5f82 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 23:41:14 -0200 Subject: [PATCH 0429/1256] - Added PHPDBG_BP_MASK macro --- phpdbg.h | 1 + phpdbg_bp.c | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 457d682ce6745..2e392e9dbb1b4 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -50,6 +50,7 @@ #define PHPDBG_HAS_SYM_BP 0x00000010 #define PHPDBG_HAS_OPLINE_BP 0x00000100 #define PHPDBG_HAS_METHOD_BP 0x00001000 +#define PHPDBG_BP_MASK (PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP) #define PHPDBG_IS_STEPPING 0x00010000 #define PHPDBG_IS_QUIET 0x00100000 diff --git a/phpdbg_bp.c b/phpdbg_bp.c index e1138193d302b..d147d59e515e9 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -36,7 +36,7 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ static void phpdbg_class_breaks_dtor(void *data) /* {{{ */ { phpdbg_breakmethod_t *bp = (phpdbg_breakmethod_t*) data; - + efree((char*)bp->class_name); efree((char*)bp->func_name); } /* }}} */ @@ -92,33 +92,33 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ -void phpdbg_set_breakpoint_method(const char* class_name, +void phpdbg_set_breakpoint_method(const char* class_name, size_t class_len, - const char* func_name, + const char* func_name, size_t func_len TSRMLS_DC) /* {{{ */ { HashTable class_breaks, *class_table; - + if (zend_hash_find(&PHPDBG_G(bp_methods), class_name, class_len, (void**)&class_table) != SUCCESS) { zend_hash_init( &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( - &PHPDBG_G(bp_methods), - class_name, class_len, + &PHPDBG_G(bp_methods), + class_name, class_len, (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); } if (!zend_hash_exists(class_table, func_name, func_len)) { phpdbg_breakmethod_t new_break; - + PHPDBG_G(flags) |= PHPDBG_HAS_METHOD_BP; - + new_break.class_name = class_name; new_break.class_len = class_len; new_break.func_name = func_name; new_break.func_len = func_len; new_break.id = PHPDBG_G(bp_count)++; - + zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); printf( "[Breakpoint #%d added at %s::%s]\n", new_break.id, class_name, func_name); @@ -200,9 +200,9 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (fbc->type != ZEND_USER_FUNCTION) { return FAILURE; } - + ops = (zend_op_array*)fbc; - + if (ops->scope) { /* find method breaks here */ return phpdbg_find_breakpoint_method( @@ -231,13 +231,13 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ HashTable *class_table; phpdbg_breakmethod_t *bp; - if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, + if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( class_table, - ops->function_name, + ops->function_name, strlen(ops->function_name), (void**)&bp) == SUCCESS) { - + printf( "[Breakpoint #%d in %s::%s() at %s:%u]\n", bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), @@ -271,8 +271,8 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); zend_hash_clean(&PHPDBG_G(bp_methods)); - - PHPDBG_G(flags) &= ~(PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP); + + PHPDBG_G(flags) &= ~PHPDBG_BP_MASK; PHPDBG_G(bp_count) = 0; } /* }}} */ From c2365d8283971f6318a5693ff5983de043ff81b2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:51:50 +0000 Subject: [PATCH 0430/1256] compress globals --- phpdbg.c | 24 ++++++++++++------------ phpdbg.h | 32 ++++++++++++++++++-------------- phpdbg_bp.c | 36 ++++++++++++++++++------------------ phpdbg_prompt.c | 36 ++++++++++++++++++++++-------------- 4 files changed, 70 insertions(+), 58 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 794f6479c195c..3cc4ba8a543ba 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -70,20 +70,20 @@ static void php_phpdbg_destroy_bp_methods(void *brake) /* {{{ */ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { - zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); - zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, php_phpdbg_destroy_bp_opline, 0); - zend_hash_init(&PHPDBG_G(bp_methods), 8, NULL, php_phpdbg_destroy_bp_methods, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], 8, NULL, php_phpdbg_destroy_bp_symbol, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, php_phpdbg_destroy_bp_opline, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], 8, NULL, php_phpdbg_destroy_bp_methods, 0); return SUCCESS; } /* }}} */ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ { - zend_hash_destroy(&PHPDBG_G(bp_files)); - zend_hash_destroy(&PHPDBG_G(bp_symbols)); - zend_hash_destroy(&PHPDBG_G(bp_oplines)); - zend_hash_destroy(&PHPDBG_G(bp_methods)); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); @@ -112,10 +112,10 @@ static PHP_FUNCTION(phpdbg_break) instructs phpdbg to clear breakpoints */ static PHP_FUNCTION(phpdbg_clear) { - zend_hash_clean(&PHPDBG_G(bp_files)); - zend_hash_clean(&PHPDBG_G(bp_symbols)); - zend_hash_clean(&PHPDBG_G(bp_oplines)); - zend_hash_clean(&PHPDBG_G(bp_methods)); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); } /* }}} */ zend_function_entry phpdbg_user_functions[] = { diff --git a/phpdbg.h b/phpdbg.h index 457d682ce6745..6b24dad848daf 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -45,6 +45,13 @@ #define PHPDBG_NEXT 2 +/* {{{ tables */ +#define PHPDBG_BREAK_FILE 0 +#define PHPDBG_BREAK_SYM 1 +#define PHPDBG_BREAK_OPLINE 2 +#define PHPDBG_BREAK_METHOD 3 +#define PHPDBG_BREAK_TABLES 4 /* }}} */ + /* {{{ flags */ #define PHPDBG_HAS_FILE_BP 0x00000001 #define PHPDBG_HAS_SYM_BP 0x00000010 @@ -58,20 +65,17 @@ typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable bp_files; /* file breakpoints */ - HashTable bp_symbols; /* symbol breakpoints */ - HashTable bp_oplines; /* opline breakpoints */ - HashTable bp_methods; /* method breakpoints */ - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ - zend_op_array *ops; /* op_array */ - zval *retval; /* return value */ - int bp_count; /* breakpoint count */ - int vmret; /* return from last opcode handler execution */ - phpdbg_command_t *last; /* last command */ - const char *last_params; /* last expression */ - size_t last_params_len; /* last expression length */ - zend_ulong flags; /* phpdbg flags */ + HashTable bp[PHPDBG_BREAK_TABLES]; /* break points */ + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ + int bp_count; /* breakpoint count */ + int vmret; /* return from last opcode handler execution */ + phpdbg_command_t *last; /* last command */ + const char *last_params; /* last expression */ + size_t last_params_len; /* last expression length */ + zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index e1138193d302b..bcca1da23ec81 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -52,14 +52,14 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP; - if (zend_hash_find(&PHPDBG_G(bp_files), + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); - zend_hash_update(&PHPDBG_G(bp_files), + zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], new_break.filename, path_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } @@ -75,7 +75,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(name); - if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) { + if (!zend_hash_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], name, name_len)) { phpdbg_breaksymbol_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_SYM_BP; @@ -83,7 +83,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ new_break.symbol = estrndup(name, name_len + 1); new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, + zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); @@ -99,11 +99,11 @@ void phpdbg_set_breakpoint_method(const char* class_name, { HashTable class_breaks, *class_table; - if (zend_hash_find(&PHPDBG_G(bp_methods), class_name, class_len, (void**)&class_table) != SUCCESS) { + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_table) != SUCCESS) { zend_hash_init( &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( - &PHPDBG_G(bp_methods), + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); } @@ -132,7 +132,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { zend_ulong opline = strtoul(name, 0, 16); - if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { + if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline)) { phpdbg_breakline_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; @@ -141,7 +141,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); } else { @@ -151,7 +151,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ { - if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), (zend_ulong) opline)) { + if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline)) { phpdbg_breakline_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; @@ -162,7 +162,7 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_index_update(&PHPDBG_G(bp_oplines), (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); } @@ -174,7 +174,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ zend_llist *break_list; zend_llist_element *le; - if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], op_array->filename, name_len, (void**)&break_list) == FAILURE) { return FAILURE; } @@ -215,7 +215,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ fname = "main"; } - if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { printf("[Breakpoint #%d in %s() at %s:%u]\n", bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), @@ -231,7 +231,7 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ HashTable *class_table; phpdbg_breakmethod_t *bp; - if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( class_table, @@ -253,7 +253,7 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * { phpdbg_breakline_t *bp; - if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, + if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { printf("[Breakpoint #%d in %s at %s:%u]\n", bp->id, bp->name, zend_get_executed_filename(TSRMLS_C), @@ -267,10 +267,10 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ { - zend_hash_clean(&PHPDBG_G(bp_files)); - zend_hash_clean(&PHPDBG_G(bp_symbols)); - zend_hash_clean(&PHPDBG_G(bp_oplines)); - zend_hash_clean(&PHPDBG_G(bp_methods)); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); PHPDBG_G(flags) &= ~(PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP); PHPDBG_G(bp_count) = 0; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9565ee61e817b..df0f21beb4104 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -246,9 +246,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("--------------------------------------\n"); printf("File Break Point Information:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_files), &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp_files), (void**) &points, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp_files), &position)) { + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { zend_llist_position lposition; phpdbg_breakfile_t *brake; @@ -268,9 +268,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("--------------------------------------\n"); printf("Symbol Break Point Information:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_symbols), &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp_symbols), (void**) &points, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp_symbols), &position)) { + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { zend_llist_position lposition; phpdbg_breaksymbol_t *brake; @@ -290,9 +290,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("--------------------------------------\n"); printf("Opline Break Point Information:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp_oplines), (void**) &brake, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp_oplines), &position)) { + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { printf("#%d\t%s\n", brake->id, brake->name); } } @@ -410,7 +410,15 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - + + /* this is implicitly required */ + if (PHPDBG_G(ops)) { + destroy_op_array( + PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; + } + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); @@ -433,10 +441,10 @@ static PHPDBG_COMMAND(clean) /* {{{ */ static PHPDBG_COMMAND(clear) /* {{{ */ { printf("[Clearing Breakpoints:]\n"); - printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); - printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); - printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_methods))); + printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); + printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); + printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); + printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); phpdbg_clear_breakpoints(TSRMLS_C); From d7e09f95646f74f47e2ff15f1ef9b78da2592dec Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:04:54 +0000 Subject: [PATCH 0431/1256] blurb/version/issues string --- phpdbg.c | 4 ++++ phpdbg.h | 4 ++++ phpdbg_prompt.c | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3cc4ba8a543ba..ca38078b14b5d 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -379,6 +379,10 @@ int main(int argc, char *argv[]) /* {{{ */ ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; phpdbg->ini_entries = ini_entries; + + printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); + printf("To get help using phpdbg type \"help\" and press enter\n"); + printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); diff --git a/phpdbg.h b/phpdbg.h index 908c1cc4b7a59..446b067194869 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -63,6 +63,10 @@ #define PHPDBG_IS_QUIET 0x00100000 #define PHPDBG_IS_QUITTING 0x01000000 /* }}} */ +/* {{{ strings */ +#define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" +#define PHPDBG_VERSION "0.0.0" /* }}} */ + typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index df0f21beb4104..fb6ba7cebc184 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -453,7 +453,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("[Welcome to phpdbg, the interactive PHP debugger.]\n"); + printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); if (!expr_len) { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -477,7 +477,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("failed to find help command: %s\n", expr); } } - printf("[Please report bugs to ]\n"); + printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); return SUCCESS; } /* }}} */ From e32d511cecd3b39a756f63c68608ffeb24d35b1f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:19:43 -0200 Subject: [PATCH 0432/1256] - Added "list func" support --- config.m4 | 2 +- phpdbg_help.c | 2 ++ phpdbg_help.h | 2 +- phpdbg_list.c | 14 ++++++++++ phpdbg_list.h | 3 +++ phpdbg_prompt.c | 69 ++++++++++++++++++++++++++++++------------------- phpdbg_utils.c | 31 ++++++++++++++++++++++ phpdbg_utils.h | 25 ++++++++++++++++++ 8 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 phpdbg_utils.c create mode 100644 phpdbg_utils.h diff --git a/config.m4 b/config.m4 index 1a99db0f24d88..df127084ae843 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS="-I$abc_srcdir" - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c" PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) diff --git a/phpdbg_help.c b/phpdbg_help.c index 97a99fde69e60..eb5982648c6b0 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -140,5 +140,7 @@ PHPDBG_HELP(list) /* {{{ */ printf("The list command displays N line from current context file.\n"); printf("\tphpdbg> list 2\n"); printf("Will print next 2 lines from the current file\n"); + printf("\tphpdbg> list func\n"); + printf("Will print func source code\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 9e187a8b395ae..ba79747a5ad49 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -64,7 +64,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), - PHPDBG_HELP_D(list, "list specified line"), + PHPDBG_HELP_D(list, "list specified line or function"), {NULL, 0, 0} }; diff --git a/phpdbg_list.c b/phpdbg_list.c index d460315531202..d5e07d49df77f 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -73,3 +73,17 @@ void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ out: close(fd); } /* }}} */ + +void phpdbg_list_function(const zend_function *fbc) /* {{{ */ +{ + const zend_op_array *ops; + + if (fbc->type != ZEND_USER_FUNCTION) { + return; + } + + ops = (zend_op_array*)fbc; + + phpdbg_list_file(ops->filename, + ops->line_end - ops->line_start + 1, ops->line_start); +} /* }}} */ diff --git a/phpdbg_list.h b/phpdbg_list.h index 4531a65d10645..95cc06e93a89f 100644 --- a/phpdbg_list.h +++ b/phpdbg_list.h @@ -20,6 +20,9 @@ #ifndef PHPDBG_LIST_H #define PHPDBG_LIST_H +#include "zend_compile.h" + void phpdbg_list_file(const char*, long, long); +void phpdbg_list_function(const zend_function*); #endif /* PHPDBG_LIST_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9565ee61e817b..65edb55f18dad 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -26,6 +26,7 @@ #include "phpdbg_bp.h" #include "phpdbg_opcode.h" #include "phpdbg_list.h" +#include "phpdbg_utils.h" static const phpdbg_command_t phpdbg_prompt_commands[]; @@ -103,7 +104,7 @@ static PHPDBG_COMMAND(step) /* {{{ */ } else { PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; } - + printf( "[Stepping %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; @@ -151,20 +152,20 @@ static PHPDBG_COMMAND(run) /* {{{ */ static PHPDBG_COMMAND(eval) /* {{{ */ { zval retval; - + if (expr_len) { zend_bool stepping = (PHPDBG_G(flags) & PHPDBG_IS_STEPPING); - + /* disable stepping while eval() in progress */ PHPDBG_G(flags) &= ~ PHPDBG_IS_STEPPING; - + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r( &retval, 0 TSRMLS_CC); printf("\n"); } - + /* switch stepping back on */ if (stepping) { PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; @@ -221,7 +222,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); printf("Quietness\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); - + if (PHPDBG_G(ops)) { printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); @@ -305,15 +306,15 @@ static PHPDBG_COMMAND(break) /* {{{ */ { char *line_pos = NULL; char *func_pos = NULL; - + if (!expr_len) { printf( "[No expression found]\n"); return FAILURE; } - + line_pos = strchr(expr, ':'); - + if (line_pos) { if (!(func_pos=strchr(line_pos+1, ':'))) { char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; @@ -336,19 +337,19 @@ static PHPDBG_COMMAND(break) /* {{{ */ } else { char *class; char *func; - + size_t func_len = strlen(func_pos+1), class_len = (line_pos - expr); - + if (func_len) { class = emalloc(class_len+1); func = emalloc(func_len+1); - + memcpy(class, expr, class_len); class[class_len]='\0'; memcpy(func, func_pos+1, func_len); func[func_len]='\0'; - + phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); } else { printf("[No function found in method expression %s]\n", expr); @@ -437,7 +438,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_methods))); - + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; @@ -489,18 +490,32 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ static PHPDBG_COMMAND(list) /* {{{ */ { - long offset = 0, count = strtol(expr, NULL, 0); - const char *filename = PHPDBG_G(exec); - - if (zend_is_executing(TSRMLS_C)) { - filename = zend_get_executed_filename(TSRMLS_C); - offset = zend_get_executed_lineno(TSRMLS_C); - } else if (!filename) { - printf("[No file to list]\n"); - return SUCCESS; - } + if (phpdbg_is_numeric(expr)) { + long offset = 0, count = strtol(expr, NULL, 0); + const char *filename = PHPDBG_G(exec); + + if (zend_is_executing(TSRMLS_C)) { + filename = zend_get_executed_filename(TSRMLS_C); + offset = zend_get_executed_lineno(TSRMLS_C); + } else if (!filename) { + printf("[No file to list]\n"); + return SUCCESS; + } + + phpdbg_list_file(filename, count, offset); + } else { + zend_function* fbc; - phpdbg_list_file(filename, count, offset); + if (!EG(function_table)) { + printf("[No function table loaded]\n"); + return SUCCESS; + } + + if (zend_hash_find(EG(function_table), expr, strlen(expr)+1, + (void**)&fbc) == SUCCESS) { + phpdbg_list_function(fbc); + } + } return SUCCESS; } /* }}} */ @@ -573,7 +588,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } return PHPDBG_NEXT; } - + } } else if (PHPDBG_G(last)) { @@ -652,7 +667,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ } } } - + if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { diff --git a/phpdbg_utils.c b/phpdbg_utils.c new file mode 100644 index 0000000000000..4b0c4a021692e --- /dev/null +++ b/phpdbg_utils.c @@ -0,0 +1,31 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include "phpdbg_utils.h" + +int phpdbg_is_numeric(const char *str) /* {{{ */ +{ + for (; *str; str++) { + if (isspace(*str)) { + continue; + } + return isdigit(*str); + } +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h new file mode 100644 index 0000000000000..231a1b3f216c5 --- /dev/null +++ b/phpdbg_utils.h @@ -0,0 +1,25 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_UTILS_H +#define PHPDBG_UTILS_H + +int phpdbg_is_numeric(const char *); + +#endif /* PHPDBG_UTILS_H */ From 6aad2ee42c355934190a46f55b7f6633f9bea407 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:28:52 -0200 Subject: [PATCH 0433/1256] - Fix function --- phpdbg_utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4b0c4a021692e..4991d3d9e5f92 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -28,4 +28,5 @@ int phpdbg_is_numeric(const char *str) /* {{{ */ } return isdigit(*str); } + return 0; } /* }}} */ From c7b51537a03734a3e0a8fbb9100840cd64a66d37 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:29:56 +0000 Subject: [PATCH 0434/1256] fix --- phpdbg_list.c | 15 ++++++++------- phpdbg_list.h | 2 +- phpdbg_prompt.c | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index d460315531202..f4209e12198ff 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -23,25 +23,26 @@ #include #include #include +#include "phpdbg.h" #include "phpdbg_list.h" -void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ +void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) /* {{{ */ { unsigned char *mem, *pos, *last_pos, *end_pos; struct stat st; int fd, all_content = (count == 0); unsigned int line = 0, displayed = 0; - if ((fd = open(filename, O_RDONLY)) == -1) { - printf("[Failed to open file %s to list]\n", filename); - return; - } - - if (fstat(fd, &st) == -1) { + if (VCWD_STAT(filename, &st) == -1) { printf("[Failed to stat file %s]\n", filename); goto out; } + if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { + printf("[Failed to open file %s to list]\n", filename); + return; + } + last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); end_pos = mem + st.st_size; diff --git a/phpdbg_list.h b/phpdbg_list.h index 4531a65d10645..883f9917f1bb8 100644 --- a/phpdbg_list.h +++ b/phpdbg_list.h @@ -20,6 +20,6 @@ #ifndef PHPDBG_LIST_H #define PHPDBG_LIST_H -void phpdbg_list_file(const char*, long, long); +void phpdbg_list_file(const char*, long, long TSRMLS_DC); #endif /* PHPDBG_LIST_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fb6ba7cebc184..c30d15589b5d4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -508,7 +508,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ return SUCCESS; } - phpdbg_list_file(filename, count, offset); + phpdbg_list_file(filename, count, offset TSRMLS_CC); return SUCCESS; } /* }}} */ From bd432b995e30ad13f725c367960f5dc4f8776d81 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:34:10 -0200 Subject: [PATCH 0435/1256] - Update list cmd description --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f7ec9419b883d..d87fd2bf0afa1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -538,7 +538,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), - PHPDBG_COMMAND_D(list, "list specified line"), + PHPDBG_COMMAND_D(list, "list specified line or function"), PHPDBG_COMMAND_D(clean, "clean the execution environment"), PHPDBG_COMMAND_D(clear, "clear breakpoints"), PHPDBG_COMMAND_D(help, "show help menu"), From 6658f58d4afcb80ffaeac460564aecb1591ecd93 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:50:15 -0200 Subject: [PATCH 0436/1256] - Added phpdbg_is_empty function --- phpdbg_prompt.c | 2 +- phpdbg_utils.c | 11 +++++++++++ phpdbg_utils.h | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5fd07125228fc..b71bd3d8203e7 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -498,7 +498,7 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ static PHPDBG_COMMAND(list) /* {{{ */ { - if (phpdbg_is_numeric(expr)) { + if (phpdbg_is_empty(expr) || phpdbg_is_numeric(expr)) { long offset = 0, count = strtol(expr, NULL, 0); const char *filename = PHPDBG_G(exec); diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4991d3d9e5f92..e3408ed47e7ff 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -30,3 +30,14 @@ int phpdbg_is_numeric(const char *str) /* {{{ */ } return 0; } /* }}} */ + +int phpdbg_is_empty(const char *str) /* {{{ */ +{ + for (; *str; str++) { + if (isspace(*str)) { + continue; + } + return 0; + } + return 1; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 231a1b3f216c5..3cb430f0594be 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,6 +20,7 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H -int phpdbg_is_numeric(const char *); +int phpdbg_is_numeric(const char*); +int phpdbg_is_empty(const char*); #endif /* PHPDBG_UTILS_H */ From b9c1c872f6fcf99b0ba8e3f26a21814e475bd788 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:50:24 +0000 Subject: [PATCH 0437/1256] ... --- phpdbg_prompt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5fd07125228fc..7d8ed357d7a10 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -513,13 +513,13 @@ static PHPDBG_COMMAND(list) /* {{{ */ phpdbg_list_file(filename, count, offset TSRMLS_CC); } else { zend_function* fbc; - + if (!EG(function_table)) { printf("[No function table loaded]\n"); return SUCCESS; } - if (zend_hash_find(EG(function_table), expr, strlen(expr)+1, + if (zend_hash_find(EG(function_table), expr, expr_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } From 32acf4736bc0d59a3d41d52244ace2ba62d7c958 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:52:43 +0000 Subject: [PATCH 0438/1256] ... --- phpdbg_list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index 3bfa214162655..fe14b1dcc9e06 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -35,7 +35,7 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / if (VCWD_STAT(filename, &st) == -1) { printf("[Failed to stat file %s]\n", filename); - goto out; + return; } if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { From f704fdea57d32cc8fa4bd98a208d9c8428bc05e4 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:54:22 -0200 Subject: [PATCH 0439/1256] - Not needed strlen() here --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index b71bd3d8203e7..4f5c6e058cb7d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -519,7 +519,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ return SUCCESS; } - if (zend_hash_find(EG(function_table), expr, strlen(expr)+1, + if (zend_hash_find(EG(function_table), expr, expr_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } From ed690e1899fa1d9234961a9b1e077c5d6912dc74 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:59:10 +0000 Subject: [PATCH 0440/1256] ... --- phpdbg_prompt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 44625a99c5a71..104247794f804 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -522,6 +522,8 @@ static PHPDBG_COMMAND(list) /* {{{ */ if (zend_hash_find(EG(function_table), expr, expr_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); + } else { + printf("[Function %s not found]\n", expr); } } From 3097c36f3042fe3f49d80eed810197036f94ab66 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 03:02:42 +0000 Subject: [PATCH 0441/1256] more help --- phpdbg_help.c | 1 + phpdbg_help.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index eb5982648c6b0..d942ebeb61117 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -142,5 +142,6 @@ PHPDBG_HELP(list) /* {{{ */ printf("Will print next 2 lines from the current file\n"); printf("\tphpdbg> list func\n"); printf("Will print func source code\n"); + printf("Note: before listing functions you must have a populated function table, try compile !!\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index ba79747a5ad49..9c89f3dcae250 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -64,7 +64,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), - PHPDBG_HELP_D(list, "list specified line or function"), + PHPDBG_HELP_D(list, "listing code gives you quick access to code while executing"), {NULL, 0, 0} }; From 08973a6bf5009dd14b2004259d0dd260726cd414 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 03:04:12 +0000 Subject: [PATCH 0442/1256] ... --- phpdbg.png | Bin 109358 -> 132259 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/phpdbg.png b/phpdbg.png index 85f9815526f2344bdb29b76c70bf97db1111639a..403652be89325f83ecb68d8bca97b38a4fe753a3 100644 GIT binary patch literal 132259 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 l{7&o#qA05>Qz2~<{6CiUpsWA@ literal 109358 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

JRH8w|Af?=*M7$=o)|Ed8@2)n1O?w_+xaR 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

!}>49 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 From 97d4052bb85915016838f5fe5ed78c43ad7cf665 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 03:14:56 +0000 Subject: [PATCH 0443/1256] ... --- README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 580538f20e99c..ba13c0d54dba0 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,26 @@ The interactive PHP debugger Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. -phpdbg aims to be a lightweight, easy to use debugging platform for PHP5.5+ +phpdbg aims to be a lightweight, powerful, easy to use debugging platform for PHP5.5+ Features ======== - - step through debugging - - break at method/function entry, file:line or address - - showing debug backtraces - - easy manipulation of the environment with built-in eval() - - userland API - - sapi agnositicism, easy integration + - Stepthrough Debugging + - Flexible Breakpoints (Class Method, Function, File:Line, internally Opline) + - Easy Access to PHP with built-in eval() + - Easy Access to Currently Executing Code + - Userland API + - SAPI Agnostic - Easily Integrated + - PHP Configuration File Support + - JIT Super Globals - Set Your Own !! + - Easy Operation - See Help :) Planned ======= - - mocking server environments/requests - - improve everything + - Mocking API for Server/Request Environments + - Improve Everything :) Installation ============ From 33f0502f1978fc89fede8b5dd7a8ced79f95d115 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:20:14 +0000 Subject: [PATCH 0444/1256] readline support #6 --- phpdbg.h | 5 +++++ phpdbg_prompt.c | 56 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 446b067194869..2a018295e9664 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -37,6 +37,11 @@ # include "TSRM.h" #endif +#ifdef HAVE_LIBREADLINE +# include +# include +#endif + #ifdef ZTS # define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v) #else diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 104247794f804..e438072c2a889 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -307,7 +307,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ char *line_pos = NULL; char *func_pos = NULL; - if (!expr_len) { + if (expr_len <= 0L) { printf( "[No expression found]\n"); return FAILURE; @@ -456,7 +456,11 @@ static PHPDBG_COMMAND(help) /* {{{ */ { printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); - if (!expr_len) { + if (expr_len > 0L) { + if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + printf("failed to find help command: %s/%d\n", expr, expr_len); + } + } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; const phpdbg_command_t *help_command = phpdbg_help_commands; @@ -473,11 +477,8 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("\t%s\t%s\n", help_command->name, help_command->tip); ++help_command; } - } else { - if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf("failed to find help command: %s\n", expr); - } } + printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); return SUCCESS; @@ -571,19 +572,39 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D) /* {{{ */ { - char cmd[PHPDBG_MAX_CMD]; - - printf("phpdbg> "); - + size_t cmd_len; + +#ifndef HAVE_LIBREADLINE + char cmd[PHPDBG_MAX_CMD]; + +phpdbg_interactive_enter: + printf("phpdbg> "); + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { - size_t cmd_len = strlen(cmd) - 1; + cmd_len = strlen(cmd) - 1; +#else + char *cmd = NULL; - if (cmd[cmd_len] == '\n') { - cmd[cmd_len] = 0; - } +phpdbg_interactive_enter: + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { + cmd = readline("phpdbg> "); + + cmd_len = strlen(cmd); +#endif + + /* trim space from end of input */ + while (isspace(cmd[cmd_len-1])) + cmd_len--; + + /* ensure string is null terminated */ + cmd[cmd_len] = '\0'; - if (cmd_len) { + if (cmd && cmd_len > 0L) { +#ifdef HAVE_LIBREADLINE + add_history(cmd); +#endif + switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { @@ -598,8 +619,6 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } return PHPDBG_NEXT; } - - } } else if (PHPDBG_G(last)) { PHPDBG_G(last)->handler( @@ -607,9 +626,8 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf("phpdbg> "); + goto phpdbg_interactive_enter; } - } return SUCCESS; From bf8a9c141fcad21738156349a9c2b2900ee2908a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:22:33 +0000 Subject: [PATCH 0445/1256] readline --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ba13c0d54dba0..1b03abe63dc24 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Features - SAPI Agnostic - Easily Integrated - PHP Configuration File Support - JIT Super Globals - Set Your Own !! + - Optional readline Support - Comfortable Terminal Operation - Easy Operation - See Help :) Planned @@ -39,6 +40,8 @@ make -j8 make install-phpdbg ``` +*Note: php must be configured with the switch --with-readline for phpdbg to support history, autocompletion, tab-listing etc* + Command Line Options ==================== From 6c317b771e5e342497a39e5610c8fe49cfd628a0 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:53:04 +0000 Subject: [PATCH 0446/1256] more command line options --- phpdbg.c | 34 +++++++++++++++++++++++++++++++++- phpdbg_prompt.c | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index ca38078b14b5d..52998a6527ac3 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -262,6 +262,10 @@ const opt_struct OPTIONS[] = { /* {{{ */ {'d', 1, "define ini entry on command line"}, {'n', 0, "no php.ini"}, {'z', 1, "load zend_extension"}, + /* phpdbg options */ + {'e', 1, "exec"}, + {'v', 0, "verbose"}, + {'s', 0, "step"}, {'-', 0, NULL} }; /* }}} */ @@ -291,6 +295,9 @@ int main(int argc, char *argv[]) /* {{{ */ sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *ini_entries = NULL; int ini_entries_len = 0; + char *exec = NULL; + size_t exec_len = 0L; + zend_ulong flags = PHPDBG_IS_QUIET; char *php_optarg = NULL; int php_optind = 1; int opt; @@ -311,7 +318,7 @@ int main(int argc, char *argv[]) /* {{{ */ tsrm_ls = ts_resource(0); #endif - + while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (opt) { case 'n': @@ -355,6 +362,21 @@ int main(int argc, char *argv[]) /* {{{ */ case 'z': zend_load_extension(php_optarg); break; + + case 'e': /* set execution context */ + exec_len = strlen(php_optarg); + if (exec_len) { + exec = strdup(php_optarg); + } + break; + + case 'v': /* set quietness off */ + flags &= ~PHPDBG_IS_QUIET; + break; + + case 's': /* set stepping on */ + flags |= PHPDBG_IS_STEPPING; + break; } } @@ -395,6 +417,16 @@ int main(int argc, char *argv[]) /* {{{ */ PG(modules_activated) = 0; + if (exec) { /* set execution context */ + PHPDBG_G(exec) = estrndup(exec, exec_len); + PHPDBG_G(exec_len) = exec_len; + + free(exec); + } + + /* set flags from command line */ + PHPDBG_G(flags) = flags; + zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e438072c2a889..d255a9d8731e8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -604,7 +604,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ #ifdef HAVE_LIBREADLINE add_history(cmd); #endif - + switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { From 12926b6aa998c37278cf21b9634c0c23d76fc935 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:54:41 +0000 Subject: [PATCH 0447/1256] ... --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b03abe63dc24..be28150285807 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,18 @@ make install-phpdbg Command Line Options ==================== -The following switches are implemented (just like cli SAPI): +The following switchess are implemented (just like cli SAPI): - -n ignore php ini - -c search for php ini in path - -z load zend extension - -d define php ini entry + +The following switches changes the default behaviour of phpdbg: + + - -v disables quietness + - -s enabled stepping + - -e sets execution context Screeny ======= From 4112330bb5ba4e1a18191c7586a3567638b44a54 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:03:37 +0000 Subject: [PATCH 0448/1256] colourfulness --- phpdbg.c | 23 +++++++--- phpdbg.h | 15 ++++++- phpdbg_bp.c | 66 ++++++++++++++++++++------- phpdbg_prompt.c | 115 +++++++++++++++++++++++++++++++++--------------- 4 files changed, 161 insertions(+), 58 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 52998a6527ac3..a83e492809873 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -35,7 +35,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->last = NULL; pg->last_params = NULL; pg->last_params_len = 0; - pg->flags = PHPDBG_IS_QUIET; + pg->flags = PHPDBG_DEFAULT_FLAGS; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -266,6 +266,7 @@ const opt_struct OPTIONS[] = { /* {{{ */ {'e', 1, "exec"}, {'v', 0, "verbose"}, {'s', 0, "step"}, + {'b', 0, "boring colours"}, {'-', 0, NULL} }; /* }}} */ @@ -297,7 +298,7 @@ int main(int argc, char *argv[]) /* {{{ */ int ini_entries_len = 0; char *exec = NULL; size_t exec_len = 0L; - zend_ulong flags = PHPDBG_IS_QUIET; + zend_ulong flags = PHPDBG_DEFAULT_FLAGS; char *php_optarg = NULL; int php_optind = 1; int opt; @@ -377,6 +378,10 @@ int main(int argc, char *argv[]) /* {{{ */ case 's': /* set stepping on */ flags |= PHPDBG_IS_STEPPING; break; + + case 'b': /* set colours off */ + flags &= ~PHPDBG_IS_COLOURED; + break; } } @@ -402,10 +407,6 @@ int main(int argc, char *argv[]) /* {{{ */ phpdbg->ini_entries = ini_entries; - printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); - printf("To get help using phpdbg type \"help\" and press enter\n"); - printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); - if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); @@ -430,6 +431,16 @@ int main(int argc, char *argv[]) /* {{{ */ zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); + + /* print blurb */ + printf( + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); + printf( + "[To get help using phpdbg type \"help\" and press enter\n"); + printf( + "%sPlease report bugs to <%s>%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); do { zend_try { diff --git a/phpdbg.h b/phpdbg.h index 2a018295e9664..34b2e56a38cb6 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -66,7 +66,10 @@ #define PHPDBG_IS_STEPPING 0x00010000 #define PHPDBG_IS_QUIET 0x00100000 -#define PHPDBG_IS_QUITTING 0x01000000 /* }}} */ +#define PHPDBG_IS_QUITTING 0x01000000 +#define PHPDBG_IS_COLOURED 0x10000000 + +#define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED) /* }}} */ /* {{{ strings */ #define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" @@ -88,4 +91,14 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) +/* {{{ colourful helpers */ +#define PHPDBG_RED_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "[") +#define PHPDBG_BOLD_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "[") +#define PHPDBG_END_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") +#define PHPDBG_PROMPT_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ + #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index fef5775c1e161..8ce2edbe5303c 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -68,7 +68,10 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "[Breakpoint #%d added at %s:%ld]\n", new_break.id, new_break.filename, new_break.line); + "%sBreakpoint #%d added at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.filename, new_break.line, + PHPDBG_END_LINE(TSRMLS_C)); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -86,9 +89,15 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); + printf( + "%sBreakpoint #%d added at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.symbol, + PHPDBG_END_LINE(TSRMLS_C)); } else { - printf("[Breakpoint exists at %s]\n", name); + printf( + "%sBreakpoint exists at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -121,10 +130,16 @@ void phpdbg_set_breakpoint_method(const char* class_name, zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); printf( - "[Breakpoint #%d added at %s::%s]\n", new_break.id, class_name, func_name); + "%sBreakpoint #%d added at %s::%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, class_name, func_name, + PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "[Breakpoint exists at %s::%s]\n", class_name, func_name); + "%sBreakpoint exists at %s::%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + class_name, func_name, + PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -143,9 +158,14 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); + printf("%sBreakpoint #%d added at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.name, + PHPDBG_END_LINE(TSRMLS_C)); } else { - printf("[Breakpoint exists at %s]\n", name); + printf( + "%sBreakpoint exists at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -164,7 +184,11 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); + printf( + "%sBreakpoint #%d added at %p%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, (zend_op*) new_break.opline, + PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -183,7 +207,10 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("[Breakpoint #%d at %s:%ld]\n", bp->id, bp->filename, bp->line); + printf("%sBreakpoint #%d at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->filename, bp->line, + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } } @@ -217,9 +244,12 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s() at %s:%u]\n", bp->id, bp->symbol, + printf("%sBreakpoint #%d in %s() at %s:%u%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C), + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } @@ -239,9 +269,12 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ strlen(ops->function_name), (void**)&bp) == SUCCESS) { printf( - "[Breakpoint #%d in %s::%s() at %s:%u]\n", bp->id, bp->class_name, bp->func_name, + "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C), + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } } @@ -255,9 +288,12 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s at %s:%u]\n", bp->id, bp->name, + printf("%sBreakpoint #%d in %s at %s:%u%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->name, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C), + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d255a9d8731e8..40db309d5abdc 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -35,13 +35,17 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - printf("[Unsetting old execution context: %s]\n", PHPDBG_G(exec)); + printf( + "%sUnsetting old execution context: %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - printf("[Destroying compiled opcodes]\n"); + printf( + "%sDestroying compiled opcodes%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops) = NULL; @@ -49,7 +53,9 @@ static PHPDBG_COMMAND(exec) /* {{{ */ PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf("[Set execution context: %s]\n", PHPDBG_G(exec)); + printf( + "%sSet execution context: %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } /* }}} */ @@ -59,20 +65,26 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - printf("[Attempting compilation of %s]\n", PHPDBG_G(exec)); + printf("%sAttempting compilation of %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( &fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - printf("[Success]\n"); + printf( + "%sSuccess%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } else { - printf("[Could not open file %s]\n", PHPDBG_G(exec)); + printf( + "%sCould not open file %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); } } else { - printf("[Cannot compile while in execution]\n"); + printf( + "%sCannot compile while in execution%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); } return FAILURE; @@ -83,7 +95,9 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (PHPDBG_G(exec)) { if (!EG(in_execution)) { if (PHPDBG_G(ops)) { - printf("[Destroying previously compiled opcodes]\n"); + printf( + "%sDestroying previously compiled opcodes%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops)=NULL; @@ -92,7 +106,9 @@ static PHPDBG_COMMAND(compile) /* {{{ */ return phpdbg_compile(TSRMLS_C); } else { - printf("[No execution context]\n"); + printf( + "%sNo execution context%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } /* }}} */ @@ -106,7 +122,11 @@ static PHPDBG_COMMAND(step) /* {{{ */ } printf( - "[Stepping %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); + "%sStepping %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", + PHPDBG_END_LINE(TSRMLS_C)); + return SUCCESS; } /* }}} */ @@ -118,14 +138,14 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { if (EG(in_execution)) { - printf("[Cannot start another execution while one is in progress]\n"); + printf("%sCannot start another execution while one is in progress%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("[Failed to compile %s, cannot run]\n", PHPDBG_G(exec)); + printf("%sFailed to compile %s, cannot run%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } @@ -137,14 +157,14 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf("[Caught excetion in VM]\n"); + printf("%sCaught excetion in VM%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } else return SUCCESS; } zend_end_try(); return SUCCESS; } else { - printf("[Nothing to execute !]\n"); + printf("%sNothing to execute !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } /* }}} */ @@ -171,7 +191,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; } } else { - printf("[No expression provided !]\n"); + printf("%sNo expression provided !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } @@ -181,7 +201,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ static PHPDBG_COMMAND(back) /* {{{ */ { if (!EG(in_execution)) { - printf("[Not executing !]\n"); + printf("%sNot executing !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } zval zbacktrace; @@ -309,7 +329,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ if (expr_len <= 0L) { printf( - "[No expression found]\n"); + "%sNo expression found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } @@ -325,13 +345,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("[Failed to expand path %s]\n", path); + printf("%sFailed to expand path %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("[No line specified in expression %s]\n", expr); + printf("%sNo line specified in expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } else { @@ -352,7 +372,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); } else { - printf("[No function found in method expression %s]\n", expr); + printf("%sNo function found in method expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } @@ -370,7 +390,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_symbol(name TSRMLS_CC); } else { - printf("[Malformed break command found]\n"); + printf("%sMalformed break command found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } @@ -432,7 +452,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); } else { printf( - "[Cannot clean environment while executing]\n"); + "%sCannot clean environment while executing%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } @@ -454,11 +474,15 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); + printf( + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf("failed to find help command: %s/%d\n", expr, expr_len); + printf( + "%sFailed to find help command: %s/%lu%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); } } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -466,20 +490,28 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); - printf("Commands:\n"); + printf( + "%sCommands:%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } - printf("Helpers Loaded:\n"); + printf( + "%sHelpers Loaded%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); ++help_command; } } - printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); + printf( + "%sPlease report bugs to <%s>%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } /* }}} */ @@ -492,7 +524,7 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ } printf( - "[Quietness %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); + "%sQuietness %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled", PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } /* }}} */ @@ -507,7 +539,9 @@ static PHPDBG_COMMAND(list) /* {{{ */ filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); } else if (!filename) { - printf("[No file to list]\n"); + printf( + "%sNo file to list%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } @@ -516,7 +550,9 @@ static PHPDBG_COMMAND(list) /* {{{ */ zend_function* fbc; if (!EG(function_table)) { - printf("[No function table loaded]\n"); + printf( + "%sNo function table loaded%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } @@ -524,7 +560,9 @@ static PHPDBG_COMMAND(list) /* {{{ */ (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { - printf("[Function %s not found]\n", expr); + printf( + "%sFunction %s not found%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); } } @@ -578,7 +616,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ char cmd[PHPDBG_MAX_CMD]; phpdbg_interactive_enter: - printf("phpdbg> "); + printf(PHPDBG_PROMPT_LINE(TSRMLS_C)); while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { @@ -588,7 +626,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - cmd = readline("phpdbg> "); + cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C)); cmd_len = strlen(cmd); #endif @@ -609,13 +647,16 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf( - "[Failed to execute %s !]\n", cmd); + "%sFailed to execute %s !%s\n", + PHPDBG_RED_LINE(TSRMLS_C), cmd, PHPDBG_END_LINE(TSRMLS_C)); } break; case PHPDBG_NEXT: { if (!EG(in_execution)) { - printf("[Not running]\n"); + printf( + "%sNot running%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); } return PHPDBG_NEXT; } @@ -640,7 +681,9 @@ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{ zend_op *opline = execute_data->opline; printf( - "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + "%sOPLINE: %p:%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + opline, phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ From 78418cc38c822cc915f23d6d3ffcd185daf29418 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:04:32 +0000 Subject: [PATCH 0449/1256] ... --- phpdbg.png | Bin 132259 -> 133955 bytes phpdbg_prompt.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg.png b/phpdbg.png index 403652be89325f83ecb68d8bca97b38a4fe753a3..829bbba8946ab317febf2a452959f298caa75c5f 100644 GIT binary patch delta 114294 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 z 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�OXMU(DFvf$AkMwqFFJNZ@``NuVs&p5^e~~G@Xtwn^`>(@o zgb+!t2CjQD=5qswxmhYWD16J~_iA!L$6!_6J_0K+uMp3X)cex(3QzFaCE0>Upyz)J> zT2iG|0G(u5?>6;KO}2e*Gqx>X>IpY&T(k`x9(Y7u0l9LEH2zdcp$r?*0<=L}wXc zvsyux<}Z`g0a09&%C#+1ag}nbaQm!q8^cI5Aal8JQ(g@{V|||8s#un-EsF#1QOlfj zJ8h%h$8S_fE;PLkXf48;{RIpm%Ysi8TLBQg!QwSB6zT=StX?wsN+BU7c?)){#sApM z|IaUJmN&6CT8PbgIcrNzurQs&%JNcpSwFPY)R&zA;!~BGyix3B&dW1>TmUtrhAPwf~p^0TREcxFDbWF z2botmapb!}xCbjDbt7^0>Lap&VTD7S!iR1vUIpmzqqe@Th<>Q_Sd?*YImIuxxA+eD z`%0?Wwss_^8n|HfWgmsRmeK?lf>Y~XW3`&Lt5rQ~5u!CvyDWU%>3L+Zgl zoa*nEYXom?&JFGYQi12sZ@wJ0ykB(stDjUA@AuAC5nl|?>q+Vk=S}d}-a>5Z%J@ei zkm)dj75QN7{U0iPsKgG#$}>Xof{A6_U_Yg0Nuwr8)NLvl19E#t_RmEpj5z@dHgh}G z{e0NL$!NPOm0)n4_63D#p70vtI@8LA!I6ece;~OsAn4nF55FFkOh$HvaR8|H{6=;Xre>6cZ+=LEu0D7>hw6#=riCRNwPT3w!Omh#N9ZcpW}p~hN|d5qdZ zz?LlVhQVhSvsb9rJyQ1elL9_eopNB9-ZG^*oBm7J(Wk2U1`O_wOkFzphs%))m?O>f zZd%S4&OO7dKJA{PXY1YHq*6{Oh}WGJnzJ>F{Klpr!G88n_)ub+Rd&#tJaJg*n~qSy^tr!55coraEvdq`AP6!?(n+iDy-mXL+?*2IHde-a(9cLL zyJ%EHD|CG89h8+>1|UXilF;Rx5p~3b&O~bpFAHv*ktKpN7${+Jdw<=jp(^QKSwxF)x2*4_AA_);m2=-1Hha8_4gxat#}{q(A|=vs55~xcTto znVz5w{lS@m32o$yWznUJ+{-62;pSKn>gCL}h$oHV;yN2#vLlia(H5c}olBCz9^?u7 z8yvFvXi2T+mubwk`IDu*6wjRvF8yGe2aiDK*M~wTk2P~vh-ENOA)bk8b}#%&Xiu1h1ym~|LR?khwN3irk;046u|pARRA%|*K+8A z){Oa@C9Q3G8yJENE9hza3s-Ywdsxkv-M5M*Qn4B1zbY9#aQ(%4ZJ%k8Dc#()nr)Jk zN*8HvdZ=ez{tL<008JbJp@MgLF`tnGMNc2o$Rh|UUJdiS)QR$Yf^xewdU3F#8rMGh z+&Ezu?`>|qYU&xBx&l5SfCmjfcYC*0`%SvY?X%dz&;;+IKZr*CmN~@taHV5(o>4sS z^xa>1rng|!&#%H|*hw|5z2WlI>sSPIU?-HAZ>79J9YU|fT`<`D1<_sTAq$Rp1Dif# zUx9Lgg#S%MM4=&Oa&UnD0fXdj9q&m<2G?l;*f7!TE_P-KBox zLF`PFNAiO>CSn{X7wfMnBeh}Im}s>BxTS;BrW?y9uTeqQ?G{@i30Rewou9li5cE4C zbf%JgccM*x;P05X4P^O#;lsA3IZA59x2Js>InvmDQet%d!>zK7w3&z$zXvOYaS(1= zs;0dg&P_Rl$^c|iv2HmGxVK*JU@|<+bd{)jFmy*IM0dQC(thW<7-Gu$ONLLg5MwXo z1CAa~b&SprmxUJ9&4sYQ#BF2Pr6H<&X^1M>uaG0@hJ{~&IboLA0j$5Y%pjpTEuXPv}-uS5* z49LqzT?9oz;?N9R5r35k_IO~)=hyBLNm}6Ydowln@fdk*lO5qEuD`-j<@bmnOWXp! zhJ9CMv@IJqZvwkabAoV$EJNQdHkB07b=FRNAhC%!QcQzx1wfHPUhT}xUevBG{u(+= zt#_8vBxuP>wn=t+q}8Wbjk!|KWq|Q#1ONvT^`l_)NjpRSpyW!TX4N0wlKCIJRbio0 zU)+*^bBczW4OH29riU6?Z4ho5gqiLQ4S2KKWX>Cpv2DwbohB)2T4FO4WPz$TGb+^j zuNQ3%?dT>|+x*rgC1k{d-^QeJo;QT|-aL`Z{ta%U4QDSsU-d*7b!=vzRxLgX=)Ku< z4f_v9`tnak`uQ(L3OpD4mnrKIsSzHGzV2vxB$K}T?p3^t4R^s@%DR_JA@IOw@A(8b z^^wj!35_sr4u~DCv|F>$V_N*9IY@=_!m2PgmR10J^< z9MU~9|Z6Cx0ecxRgbpb_vNY}9+8>5m>Wh=m%y5|LeS6X6}wHq!cCO-?Qz9v)6& z8#ZU&FfCn9)Y7;7rn{afL}A^dSEE6f$E`8kIvv;8L-&)XLe_29WwZ1>_KSuc&j;fg z12e=G-bx)x?}%JgaN$gB8^QHCzl&zPkl*}g45UnB0dd1b45Kli1kX6t2(R!>WF<=M zliGV>l6ZD`q5`ZAGH;B%|8zn~T~I8Q;@7%LdOqR!ovt6N&+B?Y!|Vad z-FD8RJC^DV_L@`&UA)$p%Z8Wl$xXU+$(|~@zd-!Ma$^~#rvjTAcl=!F-%B~=cembVxHLsl{dW@iSa zXjfPM&735yWpGSZZEB}d@X3#Di|@@LVRjdB;CH^Axw4y^9vALTK&+w}`Bico1fPj! zGDbayi8exczlInLL7vo9T>m7k&G(9R*P@F+pR#q8#AVjli)|*r(6(RYv47z{+$8Ky z)n+i$*cq%4T|ww9|2FtSK3f{zTzJs-Yqz{PC_~u`Ae?g}o{z(Y4|*4x9(mr|o@%R8 z@5Yp@pYV5%(l^IK{W-rHmzk2YBl%-57?s){7i4wqGiw&YE0B;}|6KJ}A)(@^4Ib;f zg^tKKNTI;jMJUY>rS)%n6Fgu3z|QZQ<9rE8e;xos%SZ!X)G`B`v&sqg7_aMN|t@qnIDItyE6GSKPEw{|3Kk?~6u zO`<{gzZWX>|0mo0gJ*z$0Zr%@3iXcb(X@)rh2Nubm!_eGQvEl?Q-%V<%+_ZVx6q&Q z@G`_5Q8sw$I?gLWtopt`4A^A7#mI%tM?!bi3elDbs^Hww(gI- zn!oQT0dZJ8l&lsF>9WEYhUz-Q+AhJ1ttCQZ6yjwt!^4s(Yw4Du3K`d0t@Yp@qcCwHkKn0TPm zgQj0@wzl#2*1Lb5-E;vCXpB9SlrY-aK4vJ00^_|u^zNPZ>yV3h?`M_UL`@{6K#B^B z|97CuM*5|_f$qZNLw{ng#sU8|8PV|CINr(wQ_(C+H)d_?o`s(o^M>T`ku~jWgh#dOy|Aax{FB;rhQIMZd%Rr%xY13Qd`gHabu$!_EE`Hijo;Ic{ zT85sNz@Z%2+m$h{zM%)FOoQt#b^I8PO`Z)|66%7fTFs&3GRxu&A!~~n(-?n<-Mw2> zvc*e+6xq?Tf@Qa33LsB!ZCd`MI5{#w|152YaT(8`d-k(slehH(ICA~j`PAG=Pqq`! z&P;+<>4bchSMIIZy5=1?nynf}DKCZ%E2kSJgnPg>X6? z%;fN$>wi=t$0tKA%hP;*JP&SbXq)QDYY#db3}m*uh>#wutNuE+O(oq2dImG(9hJI} zZg3*dEYpZD0*)xas(a|!k9y0SQ%*=~Q!J@1k#nB5@!K9ZGG3#0%%});y%cB$elNN- z11I7KF_mwkMSbb)r))`q|KHw9}7s$(&xM|B6($Aul*BU0!}rBbJx% z|5u$TDgEiy9KulYupJ}zJ(9Fjw}xj z4S#REVO6zvMu#Di`C#Mj7^d38+-{70(I!&!&BZ4c?9DzGZ**tKVYB2#+7e)0gFx|%M1-{6#=hqJcUnDcT@M82`SgZIFB;Nq%22#OUc)>l$DIQPuY zVzb^jkEVzv;H$>RI<|0L>#$@jn9`@6p)J6Racr&hjQrJc8M|c_3@^~5jPsvh>{o+! zU3_uL-EY5m{Ioe^BR;nj%a`dXps_?UvwrP6F-v;xaoJa=_xYCd%A_Az=)vi7{ zV6%qNuvK3bzjr>#!5j$Jp50aXeuf*!?SR)sHP=nIWR_POPM_o~6vesH`F^>yhvUnk zemVws9FVCFW>J<*kKpL?tlGYHyxRi8H8XZ9Dw7j5W|23MoYcrNgG1ZUb(Ofw=;R@k ztI=O80UNj~dWV{>d8^3Ca_juk^tuKb-cVQ4*ZqH6ZMRyc^!_A#!=BUtp8TvD`{u_} zOO;L0<4rOXDa1b>CDskM3@LJJp%h+Ntl| z$LB_A3mLud$LN``2OPJ9kNx6egPyC0^*X$pRgNB&e-)W!ro?mQh@bn5CuNB`-bzW5 zpS>1jfX6S|RK!uAVu3q#fAc*;SE5O{(Q;GNU&=$HrN1`xq{`(DZhtwTJ0< zd9p4poSBl&!_5ygCrc~3C7TNsp%L}2(Xg~52(s}Ik$Y!Wdtw#ucQa={6BH9U)R^dO z_*~OsUZSn?>i9DOvPjA`7mx*;Gz7VG+;=z-2E!^1h23=aOS*JscD@@qCNDhJEM8xi z2)Ix}a+V?oU>N#3I$#T_ZH2Yh$~}Z?yI$OnMz4#?XqcBwOzaC&LmBKP+k}Mlh_0Rz z3hOO*uWh^Fsy>i>KRaXk!MLFPXQA|*P6%kd<$<@}U&-A_HV8qo)!_h{^mUzl07M_49Rb23#L<>j7V6$*zVTMSy-FmSWIsvi?)H z>NO^-Ou}hD{DPbu{|Enus^qX7#Qh_a|4hQ(_KDM*v(6Gu)GYI}FOj)||7y}nVKe@T zJ$Z21_G_HkCvoxA6FX7)o*;JrZBLFp|FP5euz-pBGItBu^ImSL`JOQbS{AkW+DCHf zo_A@RPYn?Osshp|n(gz)&3EIz1t;#W-YO7-R(`orx9B@^^QNZl>1?lMExK;AQ zdKeo31arb}j>zVnC`ikO@6d5DTt4l;$6*H}VxFe}&(-S>@}mfZ!48tYF9rPd#rXk$ zEpA9c1}X1hvBUlAoo$^Pc}Cr`UptldYoZ`RmN&N_-tHpP zFn3;9j656CdiI<}*Y^#p0~w&0gr@~W^SKOaM$%w7Ub9lTWyo}&a)SHn)iq4UwT&x% zqEj($%x1hmMKji!S@!SAzrw%x@zajZtyWR}LTAUA%d{HmrrE!;ES4MNcXJivAzeDL zr{RGQd>mXSknTJ)W(;-Dcrn{sA!hTX%KP-@^`m6FM`s@EE`s*>O9I#?O0-*o`?oW5IP|{udS7!J01DM&}vz|jJ zQE#R!ag*26S@?#XpNbCx{v__7v|L|YpE&!^B=DoTGhHgE@W6unj@2Nv7l;p`U2XED z`y3#cPP0({yRhuFT~qj3EsbTzCY6`>8XM8^O)KYTisyj~l_k~S1;go8pjpUX)AT94 zd?G0*k5|~F@YAOoSb}8pMSFF3RuI0H3G6#{zUPUeCx>(Tgh}xjD0$rj|v?ZzOE8gmv7-e zX>%W+HjGzWRgi1j!N=@(l%#-7QdS1*JFadvroApw1i4}lMhmvzyjcf*5# ze(w;>Un?DpMvGwM08JoP6Y85a=K;V8?a?alu)_9HcqN9}qnlIBPMlFxqMe^c8CAVJ zl@giWG#^4p-n7iEWC0RNT_uuB9xWrAM?xA;EPfQo`u)?K{QvhR-yZ+%O+wC<(Zsw_ zhuZEr`Xo}}*kG*OHmbzX-!(D8@hfbc1z5uTI1ko>p&x1Zm#{6pBbm zZE)0cLHgPPjUqy!e~vliM0iuX^jDu%X)-U6~&;|4YfeZ(*pXuzzk{Ka*KTO zyL>PKeaRUrk1+Sz!8HL0xRRZTeZOjd2suEn$%+P3VhMi(U|9CkC39{O*Ax4`ZoD0H zfr8aW*T>aeaOT5mSf8pbUP7lmp*E&?7oER4q((J>r6hb;Kc=OS+eY8>xv#F6=jNpz z8tSTuEU7+vko>E=s*-?pN z40t@U0O|p`tT}qyv&@T+5c4$6!*kC!Fx&lY^cHjNKj{6gcNG+xD&)?L$!QeA&q}w^ zpX1Nd03MPwKOv#OoIjjD?}ku3&&51r)HyO_c=RD6_5QAjt*4a|`~f?hYEki=1~^uu z{dQLBfDQfy_zlRK%d^2eFr&kFKKuzQH~uJO^_&pC_6b?xuRDop8AA~yp7X#yD9`B- zBvIO*s&mjQjnu1f1no72ai(|5Vf;bwj+U-mJkTtv=qRdjF+k<gvEFjH9UU{nyQAs)Mq}mAaz?5K_e9rvtzXzA7gX`wBtM(`;q+r zc2ZR`>_`Ls&smOA5!ZV5u?eE5Nu3V;!cqw`@93aFK%`W|6yS1iWwgK-y|(WXaQ|HM zzO4QIsQniRM%o4W8%Xs$sFkx^3}MVq>_q(!$(retUGE&fidfJ&1@3pQEuDG0-OimS ziX3`@IjrxbbEX-L2tZh}!Gp#819i5MD#74pgOX!scuCM;4DpmoB37PSmNHrFnDI$1 z>+|Egpl65#o;Ir4EYA)J2)N(R1-U-XX3p+!tRE7n-hD2E1{fb84i34vHac|)%#`$| zd!{eB9w0{?bH)f-Z5Yi@&4<^*JU?qAKL`-Ldc*0>YFqs~Smm*gqXepALmgMGjLkIo z&Lr%JCbKOF@*-wnfkqBTycv(+P50WUY7C#)F@L^eXu)X;tX z1#}%}O4iRs`1RwPpFW-49@(G!!7i?NVOlU(>uY}hO`ASXMsh2 z(S07(vd)0TK^ZDk!s+87LTyTS5b0X7f=;(&6<{0p@})%HXKN0utb^Udz9kmEx4&mI zv<=?vEa(QVBpIN&V=v^Rc!e)+=hh#_036uRL0ERDODvk}@{ui!!L>t!DG`EN(BJqz z^)bt{s|qtf0QU5TTZ9DVWI&KMdq7WZQK8F|rE*y{F2M6a%d5LpQeP^mbia#|x0Mwib>jiy`gxo1nV;PO| z%uC0H@MsNHvIz20^94I94If&t8+TFf$eoGe3*z`JAtCY5pavUB<0HqiO~$qSK9^GD z6}9bjpfGiRgQaY`YUd@8Z^^~){}75rn^(mID2ql}{Y>a7eYUdH{%cI$rY7IRkq@l0xVfPX zk;~Rdg@H5t(iE|_;$!?=I&9buc{QMaRMG7JP%tE zMurPnU!D?f5ud*Vn|hG~usj_L-9W$md2%zM0iu~e*hL(nSU z+f!YyR}U53jAg7WwduG{MX(5-Rf8CHQ?x2xTLc%V)IJ>Wyi2y z5&DiuyL;j)fifQo2xk-j-pYQs@p|9s7uHplh?tkP)9w8+U7n!iGLwe+b&lnN{O)hN zmVM9q;L4(i5HE7}vYfDND)r^NP5g^u4mFPE!vr4#A;zsP6zy1F@pPDrdId`t@|9jOLS3y50OUr?A23FG!>eoMB>9@vVNpJbw%lUoOP2o#A@B^nFFMbDk2A)k$Ao=f9HdrQb@fwkZtX~+VV+t z98UaDMroBc!0$n57(ZrOEnCJlp*Xs(^{44~tzhr3reDMZ zR0N4TqUZUS{`0$E-e`vjx4t}Cmet0Nf5o2R7oh$B{By&jObb%UMkG8)oBI0t4nto0 zMpT9^l}MaX0oT4$LWDPDOV2i8lo-NHz@8c=cUbetpHLpFUn31xbl%})TgNymA`k%V zwoOoIEZenCahKqVD*t4%<@yZOmb>_0@IK_tdiV|EYR7zS6pZg6OvR4s=3|MRqq`G< z*9ND5QBc;eM$3WwkZ)ZS;ePEX2f#qDC&k%z^tnKjt^_8xooeItMbpAN*9GsBPu}z+xxVFm-ZDv8M?1 zgE0WJO2wBi(MM%Z-h=VvN!B_^o2xI@8)EVgkP4O*vfK0)G^|t22+n9@7d@C^%q|6| z#=_T8K{|SE$k%Lj+|=ra#KHuE4>L~ST4#ONo)1wB$$o$g>QXL-ObzeBFz80Em>f zCD?9z_G2-ceS9P1D~5Q6Rq;DB@CdBhtROqoY0yDXAy@_#f?QA`*!^1}Kn23N74Jjr zyKEm~aazDluy01v$zkg<0mbzKE$zQABg~A^4}@3HYgZj(E0k#vuxhM$E+*(Exfzq7OB!7?$? zQ#c;gvn5KF{s&&mUlXQT&;ByaLt~kkR5?5YbG*>~2xg|~bqXl?^UpueKQpt1>u6(J z>q(hZ5kyrtsCsV6(7Tq+*_hq1p7iz@uuhG7##KokX}Rk|glVL$|=rKOSX?wBng z-QC^NB_J`<4bsif9nuWUFz?piec#`GJm2#k$NMK7v-j+|_O;hO&vl+_Et3K&Ho6{T zrd}`uvo!$7Hw}HMnG!Txv}n+0Fv*KvCb&wc#=^9Rl6al#&%}|10ja+#Szs~N$oxda&_afy7=O*i z{5e@~@J9RH`e%;YV)4rC(nb$;Kb7snLgsrStu%nmw2iwCcH~IByvgnI_SRPZD}mte zGmi^=m5_1U1YWnVxlCh)CTjNsGGrT&w3yR)!_#K`#~Mfs4(_}N#B{tw=v)u&k+^lWgITN z-?0#?a=g2G6zL%m?-0#t)%=(`suX%U?$%3|PPlYvm4~nA6=k#|dy;;*5f4DHYupOx zx&1ngc_%x*|E5XnCklRaBpYXt834q~5$j8h4cN&l~fsZc`dT zU_PPt(kdpJQ0QoD#nW@Vg*|OHvoq$Bs0tBQ!VBC$#oV&c@lNt#ex-g^*Slhb!-n#$ zW=qP=$$6VBnHqYl9@k2*DP}clPrWn7GZ$d;@Z(y(vi;4!8VMy5)P>SsUWrp`}h&JkRGu*T@)BWJD#yN4Uym*0Wrm;i3K!Tk3wz#k2YME@Cq{cm&t;^{ zor%2X8)t72C9)d!_du650|L|kglVV3h|(DEK?T6L8<~T8f6NyD3F6mPNE<=%yx{Eu zci`40N}Qrf`_IgL*gMwsS>pNLWBT<=etJ99TZWktIJQ#V4Ph3d0*U+ENlvgtKueM<$yCa+UDcfLO6umGi9$vrSwyJ(2B>C#*qggFJ zpPtZ25`dQNAjQZ=8N7*X{gF(IvMERwZG%eRDl!7FoZH72iXVz^879GLtNy$2sJ+7X zULFoJRr;)+Ba}VcOsl~#1Fp4U_(0l2fo4C}t}C_gl#eg4Z?3>#=bIvl1Kw3hMyABl zHM;~{Etkhqq3VXPN=htoa;4KX#iY=w$1^gpgAq^`~I8orha zYfTpCPZ1lnoProS%Zr*i9KVZ^($wI}%MD7R8+_IT~)LdFyNZk-4Ef?AW@?mwLjTUul;)vV4~XD0no+EJ?2 zOrmuu%oSc8+xnV#Ts1f;?=!21`|HeRJ7Iu5Cb+XimfH5C;h$ej(g1OhIo>ReBBA7zh2FJEhDO+pRQo+~wNLT8;s^J$rKWo8cWqQ61{opqro zQhZxXlZASJW?OWwEbirT;&QqZ#!^diYI`eGK#*$6Y^0DOsRLC#=Xv>s0*tgGPcgos zymRJG9_LDTsQ!v>jw!YqM&{1o0Eq@;cg%tg7c!sWEw$$#q~a6hi^ot`?jQ4O63LYm z391>*-iI|VE%*f5${N?#2nn&3jwIx9Hk1?^_0L3Bn)Sc2ftAs@3OW!CrM#mBse5>) ztg-GGL)sk*rk#i7tIXA4hpybqC7sEa<~jApmJB!KZQo%pV=+p5reo)}0f*s|qa4>% zGlOk018s`Lp2F(ehLDWF?hnd-;X{c04Wb4QH}t5)xL_;!{Vf*b5692&V~lyabF^NG zqDsC_eeiATp5j1YYpWOamTn@y;OiaUi`Z%k8Bu%#`GA_ZqEqqhD#U+$tR*XQbEl!| zr_rwnN!IH_k*V!b`dKz`_|P_GjQ5M(OikZ81t0zEKuw5hS7D&<`q9<#J`0ZFGs_qj z8n#BY{t87!pd{vd1fCE0`n%r_U8bS;V@*i_8SjQCoABIr!pn5Js-HeZYBWJ9rc^}4i<&Mr5d3G4=+$s}H5+zw*frA|5o@!1ZoDi}g&0l8bE`!RZk{$uS0 z7Gm8VM$h${VZm%PShei6%@&VFgm~k)wU#!blw2ai$5{;-Zgz6C44jPhPw!mhTJ@3* zcBO~c4qwHvHAV>Qu)concweuiac%F1!K@$2KA3WK@Xg*QUYRUM%3zR7t>nfaa-ATJ(@ zO)B(3-i0e6uRmqCR>z>EpDjQL#vl`IWlAWq?AxnPG=|}y_6omWO^hvnkH+D+ZKK37 zSXYH{Y$P%t4dLb^G4iiVmY`pV|Fai^3Yf>oN7g_4x>0lIh#(i6jVd9!z= zLN(|N`}$r_?@GY4gm?t)AZ4Ki!F*$%PYo$r=y38)ZvtM{Y08H4kDB&&)UxPeuH^h$ zX|s1=;oQ8H8^O99m72VlXz^MYDxQ-U+9;{hiWzqM=`} zTg*sHz)HIcmX-jVS0(`dj*G}J-G(Vq%hAuMv?K27<0fs^<`SOrOyyp68c2Aii#YqT zk8W-7WNyWD1StjC2S+ifYdkGy9E!O_`C~;hE(sFn=7=_hux#(qsev}+Uhg`a%yS!9 zE0w(mO8^G>j?nrO%@6UtdN+X?T7j4OhTiwDXSjj0X5bFiMsmP&u%U33!x;I(|oI!npPZgo0gZLl7JDfOB{9U`ZJQNCR_}{(&)H z&}~1YysntwIcGP=ehd5gipLq zSW6@#H@gsqK~#ajk20gVo|_hd)z`6rr`_{}>lOs`l9&ULG2VeuwWD9&?`*>zL!@Ag z=&fqz1(?s%%=fSC-$|Aw5*7&X{y4KHT;lV6h9;IMabrP9qKy`-M|e%TEYbS6&grXx zd?nj&55Z!Da>6v2TK4KlMj4bG?!m(*&MIKB}Gj z9~9aw-p<8=d!@9aX@JZl&7kS0Ti_@vvs@wCbh`em)9pGBKdq9>q#PXn@TII#abjGF zSj90(VqA81c78*ru-DwI!=E6+!r!5O7zGU&$CQiHhISGjB-3YyLzcCLi z)e$W(+O@mthEczkQmXO`iHP?m;>vUkE3~ta%SLkaSY(~?SpYE{KmEe?qp{D=b77fq zYAHVzr7I5OQ=z3y!FP-ay_cpyaV1XI^?-x<4dy8ueoR3Ta>;9}pN$VjdyBE;QHOm> zJNzd940?FWg_n61L(LTvnHYLXe??7=3W>Q7u3v?XF;;og9Ng<%nG|+=F2M7{yS1b$ zQymKe!Vee_a|;&KLwu(p`PaEtuwNTYz>RY2wMHDo&PzH50}C%>HP-z1Cw_?+YXWAd zPc}e^(Kkyk5P1AC9G^QHwWzb2Zw;rFOUatvjiPRDDv-w4EW1b(w5d;xB_>XTqr4Vu zcr?orPE%;!o(x#)eRizoIGEMYh}a*LmDH7w7y#6wj(SH%64PB$J51`_wOvv{Z@XEk zOQ6`Ei$$7EVfUdOfmtal7YPp^KaY{e9iFAe$&B`qoFnnLrk%ft_A#--3c((1PrM_`b})7F9~B8)O~OZPjRod>A}{F_!b9>m66;{vp9A!_o-}7Ix@PT2 z0 zm>v$)Pal0JSA;wSVZA(+%e&Ihq^9F*lL%1?O?zy1Ev-nuwnhPKY<; zUtmAOZBZ}$Si#q4kun&SoSzMVeU7;K0Kp|W6;|q__X8C1Ja{krg14OKY8u_ltr)(XZ9`Zj-HX<&la@BX>o{)&TWCla zhG_o9u^b9<4&Syv%Ej4n6%M9l>ZwOZx;v^l^uD{W|RlMm}qP9-_K?L?#IbF`HxMqbeek4U$)n{rEqG|un?ctx(%(E!58 zxBm*u1R_T!L@WEH!TQO_&`qeILE~~&J+Y;BZw==UcfH@GFDPS@FHix0M9@q-X)iG~ zFlWyu1DUm5AEZjPpi$Rgo7s<>fXl*3ui0TkHOqP5=26)IV!7iT(mGysR{cM@jH@>o zy3hQhUGU^rSx==4z)lL!m9Wc!b-wZtVGTFeMR>YPCY<>uN$^bmt?O3!<>9HL2MDqqbEn9*o!|;AENL?fN(IsC(b^sb=94aBh7y6$at#eKa}V9Xe}CB zaQcQ9oqj4f9$`e)<+?tXdL3h?Eh62BJQ@KWU&IbNk=)|Aeqb@}UyGH>e>feP(#hGO zoWy(dictLKJ4cSl-xc*Gc`y4ej5-H@+cVm4GBg(W*!Sbh0RP}m8hFg^C#EbT9u}Bk zRM7*QpArU>$oPHf5wLeszb%}Z4(3RSpVPky(#8`0=@MQgjYcE#z#6NWYUR%`w|5tz z*U|dS6KKtfTLJ8IxTZAl@b7n2f!{H$p6>0pOO)dsj&;^FqpOJ)XBx-`UjNATs?&c5 z0O^B09xjvvO9;r5&nj_vzo2Qh38ibl%$el1Xm6%j=%}s@R&ke3F85ac7t6_`VdBeH zgAm-FucNvOIl0Fz2KSnU3kYDtpL-7lBYz?TKG-z!Mc{H0R^NWYc=!YpvEzBQG9LM{ z>bv5nK0x|-6r^Y@AVmW*)=S@`S#-k>kiuLnA#nW*g1?V$)|2PklSeDxz^s*&nH(4A z%uLJ?^KD-;@a>*@q;w3W-077I4pN_(${S#t31`<1*e<^pu^t}>j|X0)-YUtGd^Jnq z!4U<@f=xU~wN7Lx$W?xNi;XH^g$EaSkfw@F!gYSxQxZG413#KCK1;Fv>D#Ma9o=qG zaIK}qKjZ$9aIELE_t?2wbylI^l{+pZ<6z`1;c?5+3&DJ3ikYVPM%9}E-QC&^Mu6Td zjB9lE>Rp8s>c=iCYnZL?{C_<#2XvgmTD7V&ux_ zm?_AWH3Aw^g>qP~cR_#fN{>BT4Na4i>FGji;kN=>56_=wni6|6s=RN1OVoF63kFZ( zexg93p6*;YYw>AFU90zf?y#m=G|!Qf4Msb$mwBBj_g8d7HA%FEVnn;i_w}DrRouoi zKulNEV&R{Df#st*d!$#KBXGlplPlQ0+tV4|1ArqT#8$^iCafICilP(w0F2L1AH5;7 zXNaV>GDp@9^nS(k7^PK+GN!!FM*MPc?=-jD$N#c}u86{wrZIVL% zRVbViEFl#vrA#L!9<`9;I-H2T>50tuJDQrIV4_<*)*f$s7O+dcM>;FjnI&7N*HkAd$Y! zx&CD?<&!P!F>u3{?tGI&%$rAK9lBeKlGl`gyr-qtcZJq!$5TqPF$@?!I*{W5gW*H}rgAC# zMTp+YqRv5dj@%uvRm}xA_7PcM5D#UJb8`X`EbBZOAEO~V)mbwT7#`ceOgihdYAvGl zpQ`SWlprt^>fRksJgu0GjLsU^{KF=be4_D~yFVKc0oRE;CQ*Q0YTnn5e ztJD21574|AC@h7;(dq5#RFtM;&5}i1AC2dCZTU+GhQb%}&Cp)?Z7Y-D`AEEdo8Xa$>^6!gX z)M!@?vQO4MDHuCb_l$T{YimdDyQdci`HhI{-(s_!g?kyBk)Cgs0qRX}ZC9Cy${(_d5}N?m1saA{Vj`NJA65lbug z+tT?X{*sO#4OW?&r#wad{7_#Q&hQab80@-QrY5siFyyvga`68TJpT)K0{`EEr=-Y# z0neLN(p!b*2V0-M$2vz0Y-H^@syP3iz)|VvODbk&lmqIvf<$gGre8PQN+aUIU)wTa zyLk~tGL~EhFE<6`nTc>4!jr^K2YBLHlK|`f0)&8C-w)C8_yZ!@fRrox3RG8?%)fV4 zuLw>v_>0fK$Zg!jwT7Wa=xQUY?40JMO$L=uBi{Xs6%TxSCBPIQ`2dA3$+^fJOmZr0YW_wNibc3xH>NuE^VLIcX0q zy03M_oN0=EJ-Gp^Ob7Hz4z!*dvpfHjM24tCMb%Y5DP~R;G!VKK%V&NUQqNkO_;KV+ zuBhYJ}tHXNML=%L%QZ3VJisK}nSMk_%+y*CRaaETdGKhY> zOWf@`(VmZt)?Dd$_yzV|e5U>}*4hQT(xVrd7W0>y;SIN-LQ>7V2BtIz*j~}`MD8yL zRy#WO4Ktt;GczL>4}*GtzRGaJLMlxkc}<_6U_bB$eg$2Keu@ve!k-WqtPUIB$@yhK zb7MuwT8}Mt(%LRQ76+Bjo8AeEjOpTE4oZWmrBL~&}BmGL_%SY8j%7=)}!)A6v`n^_RkqXh4ojK;m^T!8Xr?;TY z0cb_tWnhe6qUvUEFa-g!xs}%GbGaMsHo7&{IdzWlR`}C^1rLJs=WDO_UXjAmM%tYv zEBjvkQ$`{kwp6WK*p?Sha8HG`JK$68mmmKD;LnGR<^KTi&6oS5t1pbHuXkkxWaNHKp-fEMN2a8Brd8+?n#9 z3Z-XGa*f`*Mw)C%yQP{c9{^Mt|y`eyr<0jb@kZxC`Wz9rvK6(n3 zSeOnx3||?%J!ejC4AL8Eh#O%m`H0tte%&1iBMMTUo02|Pn1z1PgyFKhydGBmTqtW` zo>HR{BfMf$AZ%%Hy$-o6w54mwHe!HI*7z?HkL2*9V);<>crdUzQz_m@{ETgq3{sm1GkCMmVBZ=~0Y@&gc4 z#|Bv_9Q(tEg-=B%CrlNhQG?cv^*0_SvJ~PD8Oaf-Ou*#-M8}upM-krfREL||JlF2s zNeacxSrG*&z2(NG9)#6JP4lS&w~`lKc~c`>aQDN!ng2$;TL-*VyW;>&zRq7 zwKBzl$;JpA=S*|ubbZfod zi_e~p@tfZfm(r+FRH>5f_DH1!=4qX`=oi~C&|KXK$<0_}JnhS>4gr+4sdAq}y6(N} zbZH7K1SmpG7X@k%=e5cx@u3M{pRKLqMJ+>jCNZ%+QaX;~VqG#XcXHE($6NJ``GMPj zLeO#cgfM+qV9v9S2B-kXm2qam=z+l%Ez7{xK{koOoL-0v+>3*3RNtaQXmJW*i+-=$ zL11x{7X^>)`0>!O!D)9bto7tCzvy9`87c*&=KpFcr%cloCll~LO}CF8sD=*gbRM{@ zIW#snFCR4QyC{uhFsRxZY0&b6V^6N})^qVTUzyi7q{(xEjg$EZ_);FLJadX@W?qZN z;j)P=lSgR)LjZ$2!dDXa)V-C;Q&5l$9D8PXu zhmCgW&Ig*`6@jrwgs9FoW`T=^7u?JmeOQ70?I2d$*yQCN{QPk&d;D{n{A2mUl|Ti^ zo36(n-sQTwVwWV8((%nl2;IEhBdq9lfl{VO-2JPfSb-|adEUC)_%xg5j(5yAby#Y7 z{9hGCKw;C6jkj&eHX# zIY}3+r~aRYlrQMVdgreYrQ7{ut&w+s_CG>YMV4Y*$SG4d;2Ly`$0z(^E)X0sQo2{4 z9xK)NvO>O-y365sAhY_9KXy>GEVZsRHQx@k%cG^+XR9RT(q@@)Cj;(4)ppBJt;fEz zE>KDUYrSM>IyG`es7_Wae>*>yd{rbNOZ(j2z0pnZgb#3UY)l%8Zt7JNJpL~8Ke7pt zt03S&goU;BY>l@)AhPf++s+GlW2|U7=Qy|_P0KG;WX1kJT7uVK_m7rr#;5hg19A7J z33iS4a?AzMwKmd2&Fz#MO}50*K}OWg?~w^#)ES9jmKF0Vj~_g#JzZi%1IR^Q^- zOw#>+y4VPz3b@#+zK{zJ9eX1s(nfLQFR_D^-pRg(ecuC$j-PFw&!_wZGA6E=cq>{% zN#~M+3wVO<8?{H@#-A7aQ-$gu=oNii5H9XxQ;up5pd7g{eHnVyY8R669Z5oPUh=)T ze=kzxQ#db~i&5kDtj7+WuJ}%L$V)eI>c0fbPtDh1F*2cwVz!s)$aWR`jx`QT1vH9? zf=oJ<<;bCE;td{_+)O!e6#o09sVq-Gt~PkIs-)5}FVtMTc20AfaXE=9q5K>dnY^{d zo!`@Ko(Qry;gj6|QeUd$W96w>a_jc{U5N^bGC?{C3M^Ol3jjEYZq>Pav?=gX1UPPYq8FT` zEJ;Y-nQ>{>{-mdNWqqPY}u_xBo*>yixyua=gF14kI2xZeEIDk0ho2 zKXspXcQ2f#4nj?qqjYP-|4K3mx?&hlYaqc+O_xZ>L72g>`z>bAL4l`&oJWv1Xj6Qv zzVNt%P{=RvJlBzmO0z7uJKe(peFgTv`E;rRnK*IB?kmQf|D%n#gQvZ-av5Gof7njH zQ#b{a?&7@_lFAScBcBR0v{a&}?=LaZ`@eEv7m^$nP$wexMvnizn&{6)uumIIU3hm` zACpm#(M@w09>UL3>?qR*8JT?Yx=LfK*4Ke3(^Gx38J{Jw!@@en4FtiOzz4LtlGg(( z%D7drV7m&qgD_z0VBeub6n(mg!R?heAnv;O)p8uZuD&VG|LH~->mXJMYVB9z=Jc5p znsF<9q<~H~>7dy7j-lxco=(dcg**NCK^b}>$KrH@BtQ{HJ$m^z$df!eXzzt3u!ZV; zs333Lw?(pAI_C8N-UL$Eot%2F1DvC6r-VvFtnpq6se~CkQJsz$? zH{LYk!b^G$e-B~0=iu< z%$MOUun6~kk3b$g-s*uyC`(y6;;wSLKcvh!X>lyg%alelrXZ+ETLrpw#7+^%l$pg6 z(ihI@z-kXD81Wv86XNiEk%7yM^&2A{p|E! zQfj@?*2l-nyTSf}&9H>GEav#nDO=;FH*MG!^j{@iqbs*_;V&TuB%!GiUq*O)M?lNw zw)iv=G4~aMU|j4BrXqFxtkPTMJ0Shd6O{n;3DrK6K?!@I)oD!;8DU@iX58r2b#C&j zZ!xXlEZMsiQF`-VnI!S3juTyzqOIEcrw5V7j3Z$`V_L?cGy`Q$P#Scx6=nOyHPurU zwk~B{OO3B;XV4H^VYwA_%!n&Xr)7|%`LSE=C`Ih>bK~FcXPPZ-Ws{z=iWunM-A_r0Op7QfDOF*j_m#E%t{z_Ma`Ubk@lRj;lb1+ij>e}~ zdn#^S%JdL+0xqw->OCq%N7TzuZi9ZnI)%y#* z^+7@D*iF#tdc!o0mB_G1NOW^2>}yXCk8tF})6E>75B3`yiMgX@zb)#xY{tSQTbFMA z-_bFRXQan(^bQX?t#7P1SUp5UAdz0P=JkA5YN2#KmeB1xV==RDR-8 zbJjnZXs>>6HuL#__&=G*%UL=4g%h@T&q*&{$a}cxA{E#P4nC3!#BH0yn?|L= zBD#%+%x9;GF+fD=@`>s!PY`OjPw(*aCq*bt^6PwnDIMa3rr&vbBKO^{9B#axD3qvl zQ@F$}ihQwK$ME^K+Wa=6Z0rh$m5R9>a!>S~Vs)d$!Fw<-;Je$I(tpX|O?;E7U`A=U zvi&1|FsX2poa@>9yu^`(^yw`H+Lg=-cSBF^x|&%qq2?U((Khp;b4ZqDwbii%8P8^=yYsuI~4=LM|{LZ1a5Qpe9Sr@GXf9 zs^TIzvCXV=BPfk%OuVx^VC(60taGvrsPx&?`}-+3F&!CcF-DTQZt{C{s|Hrzn|y&N z`f(${>dtP`$m$VokQtJoz(P>x*Y9=r94LQ%qn?6WqKO6Vd&whY+dz^(|S2C#kN#qu%CGtOJjD8P$41XXp(<38(@bo+C&ElfGah6BgT3|h~kJuDtB~n zc90W#Dt_-7{~t!t3paX-t83v&hsH`GBm31~CJ8M9X`y@O%{^0Ne7Rr5Sz6Z~e*+M4 zXC)FSL)O%`;Y`ZHx>kc7Xy5F|BfyPi?rO(3KPFc(_&@(iO^lZ8J$!WmN5vEek{Af-&gW36^FoyYJbF*cku2Ao8+?KBqz zHYXpLaw8DJn*W7+a9usS7?ZJv9#D_na&+Ds*S0&dke{v%arS)=`J{F95eV@7du6n! zI=Sr|Y1=0)2>zZlf{%E<`^OJv`Ir|_%5vZI;k&OI@R)qwvH`sh81&-j)xhi&BXQxl zX#FYM@=-@%U*E6^qT2Xl%q0O%Ou?Dsn=%QRmKl#)>v@X6TqCVvJ9s3iMceZVkzN~~ zh&13c1Yo?uKI3Y20rTHE@uyM+7dXj{5n`r~D~(Vc6_nvCIiD#x&3Em0)-q4#g9S_7 z>1NU6vJ_@owXZ&jEf`0#U-rOwGmP7G?E=>IgxBH)`1KQ1z$wGqHc(xTP<5-d53TnT zN77MQC!wblCM#%{sEka>Ygse)b)2 z;;8GohQRGa->k1A^R}%RDJXB1+|j~CDYI4_V)(occv1 z<2)uqW)7-9n7f>lM~K_MVj4QES|xsA-c}j;!$Gh|8hY(Q_{3H$js!JPfEkPjgFgD2 zJ@huiwlM&0B?zp!x{3fhqNu`Jd1Y%P!>oe2oP5@mir?QPar(gAqWSt~mNdS~1Y$gA zx`N6OjIhjxj8Xynuz1M98=(;i(Qe%-*6S3w@@eHJa_Dj-U14^Ur3m$IRQsykWLT5) z>Wf!m%$2&Co^L&{5k>hcQ2M-3@L-E?L!A^Zef*3XfMs`i4=y_RHY1gh$2%Qy1P4O& zcE|^|FqH(hWqy57VeD$fLltqY-8F?&fw?)@t7CY^Kvu!c~L#X1{dZdwwE6`S@eZ7 zr(s@^k`<#>`ubWVTvlQgbgk`6mr_5wzsFU4TvzTosl!+-jnXm zWUny-R4%B3PRuAgB;hP8C+%PNC*@81nR;ZRkflB-^?1R5C%|kqLAaNoe)vtxZ9cGo zo|AEkRLjoHxs^Uv{1)<#T1kjCmFva8P0fs@VsiO9B;Ps3VvQ{dHBsJ&^)gfX!zdIf zJvB%sS}$h%yF$)T6aGgKR!=SwX!eK#f=}XzjiJ4=dVW{I{?|l2SfgaT5@kADXx?$2 zOPT9u8}+ab7I6v|o173eIXZ1F;s6;fa8rRD{R8Z_dC0pHzw1xMw{f|sGc9QRaoGz> zpA$=xQP&GuipGV`h+rO$)xaNIXPmUSFCo&$6)M7@*J*r%saEkKKd|m+P@%4F?>% zlzJTkYu!~s>iJ%EFZK<0(cZuagfDp?c`fwhMVweGjlY80f$`C&re;Uyr$$j{!^3jqinY^H_g`!Uu*`V_J+l5rA$`p zJ!fhhUNf|&%hP~K5i>-;Aq3b?wL68GoG$A1@Wq|6kDQHFIS)U;&;iC`2&VXnidQe6>)IQLTvJLdUx$fYV@O?k zdOf`<&dE78-|aOt^!x;eMwyR5JCEqFK}+v2py!a_tN9Magn(YS%tj zF>Oo(?2B4@LGGoW*E=iby&)a&xHx84UI> z!)j+Ow8!>iua#VZo_#vo0x1@qLeLu`9qZ2TH$jEALuLYTUx8xD+t;T~5^^P)uiJrT z)##m+bI+>VFzmgZMK9s^J>8c*zkyB*d8QV85xvL=dygVln#@9e`vSJLU5~7i>GD7A zC55xU(3M^{&xSS08ssbTO}&4oq!^5W;~kHYxwcgX74bjnAsvHk(^aS2(1eJC?Zrb~ zMJS&gfgQjF`xB#erlL^hmFWMRkcf2vi<$Lz3jSNmyWY&?yE`LN)6-0g#n^7Q{W+!3 z&G)Fd-(9~MB`{gBd$6?|9!DrI&oe2WC=|u@KyTl=nv4w?HdI+Zfw#;gx}tT#56 zF2(yS)^mareO&vO?bU{?HbstC#QxlkijIhs%{vCF>u0>C;OuwD;*sha-z;Du-G$l0 zi=;1qMR%3UX7cTHovZ60uWat>oau~hdy_amys-@D8Z&$A+8k?1`q0b`Ic4jAQ6YGO z%2t6+9u&Su#II^G2;bY7PLbj=ml?xu-U&g3u1Y#1nI{#x&1rf;S$ zr4bmx%{DD`IrBaiaF|=_O;V>FZEWVD1D!>$aInxm>f(O`VK+t?JFe8e*E?6i^Jl>N zizSzMofi#)uXchtfK*>vT8&GZ`$~gDwCcmZCl={ z%S)%_A9;rMo~LwMeAwf4T|2|gMkm7>X@^_LcySF>ssA+rRrdJTJkH!x=j{3SKf7@G zIfG5e`5oVk=JOjpzQu}nm>t1O@N4GTFyzkTHu#ll$ye#glG)5116?FhJ7VSa0anFm zltA)+n;}~;1PLk=+zGiYVZGO>{w(B}_>Ls^O*Of`*{_GVNakB`Qfo-9dL^V$i`ad{ zE22ktgtS6O#v7*Gh@7zP`gaeqRG{$(sRjtKu%oYtMZ&SNLj#nviS17VXo&)p;JD&* z>sRm=Sj_j_ITss+Sgh}v0W${@60H|lmadfg2dVeX;(q!>7B=^^-BCb;%HKiv+HocN zm#83xGn>j2SBtG*p*aF4OE4uitlIoz5S?gIS?{?_}#F|03wO*QE=!|w+3Br zxgZ(EyA!bwWnPW~0hdSb6H_U3(r4wSGWF~`SBGHBsZ=wv2X5P&?M|`bR0D)|4T3~M z^_LN>*8$oKgDSV_8~wZWj>YN_bzxwOuPv!JTqouC_i4Mi_>}huJTyw^d3_^!$Bk>g zC7NSL`WCCsD|>DPaKB4Di~HYZf*9Mvh#asZ_0KcXj(uxIZHPUErAvXs{+79R)-ELWr-A8&mm~VxM0F#c1YjuJ zV49>KzdJvY>(#5>w5(# zuds=9IJ@oY`3LLNAw$&9sF^y-+yZdo_*?^LKImExVIJ_RJ0mq2Oc{!EEu609kAGiA z4!Aw+w2xDeklQR-q_DYWPWDQ)#Vr1sUV)>3RU7_NqJnzEihn*ajOzHZk*pW<1ic!+ zMRcO&Lb^2597-#VB*0!-P_b4J#lqu+QODd__1G%iF%QIs5v8}rq? zE_-jLhMMp7L_{XNJ)|3U3pv3v7z}JO2T+Gc$Xgpr7l1cFG}bkzRA+OVVqj*HDG1p=3v z!hN0-Id1!+D_7hI&9zMIPl1)F|OjQcRw9o}0#7@aGrkr}5l z&gd^Ieu;fDRLFn?Yktf9-Ei$$Stug8=M2Z(L0@sCZV69Aokt`C(4RHFjZ2~vH>%G? zOyeCl`V?%H%_-6I(qL^B=X`A~cbCUZKg9AWY&l~9!!%8LYi?k3p|v%v z$B@c>ZbO^P98ay;6D1SErV$s#6{GN4n)1lo_Nz)7?SMlc2d30}GWhsQ zmrt&SDya1yN*m+Q1F&8jtK|T0@0mEQB(Q7r=6yJFsX2cnx4*m9g|SD5Ex&!(qRM<= zx6lZngj=L642@v6=1I1xYme^;LkGm-fe8kZ1~1Se&(>PqKPQ~U7Po)Ireo~&K)52{ zDix;RF~hd)*~62@zZKA|#7~b@ zfW#LETAFNF;S%>Wy4P~Q#vJxvV6jq)guwj68Q}J1dy*b?O~IMog^wBQAa~~#{I8Ur z!9~}^R8fB#f2hzyeY;=|D8*7r>4VIWv*m+|lXK1_FFn`|Rr!`eUMb8cKoeK#0;Am4 zTa3j^sumFWbU9OdapMS`Ki6>zAw=2FIbp!%O+N+QK<|U2-oQCxb;ev0MD_mb-%c9&$nRGBg*EvYdb7|Prdi0v zJzdK2lo2AE_Y}M-Pev&mT)jHjW%`c6w|$`*n0e~fFDY$aJu7zv9eUBRx9R&-J=EkUjNt*8~mFxW*rGJb&*= z$O*#~9>^xeJ${2NZud;zBBT#Yh6?~F7i-<9?C*|;_e8(Nq@D0&di_jNE7Lsg2A0;B z4|SRmo2h~qGlpKsokC>E(sMAUP*5;g`t%Fr&*N{qPm;216#wuHIArP{Zbt5m%5KgC zXf$8qyk z*F*2=3<^mw-ZN@9YpI?vYPJ5elYvIOSAUdTe&uts;1}tD#;3pk_-F8bg##MD|N9T{ z2N=AuTvn~^W`rdBqi_6TA0pC_sQVOV=Jeia*$?r&&q#|Kxj_M2f2G4ZNGTcq+u*Gu zP+t(O7uA-T8Ie_Lb|lI|e7uus^kO~shx3!mI(oj3uDZa|tX-J44DAi{Iw1Fee{HXZgrDvE) zcWLVqQpvkKT{x4jBGh1;3Dm#Nk_Z-OBWp`S%bc$ z|6aIHCBY3oM0XNi2O6&r zF29!$OYEO}nH#ydfqYe40w(CagzuGc|8p5P!C%w$sT`L#s-sMtSE>uX*!xUP;M5!q z0z$LmJ~9}Q189sJkn9gpC)LvI5dKB1j$fcUI4p)v%hgd9_AAwSN}p(9%mTcqX~s=K z$hSTI+Uz6jl3p9f=Z1P2DjHMI{y8@Pnpg3gI(#}-{-kc&@m6Af{F|T^a8FNu5c`A$ zE6I6zSiWZ!V}dpHaU3P~jv5cp>5i$--N=KJ0v8P?=w9+UA@5nne6R8&Kp`kk#0jfi3U`PDDqM`$xa$qCSah}> z_Bv`gOL}3ad+kW{pV_12hM@zutEqA)mehX$&mrx3lN#sc4r$Oe%9~tPp$7V&gAHlqpgtQ@$%GD2>&)NPw z(S3}TMr&X506h-|j#4Er9AzuH?ijGGpPSm`TCQC?kzCP}=LoG+Tm={sW+DmL>i%bc zm-Gpyi(1ttW3x6t`WnjG_@IU%q{dW!y3!>3S+YWNd$KP~BjM(OBM%@OX~NONJ-9k4 zc`Nx-zzG=j!@zy46ZGF_db*iM4w0CDLT)~tEo4&|o68VrshJ-I29{|)WvmiD7>S@e zlF#-(mi?~<0$fTqOFU>Y z$JkfG|6!woHfxvu)yA0g+^mXstctV)@VobmZ|Bq!X;iQX&@!$5Du% zP~PK_>n=W_$erIiJq~RK2S(_sPLd#EP>*G-&YG5%mWE259zM%ftI)~D>_`swn-ZD0#@S){Lc`zU#~^F9F}BFt)YOD_3k7mayb)u^ z$BAK>4IepqCTnQ@eS!`CmI>Sn1Cx;rjPO#FzPFVbj}%RAdr#Ln4Ni%<`{-%c+0VA% z0Ag{)m2Vh^;)%yj#Gh63haQ-vixQx$oHwyKym`3h*{GXK z7mpX&89K7wweGoq*-kRz=fBv+acw^Bq2pHNw9vGjHgTdkxd3^JjeQkKQGlct*G>^$ z!;SmCeOrdh27Jt7e8v$?)ab({PzmL9;3Czh_FBr+rgTY%KkX=wFLzqTcmmhtL^1fD zZff;^t^=L@8391U_Tc(ouD=ARUF(XMMiwtCxLZ{UUd(qy^u0PgFL@ERwf#!TlQyul ze}7cmWFDAH`Rc&#^DD?LLMqEVur^)VwW$K{Nq&fp{B`gi{m#{3tS8to^eIdsn0vHl z|BYI9!+m{a`W3!+LQd?P&;2mdyb3NheCX9%BD61E93F6AMmW^0$-CNSlge3~{#h|m z+DP=sdPf4IaVlmr*r>w5+E@U|N2)}3<^3g@qqKwZ8G1BD=ohO7JL@-!XQE};8Tz3Y z+9giQ71&*1#lJ={uVQ@B#^q95ar z?kGzpxx3$L)VTXF@%y3`ligsBEaH4enuCKw=prw&@5hhD!Zavv3g*l=%=RctTEH#u znirb3XCG#VYE-Ri-KKzE^~h+dv_GqP0hJ$1759;eyGD|Yd#&Y|<$b}FYd#3M+Jlc? zeAC6vQFsyT{;p{?AhrBgf4kmo`;EGl&-Cbp$}*7fbaKYk%Bx26srT}=JFH`<*L(2z zf-r%1@&-Xa>RJomt~;n5e_*mOLK~!CWOrnK|5G<1G$$#4uwetx%24SBU!)6OZfv%v zR;SfmpC_2#%V8U|T0$gDyc`Ux8+u>>GWFp!fxs4FcOsx3I*|uQGw8YKJ*|?hmv8bo zV?2{TJ=qF5?fXQy6#2-E&n>E?`99(RsZUN$?(2K<^3|(Xo#;&MyW7oM65Vj~Yarm5 ziBlD_dh6o6333Uf8$Kd`gt~)EIoTD)9YDZOL$0Wxy~H{oXMNj;ddN(+N=ARYyEliu zys~7gkyn5`mj$hyR3AcEzLUhx&9}9m9L{l{mG(aCNFuE9`06NeCujX>V?a*!PR404 zvQ$qN;!%d)w%!=8bA=rG?1pjGeteq|nNpVUsC{!z&Ab!16#Td+E^~B=UWn96?S~tA zQ9%7Ju3w^hH-2%A*#q*FGa5>xZJ&stx(8}`U-{jsavQEh)fQ;fEr%y2BFidU=+u)( zx70N7Kj_+h*j5Nx5SO_)ht&VUH*{#c z5UoFoaa-sEt<0~=pMqJ(K{;3S{KIUhJ z5-!G6BCq%9T-rP9F6dp)PgRya$L_9x3|UvpuFis(22tm?0}EVFfB5dMz~_#xQBkJe ztSBIGp?dOcO|O2<<68S%uJkWynDlP%wZ7G*zOx%qe38~<&8DQO-x$PYnoBGIV759S zaqGFf1j1wCm!zo{qD-gAi9KugtGU@Lq2-5{bG9~ceP*K-$B>Jf5Z2<&pa7*d(vD!$DOT`oht!8y2&Z1D|WjwBCz@4IyFy)Y(AwLUel zH|~>*Q5Iv=?m=<3F_-79HD5;HYUkZu zB$YVKt@oAb{=9tebmzTCKD;5{knR0-*)bU=Kt%Q)!G_!~JMcIComE&4FFSn-4zg*d z1=L`AZ&2P`Y7TJ(ni#(}DXDJ01n1S?Id+r6rUs5SPgc?ddiR>pU8}ADt-DRo3(=j~ zKyHDPrL?_lla_G41axQf^$|eoU7z$mv3l=_{^j}3qWf~1YtMu0Kfw$wd#aQAT?!u} z`C8{|>0cTKgDYG1Y=7-fwf4k3AlZVn*nZFk{;Fu?Ix(*O(Kmy$<-z!Y<`!9+N|#su2o5sIr%lKTRjtJFk%j; zr7`ML>sJ+AI4}$*puYYQ`EoDi;X*`Tn>F=f7Lk_9;1~H0LwFNj8n8c5zgapl$2UXt zIek|0Bv{32t14UK6CmBpJWWJle#SE%G|%kbJ!|$xso)b1C@ z+0vX${E}raE6KU{{xiRr_54{;r!94hRmQZ|w#~PSThJ7ra(rn_7WdD#L@w5EbItGK zNR!&y&R2o$ETKC*h|IW;frz^#a!DNyIGZFGi_A%gSSM=%0L;xxsdyjLU2()!2(bu0 zg2}CQj+p<+Lwl_W!oahE+_wHoho2}aJb38{mzW;_7xtb^VBJj1lkVz6nOkjrWi*eT&8Ssi7)DqvQqbA>Nre&zuuIvRrvmCZlAEpT7@Axu3_!Z2sr zr9E&}5zYc)ou6QFg|*tj`iZ|s^5h2NRMyX%M zydDeRu%*84>{6Fef}7vs@rzyA%yDQFr4Mi}9ByYCo(NA*%wXi{%i(gr^pfWT@H!`& zckIA-&OblLFAzzsSHT>E{Co1!lg>0H%M+>seGbna554pMe34Pz`~VC&3%5n1le&LZNmyUr z|1&e3GW&Jn>_ML-CWJ-m_q2x62mr<#6JxPnFbAo(Fv;^|a>hTxQ4SCRkJ%jM&Y1UWHkUCsb~i61J-nZ?r8p=wOgI9-~(NFT3o8g`1fj6 z$^2Yw|e2H68Zq8 zA}R4xwnBV-Bd7W1NRP^kC0P4smnL>m>~8{H--vQM8?{go6*^q0OhI^ZCl~`1D*W=9 zEd?hLCX!-9Qxy1sk;wfgeNLN;`6cevVG3^c0ZH$Me30P19U-9zI&>s|Dq<5y0$u60 z_#wB2q&YqIVfGbueO2eEoP%i@k{xhy>(xc9{(87jGz0IoF^^8lX{JzRtfM3Pa;-NF z^?vW=rl0oh<4XJ5+$}q)Y`U>qc9MSJntt$|5PPC4tKVTpe(UN+Z|?fO{O#Z6)kUR;S2ma*L9MwRJe<{%U*b`TRaZFwU}bryo7APTEx=WC;T5`4hJbHI#LK`M12TO+qUP4JvboU*Cv zA`#iEdcCFXd0Y26N$4GHVtu$j?HiuNXNapoc!!^P6IpJK zyrIN#9*{(Hx6-&?6RCL%kGEXYl?MUqc1@R&C!^Q={E4FpRY)BA53m1@+uC2-JCjsC zZil5E6r%M@ZLMcVp5o!@P|Ta5{i$_JN88>%E1qvwW$2Asq)|`aIy|eHfQE&ZHvFh% z!B#B&Vb!>7fmklBxINzjbSRR>orZ`Kyw02foEup}aDN-Qqk3Or+)2j=CCDd$#Xd~F zmCpD0Av?W4$Gg>Y~r{#B6d!b7vz?(F$BpHCRn z&=j{h3;$NticXKTlAc(kzdm{3+;0O^Fa0Q<4_jr>z5aQqQe+YkT@wAi-HGi4_G}~_ zE2!ygXzF)-pg`ROy27*po6oRva(2wA1=;ETLmv3#wOqRFZ;Nb8$d-0wA{eL3mRg8n z->rcM7p^p$#zzsLJa!~2X!i(l6mah|EZX<`4kRialb5eIfXpv;srPh&bs``Vemc-O zM42#;<=luFyNXP2B=N=wU4iV5Lqzq_$FXH%UUN

`(M!S{o ze{OlKSl>$rmszcpOPUAv0`sfKXurG2=gzZxg!7_gHlo6 zd^bsvFLBS*k~}S)yH--KN~q_B&sqqScY=d_a6XmnKhr?hfTRLt56$-t_iCe~#t1CDRv^j)Sv-yKS$+1)xoO)(WY=EK&LU;q?XWmU~p5wz|o8T{uj7Ac`EliAc!ud`MPQcl@ ziIHgj%I5k`PpHSeu8vcpx7%x2+EQ~{TN`bI%t5$r^2=gN2a=N#uI`%AnOsi`ho;8D z@Pj?&rJAJh?uk!v4SDL7Va6YF^zYr)QA-zQgg$;)8kr(67{_ES!t*^tl)l@tIs(k@ z*y1c6yHok>lc+HbkJ-FQP|-CiV5ftb$%B98dj?L3-I-*rzX#UZ?*`E31blXtU;Z37 z)7A0tj*`CaIytY#7#0>Gr@E4&zUZ{^3_d(hi(8nj&sO^FH*2nL{HJ0}Y&ES~QFdnz zQVyP}xk1=~CfDH^ZvMKfotq%WcN#u6Mq_Y}FSzQ6YUs%((X^8p(Hi-thTQ+6#ln`^ zk^@}%@f&^p^taXwrq<++fYytb=UEK%f=XuyAEEVTaBJz?FSV@~g9GTTq zEMd#na~TsCe421}Ov_|sHO)^Z_o2fR$Gkbf{B3KgrrqzZ&eR~>LgE+1T{M(55K3I| zzG`EZrZ%(~9BlWxW+Eyr3Ol3(W{3qnl&@R=B1rMQl4>IE=1ZQJOF3gQ1_Jbdzc+&@ zt((O4c(6T9BwRnIRv$^VoqyWy^szlZgnOY`9*d}WccVK%5C(Oz95W`$HOlR(*2-T) zR?t=^7l4haG7rnTZ}SZ$HQDX*7;8vY$pK0ljxt&`%i<7!mMoOOMz7q> zk~^Sb@tWCf+ixdNUmSevkdqBl^3^p$?H*$Hb#RJTcgtRi=MKzp^EOJvIA?JPJR^6@ z_JKAZpkhIc-&s1}@H2`qpZPz{JlB70MS;R0jfi@}!ONoq#Dh|tpI5}1^+bV~eZ5ey zM9|pNg?!U?Dp6X{imqjx4t!&gBS~oNNb3d14b98PE|xBN+G_g^!6x6AorQVpxec|w zqR%9BR$UxM`P|35kx|_FMul0Lr26sxv?HTB@MuDjlqUwi-`i5`hD5C>ebpm`CI3{@ zm2;6o07i?PRtU<)ctbnqtVs#AE~RQU?YA$rN`&yBV@+MtmU4+K*1LZRv*nZ9RcI_s zQWBnW=MHk7V)!-Zua}5%$>KouL?3J*XaswFqn{k~sX{q)l9W8iH|7f8oQDf`x8?^bJB#61M>^C_{8Hw?wD?g1g z$Hq*kxRBDDqfrsxO6{p4RMa6@_Dx;G0QHog{YL9_9yag9r6I_n%W*>F7 z(x-HaG>$a5j-S@eomFnQei!BosYY@lpKInDnI%t7_MlXvOEj{kySmjavpp6@qrp&e zFUz>J*L!a_28e$Q4G??vi3w;j?M=^zN@82d=yR^dds49%)4H*N8a?x|?<$SPj!4`J zQFwI7<`|0toOsoB1=Ptwc)XStpPE~CGyb7NZy7ZN-Ru>uL9RaPS2I3YPtlk!k@T}9 zopRHZ!idYVnF5q18X75Fct;m0ur0X&LCe86yv`H+)r({9Ff1r7P;j{Dm+Re0iiia% z)4|4lg`@Q}Z;u<5_0ZU}5WHuH-Y}=X04T9O>kdFSOYKD;Fd2+Jr{;>5@EWJApjowC z%<75;fuzVx{ITX*3d|H1hrlZe;=_sW;MLA+C5B99%58Q(UvnrDvoKiR6;F6 z%Gd(r?X7&~ghy^A1Md*)kL-jy6i%Kz7B$f4+#8RCYOeiEqGR?ifMJKfPEVt|u|1uP zC~N~|rFgI$)n>P`+o)7^k80=xGpNx$Ge3}o8uD>m?@n9dTqqsL8$O|gOG~@|9G02^ z%e^Z!frYdv65W*x@y-x9?6DIK^`}-CQ5lizv+uX>rw7K~hr;Z6`Qtr#!l?fmIax|d zOBhkIk@?xqT$hGrAV+i>29~zE^#ugQn34~KdQu)4&JCo|7$o|h?x#B4hPy{pVesv+ zV`9hwy<6xwCmkkms3MKf$pynu7(${b>%eI&UKp>MsOL@l!=%+EQQRza8Iu~;G917W zTTd*HKMzeVXz|7VJ+>CbHAk^&@J4)BW z3K=TRpJpx8Af`p!^mBWlI9`Fd z2l2<(#)Wf`I~EFco_BwZbPxSQq{H_+hyCj7O<~9PObb~I4*zuc=MmZew5Jx@Yj;`` zk0df*E|ob0)3iMqfY@Mk6Ig|JBZ9k-;5NKZV*9rhUI20T@G3)fD(82W9iOjZXM!+P z>vT?FP}`6O5z;m+3j;qWq2*0CQ#uzZqDVgLXLS~Od6#h>`#EW2$R!8?1DG5L-suwH zJW(uvUGN{fVujo)WoUWw!l@p;`Y3*4?7rqMtY%wf-f8VDZ`08w@gMVRYGc5V5Jb>^ zyKdG6dF} z8)yaCG9?P`8l1~oeLd4{8AbqQn@?`)Zrh2m!fe8%wkd3AB6|J>B4X tb7M4Tn$7-(=>PZMznRs)*L5CWlQ>Sq>xE@a&tPGSy7Dun%10Kj{||Gt>jVG* delta 112632 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 { From fd0aeb5b536bf2af11107b2b895387955175729a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:05:24 +0000 Subject: [PATCH 0450/1256] ... --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index be28150285807..bd06569fbef98 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ The following switches changes the default behaviour of phpdbg: - -v disables quietness - -s enabled stepping - -e sets execution context + - -b boring - disables use of colour on the console Screeny ======= From f4523640609690faf2495022be15af50c06efdd3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:29:54 +0000 Subject: [PATCH 0451/1256] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bd06569fbef98..f9ae87718ddcc 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ The following switchess are implemented (just like cli SAPI): - -z load zend extension - -d define php ini entry -The following switches changes the default behaviour of phpdbg: +The following switches change the default behaviour of phpdbg: - -v disables quietness - -s enabled stepping From a29c0e5c96be3d7414e8e541e1d3e7376f12cdb9 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:31:29 +0000 Subject: [PATCH 0452/1256] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9ae87718ddcc..f6b67040d95d4 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Features Planned ======= - - Mocking API for Server/Request Environments + - Pass JIT Super Globals to Userland (Mocking, Testing etc) - Improve Everything :) Installation From f566a6136bbd4fd4f3afeaeccb666bd7806562b8 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:43:23 +0000 Subject: [PATCH 0453/1256] additional list option, class methods --- phpdbg_help.c | 4 +++- phpdbg_prompt.c | 26 ++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index d942ebeb61117..b887380d0722a 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -141,7 +141,9 @@ PHPDBG_HELP(list) /* {{{ */ printf("\tphpdbg> list 2\n"); printf("Will print next 2 lines from the current file\n"); printf("\tphpdbg> list func\n"); - printf("Will print func source code\n"); + printf("Will print the source of the global function \"func\"\n"); + printf("\tphpdbg> list .mine\n"); + printf("Will print the source of the class method \"mine\"\n"); printf("Note: before listing functions you must have a populated function table, try compile !!\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 72d9023912861..d42e638b51997 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -547,22 +547,40 @@ static PHPDBG_COMMAND(list) /* {{{ */ phpdbg_list_file(filename, count, offset TSRMLS_CC); } else { + HashTable *func_table = EG(function_table); zend_function* fbc; + const char *func_name = expr; + size_t func_name_len = expr_len; - if (!EG(function_table)) { + /* search active scope if begins with period */ + if (func_name[0] == '.') { + if (EG(scope)) { + func_name++; + func_name_len--; + + func_table = &EG(scope)->function_table; + } else { + printf( + "%sNo active class%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + return FAILURE; + } + } else if (!EG(function_table)) { printf( "%sNo function table loaded%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; + } else { + func_table = EG(function_table); } - - if (zend_hash_find(EG(function_table), expr, expr_len, + + if (zend_hash_find(func_table, func_name, func_name_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { printf( "%sFunction %s not found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + PHPDBG_RED_LINE(TSRMLS_C), func_name, PHPDBG_END_LINE(TSRMLS_C)); } } From bb715ac77d6a83eeb9973037a087d32f872ba77a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:47:33 +0000 Subject: [PATCH 0454/1256] ... --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f6b67040d95d4..e9f7fbe4b5569 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ Features Planned ======= - - Pass JIT Super Globals to Userland (Mocking, Testing etc) - Improve Everything :) Installation From 4b2490426f46d360345d353b94c5b4a03c38a92a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:57:56 +0000 Subject: [PATCH 0455/1256] web-bootstrap example --- web-bootstrap.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 web-bootstrap.php diff --git a/web-bootstrap.php b/web-bootstrap.php new file mode 100644 index 0000000000000..c5802c1e3c22f --- /dev/null +++ b/web-bootstrap.php @@ -0,0 +1,46 @@ + 'localhost', + 'HTTP_CONNECTION' => 'keep-alive', + 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36', + 'HTTP_ACCEPT_ENCODING' => 'gzip,deflate,sdch', + 'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8', + 'HTTP_COOKIE' => 'tz=Europe%2FLondon; __utma=1.347100075.1384196523.1384196523.1384196523.1; __utmc=1; __utmz=1.1384196523.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', + 'PATH' => '/usr/local/bin:/usr/bin:/bin', + 'SERVER_SIGNATURE' => '

Apache/2.4.6 (Ubuntu) Server at phpdbg.com Port 80
', + 'SERVER_SOFTWARE' => 'Apache/2.4.6 (Ubuntu)', + 'SERVER_NAME' => 'localhost', + 'SERVER_ADDR' => '127.0.0.1', + 'SERVER_PORT' => '80', + 'REMOTE_ADDR' => '128.0.0.1', + 'DOCUMENT_ROOT' => dirname(__FILE__), + 'REQUEST_SCHEME' => 'http', + 'CONTEXT_PREFIX' => '', + 'CONTEXT_DOCUMENT_ROOT' => dirname(__FILE__), + 'SERVER_ADMIN' => '[no address given]', + 'SCRIPT_FILENAME' => sprintf( + '%s/%s', dirname(__FILE__), PHPDBG_BOOTSTRAP + ), + 'REMOTE_PORT' => '47931', + 'GATEWAY_INTERFACE' => 'CGI/1.1', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => '', + 'REQUEST_URI' => PHPDBG_BOOTSTRAPPED, + 'SCRIPT_NAME' => PHPDBG_BOOTSTRAPPED, + 'PHP_SELF' => PHPDBG_BOOTSTRAPPED, + 'REQUEST_TIME' => time(), +); + +$_GET = array +( + "request" => "variables" +); + +chdir(PHPDBG_BOOTPATH); From 25475ff95e1f1f30df22bc0d920692f92c199a2f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 07:01:28 +0000 Subject: [PATCH 0456/1256] ... --- web-bootstrap.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/web-bootstrap.php b/web-bootstrap.php index c5802c1e3c22f..fdb40f92b4388 100644 --- a/web-bootstrap.php +++ b/web-bootstrap.php @@ -1,8 +1,21 @@ 'localhost', From 6c5831aa09a85b069dfc0c9360547f960fb701e2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 07:08:00 +0000 Subject: [PATCH 0457/1256] ... --- web-bootstrap.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web-bootstrap.php b/web-bootstrap.php index fdb40f92b4388..e6bea6b7f4a35 100644 --- a/web-bootstrap.php +++ b/web-bootstrap.php @@ -31,14 +31,14 @@ 'SERVER_NAME' => 'localhost', 'SERVER_ADDR' => '127.0.0.1', 'SERVER_PORT' => '80', - 'REMOTE_ADDR' => '128.0.0.1', - 'DOCUMENT_ROOT' => dirname(__FILE__), + 'REMOTE_ADDR' => '127.0.0.1', + 'DOCUMENT_ROOT' => PHPDBG_BOOTPATH, 'REQUEST_SCHEME' => 'http', 'CONTEXT_PREFIX' => '', - 'CONTEXT_DOCUMENT_ROOT' => dirname(__FILE__), + 'CONTEXT_DOCUMENT_ROOT' => PHPDBG_BOOTPATH, 'SERVER_ADMIN' => '[no address given]', 'SCRIPT_FILENAME' => sprintf( - '%s/%s', dirname(__FILE__), PHPDBG_BOOTSTRAP + '%s/%s', PHPDBG_BOOTPATH, PHPDBG_BOOTSTRAP ), 'REMOTE_PORT' => '47931', 'GATEWAY_INTERFACE' => 'CGI/1.1', From ff4c0c9397d7435ab8462fedd3e89fe2c9e3c4d4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 07:09:07 +0000 Subject: [PATCH 0458/1256] ... --- web-bootstrap.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/web-bootstrap.php b/web-bootstrap.php index e6bea6b7f4a35..d50e1ead38025 100644 --- a/web-bootstrap.php +++ b/web-bootstrap.php @@ -8,9 +8,13 @@ * break ... * run */ -define("PHPDBG_BOOTPATH", "/opt/php-zts/htdocs"); -define("PHPDBG_BOOTSTRAP", "index.php"); -define("PHPDBG_BOOTSTRAPPED", sprintf("/%s", PHPDBG_BOOTSTRAP)); +if (!defined('PHPDBG_BOOTSTRAPPED')) +{ + /* define these once */ + define("PHPDBG_BOOTPATH", "/opt/php-zts/htdocs"); + define("PHPDBG_BOOTSTRAP", "index.php"); + define("PHPDBG_BOOTSTRAPPED", sprintf("/%s", PHPDBG_BOOTSTRAP)); +} /* * Superglobals are JIT, phpdbg will not over-write whatever you set during bootstrap From c00abb0e75628d2284f76098e43626266a440d3e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 08:26:11 +0000 Subject: [PATCH 0459/1256] printer commands --- config.m4 | 2 +- phpdbg_print.c | 29 +++++++++++++++++++++++++++++ phpdbg_print.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_prompt.c | 17 ++++++++++++----- 4 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 phpdbg_print.c create mode 100644 phpdbg_print.h diff --git a/config.m4 b/config.m4 index df127084ae843..92f626e86557d 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS="-I$abc_srcdir" - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_print.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c" PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) diff --git a/phpdbg_print.c b/phpdbg_print.c new file mode 100644 index 0000000000000..c167482b6f60a --- /dev/null +++ b/phpdbg_print.c @@ -0,0 +1,29 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include "zend.h" +#include "phpdbg.h" +#include "phpdbg_print.h" + +PHPDBG_PRINT(default) /* {{{ */ +{ + printf("in default printer\n"); + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h new file mode 100644 index 0000000000000..825316a965d07 --- /dev/null +++ b/phpdbg_print.h @@ -0,0 +1,47 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_PRINT_H +#define PHPDBG_PRINT_H + +#include "TSRM.h" +#include "phpdbg_prompt.h" + +/** + * Command Declarators + */ +#define PHPDBG_PRINT_D(name, tip) \ + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_print_##name} +#define PHPDBG_PRINT(name) \ + int phpdbg_do_print_##name(const char *expr, size_t expr_len TSRMLS_DC) + +/** + * Printer Forward Declarations + */ +PHPDBG_PRINT(default); + +/** + * Commands + */ +static const phpdbg_command_t phpdbg_print_commands[] = { + PHPDBG_PRINT_D(default, "the default print command"), + {NULL, 0, 0} +}; + +#endif /* PHPDBG_PRINT_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d42e638b51997..dd225d6dbc43f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -23,6 +23,7 @@ #include "zend_compile.h" #include "phpdbg.h" #include "phpdbg_help.h" +#include "phpdbg_print.h" #include "phpdbg_bp.h" #include "phpdbg_opcode.h" #include "phpdbg_list.h" @@ -228,16 +229,22 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { - if (expr_len) { - printf("%s\n", expr); + if (expr_len > 0L) { + if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + printf( + "%sFailed to find print command: %s/%lu%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); + } return SUCCESS; } -#ifdef HAVE_READLINE_H - printf("HAVE READLINE\n"); -#endif printf("--------------------------------------\n"); printf("Execution Context Information:\n"); +#ifdef HAVE_LIBREADLINE + printf("Readline\tyes\n"); +#else + printf("Readline\tno\n"); +#endif printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); From 83852d3bb775fd3555011e2cc1d5fdc9f418469e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 08:28:03 +0000 Subject: [PATCH 0460/1256] ... --- phpdbg_help.c | 2 -- phpdbg_print.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index b887380d0722a..21feb07926d1b 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -17,8 +17,6 @@ +----------------------------------------------------------------------+ */ -#include -#include "zend.h" #include "phpdbg.h" #include "phpdbg_help.h" diff --git a/phpdbg_print.c b/phpdbg_print.c index c167482b6f60a..d49cc26fcb1df 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -17,8 +17,6 @@ +----------------------------------------------------------------------+ */ -#include -#include "zend.h" #include "phpdbg.h" #include "phpdbg_print.h" From 1d373be4fbaaf9878c4acb1afb21647651dbbbc4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 09:26:26 +0000 Subject: [PATCH 0461/1256] updates to helpers --- phpdbg_help.c | 40 ++++++++++++++++++++++++---------------- phpdbg_print.c | 14 ++++++++++++-- phpdbg_print.h | 4 ++-- phpdbg_prompt.c | 8 ++++---- phpdbg_prompt.h | 1 + 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 21feb07926d1b..1a78c6928a925 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -19,6 +19,9 @@ #include "phpdbg.h" #include "phpdbg_help.h" +#include "phpdbg_print.h" + +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); PHPDBG_HELP(exec) /* {{{ */ { @@ -31,7 +34,7 @@ PHPDBG_HELP(step) /* {{{ */ { printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); printf("For example:\n"); - printf("\tphpdbg> stepping 1\n"); + printf("\t%sstepping 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will enable stepping\n"); printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); return SUCCESS; @@ -56,11 +59,16 @@ PHPDBG_HELP(compile) /* {{{ */ PHPDBG_HELP(print) /* {{{ */ { printf("By default, print will show information about the current execution environment\n"); - printf("To show specific information pass an expression to print, for example:\n"); - printf("\tphpdbg> print opcodes[0]\n"); - printf("Will show the opline @ 0\n"); - printf("Available print commands:\n"); - printf("\tNone\n"); + printf("Specific printers loaded are show below:\n"); + printf("%sCommands%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + { + phpdbg_command_t *print_command = phpdbg_print_commands; + + while (print_command && print_command->name) { + printf("\t%s\t%s\n", print_command->name, print_command->tip); + ++print_command; + } + } return SUCCESS; } /* }}} */ @@ -86,13 +94,13 @@ PHPDBG_HELP(break) /* {{{ */ printf("\t\\my\\class::method\n"); printf("\t0x16\n"); printf("For example:\n"); - printf("\tphpdbg> break test.php:1\n"); + printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on line 1 of test.php\n"); - printf("\tphpdbg> break my_function\n"); + printf("\t%sbreak my_function\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on entry to my_function\n"); - printf("\tphpdbg> break \\my\\class::method\n"); + printf("\t%sbreak \\my\\class::method\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on entry to \\my\\class::method\n"); - printf("\tphpdbg> break 0x7ff68f570e08\n"); + printf("\t%sbreak 0x7ff68f570e08\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); @@ -117,9 +125,9 @@ PHPDBG_HELP(quiet) /* {{{ */ { printf("Setting quietness on will stop the OPLINE output during execution\n"); printf("For example:\n"); - printf("\tphpdbg> quiet 1\n"); + printf("\t%squiet 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will silence OPLINE output, while\n"); - printf("\tphpdbg> quiet 0\n"); + printf("\t%squiet 0\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will enable OPLINE output again\n"); return SUCCESS; } /* }}} */ @@ -128,7 +136,7 @@ PHPDBG_HELP(back) /* {{{ */ { printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); printf("You can set the limit on the trace, for example:\n"); - printf("\tphpdbg> back 5\n"); + printf("\t%sback 5\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will limit the number of frames to 5, the default is no limit\n"); return SUCCESS; } /* }}} */ @@ -136,11 +144,11 @@ PHPDBG_HELP(back) /* {{{ */ PHPDBG_HELP(list) /* {{{ */ { printf("The list command displays N line from current context file.\n"); - printf("\tphpdbg> list 2\n"); + printf("\t%slist 2\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will print next 2 lines from the current file\n"); - printf("\tphpdbg> list func\n"); + printf("\t%slist func\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will print the source of the global function \"func\"\n"); - printf("\tphpdbg> list .mine\n"); + printf("\t%slist .mine\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will print the source of the class method \"mine\"\n"); printf("Note: before listing functions you must have a populated function table, try compile !!\n"); return SUCCESS; diff --git a/phpdbg_print.c b/phpdbg_print.c index d49cc26fcb1df..747789799f835 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -20,8 +20,18 @@ #include "phpdbg.h" #include "phpdbg_print.h" -PHPDBG_PRINT(default) /* {{{ */ +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +PHPDBG_PRINT(opline) /* {{{ */ { - printf("in default printer\n"); + if (EG(in_execution) && EG(current_execute_data)) { + phpdbg_print_opline( + EG(current_execute_data), 1 TSRMLS_CC); + } else { + printf( + "%sNot Executing!%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + } + return SUCCESS; } /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h index 825316a965d07..ae8453bd0ff5c 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -34,13 +34,13 @@ /** * Printer Forward Declarations */ -PHPDBG_PRINT(default); +PHPDBG_PRINT(opline); /** * Commands */ static const phpdbg_command_t phpdbg_print_commands[] = { - PHPDBG_PRINT_D(default, "the default print command"), + PHPDBG_PRINT_D(opline, "print the current opline information"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index dd225d6dbc43f..5fae1559d386f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -699,15 +699,15 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ return SUCCESS; } /* }}} */ -static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ +void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC) /* {{{ */ { /* force out a line while stepping so the user knows what is happening */ - if (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING)) { + if (ignore_flags || (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { zend_op *opline = execute_data->opline; printf( "%sOPLINE: %p:%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + PHPDBG_BOLD_LINE(TSRMLS_C), opline, phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -731,7 +731,7 @@ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ #endif phpdbg_print_opline( - execute_data TSRMLS_CC); + execute_data, 0 TSRMLS_CC); if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index bddc7f99f7da5..f9fd39dfdb5dc 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -60,5 +60,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); +void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From 7f743e1fca1773a8e5deaac079386c9a8b731601 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 09:52:59 +0000 Subject: [PATCH 0462/1256] ... --- phpdbg_prompt.c | 52 ++++++++++++++++++++++++++++++------------------- phpdbg_prompt.h | 1 + 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5fae1559d386f..a3eaacbbef6a5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -47,9 +47,8 @@ static PHPDBG_COMMAND(exec) /* {{{ */ printf( "%sDestroying compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops) = NULL; + + phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); @@ -99,9 +98,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ printf( "%sDestroying previously compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops)=NULL; + phpdbg_clean(0 TSRMLS_CC); } } @@ -184,6 +181,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r( &retval, 0 TSRMLS_CC); + zval_dtor(&retval); printf("\n"); } @@ -439,18 +437,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - /* this is implicitly required */ - if (PHPDBG_G(ops)) { - destroy_op_array( - PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops) = NULL; - } - - zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); - zend_hash_clean(&EG(included_files)); + phpdbg_clean(1 TSRMLS_CC); printf("[Clean Environment:]\n"); printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); @@ -702,13 +689,38 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC) /* {{{ */ { /* force out a line while stepping so the user knows what is happening */ - if (ignore_flags || (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { + if (ignore_flags || + (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { + zend_op *opline = execute_data->opline; printf( "%sOPLINE: %p:%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), - opline, phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); + opline, + phpdbg_decode_opcode(opline->opcode), + PHPDBG_END_LINE(TSRMLS_C)); + } +} /* }}} */ + +void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */ +{ + zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC); + + /* this is implicitly required */ + if (PHPDBG_G(ops)) { + destroy_op_array( + PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; + } + + if (full) { + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_clean(&EG(included_files)); } } /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index f9fd39dfdb5dc..2a4fa4bb74af9 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -61,5 +61,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC); +void phpdbg_clean(zend_bool full TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From 6cc7a5784eed6fe24e9fa4982d0c01cc463d8355 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 12:10:53 +0000 Subject: [PATCH 0463/1256] windows --- phpdbg.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/phpdbg.h b/phpdbg.h index 34b2e56a38cb6..83b93fe912aed 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -30,7 +30,17 @@ #include "zend_ini_scanner.h" #include "zend_stream.h" #include "SAPI.h" -#include +#include +#include +#if defined(_WIN32) && !defined(__MINGW32__) +# include +# include "config.w32.h" +#else +# include "php_config.h" +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif #include "php_main.h" #ifdef ZTS From 9e47ce64acb74509a1c396f2b234a1b474028ce4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 12:11:02 +0000 Subject: [PATCH 0464/1256] windows --- config.w32 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 config.w32 diff --git a/config.w32 b/config.w32 new file mode 100644 index 0000000000000..2359283998383 --- /dev/null +++ b/config.w32 @@ -0,0 +1,5 @@ +ARG_ENABLE('phpdbg', 'Build phpdbg', 'yes'); + +if (PHP_PHPDBG == "yes") { + SAPI('phpdbg', 'phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_print.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c', 'phpdbg.exe'); +} From 3168b7b0574eff976dfb63aac43822db493b721a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 12:38:04 +0000 Subject: [PATCH 0465/1256] more windows --- phpdbg_list.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index fe14b1dcc9e06..9f2c6a228600a 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -20,8 +20,10 @@ #include #include #include -#include -#include +#ifndef _WIN32 +# include +# include +#endif #include #include "phpdbg.h" #include "phpdbg_list.h" @@ -30,14 +32,19 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / { unsigned char *mem, *pos, *last_pos, *end_pos; struct stat st; - int fd, all_content = (count == 0); +#ifndef _WIN32 + int fd; +#else + HANDLE fd, map; +#endif + int all_content = (count == 0); unsigned int line = 0, displayed = 0; if (VCWD_STAT(filename, &st) == -1) { printf("[Failed to stat file %s]\n", filename); return; } - +#ifndef _WIN32 if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { printf("[Failed to open file %s to list]\n", filename); return; @@ -45,7 +52,29 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); end_pos = mem + st.st_size; +#else + fd = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + if (fd == INVALID_HANDLE_VALUE) { + printf("[Failed to open file!]\n"); + return; + } + + map = CreateFileMapping(fd, NULL, PAGE_EXECUTE_READ, 0, 0, 0); + if (map == NULL) { + printf("[Failed to map file!]\n"); + CloseHandle(fd); + return; + } + last_pos = mem = (char*) MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); + if (mem == NULL) { + printf("[Failed to map file in memory]\n"); + CloseHandle(map); + CloseHandle(fd); + return; + } + end_pos = mem + st.st_size; +#endif while (1) { pos = memchr(last_pos, '\n', end_pos - last_pos); @@ -70,9 +99,14 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / } } +#ifndef _WIN32 munmap(mem, st.st_size); -out: close(fd); +#else + UnmapViewOfFile(mem); + CloseHandle(map); + CloseHandle(fd); +#endif } /* }}} */ void phpdbg_list_function(const zend_function *fbc TSRMLS_DC) /* {{{ */ @@ -88,3 +122,4 @@ void phpdbg_list_function(const zend_function *fbc TSRMLS_DC) /* {{{ */ phpdbg_list_file(ops->filename, ops->line_end - ops->line_start + 1, ops->line_start TSRMLS_CC); } /* }}} */ + From ffad3fa2119346e6735dda266f705fae68c1109c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 10:58:19 -0200 Subject: [PATCH 0466/1256] - Implemented "break N" where N is the line number on the current file --- phpdbg_prompt.c | 116 ++++++++++++++++++++++++++---------------------- phpdbg_utils.c | 5 +++ phpdbg_utils.h | 1 + 3 files changed, 70 insertions(+), 52 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a3eaacbbef6a5..3040b80d2657e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -37,7 +37,7 @@ static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { printf( - "%sUnsetting old execution context: %s%s\n", + "%sUnsetting old execution context: %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; @@ -47,14 +47,14 @@ static PHPDBG_COMMAND(exec) /* {{{ */ printf( "%sDestroying compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); printf( - "%sSet execution context: %s%s\n", + "%sSet execution context: %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; @@ -73,17 +73,17 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ &fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); printf( - "%sSuccess%s\n", + "%sSuccess%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } else { printf( - "%sCould not open file %s%s\n", + "%sCould not open file %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); } } else { printf( - "%sCannot compile while in execution%s\n", + "%sCannot compile while in execution%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); } @@ -96,7 +96,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (!EG(in_execution)) { if (PHPDBG_G(ops)) { printf( - "%sDestroying previously compiled opcodes%s\n", + "%sDestroying previously compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); phpdbg_clean(0 TSRMLS_CC); } @@ -120,11 +120,11 @@ static PHPDBG_COMMAND(step) /* {{{ */ } printf( - "%sStepping %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", + "%sStepping %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", PHPDBG_END_LINE(TSRMLS_C)); - + return SUCCESS; } /* }}} */ @@ -230,7 +230,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { printf( - "%sFailed to find print command: %s/%lu%s\n", + "%sFailed to find print command: %s/%lu%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); } return SUCCESS; @@ -382,22 +382,34 @@ static PHPDBG_COMMAND(break) /* {{{ */ } } } else { - if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') { - phpdbg_set_breakpoint_opline(expr TSRMLS_CC); - } else { - char name[200]; - size_t name_len = strlen(expr); - - if (name_len) { - name_len = MIN(name_len, 200); - memcpy(name, expr, name_len); - name[name_len] = 0; + if (phpdbg_is_addr(expr)) { + phpdbg_set_breakpoint_opline(expr TSRMLS_CC); + } else if (phpdbg_is_numeric(expr)) { + const char *filename = zend_get_executed_filename(TSRMLS_C); + long line_num = strtol(expr, NULL, 0); + + if (!filename) { + printf("%sNo file context found%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + return FAILURE; + } - phpdbg_set_breakpoint_symbol(name TSRMLS_CC); - } else { - printf("%sMalformed break command found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - return FAILURE; - } + phpdbg_set_breakpoint_file(filename, line_num TSRMLS_CC); + } else { + char name[200]; + size_t name_len = strlen(expr); + + if (name_len) { + name_len = MIN(name_len, 200); + memcpy(name, expr, name_len); + name[name_len] = 0; + + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + } else { + printf("%sMalformed break command found%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + return FAILURE; + } } } @@ -469,13 +481,13 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { printf( - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { printf( - "%sFailed to find help command: %s/%lu%s\n", + "%sFailed to find help command: %s/%lu%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); } } else { @@ -485,26 +497,26 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); printf( - "%sCommands%s\n", + "%sCommands%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } printf( - "%sHelpers Loaded%s\n", + "%sHelpers Loaded%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); ++help_command; } } - + printf( - "%sPlease report bugs to <%s>%s\n", + "%sPlease report bugs to <%s>%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; @@ -545,13 +557,13 @@ static PHPDBG_COMMAND(list) /* {{{ */ zend_function* fbc; const char *func_name = expr; size_t func_name_len = expr_len; - + /* search active scope if begins with period */ if (func_name[0] == '.') { if (EG(scope)) { func_name++; func_name_len--; - + func_table = &EG(scope)->function_table; } else { printf( @@ -567,13 +579,13 @@ static PHPDBG_COMMAND(list) /* {{{ */ } else { func_table = EG(function_table); } - + if (zend_hash_find(func_table, func_name, func_name_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { printf( - "%sFunction %s not found%s\n", + "%sFunction %s not found%s\n", PHPDBG_RED_LINE(TSRMLS_C), func_name, PHPDBG_END_LINE(TSRMLS_C)); } } @@ -623,13 +635,13 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D) /* {{{ */ { size_t cmd_len; - + #ifndef HAVE_LIBREADLINE char cmd[PHPDBG_MAX_CMD]; - + phpdbg_interactive_enter: printf(PHPDBG_PROMPT_LINE(TSRMLS_C)); - + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { cmd_len = strlen(cmd) - 1; @@ -639,14 +651,14 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C)); - + cmd_len = strlen(cmd); #endif /* trim space from end of input */ while (isspace(cmd[cmd_len-1])) cmd_len--; - + /* ensure string is null terminated */ cmd[cmd_len] = '\0'; @@ -659,7 +671,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf( - "%sFailed to execute %s !%s\n", + "%sFailed to execute %s !%s\n", PHPDBG_RED_LINE(TSRMLS_C), cmd, PHPDBG_END_LINE(TSRMLS_C)); } break; @@ -689,17 +701,17 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC) /* {{{ */ { /* force out a line while stepping so the user knows what is happening */ - if (ignore_flags || - (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || + if (ignore_flags || + (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { - + zend_op *opline = execute_data->opline; printf( - "%sOPLINE: %p:%s%s\n", + "%sOPLINE: %p:%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), - opline, - phpdbg_decode_opcode(opline->opcode), + opline, + phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -707,7 +719,7 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */ { zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC); - + /* this is implicitly required */ if (PHPDBG_G(ops)) { destroy_op_array( diff --git a/phpdbg_utils.c b/phpdbg_utils.c index e3408ed47e7ff..9e39010ea0492 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -41,3 +41,8 @@ int phpdbg_is_empty(const char *str) /* {{{ */ } return 1; } /* }}} */ + +int phpdbg_is_addr(const char *str) /* {{{ */ +{ + return str[0] && str[1] && memcmp(str, "0x", 2) == 0; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 3cb430f0594be..464a0c7f90023 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -22,5 +22,6 @@ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); +int phpdbg_is_addr(const char*); #endif /* PHPDBG_UTILS_H */ From fdf26eaa0f7daaecfb05699e6012d140d1cdbaa8 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:07:35 -0200 Subject: [PATCH 0467/1256] - Removed name member to opline breakpoints --- phpdbg.c | 51 ++++++++++++++++++--------------------- phpdbg_bp.c | 63 +++++++++++++++++++++++-------------------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 4 +++- test.php | 2 +- 5 files changed, 57 insertions(+), 65 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a83e492809873..bd756eef67e3f 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -58,11 +58,6 @@ static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ efree((char*)((phpdbg_breaksymbol_t*)brake)->symbol); } /* }}} */ -static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ -{ - free((char*)((phpdbg_breakline_t*)brake)->name); -} /* }}} */ - static void php_phpdbg_destroy_bp_methods(void *brake) /* {{{ */ { zend_hash_destroy((HashTable*)brake); @@ -72,9 +67,9 @@ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, php_phpdbg_destroy_bp_opline, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, NULL, 0); zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], 8, NULL, php_phpdbg_destroy_bp_methods, 0); - + return SUCCESS; } /* }}} */ @@ -84,7 +79,7 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); - + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } @@ -97,12 +92,12 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ } /* }}} */ /* {{{ proto void phpdbg_break(void) - instructs phpdbg to insert a breakpoint at the next opcode */ + instructs phpdbg to insert a breakpoint at the next opcode */ static PHP_FUNCTION(phpdbg_break) { if (EG(current_execute_data) && EG(active_op_array)) { zend_ulong opline_num = (EG(current_execute_data)->opline - EG(active_op_array)->opcodes); - + phpdbg_set_breakpoint_opline_ex( &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); } @@ -206,7 +201,7 @@ static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* { if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); } - + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); } @@ -214,7 +209,7 @@ static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* { php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), track_vars_array TSRMLS_CC); } } - + /* any old docroot will doo */ len = 0U; if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", &docroot, len, &len TSRMLS_CC)) { @@ -302,7 +297,7 @@ int main(int argc, char *argv[]) /* {{{ */ char *php_optarg = NULL; int php_optind = 1; int opt; - + #ifdef ZTS void ***tsrm_ls; #endif @@ -319,7 +314,7 @@ int main(int argc, char *argv[]) /* {{{ */ tsrm_ls = ts_resource(0); #endif - + while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (opt) { case 'n': @@ -363,7 +358,7 @@ int main(int argc, char *argv[]) /* {{{ */ case 'z': zend_load_extension(php_optarg); break; - + case 'e': /* set execution context */ exec_len = strlen(php_optarg); if (exec_len) { @@ -374,11 +369,11 @@ int main(int argc, char *argv[]) /* {{{ */ case 'v': /* set quietness off */ flags &= ~PHPDBG_IS_QUIET; break; - + case 's': /* set stepping on */ flags |= PHPDBG_IS_STEPPING; break; - + case 'b': /* set colours off */ flags &= ~PHPDBG_IS_COLOURED; break; @@ -394,7 +389,7 @@ int main(int argc, char *argv[]) /* {{{ */ phpdbg->executable_location = argv[0]; phpdbg->phpinfo_as_text = 1; phpdbg->php_ini_ignore = 0; - + if (ini_entries) { ini_entries = realloc(ini_entries, ini_entries_len + sizeof(phpdbg_ini_hardcoded)); memmove(ini_entries + sizeof(phpdbg_ini_hardcoded) - 2, ini_entries, ini_entries_len + 1); @@ -404,9 +399,9 @@ int main(int argc, char *argv[]) /* {{{ */ memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded)); } ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; - + phpdbg->ini_entries = ini_entries; - + if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); @@ -421,35 +416,35 @@ int main(int argc, char *argv[]) /* {{{ */ if (exec) { /* set execution context */ PHPDBG_G(exec) = estrndup(exec, exec_len); PHPDBG_G(exec_len) = exec_len; - + free(exec); } - + /* set flags from command line */ PHPDBG_G(flags) = flags; - + zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); - + /* print blurb */ printf( - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); printf( "[To get help using phpdbg type \"help\" and press enter\n"); printf( - "%sPlease report bugs to <%s>%s\n", + "%sPlease report bugs to <%s>%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); do { zend_try { phpdbg_interactive(TSRMLS_C); } zend_catch { - + } zend_end_try(); } while(!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)); - + if (ini_entries) { free(ini_entries); } diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 8ce2edbe5303c..aa7c63092dfc5 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -68,8 +68,8 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "%sBreakpoint #%d added at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + "%sBreakpoint #%d added at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), new_break.id, new_break.filename, new_break.line, PHPDBG_END_LINE(TSRMLS_C)); } /* }}} */ @@ -90,13 +90,13 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); printf( - "%sBreakpoint #%d added at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + "%sBreakpoint #%d added at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), new_break.id, new_break.symbol, PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "%sBreakpoint exists at %s%s\n", + "%sBreakpoint exists at %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -112,8 +112,8 @@ void phpdbg_set_breakpoint_method(const char* class_name, zend_hash_init( &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( - &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], - class_name, class_len, + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + class_name, class_len, (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); } @@ -130,42 +130,40 @@ void phpdbg_set_breakpoint_method(const char* class_name, zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); printf( - "%sBreakpoint #%d added at %s::%s%s\n", + "%sBreakpoint #%d added at %s::%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), new_break.id, class_name, func_name, PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "%sBreakpoint exists at %s::%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - class_name, func_name, + "%sBreakpoint exists at %s::%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + class_name, func_name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ -void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* {{{ */ { - zend_ulong opline = strtoul(name, 0, 16); - if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline)) { phpdbg_breakline_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; - new_break.name = strdup(name); + new_break.name = NULL; new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("%sBreakpoint #%d added at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.name, + printf("%sBreakpoint #%d added at %#lx%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.opline, PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "%sBreakpoint exists at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); + "%sBreakpoint exists at %#lx%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), opline, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -176,18 +174,15 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; - asprintf( - (char**)&new_break.name, "%p", (zend_op*) opline); - new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); printf( - "%sBreakpoint #%d added at %p%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, (zend_op*) new_break.opline, + "%sBreakpoint #%d added at %#lx%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.opline, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -207,8 +202,8 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("%sBreakpoint #%d at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + printf("%sBreakpoint #%d at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), bp->id, bp->filename, bp->line, PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; @@ -244,7 +239,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %s() at %s:%u%s\n", + printf("%sBreakpoint #%d in %s() at %s:%u%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), @@ -261,7 +256,7 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ HashTable *class_table; phpdbg_breakmethod_t *bp; - if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name, ops->scope->name_length, + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( class_table, @@ -269,7 +264,7 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ strlen(ops->function_name), (void**)&bp) == SUCCESS) { printf( - "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", + "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), @@ -288,9 +283,9 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %s at %s:%u%s\n", + printf("%sBreakpoint #%d in %#lx at %s:%u%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), - bp->id, bp->name, + bp->id, bp->opline, zend_get_executed_filename(TSRMLS_C), zend_get_executed_lineno(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); @@ -307,7 +302,7 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); - + PHPDBG_G(flags) &= ~PHPDBG_BP_MASK; PHPDBG_G(bp_count) = 0; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 3eaa6e695e023..7636d8bf50cdd 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -63,7 +63,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); -void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_opline(zend_ulong TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3040b80d2657e..54be3aa3b4b6d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -383,7 +383,9 @@ static PHPDBG_COMMAND(break) /* {{{ */ } } else { if (phpdbg_is_addr(expr)) { - phpdbg_set_breakpoint_opline(expr TSRMLS_CC); + zend_ulong opline = strtoul(expr, 0, 16); + + phpdbg_set_breakpoint_opline(opline TSRMLS_CC); } else if (phpdbg_is_numeric(expr)) { const char *filename = zend_get_executed_filename(TSRMLS_C); long line_num = strtol(expr, NULL, 0); diff --git a/test.php b/test.php index 457e487db703d..06e855bfd3f6a 100644 --- a/test.php +++ b/test.php @@ -13,6 +13,6 @@ function test2() { $my = new my(); var_dump($my->method()); - +phpdbg_break(); return true; ?> From 277b10a5c059437754452b6de7e42aa6bde64e13 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 13:21:55 +0000 Subject: [PATCH 0468/1256] ... --- phpdbg_prompt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3040b80d2657e..6bfc16a70c65b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -615,7 +615,11 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { char *params = NULL; +#ifndef _WIN32 const char *cmd = strtok_r(cmd_line, " ", ¶ms); +#else + const char *cmd = strtok_s(cmd_line, " ", ¶ms); +#endif size_t expr_len = cmd != NULL ? strlen(cmd) : 0; while (command && command->name) { From af90b6d5c737646fa2b1f30d2f85a67fd8d770a7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:33:51 -0200 Subject: [PATCH 0469/1256] - Improved breakpoint code --- phpdbg_bp.c | 17 +++++++++-------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 46 ++++++++++++++++++---------------------------- phpdbg_utils.c | 22 ++++++++++++++++++++++ phpdbg_utils.h | 1 + 5 files changed, 51 insertions(+), 37 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index aa7c63092dfc5..43f5fa7882e6e 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -101,16 +101,15 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ -void phpdbg_set_breakpoint_method(const char* class_name, - size_t class_len, - const char* func_name, - size_t func_len TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_method(const char* class_name, const char* func_name TSRMLS_DC) /* {{{ */ { HashTable class_breaks, *class_table; + size_t class_len = strlen(class_name); + size_t func_len = strlen(func_name); - if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_table) != SUCCESS) { - zend_hash_init( - &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, + class_len, (void**)&class_table) != SUCCESS) { + zend_hash_init(&class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, @@ -128,7 +127,9 @@ void phpdbg_set_breakpoint_method(const char* class_name, new_break.func_len = func_len; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); + zend_hash_update(class_table, func_name, func_len, + &new_break, sizeof(phpdbg_breakmethod_t), NULL); + printf( "%sBreakpoint #%d added at %s::%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 7636d8bf50cdd..61d5004bf99a4 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -62,7 +62,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); -void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); +void phpdbg_set_breakpoint_method(const char*, const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline(zend_ulong TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 54be3aa3b4b6d..f12567c5ed04a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -329,8 +329,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { - char *line_pos = NULL; - char *func_pos = NULL; + char *line_pos; if (expr_len <= 0L) { printf( @@ -338,10 +337,17 @@ static PHPDBG_COMMAND(break) /* {{{ */ return FAILURE; } - line_pos = strchr(expr, ':'); + line_pos = strchr(expr, ':'); if (line_pos) { - if (!(func_pos=strchr(line_pos+1, ':'))) { + char *class; + char *func; + + /* break class::method */ + if (phpdbg_is_class_method(expr, expr_len, &class, &func)) { + phpdbg_set_breakpoint_method(class, func TSRMLS_CC); + } else { + /* break file:line */ char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); @@ -350,43 +356,26 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("%sFailed to expand path %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); + printf("%sFailed to expand path %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("%sNo line specified in expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); - return FAILURE; - } - } else { - char *class; - char *func; - - size_t func_len = strlen(func_pos+1), - class_len = (line_pos - expr); - - if (func_len) { - class = emalloc(class_len+1); - func = emalloc(func_len+1); - - memcpy(class, expr, class_len); - class[class_len]='\0'; - memcpy(func, func_pos+1, func_len); - func[func_len]='\0'; - - phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); - } else { - printf("%sNo function found in method expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + printf("%sNo line specified in expression %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } - } + } } else { + /* break 0xc0ffee */ if (phpdbg_is_addr(expr)) { zend_ulong opline = strtoul(expr, 0, 16); phpdbg_set_breakpoint_opline(opline TSRMLS_CC); } else if (phpdbg_is_numeric(expr)) { + /* break 1337 */ const char *filename = zend_get_executed_filename(TSRMLS_C); long line_num = strtol(expr, NULL, 0); @@ -398,6 +387,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(filename, line_num TSRMLS_CC); } else { + /* break symbol */ char name[200]; size_t name_len = strlen(expr); diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 9e39010ea0492..cb864c087ca22 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -17,7 +17,9 @@ +----------------------------------------------------------------------+ */ +#include #include +#include "zend_alloc.h" #include "phpdbg_utils.h" int phpdbg_is_numeric(const char *str) /* {{{ */ @@ -46,3 +48,23 @@ int phpdbg_is_addr(const char *str) /* {{{ */ { return str[0] && str[1] && memcmp(str, "0x", 2) == 0; } /* }}} */ + +int phpdbg_is_class_method(const char *str, size_t len, char **class, char **method) /* {{{ */ +{ + const char *sep = strstr(str, "::"); + size_t class_len, method_len; + + if (!sep) { + return 0; + } + + class_len = sep - str; + method_len = len - ((sep+2) - str); + + *class = estrndup(str, class_len); + class[class_len] = 0; + + *method = estrndup(sep+2, method_len+1); + + return 1; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 464a0c7f90023..d56e50479140d 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -23,5 +23,6 @@ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); +int phpdbg_is_class_method(const char*, size_t, char**, char**); #endif /* PHPDBG_UTILS_H */ From 2e14649c92fa441eb940093d68cd54ec2919b174 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:39:02 -0200 Subject: [PATCH 0470/1256] - Added check for malformed class::method syntax --- phpdbg_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index cb864c087ca22..b509900912dd3 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -54,7 +54,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met const char *sep = strstr(str, "::"); size_t class_len, method_len; - if (!sep) { + if (!sep || sep == str || sep+2 == str+len-1) { return 0; } From 5a3285ae99e03ce9a7d8003dc795553cc8ef389d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:44:36 -0200 Subject: [PATCH 0471/1256] - Cosmetic change --- phpdbg_utils.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpdbg_utils.h b/phpdbg_utils.h index d56e50479140d..f4eda3f18cbde 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,6 +20,9 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H +/** + * Input scan functions + */ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); From edbb1313a1f3f6ecae11a0d120db3c2f4c381f00 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 13:10:29 -0200 Subject: [PATCH 0472/1256] - Simplify code --- phpdbg_utils.c | 10 +++------- test.php | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index b509900912dd3..4ad75acd10476 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -52,19 +52,15 @@ int phpdbg_is_addr(const char *str) /* {{{ */ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **method) /* {{{ */ { const char *sep = strstr(str, "::"); - size_t class_len, method_len; if (!sep || sep == str || sep+2 == str+len-1) { return 0; } - class_len = sep - str; - method_len = len - ((sep+2) - str); + *class = estrndup(str, sep - str); + class[sep - str] = 0; - *class = estrndup(str, class_len); - class[class_len] = 0; - - *method = estrndup(sep+2, method_len+1); + *method = estrndup(sep+2, str + len - sep); return 1; } /* }}} */ diff --git a/test.php b/test.php index 06e855bfd3f6a..457e487db703d 100644 --- a/test.php +++ b/test.php @@ -13,6 +13,6 @@ function test2() { $my = new my(); var_dump($my->method()); -phpdbg_break(); + return true; ?> From 9c37190876e58e8209c59cbed08b672599c6b164 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 13:17:24 -0200 Subject: [PATCH 0473/1256] - Fix allocation size --- phpdbg_utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4ad75acd10476..e8a5dc634700f 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -19,7 +19,7 @@ #include #include -#include "zend_alloc.h" +#include "zend.h" #include "phpdbg_utils.h" int phpdbg_is_numeric(const char *str) /* {{{ */ @@ -60,7 +60,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met *class = estrndup(str, sep - str); class[sep - str] = 0; - *method = estrndup(sep+2, str + len - sep); + *method = estrndup(sep+2, str + len - (sep + 2)); return 1; } /* }}} */ From 803303057a4bf6353a2c760d9b42aa956b7ebb32 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 15:51:30 +0000 Subject: [PATCH 0474/1256] fix output from print command to show all breakpoints --- phpdbg_prompt.c | 58 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f93a34472040c..7ec8401420f46 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -271,7 +271,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ zend_llist *points; printf("--------------------------------------\n"); - printf("File Break Point Information:\n"); + printf("File Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { @@ -279,47 +279,67 @@ static PHPDBG_COMMAND(print) /* {{{ */ phpdbg_breakfile_t *brake; if ((brake = zend_llist_get_first_ex(points, &lposition))) { - printf("%s:\n", brake->filename); do { - printf("\t%lu\n", brake->line); + printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); } while ((brake = zend_llist_get_next_ex(points, &lposition))); } } } -#if 0 - if (PHPDBG_G(has_sym_bp)) { + if ((PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP)) { HashPosition position; - zend_llist *points; + phpdbg_breaksymbol_t *brake; printf("--------------------------------------\n"); - printf("Symbol Break Point Information:\n"); + printf("Function Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &points, &position) == SUCCESS; + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { - zend_llist_position lposition; - phpdbg_breaksymbol_t *brake; - - if ((brake = zend_llist_get_first_ex(points, &lposition))) { - printf("%s:\n", brake->symbol); - do { - printf("\t%d\n", brake->id); - } while ((brake = zend_llist_get_next_ex(points, &lposition))); + printf( + "#%d\t\t%s\n", brake->id, brake->symbol); + } + } + + if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { + HashPosition position[2]; + HashTable *class_table; + char *class_name = NULL; + zend_uint class_len = 0; + zend_ulong class_idx = 0L; + + printf("--------------------------------------\n"); + printf("Method Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { + + if (zend_hash_get_current_key_ex( + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { + + phpdbg_breakmethod_t *brake; + + for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); + zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; + zend_hash_move_forward_ex(class_table, &position[1])) { + printf( + "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); + } } + } } -#endif if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { HashPosition position; phpdbg_breakline_t *brake; printf("--------------------------------------\n"); - printf("Opline Break Point Information:\n"); + printf("Opline Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t%s\n", brake->id, brake->name); + printf("#%d\t\t%p\n", brake->id, brake->opline); } } From c43d5a558f8c4b73d319b6d65ddfc7f1bd3924ec Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 16:04:41 +0000 Subject: [PATCH 0475/1256] ... --- phpdbg.h | 5 ++- phpdbg_bp.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_bp.h | 1 + phpdbg_prompt.c | 83 ++++--------------------------------------------- 4 files changed, 93 insertions(+), 78 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 83b93fe912aed..f76e8377aceca 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -109,6 +109,9 @@ ZEND_END_MODULE_GLOBALS(phpdbg) #define PHPDBG_END_LINE(TSRMLS_D) \ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") #define PHPDBG_PROMPT_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") +#define PHPDBG_SEP_LINE(TSRMLS_D) do {\ + printf("%s--------------------------------------%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));\ + } while(0) /* }}} */ #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 43f5fa7882e6e..4e23add761c8a 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -309,3 +309,85 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ PHPDBG_G(bp_count) = 0; } /* }}} */ +void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ +{ + switch (type) { + case PHPDBG_BREAK_SYM: if ((PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP)) { + HashPosition position; + phpdbg_breaksymbol_t *brake; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("Function Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { + printf( + "#%d\t\t%s\n", brake->id, brake->symbol); + } + } break; + + case PHPDBG_BREAK_METHOD: if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { + HashPosition position[2]; + HashTable *class_table; + char *class_name = NULL; + zend_uint class_len = 0; + zend_ulong class_idx = 0L; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("Method Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { + + if (zend_hash_get_current_key_ex( + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { + + phpdbg_breakmethod_t *brake; + + for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); + zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; + zend_hash_move_forward_ex(class_table, &position[1])) { + printf( + "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); + } + } + + } + } break; + + case PHPDBG_BREAK_FILE: if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { + HashPosition position; + zend_llist *points; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("File Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { + zend_llist_position lposition; + phpdbg_breakfile_t *brake; + + if ((brake = zend_llist_get_first_ex(points, &lposition))) { + do { + printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); + } while ((brake = zend_llist_get_next_ex(points, &lposition))); + } + } + } break; + + case PHPDBG_BREAK_OPLINE: if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { + HashPosition position; + phpdbg_breakline_t *brake; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("Opline Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { + printf("#%d\t\t%p\n", brake->id, brake->opline); + } + } break; + } +} /* }}} */ + diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 61d5004bf99a4..d6167597f49bf 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -72,5 +72,6 @@ int phpdbg_find_breakpoint_method(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); void phpdbg_clear_breakpoints(TSRMLS_D); +void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC); #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 7ec8401420f46..9fd03b986c417 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -236,7 +236,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ return SUCCESS; } - printf("--------------------------------------\n"); + PHPDBG_SEP_LINE(TSRMLS_C); printf("Execution Context Information:\n"); #ifdef HAVE_LIBREADLINE printf("Readline\tyes\n"); @@ -266,84 +266,13 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); - if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { - HashPosition position; - zend_llist *points; - - printf("--------------------------------------\n"); - printf("File Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { - zend_llist_position lposition; - phpdbg_breakfile_t *brake; - - if ((brake = zend_llist_get_first_ex(points, &lposition))) { - do { - printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); - } while ((brake = zend_llist_get_next_ex(points, &lposition))); - } - } - } + phpdbg_print_breakpoints(PHPDBG_BREAK_FILE TSRMLS_CC); + phpdbg_print_breakpoints(PHPDBG_BREAK_SYM TSRMLS_CC); + phpdbg_print_breakpoints(PHPDBG_BREAK_METHOD TSRMLS_CC); + phpdbg_print_breakpoints(PHPDBG_BREAK_OPLINE TSRMLS_CC); - if ((PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP)) { - HashPosition position; - phpdbg_breaksymbol_t *brake; - - printf("--------------------------------------\n"); - printf("Function Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { - printf( - "#%d\t\t%s\n", brake->id, brake->symbol); - } - } + PHPDBG_SEP_LINE(TSRMLS_C); - if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { - HashPosition position[2]; - HashTable *class_table; - char *class_name = NULL; - zend_uint class_len = 0; - zend_ulong class_idx = 0L; - - printf("--------------------------------------\n"); - printf("Method Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { - - if (zend_hash_get_current_key_ex( - &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], - &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { - - phpdbg_breakmethod_t *brake; - - for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); - zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; - zend_hash_move_forward_ex(class_table, &position[1])) { - printf( - "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); - } - } - - } - } - - if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { - HashPosition position; - phpdbg_breakline_t *brake; - - printf("--------------------------------------\n"); - printf("Opline Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t\t%p\n", brake->id, brake->opline); - } - } - - printf("--------------------------------------\n"); return SUCCESS; } /* }}} */ From b6f5b64c6128a03f341ae991caeb66bfadead0d6 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 16:07:59 +0000 Subject: [PATCH 0476/1256] ... --- phpdbg_help.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 1a78c6928a925..476996535f971 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -88,11 +88,8 @@ PHPDBG_HELP(eval) /* {{{ */ PHPDBG_HELP(break) /* {{{ */ { - printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); - printf("\tfile:line\n"); - printf("\tfunction\n"); - printf("\t\\my\\class::method\n"); - printf("\t0x16\n"); + printf("Setting a breakpoint stops execution at a specific stage.\n"); + printf("\n"); printf("For example:\n"); printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on line 1 of test.php\n"); @@ -102,6 +99,8 @@ PHPDBG_HELP(break) /* {{{ */ printf("Will break execution on entry to \\my\\class::method\n"); printf("\t%sbreak 0x7ff68f570e08\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); + printf("\t%sbreak 200\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); + printf("Will break at line 200 of the currently executing file\n"); printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); return SUCCESS; From 6b3b14e8ddb86e7f5051c95911ff7d6ca1f7ce11 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 16:13:14 +0000 Subject: [PATCH 0477/1256] ... --- phpdbg.h | 2 +- phpdbg_help.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index f76e8377aceca..af4a76f384db6 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -112,6 +112,6 @@ ZEND_END_MODULE_GLOBALS(phpdbg) ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") #define PHPDBG_SEP_LINE(TSRMLS_D) do {\ printf("%s--------------------------------------%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));\ - } while(0) /* }}} */ + } while(0) /* }}} */ #endif /* PHPDBG_H */ diff --git a/phpdbg_help.c b/phpdbg_help.c index 476996535f971..8f8da951aa86a 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -89,7 +89,6 @@ PHPDBG_HELP(eval) /* {{{ */ PHPDBG_HELP(break) /* {{{ */ { printf("Setting a breakpoint stops execution at a specific stage.\n"); - printf("\n"); printf("For example:\n"); printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on line 1 of test.php\n"); From 1984919ddc3252c0f9b5d5d0beef10bdc4804091 Mon Sep 17 00:00:00 2001 From: Julien Pauli Date: Tue, 12 Nov 2013 18:20:09 +0100 Subject: [PATCH 0478/1256] 5.5.7 now --- NEWS | 2 +- configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 9cacb5fd1adcc..8331261607391 100644 --- a/NEWS +++ b/NEWS @@ -7,7 +7,7 @@ PHP NEWS case-sensitivity incorrectly"). (Andrea Faulds) -?? ??? 2013, PHP 5.5.6 +14 Nov 2013, PHP 5.5.6 - Core: . Fixed bug #65947 (basename is no more working after fgetcsv in certain diff --git a/configure.in b/configure.in index 7e444b0ac4a03..f25dc81c89be7 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=5 -PHP_RELEASE_VERSION=6 +PHP_RELEASE_VERSION=7 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index 2d98a3f80789a..dd8a0272d57db 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 5 -#define PHP_RELEASE_VERSION 6 +#define PHP_RELEASE_VERSION 7 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.5.6-dev" -#define PHP_VERSION_ID 50506 +#define PHP_VERSION "5.5.7-dev" +#define PHP_VERSION_ID 50507 From e8cb646fed5709f124d5b6674e71d1a36043b16c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 16:53:48 -0200 Subject: [PATCH 0479/1256] - Fix compiler warning --- phpdbg_bp.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4e23add761c8a..26cb6862351e2 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -325,26 +325,26 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ "#%d\t\t%s\n", brake->id, brake->symbol); } } break; - + case PHPDBG_BREAK_METHOD: if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { HashPosition position[2]; HashTable *class_table; char *class_name = NULL; zend_uint class_len = 0; zend_ulong class_idx = 0L; - + PHPDBG_SEP_LINE(TSRMLS_C); printf("Method Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { - + if (zend_hash_get_current_key_ex( - &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { - + phpdbg_breakmethod_t *brake; - + for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; zend_hash_move_forward_ex(class_table, &position[1])) { @@ -352,10 +352,10 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); } } - + } } break; - + case PHPDBG_BREAK_FILE: if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { HashPosition position; zend_llist *points; @@ -375,7 +375,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ } } } break; - + case PHPDBG_BREAK_OPLINE: if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { HashPosition position; phpdbg_breakline_t *brake; @@ -385,7 +385,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t\t%p\n", brake->id, brake->opline); + printf("#%d\t\t%#lx\n", brake->id, brake->opline); } } break; } From aee271ec0d30c332bed32b5eca1fdff1cb447eab Mon Sep 17 00:00:00 2001 From: Andrea Faulds Date: Thu, 17 Oct 2013 22:19:09 +0000 Subject: [PATCH 0480/1256] Implemented FR #65917 (getallheaders() is not supported by the built-in...) - Implemented apache_request_headers() and getallheaders() alias in CLI server - Implemented apache_response_headers() in CLI server using FastCGI code Conflicts: NEWS UPGRADING --- NEWS | 4 ++ UPGRADING | 3 + sapi/cgi/cgi_main.c | 4 +- sapi/cli/php_cli_server.c | 79 ++++++++++++++++++++++++++ sapi/cli/tests/php_cli_server_019.phpt | 46 +++++++++++++++ 5 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 sapi/cli/tests/php_cli_server_019.phpt diff --git a/NEWS b/NEWS index 8331261607391..de12f57afe2c8 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed whitespace part of bug #64874 ("json_decode handles whitespace and case-sensitivity incorrectly"). (Andrea Faulds) +- CLI server: + . Implemented FR #65917 (getallheaders() is not supported by the built-in web + server) - also implements apache_response_headers() (Andrea Faulds) + 14 Nov 2013, PHP 5.5.6 diff --git a/UPGRADING b/UPGRADING index 43e4118b21245..e95ac2a05fef2 100755 --- a/UPGRADING +++ b/UPGRADING @@ -85,6 +85,9 @@ PHP 5.5 UPGRADE NOTES configure this. The service can now use Type=notify in the systemd unit file. (Remi) +- CLI server: + Now supports apache_request_headers() and apache_response_headers() + ======================================== 3. Deprecated Functionality ======================================== diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 4c78fcafec08f..6c83f280024c4 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -1688,8 +1688,8 @@ static void add_response_header(sapi_header_struct *h, zval *return_value TSRMLS PHP_FUNCTION(apache_response_headers) /* {{{ */ { - if (ZEND_NUM_ARGS() > 0) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters_none() == FAILURE) { + return; } if (!&SG(sapi_headers).headers) { diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 1315a62b87010..ac8530afa8115 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -133,6 +133,7 @@ typedef struct php_cli_server_request { char *query_string; size_t query_string_len; HashTable headers; + HashTable headers_original_case; char *content; size_t content_len; const char *ext; @@ -435,6 +436,75 @@ static const char *get_mime_type(const char *ext, size_t ext_len) /* {{{ */ return NULL; } /* }}} */ +PHP_FUNCTION(apache_request_headers) /* {{{ */ +{ + php_cli_server_client *client; + HashTable *headers; + char *key; + uint key_len; + char **value_pointer; + HashPosition pos; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + client = SG(server_context); + headers = &client->request.headers_original_case; + + array_init_size(return_value, zend_hash_num_elements(headers)); + + zend_hash_internal_pointer_reset_ex(headers, &pos); + while (zend_hash_get_current_data_ex(headers, (void **)&value_pointer, &pos) == SUCCESS) { + zend_hash_get_current_key_ex(headers, &key, &key_len, NULL, 0, &pos); + add_assoc_string_ex(return_value, key, key_len, *value_pointer, 1); + zend_hash_move_forward_ex(headers, &pos); + } +} +/* }}} */ + +static void add_response_header(sapi_header_struct *h, zval *return_value TSRMLS_DC) /* {{{ */ +{ + char *s, *p; + int len; + ALLOCA_FLAG(use_heap) + + if (h->header_len > 0) { + p = strchr(h->header, ':'); + len = p - h->header; + if (p && (len > 0)) { + while (len > 0 && (h->header[len-1] == ' ' || h->header[len-1] == '\t')) { + len--; + } + if (len) { + s = do_alloca(len + 1, use_heap); + memcpy(s, h->header, len); + s[len] = 0; + do { + p++; + } while (*p == ' ' || *p == '\t'); + add_assoc_stringl_ex(return_value, s, len+1, p, h->header_len - (p - h->header), 1); + free_alloca(s, use_heap); + } + } + } +} +/* }}} */ + +PHP_FUNCTION(apache_response_headers) /* {{{ */ +{ + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + if (!&SG(sapi_headers).headers) { + RETURN_FALSE; + } + array_init(return_value); + zend_llist_apply_with_argument(&SG(sapi_headers).headers, (llist_apply_with_arg_func_t)add_response_header, return_value TSRMLS_CC); +} +/* }}} */ + /* {{{ cli_server module */ @@ -479,9 +549,15 @@ zend_module_entry cli_server_module_entry = { }; /* }}} */ +ZEND_BEGIN_ARG_INFO(arginfo_no_args, 0) +ZEND_END_ARG_INFO() + const zend_function_entry server_additional_functions[] = { PHP_FE(cli_set_process_title, arginfo_cli_set_process_title) PHP_FE(cli_get_process_title, arginfo_cli_get_process_title) + PHP_FE(apache_request_headers, arginfo_no_args) + PHP_FE(apache_response_headers, arginfo_no_args) + PHP_FALIAS(getallheaders, apache_request_headers, arginfo_no_args) {NULL, NULL, NULL} }; @@ -1300,6 +1376,7 @@ static int php_cli_server_request_ctor(php_cli_server_request *req) /* {{{ */ req->query_string = NULL; req->query_string_len = 0; zend_hash_init(&req->headers, 0, NULL, (void(*)(void*))char_ptr_dtor_p, 1); + zend_hash_init(&req->headers_original_case, 0, NULL, NULL, 1); req->content = NULL; req->content_len = 0; req->ext = NULL; @@ -1325,6 +1402,7 @@ static void php_cli_server_request_dtor(php_cli_server_request *req) /* {{{ */ pefree(req->query_string, 1); } zend_hash_destroy(&req->headers); + zend_hash_destroy(&req->headers_original_case); if (req->content) { pefree(req->content, 1); } @@ -1569,6 +1647,7 @@ static int php_cli_server_client_read_request_on_header_value(php_http_parser *p { char *header_name = zend_str_tolower_dup(client->current_header_name, client->current_header_name_len); zend_hash_add(&client->request.headers, header_name, client->current_header_name_len + 1, &value, sizeof(char *), NULL); + zend_hash_add(&client->request.headers_original_case, client->current_header_name, client->current_header_name_len + 1, &value, sizeof(char *), NULL); efree(header_name); } diff --git a/sapi/cli/tests/php_cli_server_019.phpt b/sapi/cli/tests/php_cli_server_019.phpt new file mode 100644 index 0000000000000..8001f51941f38 --- /dev/null +++ b/sapi/cli/tests/php_cli_server_019.phpt @@ -0,0 +1,46 @@ +--TEST-- +Implement Req #65917 (getallheaders() is not supported by the built-in web server) +--SKIPIF-- + +--FILE-- +array( + 'method'=>"GET", + 'header'=>"Foo-Bar: bar\r\n" + ) +); + +$context = stream_context_create($opts); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS, false, $context); +?> +--EXPECTF-- +array(2) { + ["Host"]=> + string(%s) "%s:%s" + ["Foo-Bar"]=> + string(3) "bar" +} +array(2) { + ["Host"]=> + string(%s) "%s:%s" + ["Foo-Bar"]=> + string(3) "bar" +} +array(2) { + ["X-Powered-By"]=> + string(%s) "PHP/%s" + ["Content-Type"]=> + string(10) "text/plain" +} From a3f5b9f62dcdca52caf804c81ac9ef21d7436261 Mon Sep 17 00:00:00 2001 From: Andrea Faulds Date: Tue, 22 Oct 2013 16:07:37 +0000 Subject: [PATCH 0481/1256] Rewrote test using tcp instead of http:// stream --- sapi/cli/tests/php_cli_server_019.phpt | 56 ++++++++++++++++++-------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/sapi/cli/tests/php_cli_server_019.phpt b/sapi/cli/tests/php_cli_server_019.phpt index 8001f51941f38..cdad01ed64a87 100644 --- a/sapi/cli/tests/php_cli_server_019.phpt +++ b/sapi/cli/tests/php_cli_server_019.phpt @@ -8,39 +8,61 @@ include "skipif.inc"; array( - 'method'=>"GET", - 'header'=>"Foo-Bar: bar\r\n" - ) -); +list($host, $port) = explode(':', PHP_CLI_SERVER_ADDRESS); +$port = intval($port)?:80; + +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<
--EXPECTF-- +HTTP/1.1 200 OK +Host: %s +Connection: close +X-Powered-By: %s +Bar-Foo: Foo +Content-type: text/html + array(2) { ["Host"]=> - string(%s) "%s:%s" + string(9) "localhost" ["Foo-Bar"]=> - string(3) "bar" + string(3) "Bar" } array(2) { ["Host"]=> - string(%s) "%s:%s" + string(9) "localhost" ["Foo-Bar"]=> - string(3) "bar" + string(3) "Bar" } -array(2) { +array(3) { ["X-Powered-By"]=> - string(%s) "PHP/%s" - ["Content-Type"]=> - string(10) "text/plain" + string(13) "P%s" + ["Bar-Foo"]=> + string(3) "Foo" + ["Content-type"]=> + string(9) "text/html" } From dc4bf922d9a0d738b621dff4a55abb715edeee61 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 12 Nov 2013 21:56:50 +0100 Subject: [PATCH 0482/1256] Allow $num=0 in array_fill() Implemented request #49824. --- NEWS | 2 + ext/standard/array.c | 8 +- ext/standard/tests/array/array_fill.phpt | 90 ++++++++----------- .../tests/array/array_fill_error.phpt | 9 +- .../tests/array/array_fill_variation2.phpt | 42 ++++----- 5 files changed, 62 insertions(+), 89 deletions(-) diff --git a/NEWS b/NEWS index fdfaef53cb58f..445e85d18cbd4 100644 --- a/NEWS +++ b/NEWS @@ -67,6 +67,8 @@ PHP NEWS 1.1). (Adam) . Implemented Change crypt() behavior w/o salt RFC. (Yasuo) https://wiki.php.net/rfc/crypt_function_salt + . Implemented request #49824 (Change array_fill() to allow creating empty + array). (Nikita) - XMLReader: . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). diff --git a/ext/standard/array.c b/ext/standard/array.c index 17be59d6ca4b8..d21badc87c0d7 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1521,14 +1521,18 @@ PHP_FUNCTION(array_fill) return; } - if (num < 1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements must be positive"); + if (num < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements can't be negative"); RETURN_FALSE; } /* allocate an array for return */ array_init_size(return_value, num); + if (num == 0) { + return; + } + num--; zend_hash_index_update(Z_ARRVAL_P(return_value), start_key, &val, sizeof(zval *), NULL); zval_add_ref(&val); diff --git a/ext/standard/tests/array/array_fill.phpt b/ext/standard/tests/array/array_fill.phpt index 1de7c3142000b..c6c7e1e45708f 100644 --- a/ext/standard/tests/array/array_fill.phpt +++ b/ext/standard/tests/array/array_fill.phpt @@ -23,34 +23,28 @@ echo '== Done =='; --EXPECTF-- =========================== start: 0 num: 0 value: 1 - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 0 num: 0 value: - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 0 num: 0 value: - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 0 num: 0 value: d - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 0 num: 0 value: e - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 0 num: 0 value: f - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 0 num: 1 value: 1 array(1) { @@ -137,34 +131,28 @@ array(2) { } =========================== start: 1 num: 0 value: 1 - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 1 num: 0 value: - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 1 num: 0 value: - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 1 num: 0 value: d - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 1 num: 0 value: e - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 1 num: 0 value: f - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 1 num: 1 value: 1 array(1) { @@ -251,34 +239,28 @@ array(2) { } =========================== start: 2.5 num: 0 value: 1 - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 2.5 num: 0 value: - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 2.5 num: 0 value: - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 2.5 num: 0 value: d - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 2.5 num: 0 value: e - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 2.5 num: 0 value: f - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} =========================== start: 2.5 num: 1 value: 1 array(1) { diff --git a/ext/standard/tests/array/array_fill_error.phpt b/ext/standard/tests/array/array_fill_error.phpt index 167163228d574..33ee2b3858a11 100644 --- a/ext/standard/tests/array/array_fill_error.phpt +++ b/ext/standard/tests/array/array_fill_error.phpt @@ -32,10 +32,6 @@ var_dump( array_fill($start_key,$num) ); $num = -1; var_dump( array_fill($start_key,$num,$val) ); -//callin array_fill with 'num' equal to zero value -$num = 0; -var_dump( array_fill($start_key,$num,$val) ); - echo "Done"; ?> --EXPECTF-- @@ -53,9 +49,6 @@ NULL Warning: array_fill() expects exactly 3 parameters, 2 given in %s on line %d NULL -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) - -Warning: array_fill(): Number of elements must be positive in %s on line %d +Warning: array_fill(): Number of elements can't be negative in %s on line %d bool(false) Done diff --git a/ext/standard/tests/array/array_fill_variation2.phpt b/ext/standard/tests/array/array_fill_variation2.phpt index 9e9df29b0bb13..ecf4ef435ec9d 100644 --- a/ext/standard/tests/array/array_fill_variation2.phpt +++ b/ext/standard/tests/array/array_fill_variation2.phpt @@ -106,7 +106,7 @@ array(2) { } -- Iteration 2 -- -Warning: array_fill(): Number of elements must be positive in %s on line %d +Warning: array_fill(): Number of elements can't be negative in %s on line %d bool(false) -- Iteration 3 -- array(5) { @@ -122,13 +122,11 @@ array(5) { int(100) } -- Iteration 4 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 5 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 6 -- Warning: array_fill() expects parameter 2 to be long, array given in %s on line %d @@ -150,31 +148,27 @@ NULL Warning: array_fill() expects parameter 2 to be long, array given in %s on line %d NULL -- Iteration 11 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 12 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 13 -- array(1) { [0]=> int(100) } -- Iteration 14 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 15 -- array(1) { [0]=> int(100) } -- Iteration 16 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 17 -- Warning: array_fill() expects parameter 2 to be long, string given in %s on line %d @@ -196,11 +190,9 @@ NULL Warning: array_fill() expects parameter 2 to be long, object given in %s on line %d NULL -- Iteration 22 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} -- Iteration 23 -- - -Warning: array_fill(): Number of elements must be positive in %s on line %d -bool(false) +array(0) { +} Done From bbd523e5cbb4d841b17d6888ab33e348e377034e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 19:40:15 -0200 Subject: [PATCH 0483/1256] - Cosmetic --- phpdbg.c | 58 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index bd756eef67e3f..4e6236f70d616 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -96,7 +96,8 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ static PHP_FUNCTION(phpdbg_break) { if (EG(current_execute_data) && EG(active_op_array)) { - zend_ulong opline_num = (EG(current_execute_data)->opline - EG(active_op_array)->opcodes); + zend_ulong opline_num = (EG(current_execute_data)->opline - + EG(active_op_array)->opcodes); phpdbg_set_breakpoint_opline_ex( &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); @@ -144,7 +145,8 @@ static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* return SUCCESS; } /* }}} */ -static char* php_sapi_phpdbg_read_cookies(TSRMLS_D) { /* {{{ */ +static char* php_sapi_phpdbg_read_cookies(TSRMLS_D) /* {{{ */ +{ return NULL; } /* }}} */ @@ -195,24 +197,33 @@ static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* { if (PHPDBG_G(exec)) { len = PHPDBG_G(exec_len); - if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("PHP_SELF", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PHP_SELF", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } - if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } - if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } - if (sapi_module.input_filter(PARSE_SERVER, "PATH_TRANSLATED", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "PATH_TRANSLATED", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } } /* any old docroot will doo */ len = 0U; - if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", &docroot, len, &len TSRMLS_CC)) { + if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", + &docroot, len, &len TSRMLS_CC)) { php_register_variable("DOCUMENT_ROOT", docroot, track_vars_array TSRMLS_CC); } } @@ -253,16 +264,16 @@ static sapi_module_struct phpdbg_sapi_module = { /* }}} */ const opt_struct OPTIONS[] = { /* {{{ */ - {'c', 1, "ini path override"}, - {'d', 1, "define ini entry on command line"}, - {'n', 0, "no php.ini"}, - {'z', 1, "load zend_extension"}, - /* phpdbg options */ - {'e', 1, "exec"}, - {'v', 0, "verbose"}, - {'s', 0, "step"}, - {'b', 0, "boring colours"}, - {'-', 0, NULL} + {'c', 1, "ini path override"}, + {'d', 1, "define ini entry on command line"}, + {'n', 0, "no php.ini"}, + {'z', 1, "load zend_extension"}, + /* phpdbg options */ + {'e', 1, "exec"}, + {'v', 0, "verbose"}, + {'s', 0, "step"}, + {'b', 0, "boring colours"}, + {'-', 0, NULL} }; /* }}} */ const char phpdbg_ini_hardcoded[] = @@ -280,13 +291,14 @@ const char phpdbg_ini_hardcoded[] = ZVAL_STRINGL(&tmp, zend_strndup(value, sizeof(value)-1), sizeof(value)-1, 0);\ zend_hash_update(configuration_hash, name, sizeof(name), &tmp, sizeof(zval), NULL);\ -void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ +void phpdbg_ini_defaults(HashTable *configuration_hash) /* {{{ */ +{ zval tmp; INI_DEFAULT("report_zend_debug", "0"); INI_DEFAULT("display_errors", "1"); } /* }}} */ -int main(int argc, char *argv[]) /* {{{ */ +int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *ini_entries = NULL; From 27f640d87911eacc829a22445d473e170f307080 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 20:39:39 -0200 Subject: [PATCH 0484/1256] - Added phpdbg_notice() and phpdbg_error() --- phpdbg.c | 13 ++-- phpdbg.h | 6 +- phpdbg_bp.c | 74 +++++++--------------- phpdbg_print.c | 7 +-- phpdbg_prompt.c | 159 +++++++++++++++++------------------------------- phpdbg_utils.c | 31 ++++++++++ phpdbg_utils.h | 15 +++++ 7 files changed, 135 insertions(+), 170 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 4e6236f70d616..0cc5d2bcdb4a6 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -19,6 +19,7 @@ #include "phpdbg.h" #include "phpdbg_prompt.h" #include "phpdbg_bp.h" +#include "phpdbg_utils.h" ZEND_DECLARE_MODULE_GLOBALS(phpdbg); @@ -440,14 +441,10 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); /* print blurb */ - printf( - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); - printf( - "[To get help using phpdbg type \"help\" and press enter\n"); - printf( - "%sPlease report bugs to <%s>%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", + PHPDBG_VERSION); + printf("[To get help using phpdbg type \"help\" and press enter\n"); + phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); do { zend_try { diff --git a/phpdbg.h b/phpdbg.h index af4a76f384db6..9826c8bb940f8 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -64,7 +64,7 @@ #define PHPDBG_BREAK_FILE 0 #define PHPDBG_BREAK_SYM 1 #define PHPDBG_BREAK_OPLINE 2 -#define PHPDBG_BREAK_METHOD 3 +#define PHPDBG_BREAK_METHOD 3 #define PHPDBG_BREAK_TABLES 4 /* }}} */ /* {{{ flags */ @@ -77,7 +77,7 @@ #define PHPDBG_IS_STEPPING 0x00010000 #define PHPDBG_IS_QUIET 0x00100000 #define PHPDBG_IS_QUITTING 0x01000000 -#define PHPDBG_IS_COLOURED 0x10000000 +#define PHPDBG_IS_COLOURED 0x10000000 #define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED) /* }}} */ @@ -107,7 +107,7 @@ ZEND_END_MODULE_GLOBALS(phpdbg) #define PHPDBG_BOLD_LINE(TSRMLS_D) \ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "[") #define PHPDBG_END_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") #define PHPDBG_PROMPT_LINE(TSRMLS_D) \ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") #define PHPDBG_SEP_LINE(TSRMLS_D) do {\ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 26cb6862351e2..f4b3d8ffb1727 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -22,6 +22,7 @@ #include "zend_llist.h" #include "phpdbg.h" #include "phpdbg_bp.h" +#include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); @@ -67,11 +68,8 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); - printf( - "%sBreakpoint #%d added at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.filename, new_break.line, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %s:%ld", + new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -89,15 +87,10 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - printf( - "%sBreakpoint #%d added at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.symbol, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %s", + new_break.id, new_break.symbol); } else { - printf( - "%sBreakpoint exists at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint exists at %s", name); } } /* }}} */ @@ -130,17 +123,10 @@ void phpdbg_set_breakpoint_method(const char* class_name, const char* func_name zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); - printf( - "%sBreakpoint #%d added at %s::%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, class_name, func_name, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %s::%s", + new_break.id, class_name, func_name); } else { - printf( - "%sBreakpoint exists at %s::%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - class_name, func_name, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint exists at %s::%s", class_name, func_name); } } /* }}} */ @@ -157,14 +143,10 @@ void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("%sBreakpoint #%d added at %#lx%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.opline, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %#lx%s", + new_break.id, new_break.opline); } else { - printf( - "%sBreakpoint exists at %#lx%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), opline, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint exists at %#lx", opline); } } /* }}} */ @@ -180,11 +162,8 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf( - "%sBreakpoint #%d added at %#lx%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.opline, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %#lx", + new_break.id, new_break.opline); } } /* }}} */ @@ -203,10 +182,8 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("%sBreakpoint #%d at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - bp->id, bp->filename, bp->line, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d at %s:%ld", + bp->id, bp->filename, bp->line); return SUCCESS; } } @@ -240,12 +217,10 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %s() at %s:%u%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + phpdbg_notice("Breakpoint #%d in %s() at %s:%u", bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C), - PHPDBG_END_LINE(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } @@ -264,13 +239,10 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ ops->function_name, strlen(ops->function_name), (void**)&bp) == SUCCESS) { - printf( - "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + phpdbg_notice("Breakpoint #%d in %s::%s() at %s:%u", bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C), - PHPDBG_END_LINE(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } } @@ -284,12 +256,10 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %#lx at %s:%u%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + phpdbg_notice("Breakpoint #%d in %#lx at %s:%u", bp->id, bp->opline, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C), - PHPDBG_END_LINE(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } diff --git a/phpdbg_print.c b/phpdbg_print.c index 747789799f835..37daf028b3c12 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -19,6 +19,7 @@ #include "phpdbg.h" #include "phpdbg_print.h" +#include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); @@ -28,10 +29,8 @@ PHPDBG_PRINT(opline) /* {{{ */ phpdbg_print_opline( EG(current_execute_data), 1 TSRMLS_CC); } else { - printf( - "%sNot Executing!%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Not Executing!"); } - + return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9fd03b986c417..d577b4ddba018 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -36,26 +36,20 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - printf( - "%sUnsetting old execution context: %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, + "Unsetting old execution context: %s", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - printf( - "%sDestroying compiled opcodes%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + phpdbg_print(NOTICE TSRMLS_CC, "Destroying compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf( - "%sSet execution context: %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Set execution context: %s", PHPDBG_G(exec)); return SUCCESS; } /* }}} */ @@ -65,26 +59,22 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - printf("%sAttempting compilation of %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, + "Attempting compilation of %s", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file( - &fh, ZEND_INCLUDE TSRMLS_CC); + + PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - printf( - "%sSuccess%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + + phpdbg_print(NOTICE TSRMLS_CC, "Success"); return SUCCESS; } else { - printf( - "%sCould not open file %s%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "Could not open file %s", PHPDBG_G(exec)); } } else { - printf( - "%sCannot compile while in execution%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "Cannot compile while in execution"); } return FAILURE; @@ -95,18 +85,15 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (PHPDBG_G(exec)) { if (!EG(in_execution)) { if (PHPDBG_G(ops)) { - printf( - "%sDestroying previously compiled opcodes%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, + "Destroying previously compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } } return phpdbg_compile(TSRMLS_C); } else { - printf( - "%sNo execution context%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No execution context"); return FAILURE; } } /* }}} */ @@ -119,11 +106,8 @@ static PHPDBG_COMMAND(step) /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; } - printf( - "%sStepping %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Stepping %s", + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -136,14 +120,14 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { if (EG(in_execution)) { - printf("%sCannot start another execution while one is in progress%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Cannot start another execution while one is in progress"); return FAILURE; } if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("%sFailed to compile %s, cannot run%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to compile %s, cannot run", PHPDBG_G(exec)); return FAILURE; } } @@ -155,14 +139,14 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf("%sCaught excetion in VM%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Caught excetion in VM"); return FAILURE; } else return SUCCESS; } zend_end_try(); return SUCCESS; } else { - printf("%sNothing to execute !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Nothing to execute!"); return FAILURE; } } /* }}} */ @@ -179,8 +163,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - zend_print_zval_r( - &retval, 0 TSRMLS_CC); + zend_print_zval_r(&retval, 0 TSRMLS_CC); zval_dtor(&retval); printf("\n"); } @@ -190,7 +173,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; } } else { - printf("%sNo expression provided !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No expression provided!"); return FAILURE; } @@ -200,7 +183,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ static PHPDBG_COMMAND(back) /* {{{ */ { if (!EG(in_execution)) { - printf("%sNot executing !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Not executing!"); return FAILURE; } zval zbacktrace; @@ -229,9 +212,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ { if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf( - "%sFailed to find print command: %s/%lu%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to find print command: %s/%u", expr, expr_len); } return SUCCESS; } @@ -272,7 +253,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ phpdbg_print_breakpoints(PHPDBG_BREAK_OPLINE TSRMLS_CC); PHPDBG_SEP_LINE(TSRMLS_C); - + return SUCCESS; } /* }}} */ @@ -281,8 +262,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ char *line_pos; if (expr_len <= 0L) { - printf( - "%sNo expression found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No expression found"); return FAILURE; } @@ -305,15 +285,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("%sFailed to expand path %s%s\n", - PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to expand path %s", path); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("%sNo line specified in expression %s%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No line specified in expression %s", expr); return FAILURE; } } @@ -329,8 +307,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ long line_num = strtol(expr, NULL, 0); if (!filename) { - printf("%sNo file context found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No file context found"); return FAILURE; } @@ -347,8 +324,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_symbol(name TSRMLS_CC); } else { - printf("%sMalformed break command found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Malformed break command found"); return FAILURE; } } @@ -398,8 +374,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); } else { - printf( - "%sCannot clean environment while executing%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Cannot clean environment while executing"); return FAILURE; } @@ -421,15 +396,13 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf( + phpdbg_print(NOTICE TSRMLS_CC, "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); + PHPDBG_VERSION); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf( - "%sFailed to find help command: %s/%lu%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to find help command: %s/%lu", expr, expr_len); } } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -437,18 +410,14 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); - printf( - "%sCommands%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Commands"); while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } - printf( - "%sHelpers Loaded%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Helpers Loaded"); while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); @@ -456,9 +425,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ } } - printf( - "%sPlease report bugs to <%s>%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Please report bugs to <%s>\n", PHPDBG_ISSUES); return SUCCESS; } /* }}} */ @@ -470,8 +437,8 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_QUIET; } - printf( - "%sQuietness %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled", PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Quietness %s", + (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); return SUCCESS; } /* }}} */ @@ -486,9 +453,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); } else if (!filename) { - printf( - "%sNo file to list%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No file to list"); return SUCCESS; } @@ -507,15 +472,11 @@ static PHPDBG_COMMAND(list) /* {{{ */ func_table = &EG(scope)->function_table; } else { - printf( - "%sNo active class%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No active class"); return FAILURE; } } else if (!EG(function_table)) { - printf( - "%sNo function table loaded%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No function table loaded"); return SUCCESS; } else { func_table = EG(function_table); @@ -525,9 +486,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { - printf( - "%sFunction %s not found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), func_name, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "Function %s not found", func_name); } } @@ -556,7 +515,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { char *params = NULL; -#ifndef _WIN32 +#ifndef _WIN32 const char *cmd = strtok_r(cmd_line, " ", ¶ms); #else const char *cmd = strtok_s(cmd_line, " ", ¶ms); @@ -615,17 +574,13 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf( - "%sFailed to execute %s !%s\n", - PHPDBG_RED_LINE(TSRMLS_C), cmd, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to execute %s!", cmd); } break; case PHPDBG_NEXT: { if (!EG(in_execution)) { - printf( - "%sNot running%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Not running"); } return PHPDBG_NEXT; } @@ -652,12 +607,8 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags zend_op *opline = execute_data->opline; - printf( - "%sOPLINE: %p:%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - opline, - phpdbg_decode_opcode(opline->opcode), - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "OPLINE: %p:%s", + opline, phpdbg_decode_opcode(opline->opcode)); } } /* }}} */ @@ -667,16 +618,18 @@ void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */ /* this is implicitly required */ if (PHPDBG_G(ops)) { - destroy_op_array( - PHPDBG_G(ops) TSRMLS_CC); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops) = NULL; } if (full) { - zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_reverse_apply(EG(function_table), + (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), + (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), + (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); } } /* }}} */ diff --git a/phpdbg_utils.c b/phpdbg_utils.c index e8a5dc634700f..01f2a3b6ac071 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -20,8 +20,13 @@ #include #include #include "zend.h" +#include "php.h" +#include "spprintf.h" +#include "phpdbg.h" #include "phpdbg_utils.h" +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + int phpdbg_is_numeric(const char *str) /* {{{ */ { for (; *str; str++) { @@ -64,3 +69,29 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met return 1; } /* }}} */ + +int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ +{ + char *buffer = NULL; + va_list args; + + va_start(args, format); + vspprintf(&buffer, 0, format, args); + va_end(args); + + switch (type) { + case ERROR: + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), + buffer, + PHPDBG_END_LINE(TSRMLS_D)); + break; + + case NOTICE: + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), + buffer, + PHPDBG_END_LINE(TSRMLS_D)); + break; + } +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index f4eda3f18cbde..cc3365a603bb0 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,6 +20,8 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H +#include "TSRM.h" + /** * Input scan functions */ @@ -28,4 +30,17 @@ int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); +/** + * Error/notice printing helper + */ +enum { + ERROR = 1, + NOTICE +}; + +int phpdbg_print(int TSRMLS_DC, const char*, ...); + +#define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) +#define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) + #endif /* PHPDBG_UTILS_H */ From 5d435cb8312c0e88d7feb38debb3bd319be35535 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 20:48:52 -0200 Subject: [PATCH 0485/1256] - Spred more some macro usage instead of phpdbg_print() --- phpdbg_prompt.c | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d577b4ddba018..444d3d453918f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -36,20 +36,19 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - phpdbg_print(NOTICE TSRMLS_CC, - "Unsetting old execution context: %s", PHPDBG_G(exec)); + phpdbg_notice("Unsetting old execution context: %s", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - phpdbg_print(NOTICE TSRMLS_CC, "Destroying compiled opcodes"); + phpdbg_notice("Destroying compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - phpdbg_print(NOTICE TSRMLS_CC, "Set execution context: %s", PHPDBG_G(exec)); + phpdbg_notice("Set execution context: %s", PHPDBG_G(exec)); return SUCCESS; } /* }}} */ @@ -59,8 +58,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - phpdbg_print(NOTICE TSRMLS_CC, - "Attempting compilation of %s", PHPDBG_G(exec)); + phpdbg_notice("Attempting compilation of %s", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { @@ -68,13 +66,13 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - phpdbg_print(NOTICE TSRMLS_CC, "Success"); + phpdbg_notice("Success"); return SUCCESS; } else { - phpdbg_print(ERROR TSRMLS_CC, "Could not open file %s", PHPDBG_G(exec)); + phpdbg_error("Could not open file %s", PHPDBG_G(exec)); } } else { - phpdbg_print(ERROR TSRMLS_CC, "Cannot compile while in execution"); + phpdbg_error("Cannot compile while in execution"); } return FAILURE; @@ -85,15 +83,14 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (PHPDBG_G(exec)) { if (!EG(in_execution)) { if (PHPDBG_G(ops)) { - phpdbg_print(ERROR TSRMLS_CC, - "Destroying previously compiled opcodes"); + phpdbg_error("Destroying previously compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } } return phpdbg_compile(TSRMLS_C); } else { - phpdbg_print(ERROR TSRMLS_CC, "No execution context"); + phpdbg_error("No execution context"); return FAILURE; } } /* }}} */ @@ -106,7 +103,7 @@ static PHPDBG_COMMAND(step) /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; } - phpdbg_print(NOTICE TSRMLS_CC, "Stepping %s", + phpdbg_notice("Stepping %s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; @@ -396,9 +393,8 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - phpdbg_print(NOTICE TSRMLS_CC, - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", - PHPDBG_VERSION); + phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", + PHPDBG_VERSION); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { @@ -410,14 +406,14 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); - phpdbg_print(NOTICE TSRMLS_CC, "Commands"); + phpdbg_notice("Commands"); while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } - phpdbg_print(NOTICE TSRMLS_CC, "Helpers Loaded"); + phpdbg_notice("Helpers Loaded"); while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); @@ -425,7 +421,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ } } - phpdbg_print(NOTICE TSRMLS_CC, "Please report bugs to <%s>\n", PHPDBG_ISSUES); + phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); return SUCCESS; } /* }}} */ @@ -437,7 +433,7 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_QUIET; } - phpdbg_print(NOTICE TSRMLS_CC, "Quietness %s", + phpdbg_notice("Quietness %s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); return SUCCESS; @@ -453,7 +449,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); } else if (!filename) { - phpdbg_print(ERROR TSRMLS_CC, "No file to list"); + phpdbg_error("No file to list"); return SUCCESS; } @@ -472,11 +468,11 @@ static PHPDBG_COMMAND(list) /* {{{ */ func_table = &EG(scope)->function_table; } else { - phpdbg_print(ERROR TSRMLS_CC, "No active class"); + phpdbg_error("No active class"); return FAILURE; } } else if (!EG(function_table)) { - phpdbg_print(ERROR TSRMLS_CC, "No function table loaded"); + phpdbg_error("No function table loaded"); return SUCCESS; } else { func_table = EG(function_table); @@ -486,7 +482,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { - phpdbg_print(ERROR TSRMLS_CC, "Function %s not found", func_name); + phpdbg_error("Function %s not found", func_name); } } @@ -607,7 +603,7 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags zend_op *opline = execute_data->opline; - phpdbg_print(NOTICE TSRMLS_CC, "OPLINE: %p:%s", + phpdbg_notice("OPLINE: %p:%s", opline, phpdbg_decode_opcode(opline->opcode)); } } /* }}} */ From ff54d20b583e41e996bdbf4c49b72919f3988f8b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 20:55:39 -0200 Subject: [PATCH 0486/1256] - Fix prototype and memory leak --- phpdbg_utils.c | 6 +++++- phpdbg_utils.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 01f2a3b6ac071..f37135f69c07c 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -70,7 +70,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met return 1; } /* }}} */ -int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ +void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { char *buffer = NULL; va_list args; @@ -94,4 +94,8 @@ int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ PHPDBG_END_LINE(TSRMLS_D)); break; } + + if (buffer) { + efree(buffer); + } } /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index cc3365a603bb0..432d6a0b22e93 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -38,7 +38,7 @@ enum { NOTICE }; -int phpdbg_print(int TSRMLS_DC, const char*, ...); +void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) From a712674964ffbabf93dae6eac6e4394079567a51 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:10:53 +0000 Subject: [PATCH 0487/1256] added phpdbg_write to replace all the printf --- phpdbg_prompt.c | 35 +++++++++++++++++++---------------- phpdbg_utils.c | 13 +++++++++++-- phpdbg_utils.h | 6 ++++-- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 444d3d453918f..a322373129a02 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -357,19 +357,21 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { if (!EG(in_execution)) { - printf("[Cleaning Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + phpdbg_notice("Cleaning Execution Environment"); + + phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_clean(1 TSRMLS_CC); - printf("[Clean Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + phpdbg_notice("Clean Execution Environment"); + + phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); } else { phpdbg_error("Cannot clean environment while executing"); return FAILURE; @@ -380,12 +382,13 @@ static PHPDBG_COMMAND(clean) /* {{{ */ static PHPDBG_COMMAND(clear) /* {{{ */ { - printf("[Clearing Breakpoints:]\n"); - printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); - printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); - printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); - printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); - + phpdbg_notice("Clearing Breakpoints"); + + phpdbg_write("File\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); + phpdbg_write("Functions\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); + phpdbg_write("Methods\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); + phpdbg_write("Oplines\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; diff --git a/phpdbg_utils.c b/phpdbg_utils.c index f37135f69c07c..4607bf66fd634 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -79,19 +79,28 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ vspprintf(&buffer, 0, format, args); va_end(args); + /* TODO(anyone) colours */ + switch (type) { case ERROR: printf("%s%s%s\n", ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), buffer, - PHPDBG_END_LINE(TSRMLS_D)); + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; case NOTICE: printf("%s%s%s\n", ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), buffer, - PHPDBG_END_LINE(TSRMLS_D)); + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); + break; + + case WRITE: + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); break; } diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 432d6a0b22e93..af659c03fdcfe 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -31,16 +31,18 @@ int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); /** - * Error/notice printing helper + * Error/notice/formatting helper */ enum { ERROR = 1, - NOTICE + NOTICE, + WRITE }; void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) +#define phpdbg_write(fmt, ...) phpdbg_print(WRITE TSRMLS_CC, fmt, ##__VA_ARGS__) #endif /* PHPDBG_UTILS_H */ From afa216fd7e2e441a1233305d0e8e404773f27dd8 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:17:37 +0000 Subject: [PATCH 0488/1256] deploy _write --- phpdbg_prompt.c | 42 +++++++++++++++++++++--------------------- phpdbg_utils.c | 2 +- phpdbg_utils.h | 3 +++ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a322373129a02..8277e166e6f71 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -194,12 +194,12 @@ static PHPDBG_COMMAND(back) /* {{{ */ zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { if (i++) { - printf(",\n"); + phpdbg_write(","); } zend_print_flat_zval_r(*tmp TSRMLS_CC); } - printf("\n"); + phpdbg_write(EMPTY); zval_dtor(&zbacktrace); return SUCCESS; @@ -215,34 +215,34 @@ static PHPDBG_COMMAND(print) /* {{{ */ } PHPDBG_SEP_LINE(TSRMLS_C); - printf("Execution Context Information:\n"); + phpdbg_notice("Execution Context Information:"); #ifdef HAVE_LIBREADLINE - printf("Readline\tyes\n"); + phpdbg_write("Readline\tyes"); #else - printf("Readline\tno\n"); + phpdbg_write("Readline\tno"); #endif - printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); - printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); - printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); - printf("Quietness\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); + phpdbg_write("Exec\t\t%s", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + phpdbg_write("Compiled\t%s", PHPDBG_G(ops) ? "yes" : "no"); + phpdbg_write("Stepping\t%s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); + phpdbg_write("Quietness\t%s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); if (PHPDBG_G(ops)) { - printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); + phpdbg_write("Opcodes\t\t%d", PHPDBG_G(ops)->last); if (PHPDBG_G(ops)->last_var) { - printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + phpdbg_write("Variables\t%d", PHPDBG_G(ops)->last_var-1); } else { - printf("Variables\tNone\n"); + phpdbg_write("Variables\tNone"); } } - printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); + phpdbg_write("Executing\t%s", EG(in_execution) ? "yes" : "no"); if (EG(in_execution)) { - printf("VM Return\t%d\n", PHPDBG_G(vmret)); + phpdbg_write("VM Return\t%d", PHPDBG_G(vmret)); } - printf("Classes\t\t%d\n", zend_hash_num_elements(EG(class_table))); - printf("Functions\t%d\n", zend_hash_num_elements(EG(function_table))); - printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); - printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); + phpdbg_write("Classes\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_write("Included\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_print_breakpoints(PHPDBG_BREAK_FILE TSRMLS_CC); phpdbg_print_breakpoints(PHPDBG_BREAK_SYM TSRMLS_CC); @@ -407,19 +407,19 @@ static PHPDBG_COMMAND(help) /* {{{ */ const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; const phpdbg_command_t *help_command = phpdbg_help_commands; - printf("To get help regarding a specific command type \"help command\"\n"); + phpdbg_write("To get help regarding a specific command type \"help command\""); phpdbg_notice("Commands"); while (prompt_command && prompt_command->name) { - printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); + phpdbg_write("\t%s\t%s", prompt_command->name, prompt_command->tip); ++prompt_command; } phpdbg_notice("Helpers Loaded"); while (help_command && help_command->name) { - printf("\t%s\t%s\n", help_command->name, help_command->tip); + phpdbg_write("\t%s\t%s", help_command->name, help_command->tip); ++help_command; } } diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4607bf66fd634..2a0d976a75005 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -98,7 +98,7 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ case WRITE: printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m" : ""), + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), buffer, ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); break; diff --git a/phpdbg_utils.h b/phpdbg_utils.h index af659c03fdcfe..d6067a61bf0bf 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -45,4 +45,7 @@ void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_write(fmt, ...) phpdbg_print(WRITE TSRMLS_CC, fmt, ##__VA_ARGS__) +/* {{{ For writing blank lines */ +#define EMPTY "" /* }}} */ + #endif /* PHPDBG_UTILS_H */ From ce78503e15d6457a28673b15a852cbeeb03a5812 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:31:46 +0000 Subject: [PATCH 0489/1256] remove more printf --- phpdbg_list.c | 12 ++++----- phpdbg_prompt.c | 68 ++++++++++++++++++++++++------------------------- phpdbg_utils.c | 23 ++++++++++++----- phpdbg_utils.h | 5 ++++ 4 files changed, 62 insertions(+), 46 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index 9f2c6a228600a..435136cee210f 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -41,12 +41,12 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / unsigned int line = 0, displayed = 0; if (VCWD_STAT(filename, &st) == -1) { - printf("[Failed to stat file %s]\n", filename); + phpdbg_error("Failed to stat file %s", filename); return; } #ifndef _WIN32 if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { - printf("[Failed to open file %s to list]\n", filename); + phpdbg_error("Failed to open file %s to list", filename); return; } @@ -55,20 +55,20 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / #else fd = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (fd == INVALID_HANDLE_VALUE) { - printf("[Failed to open file!]\n"); + phpdbg_error("Failed to open file!"); return; } map = CreateFileMapping(fd, NULL, PAGE_EXECUTE_READ, 0, 0, 0); if (map == NULL) { - printf("[Failed to map file!]\n"); + phpdbg_error("Failed to map file!"); CloseHandle(fd); return; } last_pos = mem = (char*) MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); if (mem == NULL) { - printf("[Failed to map file in memory]\n"); + phpdbg_error("Failed to map file in memory"); CloseHandle(map); CloseHandle(fd); return; @@ -87,7 +87,7 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / if (!offset || offset <= line) { /* Without offset, or offset reached */ - printf("%05u: %.*s\n", line, (int)(pos - last_pos), last_pos); + phpdbg_writeln("%05u: %.*s", line, (int)(pos - last_pos), last_pos); ++displayed; } diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 8277e166e6f71..fe1c326086907 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -162,7 +162,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r(&retval, 0 TSRMLS_CC); zval_dtor(&retval); - printf("\n"); + phpdbg_writeln(EMPTY); } /* switch stepping back on */ @@ -194,12 +194,12 @@ static PHPDBG_COMMAND(back) /* {{{ */ zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { if (i++) { - phpdbg_write(","); + phpdbg_writeln(","); } zend_print_flat_zval_r(*tmp TSRMLS_CC); } - phpdbg_write(EMPTY); + phpdbg_writeln(EMPTY); zval_dtor(&zbacktrace); return SUCCESS; @@ -217,32 +217,32 @@ static PHPDBG_COMMAND(print) /* {{{ */ PHPDBG_SEP_LINE(TSRMLS_C); phpdbg_notice("Execution Context Information:"); #ifdef HAVE_LIBREADLINE - phpdbg_write("Readline\tyes"); + phpdbg_writeln("Readline\tyes"); #else - phpdbg_write("Readline\tno"); + phpdbg_writeln("Readline\tno"); #endif - phpdbg_write("Exec\t\t%s", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); - phpdbg_write("Compiled\t%s", PHPDBG_G(ops) ? "yes" : "no"); - phpdbg_write("Stepping\t%s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); - phpdbg_write("Quietness\t%s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); + phpdbg_writeln("Exec\t\t%s", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + phpdbg_writeln("Compiled\t%s", PHPDBG_G(ops) ? "yes" : "no"); + phpdbg_writeln("Stepping\t%s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); + phpdbg_writeln("Quietness\t%s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); if (PHPDBG_G(ops)) { - phpdbg_write("Opcodes\t\t%d", PHPDBG_G(ops)->last); + phpdbg_writeln("Opcodes\t\t%d", PHPDBG_G(ops)->last); if (PHPDBG_G(ops)->last_var) { - phpdbg_write("Variables\t%d", PHPDBG_G(ops)->last_var-1); + phpdbg_writeln("Variables\t%d", PHPDBG_G(ops)->last_var-1); } else { - phpdbg_write("Variables\tNone"); + phpdbg_writeln("Variables\tNone"); } } - phpdbg_write("Executing\t%s", EG(in_execution) ? "yes" : "no"); + phpdbg_writeln("Executing\t%s", EG(in_execution) ? "yes" : "no"); if (EG(in_execution)) { - phpdbg_write("VM Return\t%d", PHPDBG_G(vmret)); + phpdbg_writeln("VM Return\t%d", PHPDBG_G(vmret)); } - phpdbg_write("Classes\t\t%d", zend_hash_num_elements(EG(class_table))); - phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); - phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); - phpdbg_write("Included\t%d", zend_hash_num_elements(&EG(included_files))); + phpdbg_writeln("Classes\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_writeln("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_writeln("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_writeln("Included\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_print_breakpoints(PHPDBG_BREAK_FILE TSRMLS_CC); phpdbg_print_breakpoints(PHPDBG_BREAK_SYM TSRMLS_CC); @@ -359,19 +359,19 @@ static PHPDBG_COMMAND(clean) /* {{{ */ if (!EG(in_execution)) { phpdbg_notice("Cleaning Execution Environment"); - phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); - phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); - phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); - phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); + phpdbg_writeln("Classes\t\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_writeln("Functions\t\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_writeln("Constants\t\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_writeln("Includes\t\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_clean(1 TSRMLS_CC); phpdbg_notice("Clean Execution Environment"); - phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); - phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); - phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); - phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); + phpdbg_writeln("Classes\t\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_writeln("Functions\t\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_writeln("Constants\t\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_writeln("Includes\t\t%d", zend_hash_num_elements(&EG(included_files))); } else { phpdbg_error("Cannot clean environment while executing"); return FAILURE; @@ -384,10 +384,10 @@ static PHPDBG_COMMAND(clear) /* {{{ */ { phpdbg_notice("Clearing Breakpoints"); - phpdbg_write("File\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); - phpdbg_write("Functions\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); - phpdbg_write("Methods\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); - phpdbg_write("Oplines\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); + phpdbg_writeln("File\t\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); + phpdbg_writeln("Functions\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); + phpdbg_writeln("Methods\t\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); + phpdbg_writeln("Oplines\t\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); phpdbg_clear_breakpoints(TSRMLS_C); @@ -407,19 +407,19 @@ static PHPDBG_COMMAND(help) /* {{{ */ const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; const phpdbg_command_t *help_command = phpdbg_help_commands; - phpdbg_write("To get help regarding a specific command type \"help command\""); + phpdbg_writeln("To get help regarding a specific command type \"help command\""); phpdbg_notice("Commands"); while (prompt_command && prompt_command->name) { - phpdbg_write("\t%s\t%s", prompt_command->name, prompt_command->tip); + phpdbg_writeln("\t%s\t%s", prompt_command->name, prompt_command->tip); ++prompt_command; } phpdbg_notice("Helpers Loaded"); while (help_command && help_command->name) { - phpdbg_write("\t%s\t%s", help_command->name, help_command->tip); + phpdbg_writeln("\t%s\t%s", help_command->name, help_command->tip); ++help_command; } } @@ -543,7 +543,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ char cmd[PHPDBG_MAX_CMD]; phpdbg_interactive_enter: - printf(PHPDBG_PROMPT_LINE(TSRMLS_C)); + phpdbg_write(PROMPT); while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 2a0d976a75005..4031b2d209c29 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -96,12 +96,23 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; - case WRITE: - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); - break; + case WRITELN: { + if (buffer) { + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + } else { + printf("\n"); + } + } break; + + case WRITE: if (buffer) { + printf("%s%s%s", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + } break; } if (buffer) { diff --git a/phpdbg_utils.h b/phpdbg_utils.h index d6067a61bf0bf..e51462c797721 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -36,6 +36,7 @@ int phpdbg_is_class_method(const char*, size_t, char**, char**); enum { ERROR = 1, NOTICE, + WRITELN, WRITE }; @@ -43,9 +44,13 @@ void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) +#define phpdbg_writeln(fmt, ...) phpdbg_print(WRITELN TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_write(fmt, ...) phpdbg_print(WRITE TSRMLS_CC, fmt, ##__VA_ARGS__) /* {{{ For writing blank lines */ #define EMPTY "" /* }}} */ +/* {{{ For prompt lines */ +#define PROMPT ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ + #endif /* PHPDBG_UTILS_H */ From a8285e3bbfb8685a36c370d1d39e435aa2871d96 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:43:49 +0000 Subject: [PATCH 0490/1256] no more printf --- phpdbg.c | 2 +- phpdbg_bp.c | 20 ++++----- phpdbg_help.c | 119 ++++++++++++++++++++++++++------------------------ phpdbg_list.c | 1 + 4 files changed, 73 insertions(+), 69 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 0cc5d2bcdb4a6..a4cb98a4516f1 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -443,7 +443,7 @@ int main(int argc, char **argv) /* {{{ */ /* print blurb */ phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", PHPDBG_VERSION); - printf("[To get help using phpdbg type \"help\" and press enter\n"); + phpdbg_writeln("To get help using phpdbg type \"help\" and press enter"); phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); do { diff --git a/phpdbg_bp.c b/phpdbg_bp.c index f4b3d8ffb1727..45ecbc5def9bb 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -287,12 +287,12 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ phpdbg_breaksymbol_t *brake; PHPDBG_SEP_LINE(TSRMLS_C); - printf("Function Breakpoints:\n"); + phpdbg_writeln("Function Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { - printf( - "#%d\t\t%s\n", brake->id, brake->symbol); + phpdbg_writeln( + "#%d\t\t%s", brake->id, brake->symbol); } } break; @@ -304,7 +304,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ zend_ulong class_idx = 0L; PHPDBG_SEP_LINE(TSRMLS_C); - printf("Method Breakpoints:\n"); + phpdbg_writeln("Method Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { @@ -318,8 +318,8 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; zend_hash_move_forward_ex(class_table, &position[1])) { - printf( - "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); + phpdbg_writeln( + "#%d\t\t%s::%s", brake->id, brake->class_name, brake->func_name); } } @@ -331,7 +331,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ zend_llist *points; PHPDBG_SEP_LINE(TSRMLS_C); - printf("File Breakpoints:\n"); + phpdbg_writeln("File Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { @@ -340,7 +340,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ if ((brake = zend_llist_get_first_ex(points, &lposition))) { do { - printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); + phpdbg_writeln("#%d\t\t%s:%lu", brake->id, brake->filename, brake->line); } while ((brake = zend_llist_get_next_ex(points, &lposition))); } } @@ -351,11 +351,11 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ phpdbg_breakline_t *brake; PHPDBG_SEP_LINE(TSRMLS_C); - printf("Opline Breakpoints:\n"); + phpdbg_writeln("Opline Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t\t%#lx\n", brake->id, brake->opline); + phpdbg_writeln("#%d\t\t%#lx", brake->id, brake->opline); } } break; } diff --git a/phpdbg_help.c b/phpdbg_help.c index 8f8da951aa86a..b49f45ac1ecd5 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -20,52 +20,53 @@ #include "phpdbg.h" #include "phpdbg_help.h" #include "phpdbg_print.h" +#include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); PHPDBG_HELP(exec) /* {{{ */ { - printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); - printf("The execution context must be set before execution can take place\n"); + phpdbg_writeln("Will attempt execution, if compilation has not yet taken place, it occurs now."); + phpdbg_writeln("The execution context must be set before execution can take place"); return SUCCESS; } /* }}} */ PHPDBG_HELP(step) /* {{{ */ { - printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); - printf("For example:\n"); - printf("\t%sstepping 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will enable stepping\n"); - printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); + phpdbg_writeln("You can enable and disable stepping at any phpdbg prompt during execution"); + phpdbg_writeln("For example:"); + phpdbg_writeln("\t%sstepping 1", PROMPT); + phpdbg_writeln("Will enable stepping"); + phpdbg_writeln("While stepping is enabled you are presented with a prompt after the execution of each opcode"); return SUCCESS; } /* }}} */ PHPDBG_HELP(next) /* {{{ */ { - printf("While stepping through execution, or after a breakpoint, use the next command to step back into the vm and execute the next opcode\n"); + phpdbg_writeln("While stepping through execution, or after a breakpoint, use the next command to step back into the vm and execute the next opcode"); return SUCCESS; } /* }}} */ PHPDBG_HELP(compile) /* {{{ */ { - printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); - printf("The execution context must be set for compilation to succeed\n"); - printf("If errors occur during compilation they must be resolved before execution can take place.\n"); - printf("It is a good idea to clean the environment between each compilation with the clean command\n"); - printf("You do not need to exit phpdbg to retry compilation\n"); + phpdbg_writeln("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed"); + phpdbg_writeln("The execution context must be set for compilation to succeed"); + phpdbg_writeln("If errors occur during compilation they must be resolved before execution can take place."); + phpdbg_writeln("It is a good idea to clean the environment between each compilation with the clean command"); + phpdbg_writeln("You do not need to exit phpdbg to retry compilation"); return SUCCESS; } /* }}} */ PHPDBG_HELP(print) /* {{{ */ { - printf("By default, print will show information about the current execution environment\n"); - printf("Specific printers loaded are show below:\n"); - printf("%sCommands%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_writeln("By default, print will show information about the current execution environment"); + phpdbg_writeln("Specific printers loaded are show below:"); + phpdbg_notice("Commands"); { - phpdbg_command_t *print_command = phpdbg_print_commands; + const phpdbg_command_t *print_command = phpdbg_print_commands; while (print_command && print_command->name) { - printf("\t%s\t%s\n", print_command->name, print_command->tip); + phpdbg_writeln("\t%s\t%s", print_command->name, print_command->tip); ++print_command; } } @@ -74,80 +75,82 @@ PHPDBG_HELP(print) /* {{{ */ PHPDBG_HELP(run) /* {{{ */ { - printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); - printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); + phpdbg_writeln("Run the code inside the debug vm, you should have break points and variables set before running"); + phpdbg_writeln("The execution context must not be set, but not necessarily compiled before execution occurs"); return SUCCESS; } /* }}} */ PHPDBG_HELP(eval) /* {{{ */ { - printf("Access to eval() allows you to change the environment during execution, careful though !!\n"); - printf("Note: When using eval in phpdbg do not prefix the code with return.\n"); + phpdbg_writeln("Access to eval() allows you to change the environment during execution, careful though !!"); + phpdbg_writeln("Note: When using eval in phpdbg do not prefix the code with return."); return SUCCESS; } /* }}} */ PHPDBG_HELP(break) /* {{{ */ { - printf("Setting a breakpoint stops execution at a specific stage.\n"); - printf("For example:\n"); - printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break execution on line 1 of test.php\n"); - printf("\t%sbreak my_function\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break execution on entry to my_function\n"); - printf("\t%sbreak \\my\\class::method\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break execution on entry to \\my\\class::method\n"); - printf("\t%sbreak 0x7ff68f570e08\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); - printf("\t%sbreak 200\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break at line 200 of the currently executing file\n"); - printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); - printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); + phpdbg_writeln("Setting a breakpoint stops execution at a specific stage."); + phpdbg_writeln(EMPTY); + phpdbg_writeln("For example:"); + phpdbg_writeln("\t%sbreak test.php:1", PROMPT); + phpdbg_writeln("Will break execution on line 1 of test.php"); + phpdbg_writeln("\t%sbreak my_function", PROMPT); + phpdbg_writeln("Will break execution on entry to my_function"); + phpdbg_writeln("\t%sbreak \\my\\class::method", PROMPT); + phpdbg_writeln("Will break execution on entry to \\my\\class::method"); + phpdbg_writeln("\t%sbreak 0x7ff68f570e08", PROMPT); + phpdbg_writeln("Will break at the opline with the address provided (addresses are shown during execution)"); + phpdbg_writeln("\t%sbreak 200", PROMPT); + phpdbg_writeln("Will break at line 200 of the currently executing file"); + phpdbg_writeln(EMPTY); + phpdbg_writeln("It is important to note, an address is only valid for the current compiled representation of the script"); + phpdbg_writeln("If you have to clean the environment and recompile then your opline break points will be invalid"); return SUCCESS; } /* }}} */ PHPDBG_HELP(clean) /* {{{ */ { - printf("While debugging you may experience errors because of attempts to redeclare classes, constants or functions.\n"); - printf("Cleaning the environment cleans these tables, so that files can be recompiled without exiting phpdbg.\n"); + phpdbg_writeln("While debugging you may experience errors because of attempts to redeclare classes, constants or functions."); + phpdbg_writeln("Cleaning the environment cleans these tables, so that files can be recompiled without exiting phpdbg."); return SUCCESS; } /* }}} */ PHPDBG_HELP(clear) /* {{{ */ { - printf("Clearing breakpoints means you can once again run code without interruption\n"); - printf("Careful though, all breakpoints are lost; be sure debugging is complete before clearing\n"); + phpdbg_writeln("Clearing breakpoints means you can once again run code without interruption"); + phpdbg_writeln("Careful though, all breakpoints are lost; be sure debugging is complete before clearing"); return SUCCESS; } /* }}} */ PHPDBG_HELP(quiet) /* {{{ */ { - printf("Setting quietness on will stop the OPLINE output during execution\n"); - printf("For example:\n"); - printf("\t%squiet 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will silence OPLINE output, while\n"); - printf("\t%squiet 0\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will enable OPLINE output again\n"); + phpdbg_writeln("Setting quietness on will stop the OPLINE output during execution"); + phpdbg_writeln("For example:"); + phpdbg_writeln("\t%squiet 1", PROMPT); + phpdbg_writeln("Will silence OPLINE output, while"); + phpdbg_writeln("\t%squiet 0", PROMPT); + phpdbg_writeln("Will enable OPLINE output again"); return SUCCESS; } /* }}} */ PHPDBG_HELP(back) /* {{{ */ { - printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); - printf("You can set the limit on the trace, for example:\n"); - printf("\t%sback 5\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will limit the number of frames to 5, the default is no limit\n"); + phpdbg_writeln("The backtrace is gathered with the default debug_backtrace functionality."); + phpdbg_writeln("You can set the limit on the trace, for example:"); + phpdbg_writeln("\t%sback 5", PROMPT); + phpdbg_writeln("Will limit the number of frames to 5, the default is no limit"); return SUCCESS; } /* }}} */ PHPDBG_HELP(list) /* {{{ */ { - printf("The list command displays N line from current context file.\n"); - printf("\t%slist 2\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will print next 2 lines from the current file\n"); - printf("\t%slist func\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will print the source of the global function \"func\"\n"); - printf("\t%slist .mine\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will print the source of the class method \"mine\"\n"); - printf("Note: before listing functions you must have a populated function table, try compile !!\n"); + phpdbg_writeln("The list command displays N line from current context file."); + phpdbg_writeln("\t%slist 2", PROMPT); + phpdbg_writeln("Will print next 2 lines from the current file"); + phpdbg_writeln("\t%slist func", PROMPT); + phpdbg_writeln("Will print the source of the global function \"func\""); + phpdbg_writeln("\t%slist .mine", PROMPT); + phpdbg_writeln("Will print the source of the class method \"mine\""); + phpdbg_writeln("Note: before listing functions you must have a populated function table, try compile !!"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_list.c b/phpdbg_list.c index 435136cee210f..ae0d5c6c58e58 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -27,6 +27,7 @@ #include #include "phpdbg.h" #include "phpdbg_list.h" +#include "phpdbg_utils.h" void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) /* {{{ */ { From 52040263083b1ab748d850d0a614b8b8bd62ffc4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:54:41 +0000 Subject: [PATCH 0491/1256] housework --- phpdbg.h | 13 ------------- phpdbg_bp.c | 8 ++++---- phpdbg_help.c | 6 ++++++ phpdbg_prompt.c | 6 +++--- phpdbg_utils.h | 5 +++-- 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 9826c8bb940f8..063cce1f9a9cd 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -101,17 +101,4 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) -/* {{{ colourful helpers */ -#define PHPDBG_RED_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "[") -#define PHPDBG_BOLD_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "[") -#define PHPDBG_END_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") -#define PHPDBG_PROMPT_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") -#define PHPDBG_SEP_LINE(TSRMLS_D) do {\ - printf("%s--------------------------------------%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));\ - } while(0) /* }}} */ - #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 45ecbc5def9bb..b4defa1e70888 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -286,7 +286,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ HashPosition position; phpdbg_breaksymbol_t *brake; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("Function Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; @@ -303,7 +303,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ zend_uint class_len = 0; zend_ulong class_idx = 0L; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("Method Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; @@ -330,7 +330,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ HashPosition position; zend_llist *points; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("File Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; @@ -350,7 +350,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ HashPosition position; phpdbg_breakline_t *brake; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("Opline Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; diff --git a/phpdbg_help.c b/phpdbg_help.c index b49f45ac1ecd5..575061955b60a 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -34,9 +34,11 @@ PHPDBG_HELP(exec) /* {{{ */ PHPDBG_HELP(step) /* {{{ */ { phpdbg_writeln("You can enable and disable stepping at any phpdbg prompt during execution"); + phpdbg_writeln(EMPTY); phpdbg_writeln("For example:"); phpdbg_writeln("\t%sstepping 1", PROMPT); phpdbg_writeln("Will enable stepping"); + phpdbg_writeln(EMPTY); phpdbg_writeln("While stepping is enabled you are presented with a prompt after the execution of each opcode"); return SUCCESS; } /* }}} */ @@ -125,6 +127,7 @@ PHPDBG_HELP(clear) /* {{{ */ PHPDBG_HELP(quiet) /* {{{ */ { phpdbg_writeln("Setting quietness on will stop the OPLINE output during execution"); + phpdbg_writeln(EMPTY); phpdbg_writeln("For example:"); phpdbg_writeln("\t%squiet 1", PROMPT); phpdbg_writeln("Will silence OPLINE output, while"); @@ -136,6 +139,7 @@ PHPDBG_HELP(quiet) /* {{{ */ PHPDBG_HELP(back) /* {{{ */ { phpdbg_writeln("The backtrace is gathered with the default debug_backtrace functionality."); + phpdbg_writeln(EMPTY); phpdbg_writeln("You can set the limit on the trace, for example:"); phpdbg_writeln("\t%sback 5", PROMPT); phpdbg_writeln("Will limit the number of frames to 5, the default is no limit"); @@ -145,12 +149,14 @@ PHPDBG_HELP(back) /* {{{ */ PHPDBG_HELP(list) /* {{{ */ { phpdbg_writeln("The list command displays N line from current context file."); + phpdbg_writeln(EMPTY); phpdbg_writeln("\t%slist 2", PROMPT); phpdbg_writeln("Will print next 2 lines from the current file"); phpdbg_writeln("\t%slist func", PROMPT); phpdbg_writeln("Will print the source of the global function \"func\""); phpdbg_writeln("\t%slist .mine", PROMPT); phpdbg_writeln("Will print the source of the class method \"mine\""); + phpdbg_writeln(EMPTY); phpdbg_writeln("Note: before listing functions you must have a populated function table, try compile !!"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fe1c326086907..f221b581eaeb4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -214,7 +214,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ return SUCCESS; } - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_notice("Execution Context Information:"); #ifdef HAVE_LIBREADLINE phpdbg_writeln("Readline\tyes"); @@ -249,7 +249,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ phpdbg_print_breakpoints(PHPDBG_BREAK_METHOD TSRMLS_CC); phpdbg_print_breakpoints(PHPDBG_BREAK_OPLINE TSRMLS_CC); - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); return SUCCESS; } /* }}} */ @@ -553,7 +553,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C)); + cmd = readline(PROMPT); cmd_len = strlen(cmd); #endif diff --git a/phpdbg_utils.h b/phpdbg_utils.h index e51462c797721..7682201493f94 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,8 +20,6 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H -#include "TSRM.h" - /** * Input scan functions */ @@ -53,4 +51,7 @@ void phpdbg_print(int TSRMLS_DC, const char*, ...); /* {{{ For prompt lines */ #define PROMPT ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ +/* {{{ For separation */ +#define SEPARATE "------------------------------------------------" /* }}} */ + #endif /* PHPDBG_UTILS_H */ From 43c2748dced2a77b34c09c15e403c6970b74e2b2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 00:36:47 +0000 Subject: [PATCH 0492/1256] fix bug in passing correct expression length add class printer (half done) --- phpdbg_print.c | 17 +++++++++++++++++ phpdbg_print.h | 2 ++ phpdbg_prompt.c | 19 +++++++++++-------- phpdbg_utils.c | 16 ++++++++++++++++ phpdbg_utils.h | 6 ++++++ 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 37daf028b3c12..c0d8fb4dcd1a5 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -34,3 +34,20 @@ PHPDBG_PRINT(opline) /* {{{ */ return SUCCESS; } /* }}} */ + +PHPDBG_PRINT(class) /* {{{ */ +{ + zend_class_entry **ce; + + if (expr && expr_len > 0L) { + if (zend_lookup_class(expr, strlen(expr), &ce TSRMLS_CC) == SUCCESS) { + + } else { + phpdbg_error("Cannot find class %s/%lu", expr, expr_len); + } + } else { + phpdbg_error("No class name provided!"); + } + + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h index ae8453bd0ff5c..2358f0bab4c65 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -35,12 +35,14 @@ * Printer Forward Declarations */ PHPDBG_PRINT(opline); +PHPDBG_PRINT(class); /** * Commands */ static const phpdbg_command_t phpdbg_print_commands[] = { PHPDBG_PRINT_D(opline, "print the current opline information"), + PHPDBG_PRINT_D(class, "print out the instructions in the specified class"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f221b581eaeb4..f7cba8cd751d0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -513,21 +513,24 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { - char *params = NULL; + char *expr = NULL; #ifndef _WIN32 - const char *cmd = strtok_r(cmd_line, " ", ¶ms); + const char *cmd = strtok_r(cmd_line, " ", &expr); #else - const char *cmd = strtok_s(cmd_line, " ", ¶ms); + const char *cmd = strtok_s(cmd_line, " ", &expr); #endif - size_t expr_len = cmd != NULL ? strlen(cmd) : 0; - + size_t expr_len = (cmd != NULL) ? strlen(cmd) : 0; + while (command && command->name) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { + PHPDBG_G(last) = (phpdbg_command_t*) command; - PHPDBG_G(last_params) = params; - PHPDBG_G(last_params_len) = cmd_len - expr_len; - return command->handler(params, cmd_len - expr_len TSRMLS_CC); + PHPDBG_G(last_params) = expr; + PHPDBG_G(last_params_len) = ((cmd_len - expr_len) - sizeof(" "))+1; + + return command->handler( + PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } ++command; } diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4031b2d209c29..27ada70ef7bdb 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -119,3 +119,19 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ efree(buffer); } } /* }}} */ + +char *phpdbg_trim(const char *expr, size_t *expr_len) /* {{{ */ +{ + char *pointer = expr; + + while (*pointer && isspace(*pointer)) { + pointer++; + (*expr_len)--; + } + + while (expr_len > 0L && isspace(pointer[(*expr_len)-1])) { + pointer[--(*expr_len)]='\0'; + } + + return pointer; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 7682201493f94..278019fd1a35f 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -28,6 +28,12 @@ int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); +/** + * Input trim function + * NOTE: efree all the things + */ +char *phpdbg_trim(const char*, size_t*); + /** * Error/notice/formatting helper */ From 68cff82d8bd6b046cbac556136b88dd76d6a116b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 01:35:39 +0000 Subject: [PATCH 0493/1256] class printer --- phpdbg_opcode.c | 3 ++- phpdbg_print.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_prompt.c | 2 +- phpdbg_utils.c | 1 + test.php | 1 + 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c index 5796678cad13a..39a51692b19df 100644 --- a/phpdbg_opcode.c +++ b/phpdbg_opcode.c @@ -191,6 +191,7 @@ const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ CASE(ZEND_RECV_VARIADIC); #endif CASE(ZEND_OP_DATA); - default: return "UNKNOWN"; + default: + return "UNKNOWN"; } } /* }}} */ diff --git a/phpdbg_print.c b/phpdbg_print.c index c0d8fb4dcd1a5..f5cbbd3eec7b4 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -20,6 +20,7 @@ #include "phpdbg.h" #include "phpdbg_print.h" #include "phpdbg_utils.h" +#include "phpdbg_opcode.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); @@ -41,7 +42,59 @@ PHPDBG_PRINT(class) /* {{{ */ if (expr && expr_len > 0L) { if (zend_lookup_class(expr, strlen(expr), &ce TSRMLS_CC) == SUCCESS) { + phpdbg_notice( + "%s %s: %s", + ((*ce)->type == ZEND_USER_CLASS) ? + "User" : "Internal", + ((*ce)->ce_flags & ZEND_ACC_INTERFACE) ? + "Interface" : + ((*ce)->ce_flags & ZEND_ACC_ABSTRACT) ? + "Abstract Class" : + "Class", + (*ce)->name); + phpdbg_writeln("Methods (%d):", zend_hash_num_elements(&(*ce)->function_table)); + if (zend_hash_num_elements(&(*ce)->function_table)) { + HashPosition position; + zend_function *method; + + for (zend_hash_internal_pointer_reset_ex(&(*ce)->function_table, &position); + zend_hash_get_current_data_ex(&(*ce)->function_table, (void**) &method, &position) == SUCCESS; + zend_hash_move_forward_ex(&(*ce)->function_table, &position)) { + switch (method->type) { + case ZEND_USER_FUNCTION: { + zend_op_array* op_array = &method->op_array; + + if (op_array) { + zend_op *opline = &op_array->opcodes[0]; + zend_uint opcode = 0, + end = op_array->last-1; + + phpdbg_writeln( + "\t%s::%s() in %s:%d-%d", + (*ce)->name, method->common.function_name, + op_array->filename ? op_array->filename : "unknown", + op_array->line_start, op_array->line_end); + + do { + char *decode = phpdbg_decode_opcode(opline->opcode); + if (decode != NULL) { + phpdbg_writeln( + "\t\t%p:%s", opline, decode); + } else phpdbg_error("\tFailed to decode opline @ %ld", opline); + + opline++; + } while (++opcode < end); + } + } break; + + default: { + phpdbg_writeln( + "\tInternal Method %s::%s()", (*ce)->name, method->common.function_name); + } + } + } + } } else { phpdbg_error("Cannot find class %s/%lu", expr, expr_len); } diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f7cba8cd751d0..d2cd8be7a8a47 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -547,7 +547,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ phpdbg_interactive_enter: phpdbg_write(PROMPT); - + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { cmd_len = strlen(cmd) - 1; diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 27ada70ef7bdb..3c8606cc22ff2 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -23,6 +23,7 @@ #include "php.h" #include "spprintf.h" #include "phpdbg.h" +#include "phpdbg_opcode.h" #include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); diff --git a/test.php b/test.php index 457e487db703d..0f240e1618fa4 100644 --- a/test.php +++ b/test.php @@ -2,6 +2,7 @@ class my { public function method() { + echo "Hello"; return $this; } } From 0781e7b86389d88bbbc28e4dfa21344cc02ae679 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 01:44:59 +0000 Subject: [PATCH 0494/1256] fix segfault on set break opline address --- phpdbg_bp.c | 2 +- phpdbg_print.c | 2 +- phpdbg_utils.c | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index b4defa1e70888..988898f22edb8 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -143,7 +143,7 @@ void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - phpdbg_notice("Breakpoint #%d added at %#lx%s", + phpdbg_notice("Breakpoint #%d added at %#lx", new_break.id, new_break.opline); } else { phpdbg_notice("Breakpoint exists at %#lx", opline); diff --git a/phpdbg_print.c b/phpdbg_print.c index f5cbbd3eec7b4..2c4c7ab5bffed 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -90,7 +90,7 @@ PHPDBG_PRINT(class) /* {{{ */ default: { phpdbg_writeln( - "\tInternal Method %s::%s()", (*ce)->name, method->common.function_name); + "\tInternal %s::%s()", (*ce)->name, method->common.function_name); } } } diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 3c8606cc22ff2..fb2253528b7d7 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -74,11 +74,13 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { char *buffer = NULL; - va_list args; + va_list args = {0}; - va_start(args, format); - vspprintf(&buffer, 0, format, args); - va_end(args); + if (format != NULL && strlen(format) > 0L) { + va_start(args, format); + vspprintf(&buffer, 0, format, args); + va_end(args); + } /* TODO(anyone) colours */ From efee212045fa151886613d1b11cd4d2c6e74441c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:26:37 +0000 Subject: [PATCH 0495/1256] class/func printers --- phpdbg_print.c | 127 ++++++++++++++++++++++++++++++++++++------------- phpdbg_print.h | 2 + 2 files changed, 96 insertions(+), 33 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 2c4c7ab5bffed..8b2f520cbbda4 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -36,6 +36,56 @@ PHPDBG_PRINT(opline) /* {{{ */ return SUCCESS; } /* }}} */ +static inline phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { + switch (method->type) { + case ZEND_USER_FUNCTION: { + zend_op_array* op_array = &method->op_array; + + if (op_array) { + zend_op *opline = &op_array->opcodes[0]; + zend_uint opcode = 0, + end = op_array->last-1; + + if (method->common.scope) { + phpdbg_writeln( + "\t#%d-%d %s::%s() %s", + op_array->line_start, op_array->line_end, + method->common.scope->name, + method->common.function_name, + op_array->filename ? op_array->filename : "unknown"); + } else { + phpdbg_writeln( + "\t#%d-%d %s() %s", + op_array->line_start, op_array->line_end, + method->common.function_name, + op_array->filename ? op_array->filename : "unknown"); + } + + + do { + char *decode = phpdbg_decode_opcode(opline->opcode); + if (decode != NULL) { + phpdbg_writeln( + "\t\t#%lu\t%p %s", opline->lineno, opline, decode); + } else phpdbg_error("\tFailed to decode opline @ %ld", opline); + + opline++; + } while (++opcode < end); + } + } break; + + default: { + if (method->common.scope) { + phpdbg_writeln( + "\tInternal %s::%s()", method->common.scope->name, method->common.function_name); + } else { + phpdbg_writeln( + "\tInternal %s()", method->common.function_name); + } + } + } +} + PHPDBG_PRINT(class) /* {{{ */ { zend_class_entry **ce; @@ -61,42 +111,11 @@ PHPDBG_PRINT(class) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(&(*ce)->function_table, &position); zend_hash_get_current_data_ex(&(*ce)->function_table, (void**) &method, &position) == SUCCESS; zend_hash_move_forward_ex(&(*ce)->function_table, &position)) { - switch (method->type) { - case ZEND_USER_FUNCTION: { - zend_op_array* op_array = &method->op_array; - - if (op_array) { - zend_op *opline = &op_array->opcodes[0]; - zend_uint opcode = 0, - end = op_array->last-1; - - phpdbg_writeln( - "\t%s::%s() in %s:%d-%d", - (*ce)->name, method->common.function_name, - op_array->filename ? op_array->filename : "unknown", - op_array->line_start, op_array->line_end); - - do { - char *decode = phpdbg_decode_opcode(opline->opcode); - if (decode != NULL) { - phpdbg_writeln( - "\t\t%p:%s", opline, decode); - } else phpdbg_error("\tFailed to decode opline @ %ld", opline); - - opline++; - } while (++opcode < end); - } - } break; - - default: { - phpdbg_writeln( - "\tInternal %s::%s()", (*ce)->name, method->common.function_name); - } - } + phpdbg_print_function_helper(method TSRMLS_CC); } } } else { - phpdbg_error("Cannot find class %s/%lu", expr, expr_len); + phpdbg_error("Cannot find class %s", expr); } } else { phpdbg_error("No class name provided!"); @@ -104,3 +123,45 @@ PHPDBG_PRINT(class) /* {{{ */ return SUCCESS; } /* }}} */ + +PHPDBG_PRINT(func) /* {{{ */ +{ + if (expr && expr_len > 0L) { + HashTable *func_table = EG(function_table); + zend_function* fbc; + const char *func_name = expr; + size_t func_name_len = expr_len; + + /* search active scope if begins with period */ + if (func_name[0] == '.') { + if (EG(scope)) { + func_name++; + func_name_len--; + + func_table = &EG(scope)->function_table; + } else { + phpdbg_error("No active class"); + return FAILURE; + } + } else if (!EG(function_table)) { + phpdbg_error("No function table loaded"); + return SUCCESS; + } else { + func_table = EG(function_table); + } + + if (zend_hash_find(func_table, func_name, func_name_len+1, (void**)&fbc) == SUCCESS) { + phpdbg_notice( + "%s Function %s", + (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", + fbc->common.function_name); + + phpdbg_print_function_helper(fbc TSRMLS_CC); + } else { + phpdbg_error("Function %s not found", func_name); + } + } else { + phpdbg_error("No function name provided"); + } + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h index 2358f0bab4c65..0af042b1bf592 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -36,6 +36,7 @@ */ PHPDBG_PRINT(opline); PHPDBG_PRINT(class); +PHPDBG_PRINT(func); /** * Commands @@ -43,6 +44,7 @@ PHPDBG_PRINT(class); static const phpdbg_command_t phpdbg_print_commands[] = { PHPDBG_PRINT_D(opline, "print the current opline information"), PHPDBG_PRINT_D(class, "print out the instructions in the specified class"), + PHPDBG_PRINT_D(func, "print out the instructions in the specified function"), {NULL, 0, 0} }; From 94e887cf2a9516970bc340630cec4f334f376150 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:39:02 +0000 Subject: [PATCH 0496/1256] ... --- phpdbg_prompt.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d2cd8be7a8a47..c3653d0284ac1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -207,9 +207,9 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { - if (expr_len > 0L) { + if (expr && expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - phpdbg_error("Failed to find print command: %s/%u", expr, expr_len); + phpdbg_error("Failed to find print command %s", expr); } return SUCCESS; } @@ -527,7 +527,8 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le PHPDBG_G(last) = (phpdbg_command_t*) command; PHPDBG_G(last_params) = expr; - PHPDBG_G(last_params_len) = ((cmd_len - expr_len) - sizeof(" "))+1; + PHPDBG_G(last_params_len) = (cmd_len - expr_len) ? + (((cmd_len - expr_len) - sizeof(" "))+1) : 0; return command->handler( PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); From 0ade5f0d9d9fc1fe40a9cbaa721e5cea685fdab5 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:43:09 +0000 Subject: [PATCH 0497/1256] fix list length lookup --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index c3653d0284ac1..5996bc23b378e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -481,7 +481,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ func_table = EG(function_table); } - if (zend_hash_find(func_table, func_name, func_name_len, + if (zend_hash_find(func_table, func_name, func_name_len+1, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { From fec3b77a0ff2b986723acf92e1b75e774f1f3753 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:48:22 +0000 Subject: [PATCH 0498/1256] ... --- phpdbg_prompt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5996bc23b378e..fbdd7def791f2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -215,7 +215,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ } phpdbg_writeln(SEPARATE); - phpdbg_notice("Execution Context Information:"); + phpdbg_notice("Execution Context Information"); #ifdef HAVE_LIBREADLINE phpdbg_writeln("Readline\tyes"); #else @@ -401,7 +401,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - phpdbg_error("Failed to find help command: %s/%lu", expr, expr_len); + phpdbg_error("Failed to find help command: %s", expr); } } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; From 2464629b5c43ff7d02ba98588f38971526538619 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:50:00 +0000 Subject: [PATCH 0499/1256] fix --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fbdd7def791f2..30f8e8adf4527 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -158,7 +158,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ /* disable stepping while eval() in progress */ PHPDBG_G(flags) &= ~ PHPDBG_IS_STEPPING; - if (zend_eval_stringl((char*)expr, expr_len-1, + if (zend_eval_stringl((char*)expr, expr_len, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r(&retval, 0 TSRMLS_CC); zval_dtor(&retval); From 0354bab777b9c08ee6aac34a64f6cdbd6c9dc9cd Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:59:10 +0000 Subject: [PATCH 0500/1256] ... --- phpdbg_help.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 575061955b60a..78d12c82a8aff 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -35,7 +35,7 @@ PHPDBG_HELP(step) /* {{{ */ { phpdbg_writeln("You can enable and disable stepping at any phpdbg prompt during execution"); phpdbg_writeln(EMPTY); - phpdbg_writeln("For example:"); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%sstepping 1", PROMPT); phpdbg_writeln("Will enable stepping"); phpdbg_writeln(EMPTY); @@ -62,6 +62,16 @@ PHPDBG_HELP(compile) /* {{{ */ PHPDBG_HELP(print) /* {{{ */ { phpdbg_writeln("By default, print will show information about the current execution environment"); + phpdbg_writeln("Other printing commands give access to address, file and line information"); + phpdbg_writeln(EMPTY); + phpdbg_writeln("Examples:"); + phpdbg_writeln("\t%sprint class \\my\\class", PROMPT); + phpdbg_writeln("Will print information about \\my\\class, including the instructions for every method and their address"); + phpdbg_writeln("\t%sprint func .getSomething", PROMPT); + phpdbg_writeln("Will print the instructions for the method getSomething in the currently active scope"); + phpdbg_writeln("\t%sprint opline", PROMPT); + phpdbg_writeln("Will print the instruction for the current opline"); + phpdbg_writeln(EMPTY); phpdbg_writeln("Specific printers loaded are show below:"); phpdbg_notice("Commands"); { @@ -93,7 +103,7 @@ PHPDBG_HELP(break) /* {{{ */ { phpdbg_writeln("Setting a breakpoint stops execution at a specific stage."); phpdbg_writeln(EMPTY); - phpdbg_writeln("For example:"); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%sbreak test.php:1", PROMPT); phpdbg_writeln("Will break execution on line 1 of test.php"); phpdbg_writeln("\t%sbreak my_function", PROMPT); @@ -128,11 +138,13 @@ PHPDBG_HELP(quiet) /* {{{ */ { phpdbg_writeln("Setting quietness on will stop the OPLINE output during execution"); phpdbg_writeln(EMPTY); - phpdbg_writeln("For example:"); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%squiet 1", PROMPT); phpdbg_writeln("Will silence OPLINE output, while"); phpdbg_writeln("\t%squiet 0", PROMPT); phpdbg_writeln("Will enable OPLINE output again"); + phpdbg_writeln(EMPTY); + phpdbg_writeln("Quietness is disabled while stepping through execution automatically"); return SUCCESS; } /* }}} */ @@ -140,7 +152,8 @@ PHPDBG_HELP(back) /* {{{ */ { phpdbg_writeln("The backtrace is gathered with the default debug_backtrace functionality."); phpdbg_writeln(EMPTY); - phpdbg_writeln("You can set the limit on the trace, for example:"); + phpdbg_writeln("Examples:"); + phpdbg_writeln("You can set the limit on the trace"); phpdbg_writeln("\t%sback 5", PROMPT); phpdbg_writeln("Will limit the number of frames to 5, the default is no limit"); return SUCCESS; @@ -150,6 +163,7 @@ PHPDBG_HELP(list) /* {{{ */ { phpdbg_writeln("The list command displays N line from current context file."); phpdbg_writeln(EMPTY); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%slist 2", PROMPT); phpdbg_writeln("Will print next 2 lines from the current file"); phpdbg_writeln("\t%slist func", PROMPT); From 60a8d908ce0735ec3973ec3d62aafbfeab52e8f2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 03:04:47 +0000 Subject: [PATCH 0501/1256] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9f7fbe4b5569..1ed77d9b7ec3b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Features ======== - Stepthrough Debugging - - Flexible Breakpoints (Class Method, Function, File:Line, internally Opline) + - Flexible Breakpoints (Class Method, Function, File:Line, Address) - Easy Access to PHP with built-in eval() - Easy Access to Currently Executing Code - Userland API From 176f995c245c3cf89a06e9f4e6f88a27a5ce1f08 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:04:41 +0000 Subject: [PATCH 0502/1256] activate globals --- phpdbg.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/phpdbg.c b/phpdbg.c index a4cb98a4516f1..24c5c1078a182 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -439,6 +439,10 @@ int main(int argc, char **argv) /* {{{ */ zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); + + zend_try { + zend_activate_auto_globals(TSRMLS_C); + } zend_end_try(); /* print blurb */ phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", @@ -446,6 +450,7 @@ int main(int argc, char **argv) /* {{{ */ phpdbg_writeln("To get help using phpdbg type \"help\" and press enter"); phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); + do { zend_try { phpdbg_interactive(TSRMLS_C); From a6d08af06b8ee4e9b3f6486fb2da7cfc69472965 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:20:39 +0000 Subject: [PATCH 0503/1256] fix leak from readline --- phpdbg_prompt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 30f8e8adf4527..951fe1d39b8f2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -594,6 +594,12 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { +#ifdef HAVE_LIBREADLINE + if (cmd) { + free(cmd); + cmd = NULL; + } +#endif goto phpdbg_interactive_enter; } } From 63a0c1ca15f695f648dbed477e8c0dda8c85fdb7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:34:02 +0000 Subject: [PATCH 0504/1256] ... --- phpdbg_prompt.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 951fe1d39b8f2..012fdd73cc989 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -563,7 +563,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ #endif /* trim space from end of input */ - while (isspace(cmd[cmd_len-1])) + while (*cmd && isspace(cmd[cmd_len-1])) cmd_len--; /* ensure string is null terminated */ @@ -588,21 +588,29 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ return PHPDBG_NEXT; } } - } else if (PHPDBG_G(last)) { - PHPDBG_G(last)->handler( - PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); - } - - if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { + #ifdef HAVE_LIBREADLINE if (cmd) { free(cmd); cmd = NULL; } #endif + + } else if (PHPDBG_G(last)) { + PHPDBG_G(last)->handler( + PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); + } + + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { goto phpdbg_interactive_enter; } } + +#ifdef HAVE_LIBREADLINE + if (cmd) { + free(cmd); + } +#endif return SUCCESS; } /* }}} */ From 88ad7f92791f7578656b3a9e0de5a78e7dd66e86 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:47:07 +0000 Subject: [PATCH 0505/1256] more detailed opline --- phpdbg_prompt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 012fdd73cc989..f9b1bf57936ab 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -623,9 +623,11 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { zend_op *opline = execute_data->opline; - - phpdbg_notice("OPLINE: %p:%s", - opline, phpdbg_decode_opcode(opline->opcode)); + /* output line info */ + phpdbg_notice("#%lu %p %s %s", + opline->lineno, + opline, phpdbg_decode_opcode(opline->opcode), + execute_data->op_array->filename ? execute_data->op_array->filename : "unknown"); } } /* }}} */ From 99bbc8e8118804367cf4a77f0c9b66118135229f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 05:36:01 +0000 Subject: [PATCH 0506/1256] method printer --- phpdbg_print.c | 38 +++++++++++++++++++++++++++++++++++++- phpdbg_print.h | 4 +++- phpdbg_prompt.c | 21 ++++++++------------- phpdbg_utils.c | 18 +----------------- phpdbg_utils.h | 6 ------ 5 files changed, 49 insertions(+), 38 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 8b2f520cbbda4..6ef3d4c37f371 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -124,6 +124,41 @@ PHPDBG_PRINT(class) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_PRINT(method) /* {{{ */ +{ + if (expr && expr_len > 0L) { + char *class_name = NULL; + char *func_name = NULL; + + if (phpdbg_is_class_method(expr, expr_len, &class_name, &func_name)) { + zend_class_entry **ce; + + if (zend_lookup_class(class_name, strlen(class_name), &ce TSRMLS_CC) == SUCCESS) { + zend_function *fbc; + + if (zend_hash_find(&(*ce)->function_table, func_name, strlen(func_name), (void**)&fbc) == SUCCESS) { + phpdbg_notice( + "%s Method %s", + (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", + fbc->common.function_name); + + phpdbg_print_function_helper(fbc TSRMLS_CC); + } else { + phpdbg_error("The method %s could not be found", func_name); + } + } + + efree(class_name); + efree(func_name); + } else { + phpdbg_error("The expression provided is not a valid method %s", expr); + } + } else { + phpdbg_error("No expression provided"); + } + return SUCCESS; +} /* }}} */ + PHPDBG_PRINT(func) /* {{{ */ { if (expr && expr_len > 0L) { @@ -152,8 +187,9 @@ PHPDBG_PRINT(func) /* {{{ */ if (zend_hash_find(func_table, func_name, func_name_len+1, (void**)&fbc) == SUCCESS) { phpdbg_notice( - "%s Function %s", + "%s %s %s", (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", + (fbc->common.scope) ? "Method" : "Function", fbc->common.function_name); phpdbg_print_function_helper(fbc TSRMLS_CC); diff --git a/phpdbg_print.h b/phpdbg_print.h index 0af042b1bf592..d906ab0230dfe 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -36,6 +36,7 @@ */ PHPDBG_PRINT(opline); PHPDBG_PRINT(class); +PHPDBG_PRINT(method); PHPDBG_PRINT(func); /** @@ -44,8 +45,9 @@ PHPDBG_PRINT(func); static const phpdbg_command_t phpdbg_print_commands[] = { PHPDBG_PRINT_D(opline, "print the current opline information"), PHPDBG_PRINT_D(class, "print out the instructions in the specified class"), + PHPDBG_PRINT_D(method, "print out the instructions in the specified method"), PHPDBG_PRINT_D(func, "print out the instructions in the specified function"), - {NULL, 0, 0} + {0, 0, 0, 0} }; #endif /* PHPDBG_PRINT_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f9b1bf57936ab..60982a9d805b4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -208,7 +208,8 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { if (expr && expr_len > 0L) { - if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + if (phpdbg_print_commands && + phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { phpdbg_error("Failed to find print command %s", expr); } return SUCCESS; @@ -521,7 +522,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #endif size_t expr_len = (cmd != NULL) ? strlen(cmd) : 0; - while (command && command->name) { + while (command && command->name && command->handler) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { @@ -546,20 +547,19 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ #ifndef HAVE_LIBREADLINE char cmd[PHPDBG_MAX_CMD]; -phpdbg_interactive_enter: - phpdbg_write(PROMPT); - while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && - fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + phpdbg_write(PROMPT) && + (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL)) { cmd_len = strlen(cmd) - 1; #else char *cmd = NULL; -phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { cmd = readline(PROMPT); - cmd_len = strlen(cmd); + if (cmd) { + cmd_len = strlen(cmd); + } else cmd_len = 0L; #endif /* trim space from end of input */ @@ -595,15 +595,10 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ cmd = NULL; } #endif - } else if (PHPDBG_G(last)) { PHPDBG_G(last)->handler( PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } - - if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - goto phpdbg_interactive_enter; - } } #ifdef HAVE_LIBREADLINE diff --git a/phpdbg_utils.c b/phpdbg_utils.c index fb2253528b7d7..b567850c2cd13 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -74,7 +74,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { char *buffer = NULL; - va_list args = {0}; + va_list args; if (format != NULL && strlen(format) > 0L) { va_start(args, format); @@ -122,19 +122,3 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ efree(buffer); } } /* }}} */ - -char *phpdbg_trim(const char *expr, size_t *expr_len) /* {{{ */ -{ - char *pointer = expr; - - while (*pointer && isspace(*pointer)) { - pointer++; - (*expr_len)--; - } - - while (expr_len > 0L && isspace(pointer[(*expr_len)-1])) { - pointer[--(*expr_len)]='\0'; - } - - return pointer; -} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 278019fd1a35f..7682201493f94 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -28,12 +28,6 @@ int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); -/** - * Input trim function - * NOTE: efree all the things - */ -char *phpdbg_trim(const char*, size_t*); - /** * Error/notice/formatting helper */ From b6c4fbee1b4e0fbfea56d335142a917b40b42a25 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 05:39:18 +0000 Subject: [PATCH 0507/1256] ... --- phpdbg_print.c | 2 +- phpdbg_utils.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 6ef3d4c37f371..1524ec5bf9da7 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -136,7 +136,7 @@ PHPDBG_PRINT(method) /* {{{ */ if (zend_lookup_class(class_name, strlen(class_name), &ce TSRMLS_CC) == SUCCESS) { zend_function *fbc; - if (zend_hash_find(&(*ce)->function_table, func_name, strlen(func_name), (void**)&fbc) == SUCCESS) { + if (zend_hash_find(&(*ce)->function_table, func_name, strlen(func_name)+1, (void**)&fbc) == SUCCESS) { phpdbg_notice( "%s Method %s", (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", diff --git a/phpdbg_utils.c b/phpdbg_utils.c index b567850c2cd13..df37df088e1d3 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -64,7 +64,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met } *class = estrndup(str, sep - str); - class[sep - str] = 0; + (*class)[sep - str] = 0; *method = estrndup(sep+2, str + len - (sep + 2)); From 5e266f34fc4b45be6ee04749d62bb379bef2c692 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:05:26 +0000 Subject: [PATCH 0508/1256] non readline fixes --- phpdbg_help.c | 4 ++++ phpdbg_print.c | 2 ++ phpdbg_prompt.c | 5 ++--- phpdbg_utils.c | 39 +++++++++++++++++++++------------------ phpdbg_utils.h | 2 +- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 78d12c82a8aff..c337ec92142a4 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -67,8 +67,12 @@ PHPDBG_HELP(print) /* {{{ */ phpdbg_writeln("Examples:"); phpdbg_writeln("\t%sprint class \\my\\class", PROMPT); phpdbg_writeln("Will print information about \\my\\class, including the instructions for every method and their address"); + phpdbg_writeln("\t%sprint method \\my\\class::method", PROMPT); + phpdbg_writeln("Will print the instructions for \\my\\class::method"); phpdbg_writeln("\t%sprint func .getSomething", PROMPT); phpdbg_writeln("Will print the instructions for the method getSomething in the currently active scope"); + phpdbg_writeln("\t%sprint func my_function", PROMPT); + phpdbg_writeln("Will print the instructions for the global function my_function"); phpdbg_writeln("\t%sprint opline", PROMPT); phpdbg_writeln("Will print the instruction for the current opline"); phpdbg_writeln(EMPTY); diff --git a/phpdbg_print.c b/phpdbg_print.c index 1524ec5bf9da7..600d8f2795c35 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -146,6 +146,8 @@ PHPDBG_PRINT(method) /* {{{ */ } else { phpdbg_error("The method %s could not be found", func_name); } + } else { + phpdbg_error("Failed to find the requested class %s", class_name); } efree(class_name); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 60982a9d805b4..85c5345fcc8ba 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -208,8 +208,7 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { if (expr && expr_len > 0L) { - if (phpdbg_print_commands && - phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { phpdbg_error("Failed to find print command %s", expr); } return SUCCESS; @@ -569,7 +568,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ /* ensure string is null terminated */ cmd[cmd_len] = '\0'; - if (cmd && cmd_len > 0L) { + if (*cmd && cmd_len > 0L) { #ifdef HAVE_LIBREADLINE add_history(cmd); #endif diff --git a/phpdbg_utils.c b/phpdbg_utils.c index df37df088e1d3..4fff4673e14c6 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -71,8 +71,9 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met return 1; } /* }}} */ -void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ +int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { + int rc = 0; char *buffer = NULL; va_list args; @@ -86,39 +87,41 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ switch (type) { case ERROR: - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); + rc = printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; case NOTICE: - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); + rc = printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; case WRITELN: { if (buffer) { - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + rc = printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); } else { - printf("\n"); + rc = printf("\n"); } } break; case WRITE: if (buffer) { - printf("%s%s%s", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + rc = printf("%s%s%s", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); } break; } if (buffer) { efree(buffer); } + + return rc; } /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 7682201493f94..b45342d0e07b1 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -38,7 +38,7 @@ enum { WRITE }; -void phpdbg_print(int TSRMLS_DC, const char*, ...); +int phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) From 8b7ab830146e5b0eb40f3c310e1abe374db453c6 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:11:23 +0000 Subject: [PATCH 0509/1256] clean up build --- phpdbg_print.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 600d8f2795c35..f337de043da45 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -36,7 +36,7 @@ PHPDBG_PRINT(opline) /* {{{ */ return SUCCESS; } /* }}} */ -static inline phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { +static inline void phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { switch (method->type) { case ZEND_USER_FUNCTION: { zend_op_array* op_array = &method->op_array; @@ -63,7 +63,7 @@ static inline phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { do { - char *decode = phpdbg_decode_opcode(opline->opcode); + const char *decode = phpdbg_decode_opcode(opline->opcode); if (decode != NULL) { phpdbg_writeln( "\t\t#%lu\t%p %s", opline->lineno, opline, decode); From b72a37dc5f9ae8a58902ce7ffa72c2d0260a06aa Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:23:40 +0000 Subject: [PATCH 0510/1256] tutorials directory for images and markdown --- tutorials/breaking.md | 6 ++++++ tutorials/welcome.png | Bin 0 -> 50332 bytes 2 files changed, 6 insertions(+) create mode 100644 tutorials/breaking.md create mode 100644 tutorials/welcome.png diff --git a/tutorials/breaking.md b/tutorials/breaking.md new file mode 100644 index 0000000000000..2cd2597087c4d --- /dev/null +++ b/tutorials/breaking.md @@ -0,0 +1,6 @@ +phpdbg - breaking +================= + +A breakpoint is a stage in the execution that you wish to halt the executor while you inspect, or change, the environment. + + diff --git a/tutorials/welcome.png b/tutorials/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..5417222169c7f86c64f35fdbc9acb9d55303aa06 GIT binary patch literal 50332 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 }lrZ41v(U3&n| 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ΞQFsyMS^62|SA^F8A40`=QD*|UH`Apv{RR=8a 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 literal 0 HcmV?d00001 From f4f8246de930f7b764ddf5e9d2c6fa621a22a72d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:29:00 +0000 Subject: [PATCH 0511/1256] help image --- tutorials/help.png | Bin 0 -> 132986 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tutorials/help.png diff --git a/tutorials/help.png b/tutorials/help.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8904ff30700673c2de23e735719a76e9a65445 GIT binary patch literal 132986 zcmdqI19v9T7B=|CR>!v8aXPkbJKeEu+s+%?wrzE6cWird*Q}X)zxfICtg2P3st)#k z&OWNWD_lWN903*w761SsNJ@w(0RUkB003waH01Xa=baOc?+du2kfaLqH@u)t!oKfe z>?AZD0RY6o|C}Jnw1~I>01-e^L{P;Ic&_UTL=%1dQgcpg41!Qe2;(xC&NmvYgr+iM zb~NW}D4~RmD#a2+L;V-Um6iIw={|Rdb_kA6Mr|10f!a~w<0~^G6MD*IXqZ}YWciEnUh)5<@o!dcaO!jD z!3xr6BI5s|uDDihY-f$kK+yEnOhT<DHyp0BG;kd1tya;HZMBaZ>1c{jY5uP~uMoQ%W?#WYFpXVF|pN$0q zR`d>N!T^vc{7Pg#QGiaWc`I)gNpSN2s>#h%DhfzNjqF6xBMX*37nzlX{rF3?VgtPv zs3A)17a%VWYZqW9N7pajOAo5?n({x4ACD4YfYA9kDvU=K#@Xct3(7z)Q=wR~ww0#< z{_aiYNKPEYI>JuVgRY1unSxUNA99L|#RHmA`u)`qg`^18hy!68%peD#iD%_RYU2mT zuZWp^4q`#0a?|I2z8FWTg%MH$9RtWHfs|oDgrxt9a6C&CgqpA`fhs3q|5zgfO>K() zQzE@dCW#man=X%7q_#`K031{!`-3)tKRcg#n(7F6EduOcgX9E>MIlHeQxN)pk-r~s z01Y)}-%H{j^fO`Xrx3I)X_9{4oLXH$;3QJ;CV6vIS|7k(#V`MTWD~vc2KR~^k%7J zqM4%^G|GJ@I$a(E$;xQzP-rJ;0J{E{K|4%t9tKQqxt*+HT7DU~I(30aaJkYjm8z;- zFFK7m=>M7>WZMusLY@r^Gxaa%xYA2a$!PcHl<`W{<#VQ!O-=4mSh?W{(ypI!VS;f;tTs6nMnt77a&EybT= zFDX+h9pDg56D6eVBwJ!3Q&3)wsybJS5veE}Th?Cuquf#?FQT9P|DfHC31)x8gu?s< zbmA;TY4nJ5?2uK8n&lQ8h{~c5P)DDJ-enHF<{`y{8CP1xV`PMbphgjRvoaVk1Mwe@ z7sxTqJwsu|1*f1CK;7LS`|fJ7DC6kLyAj2uNu@f=s?}vQs!my_7BY&c_CI1rN~?#Q zGQ#ExF#_`~laSYleE-Mj$Z#No9U)ot4Nim@YRnv@^prUj(Pm{Z05V1na?r|mL!l#f zN(R86A)RG*)7TQIAo7@m#cf`^pmcv)O!K0N{4ZCza8XQ#JVCf9si$G22dQO(htu+z z$`zuiVdq&@^V-W%Wl78PsVzvVDfaE@F{I-(ewGa>OOj{HD2OhjCsVZ-)4T*2viI7; z{1@RNy{xTclU`d3^VlZItm=QI`~!#({EE`2jp*d5S###e>pw)VVv*f3NC^J&oG|N$JrS!?$X7u1vjC0Cq+o#;&QpLPpHxZjOV8J6@J~X+qQ51dR%kD(4yz^4 zV?*iJs!8%;3@b^#dO%~vg_ThTk)|1I&HJgW-d1eUo-vCRTs^GBt!m7ytGG{w5@~s3 zBdhf@US+SW*e&&Pb5TWEoqnWadk2&0n!%mD#nEoN@*r1eFjI?k#MjB7QdckD@ zN$vVHG#Pb~;3k=xLbNO_w`yq4CyZYI%3HbM8hY-8I znBGKqja>he;(Y46$`+M`O~MRB~e1R3K{Fmh-*LqN!ArOzpx(cg6ta~^#rcCo8gXF` z@@r^J-(wSPYs!_16VT*9gPltQ!PSgskj^MzbX->rJcnoS$D02Dh=N=eCGU8T5P$u< z6))+6nTBtQo2nDylmFcDyBM3%~=Fgl2R>K(p4@iKKt&8>PB^~DKccP zYlZq(rjeK)=QSF2KlI;^B4_=#_Nj_hSAx;$GXZljnF?%cnR-x)C)JTX@6kwU~s zy32WI+*HXk72$}qc!v)tg6i*UeJFTd;;I!}0^T&v)M`~2xjVubb<8sNz@24gD3a~zX}h%k{t0oU49}9Ku3~y zAiqxpA@xhB`DOQ%*XZWyV71+CURZ%EL`kSWa0}%sfMWgT;|77RC&Xr3ZV(&FSnx{9 zUn@@lxR5QJowUmU)>(WmXPdb~4bes!G9S+h$WbND4jjIZ4ZW zDk&bPLW{n3O1Z|OEbN7mnh?My9TH6;U=4z1f9+!uiTej~1oZnI(1hKbC)(Pxvvg+EPIkA){DOb@5hwo>f6Ae&$G#3e5lu z5`I8{J+p6w&^PKkDMO=Cun-8XdX-R*&&TY>23V3(T9j}ecoZ|8<)6O(V7R#|ZS~(7 zYNCmfPGllSw0mJ)H$kjXvm#T_v_q(W#Z}Q#Fweyvq!28Zxe*`|MfBdICtUj(srbW= zgAZF6QNXS4dUF3Qjj-^f*?*4Sl3IWuf{%NS z1^TH$oWD*4&D=v5E@6S(=Z)(CG06#`N!?LqbE}nbG2shy*wD}pgp9+D5VARnpJ~Du z+QnPA3D&+@hHvKLMCNDh}rKG(R@eC zuu=_kag*H}l4tPKEF*+-hAEc{b~pwfu3RCFBJd9mlPsiJ#*po_0S+V1pqm~W@<`;EHRCFANT%z4y;b2Qc*P(T4-uM ztb6VeM?hmom%cAjsLjHlLMWYzML-ccJ1&34#p{nktIT1}O0=IBQPiKmVx*ZnyL5vYd%pQPJ%xSlgQJe!cmd~8+t>>BSN}^1PlRK3PE=MV z=%~SJOfH#cts29crZE&09X02By^GdYI5Q<*z?~j2KsTdRdy)_&bj}dfPsIto?%IYaqYt&0lg6+k+$G&-0&iV zK!kd^0u`C!CeTZq8dmAFw6w<0JOd3fC@|>tf@ImZz=Nnp4;@C291c%*z4&6i7(#Uz zphOjG$BHuz=ki6F4wa=z``cv}xop@SR-$ca>Fg}gK!w93u)F*Ggefd)k#|9`NfrS` zrEEGS0pdB$^t5o+oOd8C@Ql9ZYd;M(@*raKjptK##u+bJ3fF%!aY1p?u9>@F+q~Vi z>-=#n!E+r=!Wm{bV(r`f1q7QEDPFvtQV!`2k>0!m>1_*lvV??ev3=7(!?CmKzf4!3 zao3nIZTv*-;d$lp>Tch&dkkH++k`RS?dz%b+qDu^*Iw6Fu;a0UL8KP%&Na8Iu;qep zZ{~qo()3d3Ruwto4E^Z3KjCaJMDT5NbsMwyDL^>G5#NreFvIIGk&E z&11Qy*_^)aDvxy8J*u!}LN1b14D_eM^vJ2G`x0Htr0s@;1eXTEoT?>awm{b0Mup&Q z96tnM9QooS;12Vb*p?;0a}U@YFJ`L4yLF83W(t2Bg$~Qso)!b;37R4vp(Tv%EYWBw zT^2i#A1n4=U%F>dJQ_LFB@#qiC~h3nNS|~}(|8y{({WjaI`$oM1GZ?ZQw20*D%tNc zSEjskJp^}+b?hd)UYa$=h zqr)c0iUs1$lCh?B-3C^`yMIKq9*IeBQF@VS+lhk2e@}GV{Ii(v1FgFA{nnZ0^6H%| z&K~Gp7V|-0EF|Wv!dP(2c+oZvI^r(LH z$gw*|hau96A{v2x1wc%kVMldvW$lYU8#zX z=H@uGyyJ&VO_qBPCoxe5@?zTN0V+j%jf6<`F`Ao*%-L!6#=*et!dlFCYYDVJ0O8!} zHMZNTvNd#BQp2zuXsOwZ(2wE4f;#Wu4~Zs-R5vq=aM9u)ffxaXlu+sh&LeFjz2V!T zP2)dd{4=4AsXa$>bKFSh^!Vzs@7*ogYcJE!U#x6}Xh7HJ^G1;4b<#iY*hb;>++dxY zu8-(Rzq%QgHQy;E_B8wwmhWdn;`LXK;YRwhKu1OzDG?E{@~!$BWQ^f~k>_(mm&0!7 zc-%T-0y^J)=VnU6jcwZPVcZUKjNL+dJ7>lU&AGMg*fHMRVBj;ftR)Kt1vvi0Irc_|~q0kDCXz;pp?J&hel9_E?VRf-AOH#GJ49+dGF!p1FQ0 zU!LIV*Y}eUHRYRWCe7RO4kIGnr6xy%8nY zdJyh<{dmV=IGR89{7}%K@X!9_>bk!rb9VzuZ^ZMeCu|!&J+#Ee2cQ2i^3x>6E7-gT zJ4l-T!`s&fd|4(toQ|`%A&u?DLgv%mH_H3dTgLNU$?9c_B`vwRN!bGD_-=w7a zUc9^K{<8A+$hvaPfZiR&?x}dUXz^b2p%;c@cK45`=@kM@zDM>g??VFk62|=ysN#aA z1)G?}*{k>af8nNH)7c&~Ge6qy(Ce~1jgWXpRDKUoTqZj<`ClI_2HBpiF7VF8^cFW`krrJ3Yvw^6@#Z8?oD8sT(bvSL*~0J>Trxe|;dS zp!2^C{mc10QQmML$>Mz4aJ(5ElziU#c&do`w(Ym4v&gYn**?mgcSLnPdk8&`8*&-o zJv95eRm1;1dNb(@aBqg_Fd)sd8sbp=wYDBDWMPZ%70Of4k;|CCSO#DMb4s#(aH>w& z#kHni5Br$l(O`og%TKw(AftjVYUx

    Fc8HKCXqj{DpSR6hi3B>;(hF|Dw*^ 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 z

    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

    of?zh8D-EA3V*O*L`o-A`YwNle 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μ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 literal 0 HcmV?d00001 From 9967c7d6bbb0dd2a1f6d5f5ab826b24d49e95093 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 09:03:58 +0000 Subject: [PATCH 0512/1256] break help image --- tutorials/help-break.png | Bin 0 -> 103209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tutorials/help-break.png diff --git a/tutorials/help-break.png b/tutorials/help-break.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8d3cc14146e387756d490c3e7f4fed107f2266 GIT binary patch literal 103209 zcmdqIgLh>?vpyW#m?RTV>=WDO#I|kQb|$tbwr$(ClZknPU*2!6yY74cg|F5=>+I8K z@9yf_)z7M~dUk}ooH!!fPdE?|5JX7{5k(LX@LCWM&?6YA@0Ljel$!4^2qz&)WteaA zhA|HR{tas{q2UAqf;9M_4`?zC5-tb`5s0LSpt5_`rH)$`hUn9ms!K+?j`|OINkgRY zEY5tx!OC#T^K`(8eHzE(p)vrETC6wAso%c9F~{xXnup=kBeEdRpA?qf!OhTZ-V*@TG#Wrii^uL&{f3^9PIzUf{$Tr!;Rt}dztC~zta1L(AHtEk>6|1B^hnq>7>Njy-=SE&@E)&F&ifX|+|RM6X%ykvYDhTr-rtAU17CsC29}oH;X=HeZsQ{*m+k0%d zgly&v_fgdNLa@Q5WB&I<%=uR%s2n~*&xiu8WzBzsU9i)wc1>^4m)OX^vqDDv_qFC~ zv%hY&&j~E(Y{bdxufz;DqOhS7R*2@MXy+}_{56=ShV+!;)j|JP0$f4q5?79jBzRyO zV6GIoBV5omdsyt3F9M&4LKH@6%+AC>#bzfZ5-QPZe|gY-{9pBvB@#L{dl3FGMa`l? zHKy&NudzxQUdSRGB&u1)wEk?A(Z(s%uawZml@w0zghQht`d^vls~xq%B}OneAu4K2 z!~8{)K7_gkV1jQ%kEo)cdhjwxB6KMBmz=epXL4Yb)g-Qp1`NX}Mgvkv4KY;z+sxSl zFeIb{@#N7cR*OwCrc|snA}JX|WkcizsB38FLf9x44K}j}6vL3#P?ZIw{~?ndmytCr`NcR@lu@QQECZ*KKgm*+%3Vec z@qeE3Uj`UrgjXJrewbqNJIEvy%VYCxQcg=WO#sXk4yo`In~>~mBdU<$R&aALlA!*8 zm>w0_Xhr%g>9?jzn3Bwx5mcdrX+r6=lKSK-X+n8`{xp#xr`rEU6c;GsXp{kwfLbsr z^@T8(0iq)P#6aUi^FE^2K*7Jpv)0ov#C5)fb!3YohDVxzbYNa(Vl8}rjo2rt=`@d4 z&@zf9%19=tkSisj;nd5>CMjx|LdX;tLj0d6*Ik?A!77uDLawwFT%D<$_{ftW1D9kD zDdtE`GKv+RK06yfl|Ll|%7Vzk9C}oe`E@IwYNl^RRx21h{~EJ$yg!j4lf*SzQ7~Fg zEL|dFA{J33q0IERauh8YTZJqF4OSl_QG`@b|G!u6Ib0A5)PR1uOqu~xki6k(C>2$S z1|>i&T%@dgg0#jzPhKEoFk`vYH3O9P8Y(X&zaRAjh6Z*NUX)i{AC%#Oz8b6NR@2i! zX+CeVwgj;vl$KE=5tEZR6C<+hZ@mach?GbohK6ahqND<;7?Grl>wnL9Hx&uYAAl{E zuP-sk5(DNO0T|H#Gj6I|TCYe+1g`>pM~!{QWh9xzYW!0@Go4-zmE4uyoT6R;zXx0k zKH!KKc)m>^)2*o#rU7m;S*yERG@fXxNm4_0M{QBwA71%4vK%0qViG}JQbet+YAh8F zAvFY3`QN~YFDRRo9*q+Z&&7HNDV7|lJp1S!fLaiM-Nu8#830y4i_q^#ZBQwIt)3IW z3aDjiC_!^8H0Rn=c$#+xjmC$I&tzCP10XuMasnTzsk!P)D_eTWFgcU zVwfsPDx&1dD&Znz5wKwYz2N14V-Ffn0uW7);Z1dyiiP+_B{=k z$%$naU?(zzi6y5(tz(l*(SrVrR`_5v+ZNUce85!BEbbw~WVnC@q2?t3Oi{j_c>%^G zk(g03!C1<;q?}2~I9;k-N<|~-&^VA3?WYQ+Y_Via2?kA4D!3sL2PEhpRnrdo)*`4h%mK{ zTP0{KLA~wbqBf+G4Vt z!37qQ1;vU|1;k`zijvf2<)rA6D#lcLvoTyRbpH#9L^n}k`OE_>cOJsBX7S1MGE&lz zaDgl!%r@mErpHvQh+{06UHa!Tj4Vk~9%8a7f6Rs1?3(NLz2fxSq1mpAnvPM|EMY5m zly&#tO;YZoQNJO?RMF}oS)RNMt&lvKDuF6wk}~0Mfkl0aguJY@RD@iNl(3Q+YqE7b z+Ss7Z2?2Mb-%bv$fBGT|gde6kMdgy@`FsDyRB;A^TE4c5$8EBqm5Acs{5midtDTN3 z>uyg%o`@z+;Z|I$Pk%CjTYO9x2&2brt#2(y;;fq3GC`qM)OEn&%Hxo)R0JT7(w-`u zO5v)?;mY&t*2|b*Gj+Jd&)4ZS^*^AJO#r=FY$v5dYWz>fnW5$6e=Ex%e<^_bTZ51@ zBPgx7Lhwf3#Fz*9KPCRSAPjBcbAZ9D9U;FX^hB3%V0{Y zUS-GzQ)-^O%M>_J96qD6kwHlFn4yk9Nzu4tg!BjAK=zJat38ujbKKd2?h5hA3`p7F z#$3q59;5typcmzgg(GMV945nG4GtTB+@04PmL-h*l@8=od-0e?JnljJb9tbeCJ&Nq zuymCCq(vkNHwkU`?7{4#)NjY+&eTf1=SI=Wo7JGlxfPtb%YdamKnaUF^gT?|xtB6H zP$|3{CLOY00ERRoFd(f0(PGHLt?NZG-^Qh4d%2yu!*d9ZWMf%V!fZa|a$GfK%;Y{a zhxJigZl>v|EW%rN217!SL7u9nw4oj;gN;ZMDrEwyb`eCs|9rf7XI@e0Qde^(m7^`k zkG1M*{=p!HR3B|AO+=agb5p{|3sC2Xh6j@?FMnNWLIb+B%PI0tkQNWQTE=^2#N+~M3GJTKBS@@%OL=sks z2Ao}`#o$kpNqvZNA#BF7No>f%KMGQ1GA8BJOe)GMQl#jKC1ih;nVJrcyS!-i-jYT> zBQa@ihrYUDy29P@$RN1?)snP3TSSuDeM8kN&-Z~L8j>PGlsQ!(KPs%E^0ypLYN(@_ z3n?<6r6Ojq-S8SIR(~Hwg|0hbUD;AGy6Q*XuCVhsRk9zb>c>?oJ&_8r5HGlBWI7+~ z{n#@=X~k0B*Io~Sq^?>Ui6lg+#QBXv?iyr+p6;YD>tMAWJspI}D*00AMhBBH7SxE2U@?W>Tjs>Ed}A zQO#05uhAEhO(x@MyPWG1C0nwX*2z4}qUsT*Qei7&K=J&_gS5 zqT}26%b$)!Vx+*_FLgVc@HcYvE^sTnM!ChcYEB-|XR`dkzZ0;W_fC}fGi9fn^ha$> zi>E{-$;yyKHq+4;8JcDau^cOd(c@_HxMMMggpEC(_6*2eoG}y!3gtB!AD$F;?HL0) zU;l7|rqSV2*fF!O?jLWW=sYoj>~<*^9=3QcH3j*2_(!rf6?fg-eWOGHLCh7KMzhNv z`c+f?c&hv|Wh3g`sYV426*7$!M4`VTnAE5mhKYhPfg&L309BX{QM;4S=muTP^#kr& z7vVmD?7-}+M>~>aBEa*(Tt1>7AcGx>GypL88TvROgWZm_(6}D17zv9`o|kuTvz{<< zRBQbT_i)idhoKT=i!Goq0|Fv6ySN!`OdWEz&?DGVt&?w|*;P(o%ck&nQ^la94h}!wVkrStcgX_f~2fjmL>wUD)(StiC~y>hBr9-7Kfhe$RO+fU3j&P(SJ1M%3i7- zI^(Dyo7MGZB{6WIW?$^W&;C;~$$mR3&M;N%_{Y6?udVZH@K*OgCJ6Yp$`>hvg^R6N zT}x=V)x}BcVWYUi(}L;_+)d*^(n{>N_tBj6@cS^gQYUcfL!?t;uoGlHQsfdxUPYuq ztX42k-ew4S4S!xF+6>GlFgr6V?peWJTyCz+i}o9nPjdqC5b#>D&>|p6Bfx_F8PPoj z#p%rui_ID|8XFt`oCHJn0T5_)>#;NKnmJ(-;wO&cXO6}P?q0nKUbT_hw2=}?4esfh z2lt1f48mJT+)ywW>R5B`FFeM=ZE0vvE3v=^awTxO1EPh=E%VU#OxSpqK#KpeYS)12 zH3oGY%(QUO!NUzfQ5Ryb(6HKnG46_scgqd zVkJxLj;sX;Cp!RC8WdBN=njvGy>;s%FFeRFLXj5pY`V|Z$gdTDBTUzsPS5ErP5Qz| z{??n*`=YTkygm^XgbUAl zTi1NyqYt~R9+DIYZ+Z~6Fqoz#qQTLN-HM(6;)U>r?z1|E<29dG3 ztnfSG!7Z@-dOqOklrE7!M@3*2y??=efed6$^!P$Uc!FZR*MhKHf@p7KO7s4iJp!e1 z!XiY*FA6QaCg+RgnKm^^&QvdN-k5AXbA zy}n{2dyVEoPk#+IMpw#Ktg=A66Rr=aJ&zJ+bUgGrbz0)cYSA*2$Z9^>7Tf(d&^owO zHghGrjakz;K-9^^_a=w?{$8&=>abxjT2YgwHr#QRxp&P?K{CzBuO13X=H>W)w9lbn z2JtXuZfVtbqDT2{K;-%^p5!_i%kyq*uecH$pDNc@=5Lib23g5zhokwOg$ijT~!TlYdoO*i6aOcG{J zyi>L5qpZneV%XMU=;-*p#xc~jD0N?!$J=rV1x4J7e|+c{a|lZOQEb~2T>?cM(Y*8@ z&YXxN1ncjJ*I#8wqc4RzOg*xM4UH-y~_}K8MrR1rmTft>*7Yihv7$qKWz~TPh-cZnHtk_{|6k5GX`3HAk%Z)8S^-Nv2vK)Y_EFd z4%jbGB{6av6>Pej;&%JIl4p56_^z781#rCoxwzSnW|=Jbd=<|MrXXnj*+amC0{+a2 zVYbbK(@>9@XliP95R>_P1QmE0;DgKwTbT1ssERA_8V*oBn4q9}GuwI(t@4ISc_pxW z|75|dn<2n<9+kv)`8wb@3ctTuJ6BxdFzWYyva-t9_e&W`jQcl8R#BNLbsS%}easBXHooaMCxo zgES87dqATv@VI`BLcPHUwv!jygBlJKYhVtvbTXtarDgY7aBZekr8n)H`>C6xKgE*T zG|j=*1Am-&LK&$j_ez-Fj5lckc^JiDEo!wE@`tBTboVeg!;@a8J1SFpBgyfM>HLeu zUZ8rNA4<*3gdSf%>+DR7r z))UvP&40XHxNnxxU>`!p_a5;Zi1nW?HCi8=HvpeGx0~?Nt1y)oKh@hDF_l$B*^+KI zJzibkoJVwGg!tmL*@A*oddHJ1^fNA=;@{uG%O$Os3Tr{h52Qjz;OpQYLp=g21aX>+ z-XPg>4k?+m$>dgtHgWmLe?bm=!WfNHd_zu3o=1-2 zdV*SVdtifp@CRQI3ns0|I_k5M*9IbcI3 zhCx#LqG3sHXZt_KAGbW$7gT+uv#5B{XMBuST2gbrHK^_v=HEC6ZY{i6N)CJ02vaIN zHo}a{M3^vMJmNaceb4|N{?%b`*T6DO?RLPb8TNMuU_VY`bbd@eu3G(r(7xYAFqXP% zdZ6I}ZvEhR?p_%Oenn(P0{MBtkz;`*?a{5s41PBhot`sotCu4!0CsqQF~DelDUHR> zPW$=cyQ7EijE9-WwX1n2)1?Kh?jw&Y>WFNG-+;W})_29jE zE6#<^>_{@|%B!agn#&P%2lH&aZw$Z02|OTr2zh^|JGWzBm@(RJa%_5C`_viw@$25+ z?(hxcx9kKs&G2F+k;@EvDU}Q!WAbeHcs}>BLiw}0DwyFhTv^c?epHA7FTKMHD|w1jjZZ!e|dl zLPs5Fnd3qi1FB(E>@x z{fzfl6DSN%al_ zJsPMLo|!g3Zvv0)xfFR=iWHfWJ^gm!W)_(R*#qlfxvQu>k}#taU7guYFSRTVN0?}2 zy`fFC3MuOdCkAeU4(s`7IUP@<6$7(8;Cx)wTYcmweOG&4+cQ1K?Km-j&l{586i3|^ zN%yNEf>t+oxYqYy6DAwHPrf&G{a|i2~1WO>*c>H5Sdb%lnu( z6)3r}g8kfk^0M^T%Kp%lY7|1im0tHN>OWnD>v+0|Db?sOzK^n z3w$iV#F+|Jqs!3^XAMC4_UsAz9=r*)%HGvFqq+6v$d2o7TxL`6IIHR|Hr30ShL7jp zpU4NpF$1TWw*BD^)5G{~+acdOi~XQ7!bNMZp~$1t`C?|IpFG%KAJkN+Z$ zCbX7mrsr>Attp7P9D175c|YQ|j_5q5#!}@1#Did~;%NZ@= z!k%pN9#DrH0PZdS&ne5gD}RxetGUYj{jlZePaW3y0xQcEP;-eHF)M|y5oeM&H8 z3P!LhEk9?4fbnYT1P`d?R(SG{TZPNT)0MEOBNu7^z<>avxh_QlBZPR|S_iY@O#Jg^iq^9P&ZAOJ4ifBarO#4iY zV!At=2NH{2WGWw0IBz^D)W#CAK;N#pkuoNB&r!z1u}XY2${ z6FTgGBk$kO@DKPrZw6_z;eLl4_V8%d^#epPdH7Ap7pFGYT_?ajFyNyiI~w zrw1@y$~E4_|>k4#~2QuC7Gh8Z3#*QnVLq>dlvCIF#}A~YHIzN0^j_i z8ZZROhxv7YlM8_tD-{U%U4^N>%C>7PLuL6P_^jHDfaXQepUK{Mk>7MN*E&yXn3Z>1 zK9T+cD#>@vr5`xGa1}QniMTwMzPJ#4-Ng)-aYmHUDBVG?*tZA?1@Yu zq;t~J9d~AiD%%zOwGEeaJ=!}`UKpxVgXdsUe}**57Ui(N{*Bmczrlo*w~BXR3n;Cg z7i~D`wcs+|?N`LNT_9z3N}};Du}x|x5A;qi*Sgy-wU{e;5o=f@`z!C`0VstQ~T`md+#OZ2_;0JfRDtzxJ2K#O%&&M;jMAtUHX(9BHLwH)o&am`ss-i zYtO4&c*87K{;-0WO0k54LEX-vdH%Je13$T#KiH;x$_%Swof5UGKBeX1LI;6ZKrA>9 z?9f`(M<=E<0OB&hZCL_U-SD>ryN%Uwi*;=VxH9D z%oqdRXBWvhvs<#lFMiZa1O|R?+?ky(@)CxLUoDrooh~~QqewhRxK>%qb+4Mb6Vt;^ z&vL^LM;eDIelacod|=lCMl=>om%6dr)sPr=?#a6~a)e!9SKN)>8`6w&e`I9GoDBaS zW}k2zr2|4Gjr2rcZV%lx#V|V0An0~pPZfOF-7NFYsJ~5i)cywwjTm}Qs;1AHp7@Q; z4$^P!b~97(9O?89rfwOCJDvd#OV%BIHXWS|ASu}~X2U(PHCpwf^qHY!2YMo|*9NQV zM*5n12>5A3(g%7YD-+-U0pV(PK3I;8yWTdxhjrM@!Rd6r&P?m34bz@rcfZdmW#qQn zh+PZu{E*3l5r~xcc6zWxwMQE^DhWWS)Gc1$86;iU$8(a-AOWS`J}?k#z2rgT%4Lh31{e%elGLtAfO3_LhOXbda)Z zM_Yn?`;c9J>jL>w=f{^iaF>!>=eVZW`EpkQfa7eW)lnqqiv9__w`RzCCOMw|%;%xb zm@sAh8d*zwKB&yFVP|#eD+(hJ`pzx_PQub>mA~Eo4cpUt(da)3p+T5RLKx!KxA6*4 zb#8@3QhBKfJKSbJt`R_V{O(L3spRQ$6U`6$v^a+Dceo9k4n)-&%`=*vGAH!zmz`93 zbn14OD>%u-b5;HTE~BcrL9n6x_B1x_L^eVc%b=Qx+sTwkhP?W-OoN4E^7iqn=z1vN z35gop^+h_}MEXG?lG(0+_hA+j5}m2^Ui3Iq9-cl*|Bh3!!Y|<8O6DHL?p#Eg-Re`P zp-a+c()e|}fwy)!cPblcv6r=Tl-`=tkLGPvvINQcE z!lv(7vxGmWMBYyEf&IBn%kFvp^RJ}KC>>;O&`h6O3(n={hpz}NKOaAhuh^&-Q8WYr zv<;m%==Zl~##YBs_aY@+qm{l9{e|HgLD(R(nm;`>T1?Yt!rvoR&hRrH9|9Q}lKM@9 zrhD;IAB5*o|7_T7EU1V3qJ7YJp_gvDGFRg{A~TJ3uU^%n*J_+EoW7;T4Aj_lL6XF^ zZIoXVtNM_2&}8`#<|uAvlSXul#|#JERkdE8Tg7)jiDf;tz_$9Xf~&{UuR6}cyzkvz z#RoUUZDi!vC!R+c0e|;_7s~b8VI9xTdWqw?P9d&R!-7y*yRBt&987QAcI+YRb7s^H z<)OX|n0#nA-$>W+rvZUxDb7+=E zMul1C=E~fxtYtdwE(`4}>=c<99bImZuoNGi&JicF8Z$jNzn=Ja1>TPs{6LEvW%Nzf z_7B^uwHREe>B*QnzCM8m3x3{#db!?-c1O+wy@9Xy0Gsud)5XN>##K;3I z0%Z^?D#SE!-8p>tXU;uMgEYW)_Yr_n9uA4+f6t`REkfhhW{|}et#Mdd4$-nHxu6QbNIZ0<@hQV zuT>H*)|XOxMC$U;%0=3O~uxxELq?jDKP8NvOSqrgaM+q4O9;r1-3_yhvG8t8@OJxiVv=vGzmg->oJ`qSUiC_NOrLE?3LGe;r$!CTFz)>pz z78)P=`2TKpaW2--Xv4f%+XS#GTuAcR_I0{sCfLV`9nc1#PNbf6M-c6I*UL;7jc z10&C_vV*()@8qs5^XILv2WAxH4v1Y>^1t`b57a-xE8>)u70(;^!8=@Pl`-xUoIh+} z?%JyhzsqB+7G51!Z^XG1h4B+9HdYx>q6;@mjTZUMWRgNH|8RF}9csGMG}=1JS`1(B z-Xl{|-p`Y19<8;kx|^DkF&)>u*^<5syQ=K)9vNdt_lXL5kc9$H9$hh}&hnP}#nvEn z7=llpf1g7PV)JQP$gODr_)4#rOuC^5z_zRP3Ta$)Pq zWU$`}V3F=Tqh)0N-GeV6_uJD|6e8OyNJu9V9kD@Qe=guVf$98j5mw8t0nzi}lxp;% z9c)8_R(?vt(!@D2q4kX(H$hxcr`_9aKW_LJ?U<^9R;W_!tI411Ds;aiLo^!lkXI}s zwUj1kF?u+i<}+nSYmf2AgJ2SJs#Fvj)OL4|vR)4tr`5;|QM@tiv}t}k zCdNz*TI3S_ZzXzZ$;Fb9$ff*bK0*C8`lX=0IX75JbHXe)qpBCXOp}o(xTU*b}-e zD&#-0$_|kG01N8!QTaa_LHNHm10msms3#B@NwBi$-%qg%*W`4~RcWdHE!Rx-gsmk0 z172-eg0TUEcyHg~&Q_kIXiYPBCI^8AUy30CGGxWWG`yxb?!_)ppJXS4c{ZkhBOukeIdca1xr^Gd(0oRrtnn}KWh z0Ydj=J^GMV1KR|IKmi35Sx*0z*;edYMbc@<$r!fN8QU_3QJ7VZ79c<$-~$;^69Bgt z4KT*y&IR>f1`leau-`~;Sv&8ja+9*7e2<78iM`^Sk_gUIey;bO?I6d-(;3*d&0(v2 zNcyW3NVjHggHLuGXIz0VY4x|VMw`RovG~9$xs{7u2)WB%vPL9%Fxjq9YG0EbH?VaX z_X-DCQ_;*#y^l=b@whyWVK@Mgr^GNMe1q^WpiDUN$t;P`rVndwW?@QaaUSrem6RY? z`rgzDE;PEl5u1bN4aiVck0XgQr68iUj{SamyVyc#p0IJ)ssFgZ)|*}tRtvO?8NdKH z?)vm-EB(^F$IX5m6|GfCXqx!5>|v&odt$CbDQEk4KW*Pllm5sQ!PG&DPQn5LpguN( z{QPHC-y)7e)Titm-l9lxa{P}43YZ3YJ|hErM@rsK5=w$hike}3aC_oXWL0}iy{F#` z(`Uu|A8LsTw}$T-qW9^jMOd-;_~8b2R?nEvto9Uc{7?$tz)2*nN(hUiDwZHmk|0IX zuWZYbgNeB5Oz-6i*bnhn5jB=hK&bm#WGT>EFt1!Gb|4!8y5AE zkdQ5`C&+vv8Z%S=aT8qtW$XcWoBF6ai$5~>GaIrsIE8;})oLcO2{HQS)Jt)(m0$@#ZIgv9!|3pOH|zh@tb$k5%HDO6di?VGZd5ga_?0IA z|4>rOZ9-#v+xzQ~P*(ScMDSX{tiV`#apCidOi1FIa&pQ^7TL(u0IG2d#S1AFD0kOma9X74?^k8Qc6T4;F@fW_b zy(@M2!k{)IC&|fT(VoL6amP^4`5aFxk|HqgMk_mJW})k_rx2fmWTA4#Yd0N;M^4g3 z!*vO50v@>e@OHE(s>-G(6J9}*7Q0uZzflzq!E8}PhzC%ee?<*1BCADs+z%Hj!h`D8 z%&3ClBUZbqJ1bX$e-lOZ>GB8`BBMmuKFup*KGrb`QRP!H!ulXLU{{`{#IxZp6CW+G zXO#8z2(=TnIiJl19Q-_ux6CenMbwiefwVc|AieqzI}MJRki+k6tERMI_2%DH|BXnV za*(K^p)8NLDwXX|a9KZjE~+hSnvA>Z5Kj&g2sevc<+=KrZ(kPL~^-9mqXHaVVS(7cisn zG!xZ?MOvG&s5`?*Ate8D^_dhQ+hVHFgDT&Cj5C;Ap{mBxrq>ih)9w(nHXFx_w_Pgc}m$xQ&$V zrnA(>f7if2XRYRK{{>YQcJvB7Aj9KxB~fGkq|^UV(t9~#BZDj0{tgtSL|r1nmyZ0c z3@g4&KT1;JovmLlih@`hEBA!@_qO#ujkZCt^GT#SCn*zGqlyGiMd< z=-geB`XFBOH_$P>%5U=2l7A(Xx%*yqd@Lv%QXFwMOZ4rzQxjITYv-kP8%@6ZcHHt& z%n(I6Rhe?_VGe#LnpT-tBZl6N>^lqsod+dlRObs0UXE#eBVSf_CDme$SMBwsR4%(_ zB_$$4L0|Hra?=s@{8`O^;wd9tV)rYF=-$TuiW4crUZk#z zo`Laaf1ODEb;q-{7hqAh*TerJi7rB`yMn(X*rPqiDL5`32y;(hvc12TX!Z$(j~U_Z z3!C_qaFk8bdDmTaz-!}9`mSh5*01(!R*d6CCAwO#`G8|f3CdMFadhrJ{Pyv3 z+DmbQn$LJ16M;m4JuB_bD{H0nr-a^WeKX3wnym54k}n_9AmxGwHkY;iC6T~N>B-CL zo%I_bkS}l>jYB+hX3rp1kK_cYqcN^hkB$f0q1S=HIF*8MsWg83hkUo4p|cj_1AcR) zPKl*Y7`%zm_sa>ah9BudSvjE>Gu;FW>(&;C8%CFf><6JhTmKA*TJi|&ncT$RaWO+r zWhfuU{Fyro_8%q;yNAGEr=kJ|dseMa$88)J)ikv}L2gpnZFf7ZC(Utn*MFsHzGM2< z^<)&dwtQ|joLa(Iek+crbqSr0&oz3vrJlCcAEX#HZjTv;cvFN>%pbgb-k*@2z%ll; z4q8OgcB7|4ca0@L+DP6~PjdGMJ#L!inBQ$$Bfmx^<5#2e*U|G0HmK;>neD}j zKAUCp_`$$9dsp&9q~MI|E4@D{;Es`?B~rnnX}}{ypZp#xrTm8iJEmN3SP@GyGAe?h!O%<1St`+39Zz4WS_wWT4LNc~9FsB7Os!yK>of!>{U2O!_h=r3_2 z2+P4AI@%AJ`0ScEAElMw`lh&is2eZ8;P?@E!IRr@;F;~%)3aTq1g|w?J9U2|f3m$& zS+_kdt+E|4UU-re2gqc0%`o|&jW!n3SRjB{f8cG)2Ry5ed!lRBTyLw^@qrp(e3;4A zPr>N_xUlN)8~mW6eqq0l&;zkrO78)t6C#Ij2PrZ0E4UZw$T>X6*nJ_8wCidG=M>ON7_dw=;L#+Wz8#jc7oY~8)hyqw&l-)=54)DdljcY7fWiDD7P zR3*B=$+~~8_B!6*mWEvq!4u91S=BSR@|yoHl1<%d$&SXN?;==8Id=Gv6eeO7!|Ou~ zT*U9lZRXCw{rYkI&+P}>f;FE>_eh0OJ;!d#MxoO(>)pkQuJbn!?cfo?iW~f8%bD#TdaWI)JnyveT$V5#U<~ddgs#|P(7suhIV3lBrJ|U zJoS?ed}0<;3z-WQE7t|(jWp80O`^L>G(P>6{9oq>{w#6N&}b0T_lC=8_2Xvh_H6O@ z?Z*t4;&%mW?j$=%2dgV|L=VU>qn9N-K<;Jmf{C?%Ba22fDPX$Sb32SaV|4y?Y*d^s zGy@v8ce#@lt&>4&rKfj??aF6vX})4pdkuTCcPY#!&UBOSA8yRn0ppjx06U`R3*&l9FI)go=|thYX0K%3 zQv<6(vrg5xn>)krU&{Xi2j4(tT|WZQ_C8}=h0{A|ArafFAoGak`jn7}0k;PRE8T30 z7B`YqHkR6sfOv-}VDa0r>QAhnM4*!;hW=;1BR@wl(yTuVW^>E|2~@1|Z3H zraN-Zm-~-(wErYjfrfkHUqi1+|9buZ#2$TlB0clof_7`y{w&&HTfH8HxBr*_P3RB8 zsbOB+^>z$i3yvI2@<{s|lW^=e%%9VR{9Epo@W-Lzs`JcV>t&=-ol9f^Q&U_((>LdF zCNo?I`8=kl^Vx24f=z$oW2QG5i!ib~V`~J&P;2a%=vUigq^C4IZr>62sS|pC#rZS> z!dKv$W#cbPwBx5lYEHLKW4F?0*@{-479%2M&F zpr8R<`3LCgP$HhTd3f4PCpg6qwD}gu`Z&FgXTtFwOOs;>dHoz<+KH#Vxt9ci%kE6T3*HSYhN zmNWT(vxm|d-97t2TMai=Rxz9aF7sX3z{wJ9zv&+mM5H~+p&GsQzjFuakUz09b3VDV zy7UN1?-t@Up6GNxTnV*(w|G~}od_DXd!XGm-7!o4`65jBJlSfmamHy7ZU)^Rlp3Zw zh#M5XyS1Kl$JIU7rS2}nvk3&v1v2Oo#zmmN?ftWI6Ejm1FFDeZ`Med-cA9{(UjHKy zIaN!o^{{sg{TU@Y(~5d>xdI(=iJZoAE9}g5mRaqUnhDv28G9@ zrK!?kv|=lLv)^DR%+yE(B z27~XL{Z*+04+^{V>Cx)d)Nwp=dk5#}2Ah1vI9pEmtFg1|UWF zKmT?nb@m3sg|_*QE5=5Is3DQQ1CUB1(uvT`Uox+hK|$5LP#q7l0zztd&f|6N&u-U7 z2DVz(>E_UWQhdBzP#ed2Z4m(t*cgvXmw+;oppdC@pti) zHaU(*xP1)~JfaG$qlA6@^OUIR31a`39_^J{3Ds^Lc=gPMK=J7bXtvE0c%tY8o**D~ z+rqf64W1)I=W=2Abs9u|Ga=us%jeC|5mDdjnyKUn95`Glo3CQS5Jm5~m1X+qgr9Y3OV6vZVbZB2c+X%Uz}zM`%dFnI$UhG5$;jClZ-?6ZPvzv zc$izwy1~)xSyA@`(WOt-if&kq(uAdUy{`&9V#^i|(tQ|h-s@i?zy5-@Y4@vlAx}@W z4mNPr|4hV8YjuUO;?e3WS0Mn8MHJM8gjj~I)PrDKLT2A&9)3lj%^XWzQZsr=)Ofiz zq1ZFgg!>0KD)o`Twm$Y9MN5L5u}w~qJ7_-}Gh(O2pLf$`{9$-$K1Yg_+dv%A|4{9G z`^ax~-+-8B)*TL;SHSL48OQC1Y{n8jFoiAz7R1&4brF6)5ylV8btC!&F7wwqx7gg= z7T9vQHw?dZ-L216BZMrAzPx>e-JFsT8r`f8)a7r7zOG@!UgS77+E4?b=D9$EkHAM6 z`WM-;g7EE0VyRI_&<;u8SS(D?NUUPy|3G-Uxt2(p{(u5O0rQy#x}T;$->e}=)lr-I zr*qZMyC!#&v+FlZQ^R17E1};<0bK43)1ae==UfRJWgUh`4c!05oY(^^?(53)36VJO znX0VS+ z*ul_ztjQDCn!2WiIlI&i71`Xzc5}pZ{1gHLK)`OO(;CgoSr#*QhTCO66<$mC1@yWY9@%ET$bLOD7c$f3rdfp%*nEN*vX!Z0rrFMcq zL8<;fI^H^{t+rj`rBI-Fi@UqKLy+PWio3f@i$j8x(&Fw#N{d5qhu|*7-QC?Gob-M7 zxA&ZL_Wmm~$(mV{=XusG*Y8@lZm6CTuzi<+G;DV$&lUCuZ<3%|tP!sQ7rp?O6DsHl zl;k}ZF^jH-Y+2wKKQ!(}D!Pk$(E9dD1_%d-P$G9*ZM!|llQE-?Z+m~l^SbikZa5&k zOu^37=E9!IavCHBOfRC6DU|idKE2ao5fX32m?}oryM9w9)_L%!@RpH^^F7Gh!FgK@TAh%3@}qM7QH8c8Yjb2d__pSGxdn z(7WSNgz^0(fa$^2_MLbwK;^)&j|1jHs?B}nNAAOFd_Vc9n+_l)QABafvE*#74O|vB zaQVz!Gb$@P50{P}7`k-`SJNhV{k7}7{(RHTrvA`v`45|#4{v${ywgU4_WKh#QNJ+* z&X{KSdczeGBX!ihK~>jdty7ULyR^^C zo%{sR#X@9Wd@wD@fy9p|cO;HU74wW`@K)Au13pGdY2(Cd!O2tAPO}ScB=U-r-c#Xk zBjq(GN{#KXRa{1St@UFF^{Fl}58eC6$&928F#n2`wpWOg^ASzPp8GgprXn1(oWcB9 zrp3WDWJ}KZn&3(VTbAnY4T%K+Pp@y5?~4_iag{d2HwRyRBK00FHnEVdJe~K5PfE!h zV7jthf!~Ef*-0DYs-4uCG)EQaszbGh?b%FY=n-cy(kNop1cK=o0cr1Cr8{@G)~FiT z;|ggSRQx(<>&<7qQUyO&HxZ7PXg=>bw5|mt1D$@hReGUY#K|esD9R8^M(OHPjyoa$ zJSZXX(wxqy>>aSjxCx$iI4r!T%($j*gSG0%5!Wvw6~I5foBfj5`J#{SfVv-Y=^8d}=@r(k3O$Q&H$E>(XHwh&$4XpCdQ^mSB~pj7|{-Ps;WIDUurR>6OFL z{UuB46L`QoU|U>pU&rX~2X$%dmNoiZUf^xk-J7eNfC{xP*|}ZH;9GJ(icm46oW^D6 zB+kA4-**q-Q*#A(htJw@wqkDmDnc#KdyjX{GUWGoJZCF;rM z*@*&}n_2+)7RDJt%C%80J23xU*uos5QL|@odPa<@u@4I1;-;4D3w7=JD;bL3wd7fA z$`QEawC@TrEg|4!TuKIYTloRbOP^Fp=scwLO(Fq1HxDQ9=yl5tXw|f1ko9vu%_2A2 zi}xW0tJBJWZ?fKDD9vrc*$EGY`3^HYUr|oQXWRKxUc^6h%xT7A22o_je6mgYpj0W-~ z(sFxd(0}av`oZ=F>5OIip6!D(pTEQKeK6f8cH`QdU_sBcS^8Uzl9Nt^qcD!~LC4je zU6CROyYoYYID)VaLMstJo!5`AdXlSsR*kN2g4XO^{Xm7{{-4Qq;a2T0TEL0J;I9JX zeFh9m+rH6EpgTovyRk94wlZ(mg{#jns_KeK3Trzszj>Ixu4|2Lx9$RWHG;)L3qZH1 zK*M~R=|>&Gy)PPN?Um$je3AH*y7>!CLa1;U%!h?ys4|YCOpg5sA84VwwRzVae-MN> zv2=b!+9Vxw?!<9<+>^7y#ct&b+Up{)lK}8CjJzrM&s#$4zf|0)SFE3i1hzf!VJPH^DV`I{B)9e!11f1_(DgPp&E|Rya-Mm@j@bza3JRH*%i5pwA-<{f$8#F=p zJH2DmqFaM!cU^_J0&%>FGbs^9>undJfV!yrkW)hsVJJy-Y3FLUwV+dXdBg5`3D?Fb z{FHNsX-WX*dyeBvSEDej`VIU5TxUTu3-pyI8c~nM&;}1R@*?tQ&b^k1N}s8)NGAeo zB*CvGZ{TbL+&VkN&Tk%L)_Re5Hg;KK9S?#=kd8uzzmmw>ILDjz0;2wPPK7lbn;p&&pT5xdy;*482)lToGutd*fIk>o=hx58kW!S0SpTW@IcxDL{7%(#mn0hR5K( z3eJS?UO#l066+LV$wX@nheAA96V?8JRQ-mq!()C;bBJYl;EbpXbMT6z&*r@-s=tX$ z?Tnn&>|6h069YkV4H1bY0E;XUsTw~0+q{N9aZ?h{ffih{vRgA}6~lYqb`(9t!d!kv zw^qmo>$xes)p`}=@ow69;@B7Ww@_k|2g;u8_%9{S4@DiygZcS``P59sR7}?D8diU& zT438#r%{F{eS(x?cA#r0=V3HX|jHH}GX3a)Sgh}A4Gh1uoK)TX*sY?GqDRs+KLjFJXtD$Knv`pXj4zP0zk=UDL# zV^Xd?@nCcLTpi-_YlK%xc(%pC6PwLJ_b0wQWR1$?`K463aC%;V&1*3o;>l0_JJ;sT zYW-E{(zCg4k5=EXm=Pz@`ghT0yyS{r%S`4>=dI!|CJ-TRp$RK@1rESTF&36eXyF;G zmRuosz5bR5NPH;O+pn&fh|y!hfXU0Enzv1@WJh+9xv@jk;0(CmoCJ`saRO!Cg<%{W z_{1SayK!TOoXRi<4r4Kr7N&@<{F=4U{BZ=?umrtP#WvnzzG=HD`ulhmr!I6$CC>?y zwTpK#n^$3dx!J{CmajFn~FSAZK6z(C`T1(=$;J8+O;)=X&&@U-Yq>iv!tTd*2eF z$|y-y#@re(W{eOvR& z`>)BxQ(co|-T`AtvX&SM^IEC;#3`7wUXK!%cqsFYG)Dy1>O<0j!_=U3`jkkmBjF$D zdsrvp4pD~cbU}$ygS~{bw8Zf;&Dil6nVuB|RyLdS1D9NTf5iTfRG+VFoKiJ+UGEja zo4(eZiFK{zxx70rsu;^Z(%Jz^VfGYMei-a*VK(| zKhMMTN9b*A2NzsAvMTmwaO?H%#;;vX3tcAhYeXZaLmYGum5Xu9H zIvC_U`$^V*Vrvx0*969Tv*2KPP`1ZK=*tlvrQ64toAELAsK*Q#9xA8=^f(YIM1hUv zejW^z3h0%MM zGapOv&QhwCqb>AIfBVJWmL}h+g+3#TU+A2}n=W_!L47kx&7e=0#uD%C7cB{i9P2l* zi8*IzuTO(ljq_?GTIJc=B_y_9W4mj~1{}|X&G|-tO)$u|8&KH~TpM=LoMR*4k0&u@ z(PiC`FO}n67>!Vm@y$VXKDJ?^g@_~88Z;Q!n&DSyfw}L4&*fAs@bp8Agrhu>tUV2X z9`G^s7YDWrhrQUGwru7VPar)lHBL?jN>H~7NFu%(>MSk|#Be3}&7}LM)=c{OGn?*5 z9Y<3{Ts28Mmh#U8uirZcUXkk;D!@rESU&uCeC8rb{gT!wkOqg6xqGV-pZS<|nN^?J zXfxWls~y5yLXV?cJAo`2B=IqQvQ`l-iLVF)tPp-@p?6jPPP{UzEk1gbkvo1 z73tkX-x!CE+hskjs3LTva2iW`J`oO+YA-C9IL2kXk+Ene}DR~D+Eh4XBLIVSO<*K>N#RsT0}1{+;v5Y*=F1a zw&Lnt$c+-lzEr_4fAOdF$00Jyro^k2Zn-HrxdALcq!d7lZHESDiW~!MipR9Z>yqBP z&k9+R6J)Q$Zs6Lcv8`iDLrtWhTqKFHPvC2^l#v}HbY?q%TV{Sn_kk<_v(-xe{bwbG zZe6jJbXVxx3zklSckgac)YU|~9UuqJFOy{;p964sU8&;_m7-Jh>qh2tUInl{kLEy8$X2&zWnO;86`60pV|q#w|6s3Ptv~^cy0Vnix*a3> zC3Pc)V|!l_Us&}Frlr0)MW4TM%y}Tg{Wj(bTSURrq7|IEs!ZLq<<8jX5xdEI*)09k z{%h69&1N^Tq5$XXx&!QsuEqxpAFb2uWT1^ANGJ*-=0!HYxtp+EBH_cU2|D7)D{caf z;^Nhwrb!HiB}rokH>e3Vs;Jef0Z5>l#N)8&*w#yi-qjVt2=eEvr;j z*2DKvKlJ1V=Bv}^vz2%H$n;2sYQDS38OqPEv*kZycrF0$5gucX)*)Cm!bC5`n@UIL zVA5;3^IUCcqRo@&?-$=q0~T@f{*1$0i{W_msw%I`%P&-kWy0QSS9jmVfcr-#Q=iCd zdI3@HWcTkD0mRn~9%d6q96nZawKdAgG!L48AHi|8yeEQ>T5We5O2)u@yetqjv~X4{ zhG6e?5kAfwY97*=pBN*vyewMPj%cTBv&~Ca!+J{GqqU1OVPlG?7i8#4?T0-2z(NL3 z!+@~t^|4g_WAewtg)pDf&6Qt6fyYv^Dnwmpkl$y=t;@EnP>w6mzTe(GrxUivzq{Ou zsI%iQ4`KhYe>s5~%_4k&HIUEubHqjU)9jwu)QKm>Y4pBIF%>N!AtuZu$iflu5ar?8 zbLKYeUq{9-cAO$=vvjo~S<3nvRfl_TBcHd`lCvcIsu@FxP5n0@&Tz1d7!2@ zVKjSbJA!)7DzqNsn^$D~2sR<*=mGmg3kx251zP1q6m)xf>xuDucikW1ar!DN89QAG ziwuWARL>klo%l>rkG`86>CZJAEbnXXrn;r7k*&EOTOaol#e#B;L|nJqz2+9&->@CM zP5;L0L7eVI&OdlfhMR$`^^_t<$oNmnD<`(7|7<& zl%qfG2-x`1RM|^l9s}|{h}oAedt&OlBjRfN+*_~h|2{$B*F?aPE_p*Srl0I;$0Ved zmalV3{NXPD-HZP7S;(?A+QIc&!9nN$NRCsunt`SKHla!+$ulMT0sb>v1? z7Fk2#EJVe4ci8d(YjLjCnJP?-8>QAD!Equt+xX>uM9f>^tjdH*@NQ!{QOms(eb$?{ z7~S%1K$-W%BEglEM+imj(Rnu3Lrh_gt> zad1w)&7_wRui9!?_Tm}IvB*gQ)8IJ5?xh>E<#K$PckUWH#Kcfadk;Oxm3mvCoBZW! ziee~C|6U{doX7g5b^{g@enw|U?Sp)b99NX{hxLY{r|=yWT`+9Ou|R7d3X&-F zH%(yWNHVDAz{`2vq?P@r^q3zZp9M0LSoZp)3`xJPP=pu7f#ibF18FrZRcESbmm3Zc zWP?US35@$U=#&~Nj6~=I_`gq==wv%hZ)_}Ow&#Dg0PeU&Tb5g2aEh=1$U4|=$94;6 z>RdjdIyvaYVslt^&RCEx-U$7`=`gIuQ=o^#*`EcB{pvZK&+v#`GOBLiCW^dyn2VA) z*EaU?M@QpssX4j@MLyfVf;d5cjD6*8|8-CVA-xNqOW38#DP|PM3c8p&W!aI4LslJs z6&_%!Y%3A`j+0?BKOeD3v+>Js>kM^)KD9+K>)=6(?$2!eeA@KisqH$$ZBkfSodJTK z*%*@-sx66qz_^OqjUs}tlLbbBt1CqBQ-;cS%WVKV&01+&!ks6U2*wx7sKsMZ@RUS_ zQ!?SU=kKI0BT&%TPRJ#n5nV1XE9Dgke#4&nBpFy`V(YJO@2-%JG2oZ!p@)g9C8LGc z;!F@8K6}a}e`I`^6(B zoA`M)+@m%xdu_xe=l#*y` z4I}zsr+q1f&|5|+z2z9o}jtp*Qdp{C@ zpIhdKeJ&**KHGOCg~)P?<>9wxJ$##I;hC%3yS}@gG$3aam+BVn9*}Pp9~-yovfUwz z+-a%N4OloAWMpATosRGn$jau!e(GA#2Q7K4`sPW5k) zaT$nMR;-Wc0VB?!lt%+S8WSD-vU84=huRCd*}MF_7ya`xnW^(jxK(F%iOQrs3N~O~ zPfYpU?D#)BtG}JT3H}O;to8Mq*D{N+P?`~wbs$p~x!=OMr?~L>pew{>lxoqS?F98T ze8>GL&zShou8F^bqB?vyz&kVV=Uq`;=J2kG%1+UX-vg_IuG{DciX&^wW7^Z%;ggrh z(pe9^dvw^cZ87Fdt2+ype@*I~BX~--eV9iFVh`W0@{;Wz>@s_3#%&KWxglJZDKoFI^F#^%;H#ZQ^E; zpCj}o#y&~NDz8Xhj;7wu z7C-tKEr@N>$GLkW2RQ1~a($}j=svX@*9bYg{sXsiwyBi_(0k~9Ltl38e&77Ec^D-5 zQkV;luX)08dD*DT4jR*UV*KLu>}_>~t7(TNe>EGXBJWb}fwS1w?YmwJXurEX^F z#g)yv^-`pdrtD82^Xx_TipEzKVvznho^!VRd65;xbWh#wBhOmsi)+qg3G0Ge><^{Y zbr(c5!L^_67pg;0y4Qw&snCgAQl-82&C{#AtgIyGfA{zSY~w#U2`amrp-yjcPwb(| zvUo^_0}(aHDztuLym}uOgA33<2Tudap8gQO)C|^MNMBxR~M^8B-MkY(q z2Hf$fncv<4qC5AHkrk>CGnRuD*nR30Fd!>|1NL3^{M00rId|txM&ACfG}}$0p`Pz?mm+xOXH9)P`<1(#P6#u^T)D!({Zn$@SqVyF{69_$;yflYcWc_rGz zO6I=TzXycOs|1gHQKo%FK*Hf~#;9hMw0FS=zoe`5tp2IJhSSE|KaXK&cn@o6p9dpo zEx0qdGHAmiT7NsK@|xJr1B$p`{@V+n=u;Ja$GBZkbxmA2{fS$N!azP7q`dow3GKc9 zcK1zo-mm4VyyO*VQZ0<9^h9#hZ1U6v1UC_}@t0cTRIy4@re-_43`ok2Z!j3nQVY!d zdIKO3RycXr)n;|2ZYiSh-I^AXKpmD6n14dNNdaqLisF660LS-P&d?si^c$Lj=bi-k+RoayB{u1vF zgvSukr!niPMbri8TwY(8(|*eC=}m?ic5vCy>YO67cH8j$DtmVA!n?I|euT|o{Kpim2*9GP6O(nA+b>wJwh z{AyZI0xr9m&?J$~?-dwFu1G8F?6*i#;8@5cL7DUM1K;>jUe*JG_YWD|_YZ422;N4R zE#q}l`&E_U8*bRs-D*8GhnU_!aAj%%rY<8Ix4at}c92}-0Fe*Jufk`>wqsceQ|dsU znTT6K`Zp|I8mQti5wU~6k8wtf^>1dGW8P7`T~^IUT6!3kd4gWhkVf+gO*4nhK_}Bz z#~*dHp;Hg$eJP_i76(New}Ni(s{^L)n2ceD0~tc^N9Se}sc!BH@}N0C ze|a^A_VT-)-v7v3w@9*vb`!2%b?YdQz1w_DY?G^&iF|tF?Usz1nhv005j=GzvyAf+ zJmnzj`;Fna^(-7GK%V)*^XQRU(rQhldkgZC1U8IjWLUIM3^_9q-Gh;4+D4X3{*eNM z@Nmo6^P_u;Q?Yv#zs+ZHruSN>5OVY07ok58LA7VhZaK(bL9KWf-(0fiPh(G$FAY_O z(_AUNC5mQG#E_mfS}7&B7Pa`7mr*@MCpRrMJV2Ja%PRQG4GZzA4K3jP6B_pwq)2`||%kI?k$ZXCyuy{mXmTh;5$?uvM_%cg|=uUW4R8+># z-!cHpwr#7|k&Hnbcu)}rlpY=)kwAR8k`2hgy;*mtvs(Q)boD8e(h++^ExO(QIBq`8X9cP0?Dk>?C z{Bt$zq*Nug2rN1BTh!?XV>R_k#M83kqv1zve_^%1PW`0yjN&MmtHC<*m|EHL&7rwI z@c3oDQ6$THCby#cdE}btX5=v8%QRj$s%9f$_=%b1I2R17x}GF4-5$s#@E+cZ7q6L*!7qRdmYN>{i5a{dx(u8IO+I(@W-U;Bg6sp z^`<$!t|+$o6Cw|TvW=GWyoEg-D~6xzODo&F=sHibjbG0!<$o%dcLxEPC&o(X4%tR&-zDiFJ&+FEz4j>X$%IeOGX|Ed-2Mm`*~#kYTptlPE8N~&+2tFO7Nw&%eJ@1*j>(6dye9AxAGqtuVnYG zGpq{pq&;-;dx8!6&0>_Lj%R2yKKCyYPrh6<&9$T{r&T9=To%L;?S~#&Z5>ut5fl%D+Gmjfl^ahg1)je%LqrK~?hV>}*TXaQankTJb);N{w>X%U3$?TWh$ zD@Q=QDm0GlN$?Ys`YyTKKuJn++%2i~iOy>Ex+%NQe8&Arm+IW{Oc6vRVIX_V`g+9z zcZ$&S;%KFdq`iV3o*Ic7HeDDWb@htwv z+ctAdT%R-7KywO09OBrwD+z%q{`JA(B#08+iNJLy&HLBH^n|KRvyK2R+U)n$xHxy= z^E!JSUE-wc7sbItaY{SIr+41V{^9|(>^fpkQs%R_j6VFj zZUnjgGiw6x+^M4uc(*s|Avqx10X1%OEl<-)k`y4a-{lhBHL~lj%|@MZq|ppEYgo&M zDG0bn$%L3)V98RO4@Ej+^X2;N$|21Efo7hXhRBk2P({TbVCFFT$2e?`sdg<~+Y>l| z`GO?*A4v07)24X$^^7gui1~YZjFNYW8x{?Cl#cPZpN4FCeg5{iv5s^j)E0@s+lc`! zRi!OF$}43O;YpuM-qGyOsl*AW=WT0UwQg%WH~tm?IT?{i-?$8CUZjnVmW*eEwGBxJ zM%Fe3Oe{Pk=VXe5o2NuodI&g8lj&3{6USx6GUBdfB!62Oh_SW-&i9OZA{jxrszrSP zT8Z-4cKa@N{q5_mm8_ZVhntx3yBE@fRxMBZa|gA490{v0iPtj@K2Jqqjlf$HRzbrX zD(nA7PanyOj1POL97hO!jac-rNu_u)q@cZeM;v2P2E0DAuiBOk1I-78&DycJ(uR%fX|4GG= z{#ARz$i_61@5?jl!6L3`7Tk?5S>yR=E^p;mqg}C4YaJ(Fk8-br!O}+Z0A$ZRg?JPV zbBiX7hIfa_zb)k!6v@78Y`L^I*)h#$DgH6xj&n?L+kPI%_Q8BgZu-1GnS!)aA*{)9 zFXK##jL!pf$JfC+l~Xdpg8Q4!|3PfQ#VXf^LD#tMTlr(UbFE^~C=GAVZY)xkv7k1! z?U*X>?oZ0uP+|}TtiKro<^Dk^iracrHecsEMsZ9Vy`;fU>3N)k#TQXztmgYkF6qqnjH!$GLi1} z@kWCTXUk~cy`BJlp`d3gSPlT6&jZ*94Ht>7&q^GTU2UpM&)mt$L?VT&LP8E9yU$D_ zZU@>_5x)^r&ihl%ehq|@>OP8D6r9d5fpbBo0G|BPbto11e87TUw9!wm)sibrY*}#{ zd&%f{^X_3k5`0T|i*?)%0T`&}dgE*V=NuQ#XnwY1HXQwU(Tsajjb4PL{=^*=nEAGX z2mv29PcHt0wG2O^BYyR`DK|+Ze#yLjwIY4QbY^O*Z4EtbdV;$8FrT^x8=w75&F?8? zqqA-R5}Ana7i%_s$-(KT1{a~(ieO`c8|&K1K;p9vX3urBx1v^pLhoo`?HA@#;=P!j zGEe;aK@1E0o%YpES*Z6QxqRq!^74fCQvI7F$?-ou;H?|;0sqmDtm;2 zubE8%p4GWPxAiGyx2R1!Yg}TmQoYak;>c~mKR`%}!nf9Udb!T_DL&4U)2uQ*mafP$ zqMW2>CTkYZ5S6AHZJwgqOIh^#$yk&e(6j@LkDRuaJue}Q;zrVhS0uWZ4`4J>P=2PH zkL+=L&o5tC9K5YhC_pWNMH02qu#lS&=~!~K5KN_H+E+$QF7&|=UA{Ph8NGqP*P}`$4r#WbG48v>Wz+YPeC1;{DfksGGw5)Tgd1Cfw0VBy;_b9@H+P zf*D7GJ7xb#rmz((glVl>hm%Xmrzzj9dsj= zls2{o8T3Tu)9nxOYhqxQ@Y@PQ9bp9!6a>mBw zK0ZRFWYhR1byo`a@W{}rHieVHmVjL0%l<`ynDPNUb?lzQZZ%yANy%5C(G|N6CBntQ zi$ursnq*%bb_18`bjB*_Pd-Qe*z-|RQV!SVx{LqI1`ixPq)TfujYsPOlE_8Xq-MS!_E8&b!xL&q^sls;{jy?nYz&|9qZJ?vF?d2NK5pCmY`K{Qh6p zS?#4*ZY4seeSGG)%-lPH+9~g(w99f?m#PEq(LeQ&B~|p;Pj0 zu^=#@GcM}XRn49H15T8;yFlD7;=n@WE0+-qBWp|{Wd6%8xm#B?bD?3%*__K(i_})` z5NSF0enXxN0T%})DFwXvS{O>dwkfw*F+i|&P6}q>B3ex4+7s9C56i7%@MCOQwVn)u2v76Z4701jfC1!bl-p7dPO7p;{kq&=f!C_W zmZg&kIs}f}A64i}cKt_^k0#HQozWkAj{r$qtF~iyVe_|};NW8$E7sl34h*G5fVIEv zp4ZPP41eJOA)DcNc4)>m_>_QI4`BAmlM-)=moBd-nw`ctL0T1MUPXoLMK!y=Vx533)8JOIs z^YU{$Cfa7S_Cl#d^yDrax$KTJfAX-1#MXS!Y$gnC4rnWaCY~u1U4$YaIvw%3j0S70 zuH~O>yo<6s`Wl~L-rxd-ww6+?l?>#hA68?n<93h8XBYoQhDfhLljJz-8Ef;aiR?*6 zYopng@xt;m`=p!)wc0G{=>JKO;rJKCME*BKJ|J)YW9F)Pq4Um9HX*^2N#Gh1J0Am) z_EZ!p2d!n-RP+>?>9Y3xj4DR=ZjU_ zyxiAp(Ud?;uCVi7oj^=w)r`lLe{b+lN>*-}QCJIA(uqaiMZ1>A9M1!07PO46DEW=A zuKoDN?8|2KxL@I?X@p3kPai%SE3StN^m6@_GrEEBed$Z)`)RCCSI%p{pp*Ba84t=6 zDD8_7H2R?S8>DXv_>+Kd+?zjCti`+p}3m zHE<8+ns^%b-Z5l>@LqzkH(1DPHoDYfj6dLTc}G`P6_VkksBU%s)OyxTcPh zS-q9uwmm9+c+$9S*baA8X(r2-fvrQxiTyBy z^#8`@N%xABY>)QWfR($+W{;V)fmwi~#cdNJ=}rHf#^USxX@_1pp{q~FTU}VY)z4=@ zZI#DBben=Hba|FR!NValnW#sx?;^t&DUxw2b~R&P%p|ofIa?!(jV; zUZ^$@7PO`OdqTAR37vi|M&>*)o+;4g)0&>)tziU?Cr5wygm}$5^iP%Sn&pZaK+BAK zyr5dSuGr)WK_4o|x_|HUeHZC-m(Ayd#xl6<##jG?u>A|u<&|I0&xX?`c%te459^JN zpB-WJUZ(T1+p%1js-e6O7y7u>(FFt3*vaWm^5T`#sy*O4rIm`$7d8rYlo=Wuld5QJ z&sQopiUT2Bxvx;x<8aU7Pqja~<-y4#(HdQ#@G5g=sh7_K&E>_vTQkw0;Z=kGgoFhM z!bYu*jX!{zo=JWO3{d7dxK)Tg-2Y3(;oJTYtVF49tYWr7F{A{GK@WLz_3+3q@16 zO)$3}cXP2r^zS)hxsfb}vExW(Vr`l`)Ek+sZ%HyS!1K3YAXTLH1ZywOh2lBa66%+1 zZtO{i@h!Jc!+8?!9|3u|tbJgrQ}hHcmRR$@3|W4lSVr%jN1_{=?fhb23zliTLR;f_ z1a5x0X}N$-F6nbb#5|aEWHfVFoGcU>;-^bEY^&0}?KkSuAyR2F63$$wT_3&+=W7f? zz2ZO$Wg+?u^YgKNL@7iKAB$K#mcbA!@G<{Q_>ra*UoK(RUT3@?s|*@?6_E^JxX|ge zg&QzMbAHz9T8K$9(ceDr)uDUKBfccWI^@n%5x|@>!^?eIh~w}aJ;hzpP@NoyV<#Xl z_&>}0$rg?4F4|=+wNGB13`+#K)Ca`_eKb|*+X0OBZW_BD?_8eVtk>19W!Kkq9h{rD z<)e+539i1DNZPmVU;5i5#QBKkdDwXGdiX~bD?Gw6g+iIHQE=JU{hBQqxUKiPn$Kd- zgYJSq^eL)(&V=Zq9KpZ25w1u3=c0JtRCaw`5vRt_0drTeFE!;-hl-{cKR4Zx((J#cp_;U)GYk(yM$cGya> z_Mw{xWIaXUQ9vErD4H`ZdVA4#rY+!0 z4w^+Yjr1HxZi61*qH#wstq7!u^}KZ@GuMfOFAnhlFAXA4l+o@(UFQ5v2>>7{WmLV2 zmFgZ5%PEi^@Fe`Qj49w>`8{*fOn|sJ!s+zZrXB5NU7|oouV#}{B&Dru6&2sLT}I&< zfr!foc|;Cu+OxNFlqwn=lsAKzT{&?Si1~cAwlunEVO`Ayc?T{ZrN8|Gbvq#F)aZ}P z5Vu%QWjS}r?3|Y#@os!temTFEKvv->wAzs4ri)Y0LsCd~R}qzZUk%1Tf6zH)>c^V~ z7(a*CUpx$H=xO{(CBT2_{naMNR-D>Y0~Lj7$>6|D)kkViy|NdRpLF%Uv6J3uX z4d1kSp7jR<#gVCd8mRc*TpVe7z5S=Ep2U)Sw^jFYh4W3uVXIx_<^6{Z&!zZCHYSva zUu&$)oh7g|q0(OXz{t$Z-Z;-?TD4G-9@UTZh7kz!1Cg7oeSy%<2amuU7b&96g%57H zU+dr%3I7{AGM?TrOZxmvPLtz4sT8Ha4ljAzXeWX54#xeubw;KgmsJ27Wa`z~LDs4=+o4qd#* z=FI!K2PuUjL^8L%P{JAR;~SL-1iF{6Kuon0k)QTw=#F2E@t}&?^n6Ormj6&xIIRw? zR0>c0I4n6yAkjLUxEEI&p@FYfPe?W6LI)KyFa}3%Y6H$V1>uy*!2bF7=kGVwZ_-i|QZMW1fUz+9aRD3N#yw45O3yp&W~$93$^bIMDqZvYHCsttvlaTpujj z*<*dI0kVflJ@W}{%@izDA14|3Y&3`9rM5_YhS7HrDO9Yd4bP6kyf-WvNG$xiMTPV? zxf5G+O@17J>w0n>6d0KCGuW0)FzO~ovs`xU5%nDpfYSPfcavcc@>3T&Iml6VA-Gwh zej#A(|Js7X+P`<|{A!S(tmy~lhbS|X(q3D+zuA8mFE`ChwCa4yjsCB>SmTcy4ZWbM z+y6pE11|2lPG8Y4&jm3VBlol&#Qubr#FJuy)C_KJi;kI0pGx>&{i6@~7aXXXjzRnq zibzlkeTIvtuE((hgMBPD z7fL)Y8!}tqfBQ3$>CLwV#b3+VXaIx?i}DOh+EyFWkKOx4c>ch#h4^=1aVaAg#BGn< zpZ!rp=L>mLm-rv|-uSg?y8=HNT~_Po{Pg}Ih>FI@_$?8Zy!Xyxl-&!=p8Pgul{0YH zh1X5~?Gqe|p{R~p-K`1rFV~)#V?|krv_vJ#;fCXR&BaQO)6;<9LCHIaecm>O1z9=K zpP;U6(E*Z0RM+HIl{=k(>!@`5dUzH+_O&X5ua^_en`yk;4*ALtv9sAt3C70`7BeDT z6AwrxC5BqABFlJwh!Ja7IAD;*epNO1LH$8M9P;#T5qJkv@y9@*L;sS?)BoYeyilvG0T%BiPp1kTzdumY39Gd)MhO zBif`)9)sSQoU1J#>nvXbjtMJC@G`YLP9bO6|17Ib(g9ykt)avizw=JCVQ0P}Kv5#} zCpGGe=^HhZ;Xg$}ILpQatfGg=};$geFaR@y>7 zuwYI$8psjT;Z^#~g!#9)VzFy=wQWzRc1~0v->xpkkKl+~_|y?h|DULn?m?k0|ElHE z`Qfvj6e{A;qXl_32xjtMT8Eb9fND0RCjl@t6 zV!GU<8pL&+H{O0@*@eiJhC}&95SH z=jagV&wTj$wEXn2OrUH8q_oWzaIu=euAhip#pG}|cOSUOS&P|5e{uMBbp|7=N5No%(7Bj~3pM;lu7eCw) zl$jr{kfOFSzv>CodBv&mvco_$<11#;CX{9rP0N0A`vz;ZF~bHh(7wGguo$xx;mGkR zuavoA8E%{DrLSnUU5R@}-)V0ZNS7V$^ED>ZQ~%2Q8!`-r0%|8Gr?LrO zI{ipB58Ur#`}VY1bYAN3|A%GX0Wf%5b|lHYe~~ns7^#&1lxuq@z;D=z%n>kPcHp)h zyDrKlm;efB6!5MpptUHQ4i_JR4X*q_baX9{v+E=vPB4I3C)zjA?1#yg!`Cy3zE=PH4cTyb;Vms1yVk6Y0f!iFzd>7ia@P07z< zZOOjL9Q~0sFpX0{r{%t=udVVzM-II^{Kb1ysRUT|G#idpb{9Si(Z44e5Fh1Sv>nKs z24>!jZ$eU`k^j=&_tF>{JX)ICS|vRsrp2>76@zN{kZVk|i*(oJR*s7m8#3)z+B*i+5V^8L z-#K%vv9Cen=3J1ZpGQP_>0q~ebDkhRHkLZnZj(^XK^K|XNYBZTE~gV7k)85TO50t_ zT5m24Fq;x92P=OLyfbDI_uMM;`L`4-e)@ScF}`sY-lQ@C|=p zGGyw;k~>LC=i0a#a*E^JFjiB_crTspTpvmhz_oD`Nqr%u!UB6|d7nK@d8f|!4bt^Y z%9zo>Lsk&Xv!KRnK)X-rO@5CH7u)luhns?RaZu;&Chczpa*xyQ}Lz|6@RI3#QSq@8_tSC<~byIczsMEO@G0cax?_dU zjumUO9?;0I0-jed#nR+iQ-QL zd}7?#nsMJ%9Wl+yI5LD(6qDkwDDdYTpDD#jxLAbH)p%X)?ko>%-Ut~rU1^Yd?|&{? zxqpI&;lXhU!I68=DqOPisbJBxFmMj=c1HL)JT8+Arb@HelxA}c_ifW_)sxO%GrD)P zT-AG3>JD1UQSl+01dQ&29->3y^6n+}EpEAH$!ODUHry}7IPC>$onXN%EjuV6z6JXtoatQh4FH+Mz_*0-j}ngE}kOaw7}{Q?>C0M!*9RL zp5=5OtW1OnEnja8{#kxM&*gp-P4BPnbY`Y~1I3J%8qt@|cPOhIP1_wR zSu%^(?~a>ID!I4GE?GVbjtMqw2%|fZgAF>Y)=uU~ftuMz=`i(5#8-TlOk)h&5lyX; ztbcRh?lrS+?1zQoLQ_(}XrdmUt}swq*Hi~&Y#iTsQ}MFlH*4PTa0ClDD6yLR>vq%j zxJiF&BpV959XaB$YEgM=ysMUCWK4cfBGqb{o)Y&{*T!2V95KJtPmywBg}QQZ{W)