From 3bc37288712ca03a17dee102751e9b68d8bd0420 Mon Sep 17 00:00:00 2001 From: Viktor Vassilyev Date: Thu, 12 Oct 2023 09:30:04 +0600 Subject: [PATCH 1/6] ext/soap: setting xml namespace in classmap --- ext/soap/php_encoding.c | 28 ++++++++++--- ext/soap/tests/classmap005.phpt | 46 ++++++++++++++++++++++ ext/soap/tests/classmap006.phpt | 60 ++++++++++++++++++++++++++++ ext/soap/tests/classmap006.wsdl | 70 +++++++++++++++++++++++++++++++++ 4 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 ext/soap/tests/classmap005.phpt create mode 100644 ext/soap/tests/classmap006.phpt create mode 100644 ext/soap/tests/classmap006.wsdl diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 3a4626aa5beee..ab7d0338c7c50 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -271,9 +271,20 @@ static encodePtr find_encoder_by_type_name(sdlPtr sdl, const char *type) encodePtr enc; ZEND_HASH_FOREACH_PTR(sdl->encoders, enc) { - if (strcmp(enc->details.type_str, type) == 0) { - return enc; - } + + if (type[0] == '{') { + size_t ns_len = strlen(enc->details.ns); + if (strncmp(enc->details.ns, type + 1, ns_len) == 0 + && type[ns_len + 1] == '}' + && strcmp(enc->details.type_str, type + ns_len + 2) == 0) { + return enc; + } + } else { + if (strcmp(enc->details.type_str, type) == 0) { + return enc; + } + } + } ZEND_HASH_FOREACH_END(); } return NULL; @@ -1380,8 +1391,15 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z } else if (SOAP_GLOBAL(class_map) && type->type_str) { zval *classname; zend_class_entry *tmp; - - if ((classname = zend_hash_str_find_deref(SOAP_GLOBAL(class_map), type->type_str, strlen(type->type_str))) != NULL && + classname = zend_hash_str_find_deref(SOAP_GLOBAL(class_map), type->type_str, strlen(type->type_str)); + if(classname == NULL){ + if (type->ns) { + zend_string *nscat =zend_strpprintf(0, "{%s}%s", type->ns, type->type_str); + classname = zend_hash_find_deref(SOAP_GLOBAL(class_map),nscat); + zend_string_release_ex(nscat, 0); + } + } + if (classname != NULL && Z_TYPE_P(classname) == IS_STRING && (tmp = zend_fetch_class(Z_STR_P(classname), ZEND_FETCH_CLASS_AUTO)) != NULL) { ce = tmp; diff --git a/ext/soap/tests/classmap005.phpt b/ext/soap/tests/classmap005.phpt new file mode 100644 index 0000000000000..11be0f52eb5ea --- /dev/null +++ b/ext/soap/tests/classmap005.phpt @@ -0,0 +1,46 @@ +--TEST-- +SOAP Classmap 5: SoapClient support for classmap with namespace +--EXTENSIONS-- +soap +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- + + + + Blaat + aap + + +EOF; + } +} + +class bookNs{ + public $a="a"; + public $b="c"; + +} + +$options=Array( + 'actor' =>'http://schema.nothing.com', + 'classmap' => array('{http://schemas.nothing.com}book'=>'bookNs', 'wsdltype2'=>'classname2') + ); + +$client = new TestSoapClient(__DIR__."/classmap.wsdl",$options); +$ret = $client->dotest2("???"); +var_dump($ret); +echo "ok\n"; +?> +--EXPECT-- +object(bookNs)#2 (2) { + ["a"]=> + string(5) "Blaat" + ["b"]=> + string(3) "aap" +} +ok diff --git a/ext/soap/tests/classmap006.phpt b/ext/soap/tests/classmap006.phpt new file mode 100644 index 0000000000000..9d1708635c546 --- /dev/null +++ b/ext/soap/tests/classmap006.phpt @@ -0,0 +1,60 @@ +--TEST-- +SOAP Classmap 6: encoding of inherited objects with namespace +--EXTENSIONS-- +soap +--FILE-- +x = $a; + } +} +class Attest { + public $x; + function __construct($a){ + $this->x = $a; + } +} +class B extends A { + public $y; + function __construct($a){ + parent::__construct($a); + $this->y = $a + 1; + } +} + +function f($input){ + return new B(5); +} + +class LocalSoapClient extends SoapClient { + private $server; + + function __construct($wsdl, $options) { + parent::__construct($wsdl, $options); + $this->server = new SoapServer($wsdl, $options); + $this->server->addFunction("f"); + } + + function __doRequest($request, $location, $action, $version, $one_way = 0): ?string { + ob_start(); + $this->server->handle($request); + $response = ob_get_contents(); + ob_end_clean(); + return $response; + } +} + +$client = new LocalSoapClient(__DIR__."/classmap006.wsdl", + array('classmap'=>array('A'=>'A','{urn:abt}At'=>'Attest','B'=>'B'))); +print_r($client->f(new Attest('test'))); +?> +--EXPECT-- +B Object +( + [x] => 5 + [y] => 6 +) diff --git a/ext/soap/tests/classmap006.wsdl b/ext/soap/tests/classmap006.wsdl new file mode 100644 index 0000000000000..f9637bb60be08 --- /dev/null +++ b/ext/soap/tests/classmap006.wsdl @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bbbb5456209b228b7c694a2ea9d7a4df61bf33cd Mon Sep 17 00:00:00 2001 From: Viktor Vassilyev Date: Thu, 19 Oct 2023 13:27:29 +0600 Subject: [PATCH 2/6] ext/soap: setting xml namespace in classmap without allocation --- ext/soap/php_encoding.c | 185 ++++++++++++++++++++-------------------- ext/soap/php_encoding.h | 1 + ext/soap/php_schema.c | 13 +++ ext/soap/php_sdl.c | 3 + 4 files changed, 110 insertions(+), 92 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index ab7d0338c7c50..63d1966536be2 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -138,93 +138,93 @@ static void set_ns_and_type(xmlNodePtr node, encodeTypePtr type); } const encode defaultEncoding[] = { - {{UNKNOWN_TYPE, NULL, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, - - {{IS_NULL, "nil", XSI_NAMESPACE, NULL, NULL}, to_zval_null, to_xml_null}, - {{IS_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_string, to_xml_string}, - {{IS_LONG, XSD_INT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{IS_DOUBLE, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_double, to_xml_double}, - {{IS_FALSE, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_bool, to_xml_bool}, - {{IS_TRUE, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_bool, to_xml_bool}, - {{IS_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL}, to_zval_array, guess_array_map}, - {{IS_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL}, to_zval_object, to_xml_object}, - {{IS_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL}, to_zval_array, guess_array_map}, - {{IS_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL}, to_zval_object, to_xml_object}, - - {{XSD_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_string, to_xml_string}, - {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_bool, to_xml_bool}, - {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_double, to_xml_double}, - {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_double, to_xml_double}, - - {{XSD_DATETIME, XSD_DATETIME_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_datetime}, - {{XSD_TIME, XSD_TIME_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_time}, - {{XSD_DATE, XSD_DATE_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_date}, - {{XSD_GYEARMONTH, XSD_GYEARMONTH_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_gyearmonth}, - {{XSD_GYEAR, XSD_GYEAR_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_gyear}, - {{XSD_GMONTHDAY, XSD_GMONTHDAY_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_gmonthday}, - {{XSD_GDAY, XSD_GDAY_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_gday}, - {{XSD_GMONTH, XSD_GMONTH_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_gmonth}, - {{XSD_DURATION, XSD_DURATION_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_duration}, - - {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_hexbin, to_xml_hexbin}, - {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_base64, to_xml_base64}, - - {{XSD_LONG, XSD_LONG_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_SHORT, XSD_SHORT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_BYTE, XSD_BYTE_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_NONPOSITIVEINTEGER, XSD_NONPOSITIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_POSITIVEINTEGER, XSD_POSITIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_NONNEGATIVEINTEGER, XSD_NONNEGATIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_NEGATIVEINTEGER, XSD_NEGATIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_UNSIGNEDBYTE, XSD_UNSIGNEDBYTE_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_UNSIGNEDSHORT, XSD_UNSIGNEDSHORT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_UNSIGNEDINT, XSD_UNSIGNEDINT_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_UNSIGNEDLONG, XSD_UNSIGNEDLONG_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_INTEGER, XSD_INTEGER_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - - {{XSD_ANYTYPE, XSD_ANYTYPE_STRING, XSD_NAMESPACE, NULL, NULL}, guess_zval_convert, guess_xml_convert}, - {{XSD_UR_TYPE, XSD_UR_TYPE_STRING, XSD_NAMESPACE, NULL, NULL}, guess_zval_convert, guess_xml_convert}, - {{XSD_ANYURI, XSD_ANYURI_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_QNAME, XSD_QNAME_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_NOTATION, XSD_NOTATION_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_NORMALIZEDSTRING, XSD_NORMALIZEDSTRING_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringr, to_xml_string}, - {{XSD_TOKEN, XSD_TOKEN_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_LANGUAGE, XSD_LANGUAGE_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_NMTOKEN, XSD_NMTOKEN_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_NMTOKENS, XSD_NMTOKENS_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_list1}, - {{XSD_NAME, XSD_NAME_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_NCNAME, XSD_NCNAME_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_ID, XSD_ID_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_IDREF, XSD_IDREF_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_list1}, - {{XSD_ENTITY, XSD_ENTITY_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_list1}, - - {{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL, NULL}, to_zval_map, to_xml_map}, - - {{SOAP_ENC_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL}, to_zval_object, to_xml_object}, - {{SOAP_ENC_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL}, to_zval_array, to_xml_array}, - {{SOAP_ENC_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL}, to_zval_object, to_xml_object}, - {{SOAP_ENC_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL}, to_zval_array, to_xml_array}, + {{UNKNOWN_TYPE, NULL, NULL, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, + + {{IS_NULL, "nil", XSI_NAMESPACE, NULL, NULL,NULL}, to_zval_null, to_xml_null}, + {{IS_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_string, to_xml_string}, + {{IS_LONG, XSD_INT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{IS_DOUBLE, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_double, to_xml_double}, + {{IS_FALSE, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_bool, to_xml_bool}, + {{IS_TRUE, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_bool, to_xml_bool}, + {{IS_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_array, guess_array_map}, + {{IS_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_object, to_xml_object}, + {{IS_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_array, guess_array_map}, + {{IS_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_object, to_xml_object}, + + {{XSD_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_string, to_xml_string}, + {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_bool, to_xml_bool}, + {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_double, to_xml_double}, + {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_double, to_xml_double}, + + {{XSD_DATETIME, XSD_DATETIME_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_datetime}, + {{XSD_TIME, XSD_TIME_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_time}, + {{XSD_DATE, XSD_DATE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_date}, + {{XSD_GYEARMONTH, XSD_GYEARMONTH_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_gyearmonth}, + {{XSD_GYEAR, XSD_GYEAR_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_gyear}, + {{XSD_GMONTHDAY, XSD_GMONTHDAY_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_gmonthday}, + {{XSD_GDAY, XSD_GDAY_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_gday}, + {{XSD_GMONTH, XSD_GMONTH_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_gmonth}, + {{XSD_DURATION, XSD_DURATION_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_duration}, + + {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_hexbin, to_xml_hexbin}, + {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_base64, to_xml_base64}, + + {{XSD_LONG, XSD_LONG_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_SHORT, XSD_SHORT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_BYTE, XSD_BYTE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_NONPOSITIVEINTEGER, XSD_NONPOSITIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_POSITIVEINTEGER, XSD_POSITIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_NONNEGATIVEINTEGER, XSD_NONNEGATIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_NEGATIVEINTEGER, XSD_NEGATIVEINTEGER_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDBYTE, XSD_UNSIGNEDBYTE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDSHORT, XSD_UNSIGNEDSHORT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDINT, XSD_UNSIGNEDINT_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_UNSIGNEDLONG, XSD_UNSIGNEDLONG_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_INTEGER, XSD_INTEGER_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + + {{XSD_ANYTYPE, XSD_ANYTYPE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, + {{XSD_UR_TYPE, XSD_UR_TYPE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, + {{XSD_ANYURI, XSD_ANYURI_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_QNAME, XSD_QNAME_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_NOTATION, XSD_NOTATION_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_NORMALIZEDSTRING, XSD_NORMALIZEDSTRING_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringr, to_xml_string}, + {{XSD_TOKEN, XSD_TOKEN_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_LANGUAGE, XSD_LANGUAGE_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_NMTOKEN, XSD_NMTOKEN_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_NMTOKENS, XSD_NMTOKENS_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_list1}, + {{XSD_NAME, XSD_NAME_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_NCNAME, XSD_NCNAME_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_ID, XSD_ID_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_IDREF, XSD_IDREF_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_list1}, + {{XSD_ENTITY, XSD_ENTITY_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_list1}, + + {{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL, NULL, NULL}, to_zval_map, to_xml_map}, + + {{SOAP_ENC_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_object, to_xml_object}, + {{SOAP_ENC_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_1_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_array, to_xml_array}, + {{SOAP_ENC_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_object, to_xml_object}, + {{SOAP_ENC_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_1_2_ENC_NAMESPACE, NULL, NULL, NULL}, to_zval_array, to_xml_array}, /* support some of the 1999 data types */ - {{XSD_STRING, XSD_STRING_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_string, to_xml_string}, - {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_bool, to_xml_bool}, - {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_double, to_xml_double}, - {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_double, to_xml_double}, + {{XSD_STRING, XSD_STRING_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_string, to_xml_string}, + {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_bool, to_xml_bool}, + {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_double, to_xml_double}, + {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_double, to_xml_double}, - {{XSD_LONG, XSD_LONG_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_INT, XSD_INT_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_SHORT, XSD_SHORT_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_BYTE, XSD_BYTE_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_long, to_xml_long}, - {{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING, XSD_1999_NAMESPACE, NULL, NULL}, to_zval_stringc, to_xml_string}, + {{XSD_LONG, XSD_LONG_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_INT, XSD_INT_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_SHORT, XSD_SHORT_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_BYTE, XSD_BYTE_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_long, to_xml_long}, + {{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING, XSD_1999_NAMESPACE, NULL, NULL, NULL}, to_zval_stringc, to_xml_string}, - {{XSD_ANYXML, "", "", NULL, NULL}, to_zval_any, to_xml_any}, + {{XSD_ANYXML, "", "", NULL, NULL, NULL}, to_zval_any, to_xml_any}, - {{END_KNOWN_TYPES, NULL, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert} + {{END_KNOWN_TYPES, NULL, NULL, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert} }; int numDefaultEncodings = sizeof(defaultEncoding)/sizeof(encode); @@ -272,13 +272,10 @@ static encodePtr find_encoder_by_type_name(sdlPtr sdl, const char *type) ZEND_HASH_FOREACH_PTR(sdl->encoders, enc) { - if (type[0] == '{') { - size_t ns_len = strlen(enc->details.ns); - if (strncmp(enc->details.ns, type + 1, ns_len) == 0 - && type[ns_len + 1] == '}' - && strcmp(enc->details.type_str, type + ns_len + 2) == 0) { - return enc; - } + if (type[0] == '{' + && enc->details.clark_notation + && strcmp(ZSTR_VAL(enc->details.clark_notation), type) == 0) { + return enc; } else { if (strcmp(enc->details.type_str, type) == 0) { return enc; @@ -1394,9 +1391,7 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z classname = zend_hash_str_find_deref(SOAP_GLOBAL(class_map), type->type_str, strlen(type->type_str)); if(classname == NULL){ if (type->ns) { - zend_string *nscat =zend_strpprintf(0, "{%s}%s", type->ns, type->type_str); - classname = zend_hash_find_deref(SOAP_GLOBAL(class_map),nscat); - zend_string_release_ex(nscat, 0); + classname = zend_hash_find_deref(SOAP_GLOBAL(class_map),type->clark_notation); } } if (classname != NULL && @@ -3629,6 +3624,9 @@ void delete_encoder(zval *zv) if (t->details.map) { delete_mapping(t->details.map); } + if (t->details.clark_notation) { + zend_string_release_ex(t->details.clark_notation, 0); + } efree(t); } @@ -3641,6 +3639,9 @@ void delete_encoder_persistent(zval *zv) if (t->details.type_str) { free(t->details.type_str); } + if (t->details.clark_notation) { + zend_string_release_ex(t->details.clark_notation, 0); + } /* we should never have mapping in persistent encoder */ assert(t->details.map == NULL); free(t); diff --git a/ext/soap/php_encoding.h b/ext/soap/php_encoding.h index a4e16666e680f..aa9fa8769a46f 100644 --- a/ext/soap/php_encoding.h +++ b/ext/soap/php_encoding.h @@ -181,6 +181,7 @@ struct _encodeType { int type; char *type_str; char *ns; + zend_string *clark_notation; sdlTypePtr sdl_type; soapMappingPtr map; }; diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c index e93679a55ea39..34db409244dfa 100644 --- a/ext/soap/php_schema.c +++ b/ext/soap/php_schema.c @@ -64,6 +64,9 @@ static encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const xmlChar * if (enc->details.type_str) { efree(enc->details.type_str); } + if (enc->details.clark_notation) { + zend_string_release_ex(enc->details.clark_notation, 0); + } } else { enc_ptr = NULL; enc = emalloc(sizeof(encode)); @@ -73,6 +76,10 @@ static encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const xmlChar * enc->details.ns = estrdup((char*)ns); enc->details.type_str = estrdup((char*)type); enc->details.sdl_type = cur_type; + enc->details.clark_notation = NULL; + if (enc->details.ns != NULL){ + enc->details.clark_notation = zend_strpprintf(0, "{%s}%s", enc->details.ns, enc->details.type_str ); + } enc->to_xml = sdl_guess_convert_xml; enc->to_zval = sdl_guess_convert_zval; @@ -335,6 +342,9 @@ static int schema_simpleType(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr simpleType, memset(cur_type->encode, 0, sizeof(encode)); cur_type->encode->details.ns = estrdup(newType->namens); cur_type->encode->details.type_str = estrdup(newType->name); + if (cur_type->encode->details.ns){ + cur_type->encode->details.clark_notation = zend_strpprintf(0, "{%s}%s", cur_type->encode->details.ns, cur_type->encode->details.type_str ); + } cur_type->encode->details.sdl_type = ptr; cur_type->encode->to_xml = sdl_guess_convert_xml; cur_type->encode->to_zval = sdl_guess_convert_zval; @@ -1390,6 +1400,9 @@ static int schema_complexType(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr compType, s memset(cur_type->encode, 0, sizeof(encode)); cur_type->encode->details.ns = estrdup(newType->namens); cur_type->encode->details.type_str = estrdup(newType->name); + if (cur_type->encode->details.ns){ + cur_type->encode->details.clark_notation = zend_strpprintf(0, "{%s}%s", cur_type->encode->details.ns, cur_type->encode->details.type_str ); + } cur_type->encode->details.sdl_type = ptr; cur_type->encode->to_xml = sdl_guess_convert_xml; cur_type->encode->to_zval = sdl_guess_convert_zval; diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 3dd8e6c5d76e4..9a4e461a505e5 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -148,9 +148,11 @@ encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type) if (sdl->is_persistent) { new_enc->details.ns = zend_strndup(ns, ns_len); new_enc->details.type_str = strdup(new_enc->details.type_str); + new_enc->details.clark_notation = zend_string_dup(new_enc->details.clark_notation, 1); } else { new_enc->details.ns = estrndup(ns, ns_len); new_enc->details.type_str = estrdup(new_enc->details.type_str); + new_enc->details.clark_notation = zend_string_dup(new_enc->details.clark_notation, 0); } if (sdl->encoders == NULL) { sdl->encoders = pemalloc(sizeof(HashTable), sdl->is_persistent); @@ -2833,6 +2835,7 @@ static encodePtr make_persistent_sdl_encoder(encodePtr enc, HashTable *ptr_map, } if (penc->details.ns) { penc->details.ns = strdup(penc->details.ns); + penc->details.clark_notation = zend_string_dup(penc->details.clark_notation, 1); } if (penc->details.sdl_type) { From e1ee150daccc6e2e8ffb3a6a3d4d47b51ed703e7 Mon Sep 17 00:00:00 2001 From: Viktor Vassilyev Date: Thu, 19 Oct 2023 15:21:16 +0600 Subject: [PATCH 3/6] ext/soap: fix cache --- ext/soap/php_sdl.c | 10 +++++ ext/soap/tests/classmap007.phpt | 66 +++++++++++++++++++++++++++++++ ext/soap/tests/classmap007.wsdl | 70 +++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 ext/soap/tests/classmap007.phpt create mode 100644 ext/soap/tests/classmap007.wsdl diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 9a4e461a505e5..a511b11e2da78 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -1420,6 +1420,11 @@ static void sdl_deserialize_encoder(encodePtr enc, sdlTypePtr *types, char **in) WSDL_CACHE_GET_INT(enc->details.type, in); enc->details.type_str = sdl_deserialize_string(in); enc->details.ns = sdl_deserialize_string(in); + char *clark_notation = sdl_deserialize_string(in); + if(strcmp(clark_notation,"") != 0){ + enc->details.clark_notation = zend_string_init(clark_notation,strlen(clark_notation),0); + } + efree(clark_notation); WSDL_CACHE_GET_INT(i, in); enc->details.sdl_type = types[i]; enc->to_xml = sdl_guess_convert_xml; @@ -2025,6 +2030,11 @@ static void sdl_serialize_encoder(encodePtr enc, HashTable *tmp_types, smart_str WSDL_CACHE_PUT_INT(enc->details.type, out); sdl_serialize_string(enc->details.type_str, out); sdl_serialize_string(enc->details.ns, out); + if(enc->details.clark_notation){ + sdl_serialize_string(ZSTR_VAL(enc->details.clark_notation), out); + }else{ + sdl_serialize_string("", out); + } sdl_serialize_type_ref(enc->details.sdl_type, tmp_types, out); } diff --git a/ext/soap/tests/classmap007.phpt b/ext/soap/tests/classmap007.phpt new file mode 100644 index 0000000000000..20a6231579be9 --- /dev/null +++ b/ext/soap/tests/classmap007.phpt @@ -0,0 +1,66 @@ +--TEST-- +SOAP Classmap 7: encoding of inherited objects with namespace and cache wsdl +--EXTENSIONS-- +soap +--FILE-- +x = $a; + } +} +class Attest { + public $x; + function __construct($a){ + $this->x = $a; + } +} +class B extends A { + public $y; + function __construct($a){ + parent::__construct($a); + $this->y = $a + 1; + } +} + +function f($input){ + return new B(5); +} + +class LocalSoapClient extends SoapClient { + private $server; + + function __construct($wsdl, $options) { + parent::__construct($wsdl, $options); + $this->server = new SoapServer($wsdl, $options); + $this->server->addFunction("f"); + } + + function __doRequest($request, $location, $action, $version, $one_way = 0): ?string { + ob_start(); + $this->server->handle($request); + $response = ob_get_contents(); + ob_end_clean(); + return $response; + } +} + +$client = new LocalSoapClient(__DIR__."/classmap007.wsdl", + array('classmap'=>array('A'=>'A','{urn:abt}At'=>'Attest','B'=>'B'))); +print_r($client->f(new Attest('test'))); +print_r($client->f(new Attest('test'))); +?> +--EXPECT-- +B Object +( + [x] => 5 + [y] => 6 +) +B Object +( + [x] => 5 + [y] => 6 +) diff --git a/ext/soap/tests/classmap007.wsdl b/ext/soap/tests/classmap007.wsdl new file mode 100644 index 0000000000000..f9637bb60be08 --- /dev/null +++ b/ext/soap/tests/classmap007.wsdl @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4a36c75d1892fc46ee60579a103dd4c11372af2f Mon Sep 17 00:00:00 2001 From: Viktor Vassilyev Date: Fri, 20 Oct 2023 09:39:51 +0600 Subject: [PATCH 4/6] ext/soap: change by comments, init clark notation in defaultEncoding --- ext/soap/php_encoding.c | 6 +++--- ext/soap/php_encoding.h | 2 +- ext/soap/php_schema.c | 1 - ext/soap/php_sdl.c | 19 ++++++++----------- ext/soap/soap.c | 3 ++- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 63d1966536be2..7a1388df792ff 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -137,7 +137,7 @@ static void set_ns_and_type(xmlNodePtr node, encodeTypePtr type); } \ } -const encode defaultEncoding[] = { +encode defaultEncoding[] = { {{UNKNOWN_TYPE, NULL, NULL, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, {{IS_NULL, "nil", XSI_NAMESPACE, NULL, NULL,NULL}, to_zval_null, to_xml_null}, @@ -1390,7 +1390,7 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z zend_class_entry *tmp; classname = zend_hash_str_find_deref(SOAP_GLOBAL(class_map), type->type_str, strlen(type->type_str)); if(classname == NULL){ - if (type->ns) { + if (type->clark_notation != NULL) { classname = zend_hash_find_deref(SOAP_GLOBAL(class_map),type->clark_notation); } } @@ -3640,7 +3640,7 @@ void delete_encoder_persistent(zval *zv) free(t->details.type_str); } if (t->details.clark_notation) { - zend_string_release_ex(t->details.clark_notation, 0); + zend_string_release_ex(t->details.clark_notation, 1); } /* we should never have mapping in persistent encoder */ assert(t->details.map == NULL); diff --git a/ext/soap/php_encoding.h b/ext/soap/php_encoding.h index aa9fa8769a46f..21dd66c48087f 100644 --- a/ext/soap/php_encoding.h +++ b/ext/soap/php_encoding.h @@ -215,7 +215,7 @@ encodePtr get_conversion(int encode); void delete_encoder(zval *zv); void delete_encoder_persistent(zval *zv); -extern const encode defaultEncoding[]; +extern encode defaultEncoding[]; extern int numDefaultEncodings; #endif diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c index 34db409244dfa..834de77cfdaee 100644 --- a/ext/soap/php_schema.c +++ b/ext/soap/php_schema.c @@ -76,7 +76,6 @@ static encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const xmlChar * enc->details.ns = estrdup((char*)ns); enc->details.type_str = estrdup((char*)type); enc->details.sdl_type = cur_type; - enc->details.clark_notation = NULL; if (enc->details.ns != NULL){ enc->details.clark_notation = zend_strpprintf(0, "{%s}%s", enc->details.ns, enc->details.type_str ); } diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index a511b11e2da78..9bb35913f8646 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -148,11 +148,15 @@ encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type) if (sdl->is_persistent) { new_enc->details.ns = zend_strndup(ns, ns_len); new_enc->details.type_str = strdup(new_enc->details.type_str); - new_enc->details.clark_notation = zend_string_dup(new_enc->details.clark_notation, 1); + if(new_enc->details.clark_notation){ + new_enc->details.clark_notation = zend_string_dup(new_enc->details.clark_notation, 1); + } } else { new_enc->details.ns = estrndup(ns, ns_len); new_enc->details.type_str = estrdup(new_enc->details.type_str); - new_enc->details.clark_notation = zend_string_dup(new_enc->details.clark_notation, 0); + if(new_enc->details.clark_notation){ + new_enc->details.clark_notation = zend_string_copy(new_enc->details.clark_notation); + } } if (sdl->encoders == NULL) { sdl->encoders = pemalloc(sizeof(HashTable), sdl->is_persistent); @@ -1420,11 +1424,9 @@ static void sdl_deserialize_encoder(encodePtr enc, sdlTypePtr *types, char **in) WSDL_CACHE_GET_INT(enc->details.type, in); enc->details.type_str = sdl_deserialize_string(in); enc->details.ns = sdl_deserialize_string(in); - char *clark_notation = sdl_deserialize_string(in); - if(strcmp(clark_notation,"") != 0){ - enc->details.clark_notation = zend_string_init(clark_notation,strlen(clark_notation),0); + if(enc->details.ns){ + enc->details.clark_notation = zend_strpprintf(0, "{%s}%s", enc->details.ns, enc->details.type_str ); } - efree(clark_notation); WSDL_CACHE_GET_INT(i, in); enc->details.sdl_type = types[i]; enc->to_xml = sdl_guess_convert_xml; @@ -2030,11 +2032,6 @@ static void sdl_serialize_encoder(encodePtr enc, HashTable *tmp_types, smart_str WSDL_CACHE_PUT_INT(enc->details.type, out); sdl_serialize_string(enc->details.type_str, out); sdl_serialize_string(enc->details.ns, out); - if(enc->details.clark_notation){ - sdl_serialize_string(ZSTR_VAL(enc->details.clark_notation), out); - }else{ - sdl_serialize_string("", out); - } sdl_serialize_type_ref(enc->details.sdl_type, tmp_types, out); } diff --git a/ext/soap/soap.c b/ext/soap/soap.c index fbf6546beb824..1893a55ae8712 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -269,7 +269,7 @@ static HashTable defEnc, defEncIndex, defEncNs; static void php_soap_prepare_globals(void) { int i; - const encode* enc; + encode* enc; zend_hash_init(&defEnc, 0, NULL, NULL, 1); zend_hash_init(&defEncIndex, 0, NULL, NULL, 1); @@ -283,6 +283,7 @@ static void php_soap_prepare_globals(void) if (defaultEncoding[i].details.type_str) { if (defaultEncoding[i].details.ns != NULL) { char *ns_type; + enc->details.clark_notation = zend_strpprintf(0, "{%s}%s", enc->details.ns, enc->details.type_str ); spprintf(&ns_type, 0, "%s:%s", defaultEncoding[i].details.ns, defaultEncoding[i].details.type_str); zend_hash_str_add_ptr(&defEnc, ns_type, strlen(ns_type), (void*)enc); efree(ns_type); From 59073515688a0e48c1a5d020082fd75e6e0df303 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:49:52 +0200 Subject: [PATCH 5/6] Fix persistent allocation in MINIT --- ext/soap/soap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 1893a55ae8712..087278dbb0714 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -282,10 +282,12 @@ static void php_soap_prepare_globals(void) /* If has a ns and a str_type then index it */ if (defaultEncoding[i].details.type_str) { if (defaultEncoding[i].details.ns != NULL) { - char *ns_type; - enc->details.clark_notation = zend_strpprintf(0, "{%s}%s", enc->details.ns, enc->details.type_str ); - spprintf(&ns_type, 0, "%s:%s", defaultEncoding[i].details.ns, defaultEncoding[i].details.type_str); - zend_hash_str_add_ptr(&defEnc, ns_type, strlen(ns_type), (void*)enc); + char *ns_type, *clark_notation; + size_t clark_notation_len = spprintf(&clark_notation, 0, "{%s}%s", enc->details.ns, enc->details.type_str); + enc->details.clark_notation = zend_string_init(clark_notation, clark_notation_len, true); + size_t ns_type_len = spprintf(&ns_type, 0, "%s:%s", enc->details.ns, enc->details.type_str); + zend_hash_str_add_ptr(&defEnc, ns_type, ns_type_len, (void*)enc); + efree(clark_notation); efree(ns_type); } else { zend_hash_str_add_ptr(&defEnc, defaultEncoding[i].details.type_str, strlen(defaultEncoding[i].details.type_str), (void*)enc); From 5b330bd908674e78204f80f8737388360279a254 Mon Sep 17 00:00:00 2001 From: Viktor Vassilyev Date: Mon, 23 Oct 2023 09:25:35 +0600 Subject: [PATCH 6/6] ext/soap: clear clark_notation in PHP_MSHUTDOWN_FUNCTION --- ext/soap/soap.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 087278dbb0714..1bf972b4214e7 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -327,6 +327,14 @@ static void php_soap_init_globals(zend_soap_globals *soap_globals) PHP_MSHUTDOWN_FUNCTION(soap) { + int i; + i = 0; + do { + if(defaultEncoding[i].details.clark_notation){ + zend_string_release_ex(defaultEncoding[i].details.clark_notation, 1); + } + i++; + } while (defaultEncoding[i].details.type != END_KNOWN_TYPES); zend_error_cb = old_error_handler; zend_hash_destroy(&SOAP_GLOBAL(defEnc)); zend_hash_destroy(&SOAP_GLOBAL(defEncIndex));