Skip to content

Commit 812e43b

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 8f4add0 commit 812e43b

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
@@ -1949,8 +1949,6 @@ PHP_METHOD(SoapClient, __construct)
19491949
RETURN_THROWS();
19501950
}
19511951

1952-
SOAP_CLIENT_BEGIN_CODE();
1953-
19541952
cache_wsdl = SOAP_GLOBAL(cache_enabled) ? SOAP_GLOBAL(cache_mode) : 0;
19551953

19561954
if (options != NULL) {
@@ -1963,7 +1961,8 @@ PHP_METHOD(SoapClient, __construct)
19631961
Z_TYPE_P(tmp) == IS_STRING) {
19641962
ZVAL_STR_COPY(Z_CLIENT_URI_P(this_ptr), Z_STR_P(tmp));
19651963
} else {
1966-
php_error_docref(NULL, E_ERROR, "'uri' option is required in nonWSDL mode");
1964+
zend_argument_value_error(2, "must provide \"uri\" option as it is required in nonWSDL mode");
1965+
RETURN_THROWS();
19671966
}
19681967

19691968
if ((tmp = zend_hash_str_find(ht, "style", sizeof("style")-1)) != NULL &&
@@ -1991,7 +1990,8 @@ PHP_METHOD(SoapClient, __construct)
19911990
Z_TYPE_P(tmp) == IS_STRING) {
19921991
ZVAL_STR_COPY(Z_CLIENT_LOCATION_P(this_ptr), Z_STR_P(tmp));
19931992
} else if (!wsdl) {
1994-
php_error_docref(NULL, E_ERROR, "'location' option is required in nonWSDL mode");
1993+
zend_argument_value_error(2, "must provide \"location\" option as it is required in nonWSDL mode");
1994+
RETURN_THROWS();
19951995
}
19961996

19971997
if ((tmp = zend_hash_str_find(ht, "soap_version", sizeof("soap_version")-1)) != NULL) {
@@ -2070,7 +2070,8 @@ PHP_METHOD(SoapClient, __construct)
20702070

20712071
encoding = xmlFindCharEncodingHandler(Z_STRVAL_P(tmp));
20722072
if (encoding == NULL) {
2073-
php_error_docref(NULL, E_ERROR, "Invalid 'encoding' option - '%s'", Z_STRVAL_P(tmp));
2073+
zend_argument_value_error(2, "provided \"encoding\" option \"%s\" is invalid", Z_STRVAL_P(tmp));
2074+
RETURN_THROWS();
20742075
} else {
20752076
xmlCharEncCloseFunc(encoding);
20762077
ZVAL_STR_COPY(Z_CLIENT_ENCODING_P(this_ptr), Z_STR_P(tmp));
@@ -2126,19 +2127,32 @@ PHP_METHOD(SoapClient, __construct)
21262127
"The \"ssl_method\" option is deprecated. "
21272128
"Use \"ssl\" stream context options instead");
21282129
}
2129-
} else if (!wsdl) {
2130-
php_error_docref(NULL, E_ERROR, "'location' and 'uri' options are required in nonWSDL mode");
2130+
}
2131+
2132+
if (options == NULL && wsdl == NULL) {
2133+
zend_argument_value_error(2, "must provide \"uri\" and \"location\" options as they are required in nonWSDL mode");
2134+
RETURN_THROWS();
21312135
}
21322136

21332137
ZVAL_LONG(Z_CLIENT_SOAP_VERSION_P(this_ptr), soap_version);
21342138

2139+
if (typemap_ht) {
2140+
HashTable *typemap = soap_create_typemap(sdl, typemap_ht);
2141+
if (UNEXPECTED(typemap == NULL)) {
2142+
RETURN_THROWS();
2143+
}
2144+
ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap);
2145+
}
2146+
21352147
if (wsdl) {
21362148
int old_soap_version;
21372149

21382150
old_soap_version = SOAP_GLOBAL(soap_version);
21392151
SOAP_GLOBAL(soap_version) = soap_version;
21402152

2153+
SOAP_CLIENT_BEGIN_CODE();
21412154
sdl = get_sdl(this_ptr, ZSTR_VAL(wsdl), cache_wsdl);
2155+
SOAP_CLIENT_END_CODE();
21422156

21432157
zval *sdl_zval = Z_CLIENT_SDL_P(this_ptr);
21442158
if (Z_TYPE_P(sdl_zval) == IS_OBJECT) {
@@ -2151,14 +2165,6 @@ PHP_METHOD(SoapClient, __construct)
21512165

21522166
SOAP_GLOBAL(soap_version) = old_soap_version;
21532167
}
2154-
2155-
if (typemap_ht) {
2156-
HashTable *typemap = soap_create_typemap(sdl, typemap_ht);
2157-
if (typemap) {
2158-
ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap);
2159-
}
2160-
}
2161-
SOAP_CLIENT_END_CODE();
21622168
}
21632169
/* }}} */
21642170

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)