From 986c96dcf9c4dd8cd72771e958560986c57d39df Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sun, 16 Jun 2024 19:22:42 +0100 Subject: [PATCH 1/5] ext/soap: Refactor implementation of SoapFault::__toString() --- ext/soap/soap.c | 70 +++++++++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index a92e1513e27f0..ed6cf219caf00 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -703,41 +703,61 @@ PHP_METHOD(SoapFault, __construct) /* {{{ SoapFault constructor */ PHP_METHOD(SoapFault, __toString) { - zval *faultcode, *faultstring, *file, *line, trace, rv1, rv2, rv3, rv4; - zend_string *str; - zval *this_ptr; - zend_string *faultcode_val, *faultstring_val, *file_val; - zend_long line_val; + zval *line, rv1, rv2, rv3, rv4, rv5; if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } - this_ptr = ZEND_THIS; - faultcode = zend_read_property(soap_fault_class_entry, Z_OBJ_P(this_ptr), "faultcode", sizeof("faultcode")-1, 1, &rv1); - faultstring = zend_read_property(soap_fault_class_entry, Z_OBJ_P(this_ptr), "faultstring", sizeof("faultstring")-1, 1, &rv2); - file = zend_read_property_ex(soap_fault_class_entry, Z_OBJ_P(this_ptr), ZSTR_KNOWN(ZEND_STR_FILE), /* silent */ true, &rv3); - line = zend_read_property_ex(soap_fault_class_entry, Z_OBJ_P(this_ptr), ZSTR_KNOWN(ZEND_STR_LINE), /* silent */ true, &rv4); + zval *this_ptr = ZEND_THIS; - zend_call_method_with_0_params( - Z_OBJ_P(ZEND_THIS), Z_OBJCE_P(ZEND_THIS), NULL, "gettraceasstring", &trace); + /* SoapFault uses typed properties */ + const zval *faultcode = zend_read_property(soap_fault_class_entry, Z_OBJ_P(this_ptr), "faultcode", sizeof("faultcode")-1, /* silent */ true, &rv1); + const zend_string *faultcode_val; + if (UNEXPECTED(Z_TYPE_P(faultcode) == IS_NULL)) { + faultcode_val = zend_empty_string; + } else { + ZEND_ASSERT(Z_TYPE_P(faultcode) == IS_STRING); + faultcode_val = Z_STR_P(faultcode); + } - faultcode_val = zval_get_string(faultcode); - faultstring_val = zval_get_string(faultstring); - file_val = zval_get_string(file); - line_val = zval_get_long(line); - convert_to_string(&trace); + const zval *faultstring = zend_read_property(soap_fault_class_entry, Z_OBJ_P(this_ptr), "faultstring", sizeof("faultstring")-1, /* silent */ true, &rv2); + const zend_string *faultstring_val; + if (UNEXPECTED(Z_TYPE_P(faultstring) == IS_NULL)) { + faultstring_val = zend_empty_string; + } else { + ZEND_ASSERT(Z_TYPE_P(faultstring) == IS_STRING); + faultstring_val = Z_STR_P(faultstring); + } + + /* Exception uses typed properties */ + const zval *file = zend_read_property_ex(soap_fault_class_entry, Z_OBJ_P(this_ptr), ZSTR_KNOWN(ZEND_STR_FILE), /* silent */ true, &rv3); + ZEND_ASSERT(Z_TYPE_P(file) == IS_STRING); + const zend_string *file_val = Z_STR_P(file); - str = strpprintf(0, "SoapFault exception: [%s] %s in %s:" ZEND_LONG_FMT "\nStack trace:\n%s", - ZSTR_VAL(faultcode_val), ZSTR_VAL(faultstring_val), ZSTR_VAL(file_val), line_val, - Z_STRLEN(trace) ? Z_STRVAL(trace) : "#0 {main}\n"); + line = zend_read_property_ex(soap_fault_class_entry, Z_OBJ_P(this_ptr), ZSTR_KNOWN(ZEND_STR_LINE), /* silent */ true, &rv4); + ZEND_ASSERT(Z_TYPE_P(line) == IS_LONG); + zend_long line_val = Z_LVAL_P(line); + + /* Grab private $trace property from base Exception class */ + zval *trace = zend_read_property_ex(zend_ce_exception, Z_OBJ_P(this_ptr), ZSTR_KNOWN(ZEND_STR_TRACE), /* silent */ true, &rv5); + ZEND_ASSERT(Z_TYPE_P(trace) == IS_ARRAY); + zend_string *trace_str = zend_trace_to_string(Z_ARRVAL_P(trace), /* include_main */ true); + + size_t max_length = ZSTR_LEN(faultcode_val) + + ZSTR_LEN(faultstring_val) + + ZSTR_LEN(file_val) + + ZSTR_LEN(trace_str) + + sizeof("9223372036854775807") + + sizeof("SoapFault exception: [] in :\nStack trace:\n"); + zend_string *str = strpprintf(max_length, + "SoapFault exception: [%s] %s in %s:" ZEND_LONG_FMT "\nStack trace:\n%s", + ZSTR_VAL(faultcode_val), ZSTR_VAL(faultstring_val), ZSTR_VAL(file_val), line_val, ZSTR_VAL(trace_str) + ); - zend_string_release_ex(file_val, 0); - zend_string_release_ex(faultstring_val, 0); - zend_string_release_ex(faultcode_val, 0); - zval_ptr_dtor(&trace); + zend_string_release(trace_str); - RETVAL_STR(str); + RETURN_NEW_STR(str); } /* }}} */ From ba38a944d7605c75abe2b59ba4b753d523f75167 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sun, 16 Jun 2024 14:37:29 +0100 Subject: [PATCH 2/5] ext/soap: Convert bailout for invalid headers argument to TypeError --- ext/soap/soap.c | 6 ++++-- .../tests/SoapClient/setSoapHeaders-invalid-headers.phpt | 4 ++-- ext/soap/tests/SoapClient/soapCall-invalid-headers.phpt | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index ed6cf219caf00..30d64991ec36e 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2617,7 +2617,8 @@ PHP_METHOD(SoapClient, __soapCall) } else if (Z_TYPE_P(headers) == IS_ARRAY) { soap_headers = Z_ARRVAL_P(headers); if (!verify_soap_headers_array(soap_headers)) { - php_error_docref(NULL, E_ERROR, "Invalid SOAP header"); + zend_argument_type_error(4, "must be on array of SoapHeader objects"); + RETURN_THROWS(); } free_soap_headers = false; } else if (Z_TYPE_P(headers) == IS_OBJECT && instanceof_function(Z_OBJCE_P(headers), soap_header_class_entry)) { @@ -2828,7 +2829,8 @@ PHP_METHOD(SoapClient, __setSoapHeaders) convert_to_null(Z_CLIENT_DEFAULT_HEADERS_P(this_ptr)); } else if (Z_TYPE_P(headers) == IS_ARRAY) { if (!verify_soap_headers_array(Z_ARRVAL_P(headers))) { - php_error_docref(NULL, E_ERROR, "Invalid SOAP header"); + zend_argument_type_error(1, "must be on array of SoapHeader objects"); + RETURN_THROWS(); } zval_ptr_dtor(Z_CLIENT_DEFAULT_HEADERS_P(this_ptr)); ZVAL_COPY(Z_CLIENT_DEFAULT_HEADERS_P(this_ptr), headers); diff --git a/ext/soap/tests/SoapClient/setSoapHeaders-invalid-headers.phpt b/ext/soap/tests/SoapClient/setSoapHeaders-invalid-headers.phpt index 1c1d69d9a7d69..0679a9b8388c3 100644 --- a/ext/soap/tests/SoapClient/setSoapHeaders-invalid-headers.phpt +++ b/ext/soap/tests/SoapClient/setSoapHeaders-invalid-headers.phpt @@ -24,5 +24,5 @@ try { } ?> ---EXPECTF-- -Fatal error: SoapClient::__setSoapHeaders(): Invalid SOAP header in %s on line %d +--EXPECT-- +TypeError: SoapClient::__setSoapHeaders(): Argument #1 ($headers) must be on array of SoapHeader objects diff --git a/ext/soap/tests/SoapClient/soapCall-invalid-headers.phpt b/ext/soap/tests/SoapClient/soapCall-invalid-headers.phpt index f9cc11fd60f4a..7891562ffecc0 100644 --- a/ext/soap/tests/SoapClient/soapCall-invalid-headers.phpt +++ b/ext/soap/tests/SoapClient/soapCall-invalid-headers.phpt @@ -24,5 +24,5 @@ try { } ?> ---EXPECTF-- -Fatal error: SoapClient::__soapCall(): Invalid SOAP header in %s on line %d +--EXPECT-- +TypeError: SoapClient::__soapCall(): Argument #4 ($inputHeaders) must be on array of SoapHeader objects From a0fbb9465a2a489040e993b10668ace8ff38e6b4 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sun, 16 Jun 2024 00:19:54 +0100 Subject: [PATCH 3/5] ext/soap: Convert bailouts to normal exception throwing in SoapClient::__constructor() Use ValueErrors as the conditions checked are programming errors Also narrow down bailout mechanism use in it as only the call to get_sdl() requires us to use the bailout mechanism. --- ext/soap/soap.c | 36 +++++++++++-------- .../SoapClient/invalid-encoding-option.phpt | 4 +-- .../missing-options-non-wsdl-mode.phpt | 12 +++---- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 30d64991ec36e..9b034a9e01c4d 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1971,8 +1971,6 @@ PHP_METHOD(SoapClient, __construct) RETURN_THROWS(); } - SOAP_CLIENT_BEGIN_CODE(); - cache_wsdl = SOAP_GLOBAL(cache_enabled) ? SOAP_GLOBAL(cache_mode) : 0; if (options != NULL) { @@ -1985,7 +1983,8 @@ PHP_METHOD(SoapClient, __construct) Z_TYPE_P(tmp) == IS_STRING) { ZVAL_STR_COPY(Z_CLIENT_URI_P(this_ptr), Z_STR_P(tmp)); } else { - php_error_docref(NULL, E_ERROR, "'uri' option is required in nonWSDL mode"); + zend_argument_value_error(2, "must provide \"uri\" option as it is required in nonWSDL mode"); + RETURN_THROWS(); } if ((tmp = zend_hash_str_find(ht, "style", sizeof("style")-1)) != NULL && @@ -2013,7 +2012,8 @@ PHP_METHOD(SoapClient, __construct) Z_TYPE_P(tmp) == IS_STRING) { ZVAL_STR_COPY(Z_CLIENT_LOCATION_P(this_ptr), Z_STR_P(tmp)); } else if (!wsdl) { - php_error_docref(NULL, E_ERROR, "'location' option is required in nonWSDL mode"); + zend_argument_value_error(2, "must provide \"location\" option as it is required in nonWSDL mode"); + RETURN_THROWS(); } if ((tmp = zend_hash_str_find(ht, "soap_version", sizeof("soap_version")-1)) != NULL) { @@ -2092,7 +2092,8 @@ PHP_METHOD(SoapClient, __construct) encoding = xmlFindCharEncodingHandler(Z_STRVAL_P(tmp)); if (encoding == NULL) { - php_error_docref(NULL, E_ERROR, "Invalid 'encoding' option - '%s'", Z_STRVAL_P(tmp)); + zend_argument_value_error(2, "provided \"encoding\" option \"%s\" is invalid", Z_STRVAL_P(tmp)); + RETURN_THROWS(); } else { xmlCharEncCloseFunc(encoding); ZVAL_STR_COPY(Z_CLIENT_ENCODING_P(this_ptr), Z_STR_P(tmp)); @@ -2148,19 +2149,32 @@ PHP_METHOD(SoapClient, __construct) "The \"ssl_method\" option is deprecated. " "Use \"ssl\" stream context options instead"); } - } else if (!wsdl) { - php_error_docref(NULL, E_ERROR, "'location' and 'uri' options are required in nonWSDL mode"); + } + + if (options == NULL && wsdl == NULL) { + zend_argument_value_error(2, "must provide \"uri\" and \"location\" options as they are required in nonWSDL mode"); + RETURN_THROWS(); } ZVAL_LONG(Z_CLIENT_SOAP_VERSION_P(this_ptr), soap_version); + if (typemap_ht) { + HashTable *typemap = soap_create_typemap(sdl, typemap_ht); + if (UNEXPECTED(typemap == NULL)) { + RETURN_THROWS(); + } + ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap); + } + if (wsdl) { int old_soap_version; old_soap_version = SOAP_GLOBAL(soap_version); SOAP_GLOBAL(soap_version) = soap_version; + SOAP_CLIENT_BEGIN_CODE(); sdl = get_sdl(this_ptr, ZSTR_VAL(wsdl), cache_wsdl); + SOAP_CLIENT_END_CODE(); zval *sdl_zval = Z_CLIENT_SDL_P(this_ptr); if (Z_TYPE_P(sdl_zval) == IS_OBJECT) { @@ -2173,14 +2187,6 @@ PHP_METHOD(SoapClient, __construct) SOAP_GLOBAL(soap_version) = old_soap_version; } - - if (typemap_ht) { - HashTable *typemap = soap_create_typemap(sdl, typemap_ht); - if (typemap) { - ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap); - } - } - SOAP_CLIENT_END_CODE(); } /* }}} */ diff --git a/ext/soap/tests/SoapClient/invalid-encoding-option.phpt b/ext/soap/tests/SoapClient/invalid-encoding-option.phpt index c51592e8b9ac6..f7173849d99c8 100644 --- a/ext/soap/tests/SoapClient/invalid-encoding-option.phpt +++ b/ext/soap/tests/SoapClient/invalid-encoding-option.phpt @@ -25,5 +25,5 @@ try { ?> --EXPECT-- -SoapFault: SoapClient::__construct(): Invalid 'encoding' option - 'non-sense' -SoapFault: SoapClient::__construct(): Invalid 'encoding' option - 'non-sense' +ValueError: SoapClient::__construct(): Argument #2 ($options) provided "encoding" option "non-sense" is invalid +ValueError: SoapClient::__construct(): Argument #2 ($options) provided "encoding" option "non-sense" is invalid diff --git a/ext/soap/tests/SoapClient/missing-options-non-wsdl-mode.phpt b/ext/soap/tests/SoapClient/missing-options-non-wsdl-mode.phpt index 55d18df6fbad6..cb42135ddf28a 100644 --- a/ext/soap/tests/SoapClient/missing-options-non-wsdl-mode.phpt +++ b/ext/soap/tests/SoapClient/missing-options-non-wsdl-mode.phpt @@ -48,11 +48,11 @@ try { ?> --EXPECT-- $options not provided -SoapFault: SoapClient::__construct(): 'location' and 'uri' options are required in nonWSDL mode -SoapFault: SoapClient::__construct(): 'location' and 'uri' options are required in nonWSDL mode +ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" and "location" options as they are required in nonWSDL mode +ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" and "location" options as they are required in nonWSDL mode Empty $options array -SoapFault: SoapClient::__construct(): 'uri' option is required in nonWSDL mode -SoapFault: SoapClient::__construct(): 'uri' option is required in nonWSDL mode +ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode +ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode $options array only sets "uri" option -SoapFault: SoapClient::__construct(): 'location' option is required in nonWSDL mode -SoapFault: SoapClient::__construct(): 'location' option is required in nonWSDL mode +ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "location" option as it is required in nonWSDL mode +ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "location" option as it is required in nonWSDL mode From 30996a968920a171197d8d10c8bf98d594ebe0ee Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Mon, 17 Jun 2024 04:12:15 +0100 Subject: [PATCH 4/5] ext/soap: Convert bailouts to normal exception throwing in SoapServer::__constructor() Use ValueErrors as the conditions checked are programming errors Also narrow down bailout mechanism use in it as only the call to get_sdl() requires us to use the bailout mechanism. --- ext/soap/soap.c | 38 ++++++++++++------- .../SoapServer/invalid-encoding-option.phpt | 4 +- .../invalid-soap_version-option.phpt | 4 +- .../missing-options-non-wsdl-mode.phpt | 20 +++------- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 9b034a9e01c4d..d97b30f2ac900 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -920,8 +920,6 @@ PHP_METHOD(SoapServer, __construct) RETURN_THROWS(); } - SOAP_SERVER_BEGIN_CODE(); - service = emalloc(sizeof(soapService)); memset(service, 0, sizeof(soapService)); service->send_errors = 1; @@ -934,18 +932,19 @@ PHP_METHOD(SoapServer, __construct) if ((tmp = zend_hash_str_find(ht, "soap_version", sizeof("soap_version")-1)) != NULL) { if (Z_TYPE_P(tmp) == IS_LONG && - (Z_LVAL_P(tmp) == SOAP_1_1 || Z_LVAL_P(tmp) == SOAP_1_2)) { + (Z_LVAL_P(tmp) == SOAP_1_1 || Z_LVAL_P(tmp) == SOAP_1_2)) { version = Z_LVAL_P(tmp); } else { - php_error_docref(NULL, E_ERROR, "'soap_version' option must be SOAP_1_1 or SOAP_1_2"); + zend_argument_value_error(2, "\"soap_version\" option must be SOAP_1_1 or SOAP_1_2"); + goto error; } } - if ((tmp = zend_hash_str_find(ht, "uri", sizeof("uri")-1)) != NULL && - Z_TYPE_P(tmp) == IS_STRING) { + if ((tmp = zend_hash_str_find(ht, "uri", sizeof("uri")-1)) != NULL && Z_TYPE_P(tmp) == IS_STRING) { service->uri = estrndup(Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)); } else if (!wsdl) { - php_error_docref(NULL, E_ERROR, "'uri' option is required in nonWSDL mode"); + zend_argument_value_error(2, "must provide \"uri\" option as it is required in nonWSDL mode"); + goto error; } if ((tmp = zend_hash_str_find(ht, "actor", sizeof("actor")-1)) != NULL && @@ -959,7 +958,8 @@ PHP_METHOD(SoapServer, __construct) encoding = xmlFindCharEncodingHandler(Z_STRVAL_P(tmp)); if (encoding == NULL) { - php_error_docref(NULL, E_ERROR, "Invalid 'encoding' option - '%s'", Z_STRVAL_P(tmp)); + zend_argument_value_error(2, "provided \"encoding\" option \"%s\" is invalid", Z_STRVAL_P(tmp)); + goto error; } else { service->encoding = encoding; } @@ -997,7 +997,8 @@ PHP_METHOD(SoapServer, __construct) } } else if (!wsdl) { - php_error_docref(NULL, E_ERROR, "'uri' option is required in nonWSDL mode"); + zend_argument_value_error(2, "must provide \"uri\" option as it is required in nonWSDL mode"); + goto error; } service->version = version; @@ -1005,8 +1006,18 @@ PHP_METHOD(SoapServer, __construct) service->soap_functions.functions_all = FALSE; service->soap_functions.ft = zend_new_array(0); + if (typemap_ht) { + service->typemap = soap_create_typemap(service->sdl, typemap_ht); + if (UNEXPECTED(service->typemap == NULL)) { + goto error; + } + } + if (wsdl) { + SOAP_SERVER_BEGIN_CODE(); service->sdl = get_sdl(ZEND_THIS, ZSTR_VAL(wsdl), cache_wsdl); + SOAP_SERVER_END_CODE(); + if (service->uri == NULL) { if (service->sdl->target_ns) { service->uri = estrdup(service->sdl->target_ns); @@ -1017,14 +1028,13 @@ PHP_METHOD(SoapServer, __construct) } } - if (typemap_ht) { - service->typemap = soap_create_typemap(service->sdl, typemap_ht); - } - soap_server_object *server_obj = soap_server_object_fetch(Z_OBJ_P(ZEND_THIS)); server_obj->service = service; + return; - SOAP_SERVER_END_CODE(); + error: + efree(service); + RETURN_THROWS(); } /* }}} */ diff --git a/ext/soap/tests/SoapServer/invalid-encoding-option.phpt b/ext/soap/tests/SoapServer/invalid-encoding-option.phpt index f594d57dd8a4a..bb8b2469e44f8 100644 --- a/ext/soap/tests/SoapServer/invalid-encoding-option.phpt +++ b/ext/soap/tests/SoapServer/invalid-encoding-option.phpt @@ -25,5 +25,5 @@ try { ?> --EXPECT-- - -SOAP-ENV:ServerSoapServer::__construct(): Invalid 'encoding' option - 'non-sense' +ValueError: SoapServer::__construct(): Argument #2 ($options) provided "encoding" option "non-sense" is invalid +ValueError: SoapServer::__construct(): Argument #2 ($options) provided "encoding" option "non-sense" is invalid diff --git a/ext/soap/tests/SoapServer/invalid-soap_version-option.phpt b/ext/soap/tests/SoapServer/invalid-soap_version-option.phpt index 17e45f2dac1b5..c3f655699288f 100644 --- a/ext/soap/tests/SoapServer/invalid-soap_version-option.phpt +++ b/ext/soap/tests/SoapServer/invalid-soap_version-option.phpt @@ -25,5 +25,5 @@ try { ?> --EXPECT-- - -SOAP-ENV:ServerSoapServer::__construct(): 'soap_version' option must be SOAP_1_1 or SOAP_1_2 +ValueError: SoapServer::__construct(): Argument #2 ($options) "soap_version" option must be SOAP_1_1 or SOAP_1_2 +ValueError: SoapServer::__construct(): Argument #2 ($options) "soap_version" option must be SOAP_1_1 or SOAP_1_2 diff --git a/ext/soap/tests/SoapServer/missing-options-non-wsdl-mode.phpt b/ext/soap/tests/SoapServer/missing-options-non-wsdl-mode.phpt index 54e6493879e11..69eae6046e628 100644 --- a/ext/soap/tests/SoapServer/missing-options-non-wsdl-mode.phpt +++ b/ext/soap/tests/SoapServer/missing-options-non-wsdl-mode.phpt @@ -32,21 +32,11 @@ try { echo $e::class, ': ', $e->getMessage(), PHP_EOL; } -echo "\$options array only sets \"uri\" option\n"; -$options = ['uri' => 'https://example.com']; -try { - $client = new SoapServer(null, $options); -} catch (Throwable $e) { - echo $e::class, ': ', $e->getMessage(), PHP_EOL; -} -try { - $client = new ExtendedSoapServer(null, $options); -} catch (Throwable $e) { - echo $e::class, ': ', $e->getMessage(), PHP_EOL; -} - ?> --EXPECT-- $options not provided - -SOAP-ENV:ServerSoapServer::__construct(): 'uri' option is required in nonWSDL mode +ValueError: SoapServer::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode +ValueError: SoapServer::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode +Empty $options array +ValueError: SoapServer::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode +ValueError: SoapServer::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode From eee6d3a96c2305b6d95b8c28dc1c9a7d95d4ddc4 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 19 Jun 2024 02:30:18 +0100 Subject: [PATCH 5/5] Invert conditions --- ext/soap/soap.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index d97b30f2ac900..fc8011b4f7d9a 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -714,20 +714,20 @@ PHP_METHOD(SoapFault, __toString) /* SoapFault uses typed properties */ const zval *faultcode = zend_read_property(soap_fault_class_entry, Z_OBJ_P(this_ptr), "faultcode", sizeof("faultcode")-1, /* silent */ true, &rv1); const zend_string *faultcode_val; - if (UNEXPECTED(Z_TYPE_P(faultcode) == IS_NULL)) { - faultcode_val = zend_empty_string; - } else { - ZEND_ASSERT(Z_TYPE_P(faultcode) == IS_STRING); + if (EXPECTED(Z_TYPE_P(faultcode) == IS_STRING)) { faultcode_val = Z_STR_P(faultcode); + } else { + ZEND_ASSERT(Z_TYPE_P(faultcode) == IS_NULL); + faultcode_val = zend_empty_string; } const zval *faultstring = zend_read_property(soap_fault_class_entry, Z_OBJ_P(this_ptr), "faultstring", sizeof("faultstring")-1, /* silent */ true, &rv2); const zend_string *faultstring_val; - if (UNEXPECTED(Z_TYPE_P(faultstring) == IS_NULL)) { - faultstring_val = zend_empty_string; - } else { - ZEND_ASSERT(Z_TYPE_P(faultstring) == IS_STRING); + if (EXPECTED(Z_TYPE_P(faultstring) == IS_STRING)) { faultstring_val = Z_STR_P(faultstring); + } else { + ZEND_ASSERT(Z_TYPE_P(faultstring) == IS_NULL); + faultstring_val = zend_empty_string; } /* Exception uses typed properties */