]> granicus.if.org Git - php/commitdiff
Fixed SOAP error handling
authorDmitry Stogov <dmitry@zend.com>
Thu, 15 May 2014 07:47:10 +0000 (11:47 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 15 May 2014 07:47:10 +0000 (11:47 +0400)
ext/soap/php_soap.h
ext/soap/soap.c

index 9b9a7efbd5b631216ebf2e00cc78a7abf451dc06..e35b033cae48cb3c7f7fe1f07cb1e7021e1407f2 100644 (file)
@@ -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;
index 83e8993da25ad396bdc1bd2115944f5078bca8ef..674a1b9ff8df948840d6c16ae6079aa504db65e6 100644 (file)
@@ -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) {