]> granicus.if.org Git - php/commitdiff
Merge branch 'master' into phpng
authorDmitry Stogov <dmitry@zend.com>
Thu, 12 Jun 2014 01:07:33 +0000 (05:07 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 12 Jun 2014 01:07:33 +0000 (05:07 +0400)
* 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

13 files changed:
1  2 
.travis.yml
Zend/zend_builtin_functions.c
Zend/zend_closures.c
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/fileinfo/libmagic/softmagic.c
ext/openssl/openssl.c
ext/soap/soap.c
ext/standard/basic_functions.c
ext/standard/dns.c
ext/standard/var.c
sapi/cli/php_cli_server.c

diff --cc .travis.yml
Simple merge
Simple merge
index ea71950d48b223d5092ddfd2fabd298c480e746c,bd2ede329d7faf6e5e483ae4455e711cffb120ee..3c2921f53cd630859dcad08752eb62bfa06ea874
@@@ -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);
        }
  }
  /* }}} */
index 66945d634c4c90a7af05ee93f2ef24b15152433f,ad92c5fb6f767158599500a293ecb7b01d885ccf..de52545353800635fe880bee413074bef16a6dd6
@@@ -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
                );
        }
  }
index def0c490c6050662c7db3093144113c732e90350,90cb0cad6a87c7e67af520a60722f0479028c131..637e32fa1f5f1720498bbdb414ae8de172d51766
@@@ -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();
  
                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();
index fa61d27bd8d0e3bfdfa7202b59dc4a8b963edbce,ade0cb82c5e240282c7cb2df0b50e791b9fd36cd..9d80c27da74545b040e6dde5f50aadb2db293014
@@@ -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();
  
                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) {
Simple merge
Simple merge
diff --cc ext/soap/soap.c
index 715073805144d2169652109a13add2b79e26d4d0,32bf5ca6f6603525c6ce817cc61968e553d526e3..fe97793afeee19d7ce50898f90145181bffbd756
@@@ -3146,6 -3155,24 +3151,26 @@@ PHP_METHOD(SoapClient, __setCookie
  }
  /* }}} */
  
 -      zval **cookies, *tmp;
+ /* {{{ proto array SoapClient::__getCookies ( void )
+    Returns list of cookies */
+ PHP_METHOD(SoapClient, __getCookies)
+ {
 -      array_init(return_value);
++      zval *cookies;
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
 -      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).
index 0242f8aaba10fd722070156ce6cae651ab120501,dd4e59ec7c2c093946b7062e92bd25b274db51e9..c8b3f96bc546370d2456599ace7973cf0b531c0d
@@@ -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
index fd0acd7e3c7e54a8982e2c521e0f16bce625527a,214a7dc7e92faf55a2f69be27adbb8ea99ab403f..cabe3d72f17454075dca9384b3ed72e86879b8e6
@@@ -515,16 -517,19 +515,20 @@@ static u_char *php_parserr(u_char *cp, 
                                
                                while (ll < dlen) {
                                        n = cp[ll];
 -                                      memcpy(tp + ll , cp + ll + 1, n);
 -                                      add_next_index_stringl(entries, cp + ll + 1, n, 1);
+                                       if ((ll + n) >= dlen) {
+                                               // Invalid chunk length, truncate
+                                               n = dlen - (ll + 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:
Simple merge
index 5a83693f56fefe9607beed8c02c10f7b6d164123,0caa45c16c0c233ebdabd271d54b16e93df54072..0eab71c868137e4ff9d7d4c173d1b8b84e215ce7
@@@ -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_
  }
  /* }}} */
  
 -      if (zend_hash_init(&server->extension_mime_types, 0, NULL, NULL, 1) != SUCCESS) {
 -              return FAILURE;
 -      }
+ 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;
 -              zend_hash_add(&server->extension_mime_types, pair->ext, ext_len + 1, (void *) pair->mime_type, mime_type_len + 1, NULL);
++      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_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);