com php-src: Fixed SOAP error handling: ext/soap/php_soap.h ext/soap/soap.c
| From: | Dmitry Stogov | Date: | Thu, 15 May 2014 07:47:10 +0000 |
| Subject: | com php-src: Fixed SOAP error handling: ext/soap/php_soap.h ext/soap/soap.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-78356@lists.php.net to get a copy of this message | ||
Commit: 4c4df8598835ce39986ea3dbe19629bb0ee61f28
Author: Dmitry Stogov <dmitry@zend.com> Thu, 15 May 2014 11:47:10 +0400
Parents: 76ada8d5e6fe47a3773c86c8b763bd75032680ae
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=4c4df8598835ce39986ea3dbe19629bb0ee61f28
Log:
Fixed SOAP error handling
Changed paths:
M ext/soap/php_soap.h
M ext/soap/soap.c
Diff:
diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h
index 9b9a7ef..e35b033 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 83e8993..674a1b9 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) {