From: Dmitry Stogov Date: Thu, 15 May 2014 07:47:10 +0000 (+0400) Subject: Fixed SOAP error handling X-Git-Tag: POST_PHPNG_MERGE~368^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4c4df8598835ce39986ea3dbe19629bb0ee61f28;p=php Fixed SOAP error handling --- diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h index 9b9a7efbd5..e35b033cae 100644 --- a/ext/soap/php_soap.h +++ b/ext/soap/php_soap.h @@ -166,7 +166,7 @@ ZEND_BEGIN_MODULE_GLOBALS(soap) sdlPtr sdl; zend_bool use_soap_error_handler; char* error_code; - zval* error_object; + zval error_object; char cache; char cache_mode; char cache_enabled; diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 83e8993da2..674a1b9ff8 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -73,22 +73,22 @@ static void soap_error_handler(int error_num, const char *error_filename, const #define SOAP_SERVER_BEGIN_CODE() \ zend_bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\ char* _old_error_code = SOAP_GLOBAL(error_code);\ - zval* _old_error_object = SOAP_GLOBAL(error_object);\ + zend_object* _old_error_object = Z_OBJ(SOAP_GLOBAL(error_object));\ int _old_soap_version = SOAP_GLOBAL(soap_version);\ SOAP_GLOBAL(use_soap_error_handler) = 1;\ SOAP_GLOBAL(error_code) = "Server";\ - SOAP_GLOBAL(error_object) = getThis(); + Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EG(This)); #define SOAP_SERVER_END_CODE() \ SOAP_GLOBAL(use_soap_error_handler) = _old_handler;\ SOAP_GLOBAL(error_code) = _old_error_code;\ - SOAP_GLOBAL(error_object) = _old_error_object;\ + Z_OBJ(SOAP_GLOBAL(error_object)) = _old_error_object;\ SOAP_GLOBAL(soap_version) = _old_soap_version; #define SOAP_CLIENT_BEGIN_CODE() \ zend_bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\ char* _old_error_code = SOAP_GLOBAL(error_code);\ - zval* _old_error_object = SOAP_GLOBAL(error_object);\ + zend_object* _old_error_object = Z_OBJ(SOAP_GLOBAL(error_object));\ int _old_soap_version = SOAP_GLOBAL(soap_version);\ zend_bool _old_in_compilation = CG(in_compilation); \ zend_bool _old_in_execution = EG(in_execution); \ @@ -97,7 +97,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const int _bailout = 0;\ SOAP_GLOBAL(use_soap_error_handler) = 1;\ SOAP_GLOBAL(error_code) = "Client";\ - SOAP_GLOBAL(error_object) = getThis();\ + Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EG(This));\ zend_try { #define SOAP_CLIENT_END_CODE() \ @@ -122,7 +122,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const } zend_end_try();\ SOAP_GLOBAL(use_soap_error_handler) = _old_handler;\ SOAP_GLOBAL(error_code) = _old_error_code;\ - SOAP_GLOBAL(error_object) = _old_error_object;\ + Z_OBJ(SOAP_GLOBAL(error_object)) = _old_error_object;\ SOAP_GLOBAL(soap_version) = _old_soap_version;\ if (_bailout) {\ zend_bailout();\ @@ -572,7 +572,7 @@ static void php_soap_init_globals(zend_soap_globals *soap_globals TSRMLS_DC) soap_globals->typemap = NULL; soap_globals->use_soap_error_handler = 0; soap_globals->error_code = NULL; - soap_globals->error_object = NULL; + ZVAL_OBJ(&soap_globals->error_object, NULL); soap_globals->sdl = NULL; soap_globals->soap_version = SOAP_1_1; soap_globals->mem_cache = NULL; @@ -598,7 +598,7 @@ PHP_RINIT_FUNCTION(soap) SOAP_GLOBAL(typemap) = NULL; SOAP_GLOBAL(use_soap_error_handler) = 0; SOAP_GLOBAL(error_code) = NULL; - SOAP_GLOBAL(error_object) = NULL; + ZVAL_OBJ(&SOAP_GLOBAL(error_object), NULL); SOAP_GLOBAL(sdl) = NULL; SOAP_GLOBAL(soap_version) = SOAP_1_1; SOAP_GLOBAL(encoding) = NULL; @@ -2076,6 +2076,7 @@ static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeade use_http_error_status = 0; } } + STR_RELEASE(server); /* Want to return HTTP 500 but apache wants to over write our fault code with their own handling... Figure this out later @@ -2132,13 +2133,12 @@ static void soap_error_handler(int error_num, const char *error_filename, const return; } - if (SOAP_GLOBAL(error_object) && - Z_TYPE_P(SOAP_GLOBAL(error_object)) == IS_OBJECT && - instanceof_function(Z_OBJCE_P(SOAP_GLOBAL(error_object)), soap_class_entry TSRMLS_CC)) { + if (Z_OBJ(SOAP_GLOBAL(error_object)) && + instanceof_function(Z_OBJCE(SOAP_GLOBAL(error_object)), soap_class_entry TSRMLS_CC)) { zval *tmp; int use_exceptions = 0; - if ((tmp = zend_hash_str_find(Z_OBJPROP_P(SOAP_GLOBAL(error_object)), "_exceptions", sizeof("_exceptions")-1)) == NULL || + if ((tmp = zend_hash_str_find(Z_OBJPROP(SOAP_GLOBAL(error_object)), "_exceptions", sizeof("_exceptions")-1)) == NULL || Z_TYPE_P(tmp) != IS_FALSE) { use_exceptions = 1; } @@ -2177,7 +2177,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const if (code == NULL) { code = "Client"; } - fault = add_soap_fault(SOAP_GLOBAL(error_object), code, buffer, NULL, NULL TSRMLS_CC); + fault = add_soap_fault(&SOAP_GLOBAL(error_object), code, buffer, NULL, NULL TSRMLS_CC); Z_ADDREF_P(fault); zend_throw_exception_object(fault TSRMLS_CC); @@ -2230,10 +2230,9 @@ static void soap_error_handler(int error_num, const char *error_filename, const if (code == NULL) { code = "Server"; } - if (SOAP_GLOBAL(error_object) && - Z_TYPE_P(SOAP_GLOBAL(error_object)) == IS_OBJECT && - instanceof_function(Z_OBJCE_P(SOAP_GLOBAL(error_object)), soap_server_class_entry TSRMLS_CC) && - (tmp = zend_hash_str_find(Z_OBJPROP_P(SOAP_GLOBAL(error_object)), "service", sizeof("service")-1)) != NULL && + if (Z_OBJ(SOAP_GLOBAL(error_object)) && + instanceof_function(Z_OBJCE(SOAP_GLOBAL(error_object)), soap_server_class_entry TSRMLS_CC) && + (tmp = zend_hash_str_find(Z_OBJPROP(SOAP_GLOBAL(error_object)), "service", sizeof("service")-1)) != NULL && (service = (soapServicePtr)zend_fetch_resource(tmp TSRMLS_CC, -1, "service", NULL, 1, le_service)) && !service->send_errors) { strcpy(buffer, "Internal Error"); @@ -2262,6 +2261,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const php_output_discard(TSRMLS_C); } + ZVAL_NULL(&fault_obj); set_soap_fault(&fault_obj, NULL, code, buffer, NULL, &outbuf, NULL TSRMLS_CC); fault = 1; } @@ -3212,6 +3212,7 @@ zval* add_soap_fault(zval *obj, char *fault_code, char *fault_string, char *faul { zval fault; + ZVAL_NULL(&fault); set_soap_fault(&fault, NULL, fault_code, fault_string, fault_actor, fault_detail, NULL TSRMLS_CC); add_property_zval(obj, "__soap_fault", &fault); Z_DELREF(fault); @@ -3265,7 +3266,7 @@ static void set_soap_fault(zval *obj, char *fault_code_ns, char *fault_code, cha if (fault_actor != NULL) { add_property_string(obj, "faultactor", fault_actor); } - if (fault_detail != NULL) { + if (fault_detail != NULL && Z_TYPE_P(fault_detail) != IS_UNDEF) { add_property_zval(obj, "detail", fault_detail); } if (name != NULL) { @@ -3293,7 +3294,7 @@ static void deserialize_parameters(xmlNodePtr params, sdlFunctionPtr function, i } } ZEND_HASH_FOREACH_END(); if (use_names) { - tmp_parameters = safe_emalloc(num_of_params, sizeof(zval *), 0); + tmp_parameters = safe_emalloc(num_of_params, sizeof(zval), 0); ZEND_HASH_FOREACH_PTR(function->requestParameters, param) { val = get_node(params, param->paramName); if (!val) {