Skip to content

Commit a0fbb94

Browse files
committed
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.
1 parent ba38a94 commit a0fbb94

File tree

3 files changed

+29
-23
lines changed

3 files changed

+29
-23
lines changed

ext/soap/soap.c

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,8 +1971,6 @@ PHP_METHOD(SoapClient, __construct)
19711971
RETURN_THROWS();
19721972
}
19731973

1974-
SOAP_CLIENT_BEGIN_CODE();
1975-
19761974
cache_wsdl = SOAP_GLOBAL(cache_enabled) ? SOAP_GLOBAL(cache_mode) : 0;
19771975

19781976
if (options != NULL) {
@@ -1985,7 +1983,8 @@ PHP_METHOD(SoapClient, __construct)
19851983
Z_TYPE_P(tmp) == IS_STRING) {
19861984
ZVAL_STR_COPY(Z_CLIENT_URI_P(this_ptr), Z_STR_P(tmp));
19871985
} else {
1988-
php_error_docref(NULL, E_ERROR, "'uri' option is required in nonWSDL mode");
1986+
zend_argument_value_error(2, "must provide \"uri\" option as it is required in nonWSDL mode");
1987+
RETURN_THROWS();
19891988
}
19901989

19911990
if ((tmp = zend_hash_str_find(ht, "style", sizeof("style")-1)) != NULL &&
@@ -2013,7 +2012,8 @@ PHP_METHOD(SoapClient, __construct)
20132012
Z_TYPE_P(tmp) == IS_STRING) {
20142013
ZVAL_STR_COPY(Z_CLIENT_LOCATION_P(this_ptr), Z_STR_P(tmp));
20152014
} else if (!wsdl) {
2016-
php_error_docref(NULL, E_ERROR, "'location' option is required in nonWSDL mode");
2015+
zend_argument_value_error(2, "must provide \"location\" option as it is required in nonWSDL mode");
2016+
RETURN_THROWS();
20172017
}
20182018

20192019
if ((tmp = zend_hash_str_find(ht, "soap_version", sizeof("soap_version")-1)) != NULL) {
@@ -2092,7 +2092,8 @@ PHP_METHOD(SoapClient, __construct)
20922092

20932093
encoding = xmlFindCharEncodingHandler(Z_STRVAL_P(tmp));
20942094
if (encoding == NULL) {
2095-
php_error_docref(NULL, E_ERROR, "Invalid 'encoding' option - '%s'", Z_STRVAL_P(tmp));
2095+
zend_argument_value_error(2, "provided \"encoding\" option \"%s\" is invalid", Z_STRVAL_P(tmp));
2096+
RETURN_THROWS();
20962097
} else {
20972098
xmlCharEncCloseFunc(encoding);
20982099
ZVAL_STR_COPY(Z_CLIENT_ENCODING_P(this_ptr), Z_STR_P(tmp));
@@ -2148,19 +2149,32 @@ PHP_METHOD(SoapClient, __construct)
21482149
"The \"ssl_method\" option is deprecated. "
21492150
"Use \"ssl\" stream context options instead");
21502151
}
2151-
} else if (!wsdl) {
2152-
php_error_docref(NULL, E_ERROR, "'location' and 'uri' options are required in nonWSDL mode");
2152+
}
2153+
2154+
if (options == NULL && wsdl == NULL) {
2155+
zend_argument_value_error(2, "must provide \"uri\" and \"location\" options as they are required in nonWSDL mode");
2156+
RETURN_THROWS();
21532157
}
21542158

21552159
ZVAL_LONG(Z_CLIENT_SOAP_VERSION_P(this_ptr), soap_version);
21562160

2161+
if (typemap_ht) {
2162+
HashTable *typemap = soap_create_typemap(sdl, typemap_ht);
2163+
if (UNEXPECTED(typemap == NULL)) {
2164+
RETURN_THROWS();
2165+
}
2166+
ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap);
2167+
}
2168+
21572169
if (wsdl) {
21582170
int old_soap_version;
21592171

21602172
old_soap_version = SOAP_GLOBAL(soap_version);
21612173
SOAP_GLOBAL(soap_version) = soap_version;
21622174

2175+
SOAP_CLIENT_BEGIN_CODE();
21632176
sdl = get_sdl(this_ptr, ZSTR_VAL(wsdl), cache_wsdl);
2177+
SOAP_CLIENT_END_CODE();
21642178

21652179
zval *sdl_zval = Z_CLIENT_SDL_P(this_ptr);
21662180
if (Z_TYPE_P(sdl_zval) == IS_OBJECT) {
@@ -2173,14 +2187,6 @@ PHP_METHOD(SoapClient, __construct)
21732187

21742188
SOAP_GLOBAL(soap_version) = old_soap_version;
21752189
}
2176-
2177-
if (typemap_ht) {
2178-
HashTable *typemap = soap_create_typemap(sdl, typemap_ht);
2179-
if (typemap) {
2180-
ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap);
2181-
}
2182-
}
2183-
SOAP_CLIENT_END_CODE();
21842190
}
21852191
/* }}} */
21862192

ext/soap/tests/SoapClient/invalid-encoding-option.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ try {
2525

2626
?>
2727
--EXPECT--
28-
SoapFault: SoapClient::__construct(): Invalid 'encoding' option - 'non-sense'
29-
SoapFault: SoapClient::__construct(): Invalid 'encoding' option - 'non-sense'
28+
ValueError: SoapClient::__construct(): Argument #2 ($options) provided "encoding" option "non-sense" is invalid
29+
ValueError: SoapClient::__construct(): Argument #2 ($options) provided "encoding" option "non-sense" is invalid

ext/soap/tests/SoapClient/missing-options-non-wsdl-mode.phpt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ try {
4848
?>
4949
--EXPECT--
5050
$options not provided
51-
SoapFault: SoapClient::__construct(): 'location' and 'uri' options are required in nonWSDL mode
52-
SoapFault: SoapClient::__construct(): 'location' and 'uri' options are required in nonWSDL mode
51+
ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" and "location" options as they are required in nonWSDL mode
52+
ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" and "location" options as they are required in nonWSDL mode
5353
Empty $options array
54-
SoapFault: SoapClient::__construct(): 'uri' option is required in nonWSDL mode
55-
SoapFault: SoapClient::__construct(): 'uri' option is required in nonWSDL mode
54+
ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode
55+
ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "uri" option as it is required in nonWSDL mode
5656
$options array only sets "uri" option
57-
SoapFault: SoapClient::__construct(): 'location' option is required in nonWSDL mode
58-
SoapFault: SoapClient::__construct(): 'location' option is required in nonWSDL mode
57+
ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "location" option as it is required in nonWSDL mode
58+
ValueError: SoapClient::__construct(): Argument #2 ($options) must provide "location" option as it is required in nonWSDL mode

0 commit comments

Comments
 (0)