From: Dmitry Stogov Date: Thu, 12 Jun 2014 01:07:33 +0000 (+0400) Subject: Merge branch 'master' into phpng X-Git-Tag: POST_PHPNG_MERGE~200 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd1c68e67fd5ed5022b62328748fb961d082c070;p=php Merge branch 'master' into phpng * master: (77 commits) NEWS entry for Fix potential segfault in dns_get_record() NEWS entry for "Fix potential segfault in dns_get_record()" NEWS entry for Fix potential segfault in dns_get_record( Fix potential segfault in dns_get_record() Revert "Add optional second arg to unserialize()" 5.5.15 now update NEWS Fix bug #66127 (Segmentation fault with ArrayObject unset) 5.4.31 next Add NEWS. This doesn't need UPGRADING (or an RFC), IMO. Fix broken test. Add a mime type map generation script and update the header. Move the mime type map out of php_cli_server.c for easier generation. Replace the CLI server's linear search for extensions with a hash table. fix test Remove unused included file NEWS NEWS NEWS Fixed Bug #67413 fileinfo: cdf_read_property_info insufficient boundary chec ... Conflicts: Zend/zend_closures.c Zend/zend_execute.c Zend/zend_vm_def.h Zend/zend_vm_execute.h ext/spl/spl_array.c ext/standard/basic_functions.c ext/standard/dns.c ext/standard/var.c --- dd1c68e67fd5ed5022b62328748fb961d082c070 diff --cc Zend/zend_closures.c index ea71950d48,bd2ede329d..3c2921f53c --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@@ -456,20 -480,19 +456,18 @@@ ZEND_API void zend_create_closure(zval } } - closure->this_ptr = NULL; ++ ZVAL_UNDEF(&closure->this_ptr); /* Invariants: * If the closure is unscoped, it has no bound object. * The the closure is scoped, it's either static or it's bound */ closure->func.common.scope = scope; if (scope) { closure->func.common.fn_flags |= ZEND_ACC_PUBLIC; - if (this_ptr && (closure->func.common.fn_flags & ZEND_ACC_STATIC) == 0) { - closure->this_ptr = this_ptr; - Z_ADDREF_P(this_ptr); + if (this_ptr && Z_TYPE_P(this_ptr) == IS_OBJECT && (closure->func.common.fn_flags & ZEND_ACC_STATIC) == 0) { + ZVAL_COPY(&closure->this_ptr, this_ptr); } else { closure->func.common.fn_flags |= ZEND_ACC_STATIC; - ZVAL_UNDEF(&closure->this_ptr); } - } else { - ZVAL_UNDEF(&closure->this_ptr); } } /* }}} */ diff --cc Zend/zend_execute.c index 66945d634c,ad92c5fb6f..de52545353 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@@ -1469,12 -1484,15 +1469,12 @@@ ZEND_API void execute_internal(zend_exe { if (fci != NULL) { execute_data_ptr->function_state.function->internal_function.handler( - fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, - fci->object_ptr, 1 TSRMLS_CC + fci->param_count, fci->retval TSRMLS_CC ); } else { - zval **return_value_ptr = &EX_TMP_VAR(execute_data_ptr, execute_data_ptr->opline->result.var)->var.ptr; + zval *return_value = EX_VAR_2(execute_data_ptr, execute_data_ptr->opline->result.var); execute_data_ptr->function_state.function->internal_function.handler( - execute_data_ptr->opline->extended_value, return_value TSRMLS_CC - execute_data_ptr->opline->extended_value + execute_data_ptr->call->num_additional_args, - *return_value_ptr, return_value_ptr, - execute_data_ptr->object, return_value_used TSRMLS_CC ++ execute_data_ptr->opline->extended_value + execute_data_ptr->call->num_additional_args, return_value TSRMLS_CC ); } } diff --cc Zend/zend_vm_def.h index def0c490c6,90cb0cad6a..637e32fa1f --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@@ -2451,7 -2463,7 +2451,7 @@@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_C FREE_OP2(); HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -3813,107 -3871,57 +3813,107 @@@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TM { USE_OPLINE zend_free_op free_op1; - zval *expr, tmp; + zval *expr; - zval *result = &EX_T(opline->result.var).tmp_var; + zval *result = EX_VAR(opline->result.var); SAVE_OPLINE(); - expr = GET_OP1_ZVAL_PTR(BP_VAR_R); + expr = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R); - if (opline->extended_value != IS_STRING) { - ZVAL_COPY_VALUE(result, expr); - if (!IS_OP1_TMP_FREE()) { - zendi_zval_copy_ctor(*result); - } - } switch (opline->extended_value) { case IS_NULL: - convert_to_null(result); + /* This code is taken from convert_to_null. However, it does not seems very useful, + * because a conversion to null always results in the same value. This could only + * be relevant if a cast_object handler for IS_NULL has some kind of side-effect. */ +#if 0 + if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { + ZVAL_DEREF(expr); + } + if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) { + if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) { + break; + } + } +#endif + + ZVAL_NULL(result); break; - case IS_BOOL: - convert_to_boolean(result); + case _IS_BOOL: + ZVAL_BOOL(result, zend_is_true(expr TSRMLS_CC)); break; case IS_LONG: - convert_to_long(result); + ZVAL_LONG(result, zval_get_long(expr)); break; case IS_DOUBLE: - convert_to_double(result); + ZVAL_DOUBLE(result, zval_get_double(expr)); + break; + case IS_STRING: + ZVAL_STR(result, zval_get_string(expr)); break; - case IS_STRING: { - zval var_copy; - int use_copy; + default: + /* If value is already of correct type, return it directly */ + if (Z_TYPE_P(expr) == opline->extended_value) { + ZVAL_COPY_VALUE(result, expr); + if (OP1_TYPE == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(result))) { + zval_copy_ctor_func(result); + } + } else if (OP1_TYPE != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } - zend_make_printable_zval(expr, &var_copy, &use_copy); - if (use_copy) { - ZVAL_COPY_VALUE(result, &var_copy); - if (IS_OP1_TMP_FREE()) { - FREE_OP1(); + FREE_OP1(); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } + + if (opline->extended_value == IS_ARRAY) { + if (Z_TYPE_P(expr) != IS_OBJECT) { + ZVAL_NEW_ARR(result); + zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0); + if (Z_TYPE_P(expr) != IS_NULL) { + expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr); + if (OP1_TYPE == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) { + zval_copy_ctor_func(expr); + } + } else if (OP1_TYPE != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } + } + } else { + ZVAL_COPY_VALUE(result, expr); + if (!IS_OP1_TMP_FREE()) { + zval_opt_copy_ctor(result); + } + convert_to_array(result); } } else { - ZVAL_COPY_VALUE(result, expr); - if (!IS_OP1_TMP_FREE()) { - zendi_zval_copy_ctor(*result); + if (Z_TYPE_P(expr) != IS_ARRAY) { + object_init(result); + if (Z_TYPE_P(expr) != IS_NULL) { + expr = zend_hash_str_add_new(Z_OBJPROP_P(result), "scalar", sizeof("scalar")-1, expr); + if (OP1_TYPE == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) { + zval_copy_ctor_func(expr); + } + } else if (OP1_TYPE != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } + } + } else { + ZVAL_COPY_VALUE(result, expr); + if (!IS_OP1_TMP_FREE()) { + zval_opt_copy_ctor(result); + } + convert_to_object(result); } } - break; - } - case IS_ARRAY: - convert_to_array(result); - break; - case IS_OBJECT: - convert_to_object(result); - break; + + FREE_OP1_IF_VAR(); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } - FREE_OP1_IF_VAR(); + FREE_OP1(); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@@ -5373,7 -5399,8 +5373,8 @@@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED) { USE_OPLINE - zend_function *op_array; + zval *zfunc; + int closure_is_static, closure_is_being_defined_inside_static_context; SAVE_OPLINE(); @@@ -5382,7 -5409,13 +5383,13 @@@ zend_error_noreturn(E_ERROR, "Base lambda function for closure not found"); } - zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(scope), Z_OBJ(EG(This)) ? &EG(This) : NULL TSRMLS_CC); - closure_is_static = op_array->common.fn_flags & ZEND_ACC_STATIC; ++ closure_is_static = Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC; + closure_is_being_defined_inside_static_context = EX(prev_execute_data) && EX(prev_execute_data)->function_state.function->common.fn_flags & ZEND_ACC_STATIC; + if (closure_is_static || closure_is_being_defined_inside_static_context) { - zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(called_scope), NULL TSRMLS_CC); ++ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(called_scope), NULL TSRMLS_CC); + } else { - zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(scope), EG(This) TSRMLS_CC); ++ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(scope), Z_OBJ(EG(This)) ? &EG(This) : NULL TSRMLS_CC); + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); diff --cc Zend/zend_vm_execute.h index fa61d27bd8,ade0cb82c5..9d80c27da7 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@@ -2802,8 -2844,8 +2802,8 @@@ static int ZEND_FASTCALL ZEND_CAST_SPE { USE_OPLINE - zval *expr, tmp; + zval *expr; - zval *result = &EX_T(opline->result.var).tmp_var; + zval *result = EX_VAR(opline->result.var); SAVE_OPLINE(); expr = opline->op1.zv; @@@ -6664,7 -6780,8 +6664,8 @@@ static int ZEND_FASTCALL ZEND_ISSET_IS static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE - zend_function *op_array; + zval *zfunc; + int closure_is_static, closure_is_being_defined_inside_static_context; SAVE_OPLINE(); @@@ -6673,7 -6790,13 +6674,13 @@@ zend_error_noreturn(E_ERROR, "Base lambda function for closure not found"); } - zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(scope), Z_OBJ(EG(This)) ? &EG(This) : NULL TSRMLS_CC); - closure_is_static = op_array->common.fn_flags & ZEND_ACC_STATIC; ++ closure_is_static = Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC; + closure_is_being_defined_inside_static_context = EX(prev_execute_data) && EX(prev_execute_data)->function_state.function->common.fn_flags & ZEND_ACC_STATIC; + if (closure_is_static || closure_is_being_defined_inside_static_context) { - zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(called_scope), NULL TSRMLS_CC); ++ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(called_scope), NULL TSRMLS_CC); + } else { - zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(scope), EG(This) TSRMLS_CC); ++ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(scope), Z_OBJ(EG(This)) ? &EG(This) : NULL TSRMLS_CC); + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@@ -7991,8 -8205,8 +7998,8 @@@ static int ZEND_FASTCALL ZEND_CAST_SPE { USE_OPLINE zend_free_op free_op1; - zval *expr, tmp; + zval *expr; - zval *result = &EX_T(opline->result.var).tmp_var; + zval *result = EX_VAR(opline->result.var); SAVE_OPLINE(); expr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@@ -9110,7 -9313,7 +9117,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -9945,7 -10178,7 +9952,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET zval_dtor(free_op2.var); HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -10776,10 -11041,10 +10783,10 @@@ static int ZEND_FASTCALL ZEND_INIT_MET } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(&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", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -12163,7 -12490,7 +12170,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -13235,107 -13574,57 +13242,107 @@@ static int ZEND_FASTCALL ZEND_CAST_SPE { USE_OPLINE zend_free_op free_op1; - zval *expr, tmp; + zval *expr; - zval *result = &EX_T(opline->result.var).tmp_var; + zval *result = EX_VAR(opline->result.var); SAVE_OPLINE(); - expr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + expr = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); - if (opline->extended_value != IS_STRING) { - ZVAL_COPY_VALUE(result, expr); - if (!0) { - zendi_zval_copy_ctor(*result); - } - } switch (opline->extended_value) { case IS_NULL: - convert_to_null(result); + /* This code is taken from convert_to_null. However, it does not seems very useful, + * because a conversion to null always results in the same value. This could only + * be relevant if a cast_object handler for IS_NULL has some kind of side-effect. */ +#if 0 + if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { + ZVAL_DEREF(expr); + } + if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) { + if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) { + break; + } + } +#endif + + ZVAL_NULL(result); break; - case IS_BOOL: - convert_to_boolean(result); + case _IS_BOOL: + ZVAL_BOOL(result, zend_is_true(expr TSRMLS_CC)); break; case IS_LONG: - convert_to_long(result); + ZVAL_LONG(result, zval_get_long(expr)); break; case IS_DOUBLE: - convert_to_double(result); + ZVAL_DOUBLE(result, zval_get_double(expr)); + break; + case IS_STRING: + ZVAL_STR(result, zval_get_string(expr)); break; - case IS_STRING: { - zval var_copy; - int use_copy; + default: + /* If value is already of correct type, return it directly */ + if (Z_TYPE_P(expr) == opline->extended_value) { + ZVAL_COPY_VALUE(result, expr); + if (IS_VAR == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(result))) { + zval_copy_ctor_func(result); + } + } else if (IS_VAR != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } - zend_make_printable_zval(expr, &var_copy, &use_copy); - if (use_copy) { - ZVAL_COPY_VALUE(result, &var_copy); - if (0) { - zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } + + if (opline->extended_value == IS_ARRAY) { + if (Z_TYPE_P(expr) != IS_OBJECT) { + ZVAL_NEW_ARR(result); + zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0); + if (Z_TYPE_P(expr) != IS_NULL) { + expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr); + if (IS_VAR == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) { + zval_copy_ctor_func(expr); + } + } else if (IS_VAR != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } + } + } else { + ZVAL_COPY_VALUE(result, expr); + if (!0) { + zval_opt_copy_ctor(result); + } + convert_to_array(result); } } else { - ZVAL_COPY_VALUE(result, expr); - if (!0) { - zendi_zval_copy_ctor(*result); + if (Z_TYPE_P(expr) != IS_ARRAY) { + object_init(result); + if (Z_TYPE_P(expr) != IS_NULL) { + expr = zend_hash_str_add_new(Z_OBJPROP_P(result), "scalar", sizeof("scalar")-1, expr); + if (IS_VAR == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) { + zval_copy_ctor_func(expr); + } + } else if (IS_VAR != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } + } + } else { + ZVAL_COPY_VALUE(result, expr); + if (!0) { + zval_opt_copy_ctor(result); + } + convert_to_object(result); } } - break; - } - case IS_ARRAY: - convert_to_array(result); - break; - case IS_OBJECT: - convert_to_object(result); - break; + + zval_ptr_dtor_nogc(free_op1.var); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } - zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@@ -15359,7 -15728,7 +15366,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -17591,7 -18074,7 +17598,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET zval_dtor(free_op2.var); HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -19786,10 -20378,10 +19793,10 @@@ static int ZEND_FASTCALL ZEND_INIT_MET } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(&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", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -23162,7 -23838,7 +23169,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -24743,7 -25480,7 +24750,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -26120,7 -26888,7 +26127,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET zval_dtor(free_op2.var); HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -27398,10 -28199,10 +27405,10 @@@ static int ZEND_FASTCALL ZEND_INIT_MET } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(&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", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -29192,7 -29944,7 +29199,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -30392,103 -31171,55 +30399,103 @@@ static int ZEND_FASTCALL ZEND_CAST_SPE { USE_OPLINE - zval *expr, tmp; + zval *expr; - zval *result = &EX_T(opline->result.var).tmp_var; + zval *result = EX_VAR(opline->result.var); SAVE_OPLINE(); - expr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); + expr = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); - if (opline->extended_value != IS_STRING) { - ZVAL_COPY_VALUE(result, expr); - if (!0) { - zendi_zval_copy_ctor(*result); - } - } switch (opline->extended_value) { case IS_NULL: - convert_to_null(result); + /* This code is taken from convert_to_null. However, it does not seems very useful, + * because a conversion to null always results in the same value. This could only + * be relevant if a cast_object handler for IS_NULL has some kind of side-effect. */ +#if 0 + if (IS_CV == IS_VAR || IS_CV == IS_CV) { + ZVAL_DEREF(expr); + } + if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) { + if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) { + break; + } + } +#endif + + ZVAL_NULL(result); break; - case IS_BOOL: - convert_to_boolean(result); + case _IS_BOOL: + ZVAL_BOOL(result, zend_is_true(expr TSRMLS_CC)); break; case IS_LONG: - convert_to_long(result); + ZVAL_LONG(result, zval_get_long(expr)); break; case IS_DOUBLE: - convert_to_double(result); + ZVAL_DOUBLE(result, zval_get_double(expr)); break; - case IS_STRING: { - zval var_copy; - int use_copy; + case IS_STRING: + ZVAL_STR(result, zval_get_string(expr)); + break; + default: + /* If value is already of correct type, return it directly */ + if (Z_TYPE_P(expr) == opline->extended_value) { + ZVAL_COPY_VALUE(result, expr); + if (IS_CV == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(result))) { + zval_copy_ctor_func(result); + } + } else if (IS_CV != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } - zend_make_printable_zval(expr, &var_copy, &use_copy); - if (use_copy) { - ZVAL_COPY_VALUE(result, &var_copy); - if (0) { + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); + } + if (opline->extended_value == IS_ARRAY) { + if (Z_TYPE_P(expr) != IS_OBJECT) { + ZVAL_NEW_ARR(result); + zend_hash_init(Z_ARRVAL_P(result), 8, NULL, ZVAL_PTR_DTOR, 0); + if (Z_TYPE_P(expr) != IS_NULL) { + expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr); + if (IS_CV == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) { + zval_copy_ctor_func(expr); + } + } else if (IS_CV != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } + } + } else { + ZVAL_COPY_VALUE(result, expr); + if (!0) { + zval_opt_copy_ctor(result); + } + convert_to_array(result); } } else { - ZVAL_COPY_VALUE(result, expr); - if (!0) { - zendi_zval_copy_ctor(*result); + if (Z_TYPE_P(expr) != IS_ARRAY) { + object_init(result); + if (Z_TYPE_P(expr) != IS_NULL) { + expr = zend_hash_str_add_new(Z_OBJPROP_P(result), "scalar", sizeof("scalar")-1, expr); + if (IS_CV == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) { + zval_copy_ctor_func(expr); + } + } else if (IS_CV != IS_TMP_VAR) { + if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr); + } + } + } else { + ZVAL_COPY_VALUE(result, expr); + if (!0) { + zval_opt_copy_ctor(result); + } + convert_to_object(result); } } - break; - } - case IS_ARRAY: - convert_to_array(result); - break; - case IS_OBJECT: - convert_to_object(result); - break; + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } CHECK_EXCEPTION(); @@@ -32363,7 -33183,7 +32370,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -34409,7 -35295,7 +34416,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET zval_dtor(free_op2.var); HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -36486,10 -37459,10 +36493,10 @@@ static int ZEND_FASTCALL ZEND_INIT_MET } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(&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", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { @@@ -39610,7 -40630,7 +39617,7 @@@ static int ZEND_FASTCALL ZEND_INIT_MET HANDLE_EXCEPTION(); } - zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", Z_STRVAL_P(function_name)); - zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); ++ zend_error_noreturn(E_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object))); } if ((call->fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) { diff --cc ext/soap/soap.c index 7150738051,32bf5ca6f6..fe97793afe --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@@ -3146,6 -3155,24 +3151,26 @@@ PHP_METHOD(SoapClient, __setCookie } /* }}} */ + /* {{{ proto array SoapClient::__getCookies ( void ) + Returns list of cookies */ + PHP_METHOD(SoapClient, __getCookies) + { - zval **cookies, *tmp; ++ zval *cookies; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + - array_init(return_value); + - if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies", sizeof("_cookies"), (void **)&cookies) != FAILURE) { - zend_hash_copy(Z_ARRVAL_P(return_value), Z_ARRVAL_P(*cookies), (copy_ctor_func_t) zval_add_ref, (void *)&tmp, sizeof(zval*)); ++ if ((cookies = zend_hash_str_find(Z_OBJPROP_P(getThis()), "_cookies", sizeof("_cookies")-1)) != NULL) { ++ ZVAL_NEW_ARR(return_value); ++ zend_array_dup(Z_ARRVAL_P(return_value), Z_ARRVAL_P(cookies)); ++ } else { ++ array_init(return_value); + } + } + /* }}} */ + /* {{{ proto void SoapClient::__setSoapHeaders(array SoapHeaders) Sets SOAP headers for subsequent calls (replaces any previous values). diff --cc ext/standard/basic_functions.c index 0242f8aaba,dd4e59ec7c..c8b3f96bc5 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@@ -4046,88 -4039,80 +4052,80 @@@ PHP_FUNCTION(putenv if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &setting, &setting_len) == FAILURE) { return; } - - if (setting_len) { - char *p, **env; - putenv_entry pe; + + if(setting_len == 0 || setting[0] == '=') { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter syntax"); + RETURN_FALSE; + } + + pe.putenv_string = estrndup(setting, setting_len); + pe.key = estrndup(setting, setting_len); + if ((p = strchr(pe.key, '='))) { /* nullify the '=' if there is one */ + *p = '\0'; #ifdef PHP_WIN32 - char *value = NULL; - int equals = 0; - int error_code; + equals = 1; #endif + } - pe.putenv_string = estrndup(setting, setting_len); - pe.key = estrndup(setting, setting_len); - if ((p = strchr(pe.key, '='))) { /* nullify the '=' if there is one */ - *p = '\0'; - #ifdef PHP_WIN32 - equals = 1; - #endif - } - - pe.key_len = strlen(pe.key); + pe.key_len = strlen(pe.key); #ifdef PHP_WIN32 - if (equals) { - if (pe.key_len < setting_len - 1) { - value = p + 1; - } else { - /* empty string*/ - value = p; - } + if (equals) { + if (pe.key_len < setting_len - 1) { + value = p + 1; + } else { + /* empty string*/ + value = p; } + } #endif - zend_hash_str_del(&BG(putenv_ht), pe.key, pe.key_len); - zend_hash_del(&BG(putenv_ht), pe.key, pe.key_len+1); ++ zend_hash_str_del(&BG(putenv_ht), pe.key, pe.key_len); - /* find previous value */ - pe.previous_value = NULL; - for (env = environ; env != NULL && *env != NULL; env++) { - if (!strncmp(*env, pe.key, pe.key_len) && (*env)[pe.key_len] == '=') { /* found it */ + /* find previous value */ + pe.previous_value = NULL; + for (env = environ; env != NULL && *env != NULL; env++) { + if (!strncmp(*env, pe.key, pe.key_len) && (*env)[pe.key_len] == '=') { /* found it */ #if defined(PHP_WIN32) - /* must copy previous value because MSVCRT's putenv can free the string without notice */ - pe.previous_value = estrdup(*env); + /* must copy previous value because MSVCRT's putenv can free the string without notice */ + pe.previous_value = estrdup(*env); #else - pe.previous_value = *env; + pe.previous_value = *env; #endif - break; - } + break; } + } #if HAVE_UNSETENV - if (!p) { /* no '=' means we want to unset it */ - unsetenv(pe.putenv_string); - } - if (!p || putenv(pe.putenv_string) == 0) { /* success */ + if (!p) { /* no '=' means we want to unset it */ + unsetenv(pe.putenv_string); + } + if (!p || putenv(pe.putenv_string) == 0) { /* success */ #else # ifndef PHP_WIN32 - if (putenv(pe.putenv_string) == 0) { /* success */ + if (putenv(pe.putenv_string) == 0) { /* success */ # else - error_code = SetEnvironmentVariable(pe.key, value); + error_code = SetEnvironmentVariable(pe.key, value); # if _MSC_VER < 1500 - /* Yet another VC6 bug, unset may return env not found */ - if (error_code != 0 || - (error_code == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND)) { + /* Yet another VC6 bug, unset may return env not found */ + if (error_code != 0 || + (error_code == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND)) { # else - if (error_code != 0) { /* success */ + if (error_code != 0) { /* success */ # endif # endif #endif - zend_hash_str_add_mem(&BG(putenv_ht), pe.key, pe.key_len, &pe, sizeof(putenv_entry)); - zend_hash_add(&BG(putenv_ht), pe.key, pe.key_len + 1, (void **) &pe, sizeof(putenv_entry), NULL); ++ zend_hash_str_add_mem(&BG(putenv_ht), pe.key, pe.key_len, &pe, sizeof(putenv_entry)); #ifdef HAVE_TZSET - if (!strncmp(pe.key, "TZ", pe.key_len)) { - tzset(); - } - #endif - RETURN_TRUE; - } else { - efree(pe.putenv_string); - efree(pe.key); - RETURN_FALSE; + if (!strncmp(pe.key, "TZ", pe.key_len)) { + tzset(); } + #endif + RETURN_TRUE; + } else { + efree(pe.putenv_string); + efree(pe.key); + RETURN_FALSE; } - - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter syntax"); - RETURN_FALSE; } /* }}} */ #endif diff --cc ext/standard/dns.c index fd0acd7e3c,214a7dc7e9..cabe3d72f1 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@@ -515,16 -517,19 +515,20 @@@ static u_char *php_parserr(u_char *cp, while (ll < dlen) { n = cp[ll]; + if ((ll + n) >= dlen) { + // Invalid chunk length, truncate + n = dlen - (ll + 1); + } - memcpy(tp + ll , cp + ll + 1, n); - add_next_index_stringl(entries, cp + ll + 1, n, 1); + memcpy(tp->val + ll , cp + ll + 1, n); + add_next_index_stringl(&entries, (char*)cp + ll + 1, n); ll = ll + n + 1; } - tp[dlen] = '\0'; + tp->val[dlen] = '\0'; + tp->len = dlen; cp += dlen; - add_assoc_stringl(*subarray, "txt", tp, (dlen>0)?dlen - 1:0, 0); - add_assoc_zval(*subarray, "entries", entries); + add_assoc_str(subarray, "txt", tp); + add_assoc_zval(subarray, "entries", &entries); } break; case DNS_T_SOA: diff --cc sapi/cli/php_cli_server.c index 5a83693f56,0caa45c16c..0eab71c868 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@@ -463,16 -402,15 +402,9 @@@ static void append_essential_headers(sm smart_str_appendl_ex(buffer, "Connection: close\r\n", sizeof("Connection: close\r\n") - 1, persistent); } /* }}} */ - static const char *get_mime_type(const char *ext, size_t ext_len) /* {{{ */ + static const char *get_mime_type(const php_cli_server *server, const char *ext, size_t ext_len) /* {{{ */ { - php_cli_server_ext_mime_type_pair *pair; - for (pair = mime_type_map; pair->ext; pair++) { - size_t len = strlen(pair->ext); - if (len == ext_len && memcmp(pair->ext, ext, len) == 0) { - return pair->mime_type; - } - char *mime_type = NULL; - - if (zend_hash_find(&server->extension_mime_types, ext, ext_len + 1, (void **) &mime_type) == SUCCESS) { - return mime_type; -- } - -- return NULL; ++ return (const char*)zend_hash_str_find_ptr(&server->extension_mime_types, ext, ext_len); } /* }}} */ PHP_FUNCTION(apache_request_headers) /* {{{ */ @@@ -2203,6 -2140,26 +2133,24 @@@ static int php_cli_server_dispatch(php_ } /* }}} */ + static int php_cli_server_mime_type_ctor(php_cli_server *server, const php_cli_server_ext_mime_type_pair *mime_type_map) /* {{{ */ + { + const php_cli_server_ext_mime_type_pair *pair; + - if (zend_hash_init(&server->extension_mime_types, 0, NULL, NULL, 1) != SUCCESS) { - return FAILURE; - } ++ zend_hash_init(&server->extension_mime_types, 0, NULL, NULL, 1); + + for (pair = mime_type_map; pair->ext; pair++) { + size_t ext_len = 0, mime_type_len = 0; + + ext_len = strlen(pair->ext); + mime_type_len = strlen(pair->mime_type); + - zend_hash_add(&server->extension_mime_types, pair->ext, ext_len + 1, (void *) pair->mime_type, mime_type_len + 1, NULL); ++ zend_hash_str_add_mem(&server->extension_mime_types, pair->ext, ext_len, (void*)pair->mime_type, mime_type_len + 1); + } + + return SUCCESS; + } /* }}} */ + static void php_cli_server_dtor(php_cli_server *server TSRMLS_DC) /* {{{ */ { zend_hash_destroy(&server->clients);