diff --git a/ext/soap/soap.c b/ext/soap/soap.c index b7ed44929872..2bb49ee4c8fb 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1394,7 +1394,7 @@ PHP_METHOD(SoapServer, handle) } } - if ((soap_action_z = zend_hash_str_find(Z_ARRVAL_P(server_vars), ZEND_STRL("HTTP_SOAPACTION"))) != NULL && Z_TYPE_P(soap_action_z) == IS_STRING) { + if ((soap_action_z = zend_hash_str_find(Z_ARRVAL_P(server_vars), ZEND_STRL("HTTP_SOAPACTION"))) != NULL && Z_TYPE_P(soap_action_z) == IS_STRING && Z_STRLEN_P(soap_action_z) > 0) { soap_action = Z_STRVAL_P(soap_action_z); } } @@ -3178,6 +3178,10 @@ static sdlFunctionPtr find_function_using_soap_action(const sdl *sdl, const char soap_action_length -= 2; } + if (UNEXPECTED(soap_action_length == 0)) { + return NULL; + } + /* TODO: This may depend on a particular target namespace, in which case this won't find a match when multiple different * target namespaces are used until #45282 is resolved. */ sdlFunctionPtr function; diff --git a/ext/soap/tests/bugs/gh22285.phpt b/ext/soap/tests/bugs/gh22285.phpt new file mode 100644 index 000000000000..8c7e0933588e --- /dev/null +++ b/ext/soap/tests/bugs/gh22285.phpt @@ -0,0 +1,45 @@ +--TEST-- +GH-22285 (SoapServer dispatches to the first function when the SOAPAction header is empty) +--CREDITS-- +Jarkko Hyvärinen +--EXTENSIONS-- +soap +--INI-- +soap.wsdl_cache_enabled=0 +--SKIPIF-- + +--POST-- + + + + World + + + +--FILE-- + 'Hello ' . $params->name]; + } + public function goodbye($params) { + return ['message' => 'Goodbye ' . $params->name]; + } +} + +$server = new SoapServer(__DIR__ . '/gh22285.wsdl', [ + 'cache_wsdl' => WSDL_CACHE_NONE, + 'encoding' => 'UTF-8', + 'soap_version' => SOAP_1_1, +]); +$server->setClass('TestWS'); +$_SERVER['HTTP_SOAPACTION'] = '""'; +$server->handle(); +?> +--EXPECTF-- + +Goodbye World diff --git a/ext/soap/tests/bugs/gh22285.wsdl b/ext/soap/tests/bugs/gh22285.wsdl new file mode 100644 index 000000000000..66b9e6749071 --- /dev/null +++ b/ext/soap/tests/bugs/gh22285.wsdl @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +