From 2709d4f18be71d82d632a61fc6bc47a9296d91a7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 15 May 2014 22:51:46 +0400 Subject: [PATCH 1/9] Buffer has to be reallocated on each loop iteration --- ext/soap/soap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 570b1ad6402..72c1e34a027 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2981,7 +2981,8 @@ PHP_METHOD(SoapClient, __getTypes) if (sdl->types) { ZEND_HASH_FOREACH_PTR(sdl->types, type) { type_to_string(type, &buf, 0); - add_next_index_str(return_value, buf.s); + add_next_index_stringl(return_value, buf.s->val, buf.s->len); + smart_str_free(&buf); } ZEND_HASH_FOREACH_END(); } } From ce8518e6528b5b0c01b369735253d2839be04ce3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 15 May 2014 22:53:01 +0400 Subject: [PATCH 2/9] Support for IS_INDIRECT --- ext/soap/php_encoding.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 29ca2ab41db..261912b75b9 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1992,6 +1992,13 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo key_type = zend_hash_get_current_key_ex(prop, &str_key, &index, FALSE, &prop->nInternalPointer); zprop = zend_hash_get_current_data(prop); + if (Z_TYPE_P(zprop) == IS_INDIRECT) { + zprop = Z_INDIRECT_P(zprop); + if (Z_TYPE_P(zprop) == IS_UNDEF) { + zend_hash_move_forward(prop); + continue; + } + } property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC); From f0da988282b2c87facd264eaceed0a436b1694f7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 15 May 2014 22:58:58 +0400 Subject: [PATCH 3/9] Buffer has to be reallocated on each loop iteration --- ext/soap/soap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 72c1e34a027..0545bddf10e 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2954,7 +2954,8 @@ PHP_METHOD(SoapClient, __getFunctions) array_init(return_value); ZEND_HASH_FOREACH_PTR(&sdl->functions, function) { function_to_string(function, &buf); - add_next_index_str(return_value, buf.s); + add_next_index_stringl(return_value, buf.s->val, buf.s->len); + smart_str_free(&buf); } ZEND_HASH_FOREACH_END(); } } From f31aa8434f987ecee622364836ef919e9215873d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 15 May 2014 23:16:21 +0400 Subject: [PATCH 4/9] Fixed support for empty strings --- ext/soap/php_packet_soap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c index 218dadbfc85..348fbc007d7 100644 --- a/ext/soap/php_packet_soap.c +++ b/ext/soap/php_packet_soap.c @@ -234,7 +234,7 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction master_to_zval(&details, NULL, tmp TSRMLS_CC); } } - add_soap_fault(this_ptr, faultcode, faultstring->val, faultactor->val, &details TSRMLS_CC); + add_soap_fault(this_ptr, faultcode, faultstring ? faultstring->val : NULL, faultactor ? faultactor->val : NULL, &details TSRMLS_CC); if (faultstring) { STR_RELEASE(faultstring); } From 7cb20d597f5f27e4770cb21d680010f32ddf1045 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 15 May 2014 23:54:36 +0400 Subject: [PATCH 5/9] Fixed support for SOAP_PERSISTENCE_SESSION --- ext/soap/soap.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 0545bddf10e..36c6ec5c50b 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1657,6 +1657,7 @@ PHP_METHOD(SoapServer, handle) /* If persistent then set soap_obj from from the previous created session (if available) */ if (service->soap_class.persistance == SOAP_PERSISTENCE_SESSION) { zval *tmp_soap; + zval *session_vars; if (PS(session_status) != php_session_active && PS(session_status) != php_session_disabled) { @@ -1664,7 +1665,10 @@ PHP_METHOD(SoapServer, handle) } /* Find the soap object and assign */ - if ((tmp_soap = zend_hash_str_find(Z_ARRVAL(PS(http_session_vars)), "_bogus_session_name", sizeof("_bogus_session_name")-1)) != NULL && + session_vars = &PS(http_session_vars); + ZVAL_DEREF(session_vars); + if (Z_TYPE_P(session_vars) == IS_ARRAY && + (tmp_soap = zend_hash_str_find(Z_ARRVAL_P(session_vars), "_bogus_session_name", sizeof("_bogus_session_name")-1)) != NULL && Z_TYPE_P(tmp_soap) == IS_OBJECT && Z_OBJCE_P(tmp_soap) == service->soap_class.ce) { soap_obj = tmp_soap; @@ -1737,8 +1741,14 @@ PHP_METHOD(SoapServer, handle) /* If session then update session hash with new object */ if (service->soap_class.persistance == SOAP_PERSISTENCE_SESSION) { zval *tmp_soap_pp; - if ((tmp_soap_pp = zend_hash_str_update(Z_ARRVAL(PS(http_session_vars)), "_bogus_session_name", sizeof("_bogus_session_name")-1, &tmp_soap)) != NULL) { + zval *session_vars = &PS(http_session_vars); + + ZVAL_DEREF(session_vars); + if (Z_TYPE_P(session_vars) == IS_ARRAY && + (tmp_soap_pp = zend_hash_str_update(Z_ARRVAL_P(session_vars), "_bogus_session_name", sizeof("_bogus_session_name")-1, &tmp_soap)) != NULL) { soap_obj = tmp_soap_pp; + } else { + soap_obj = &tmp_soap; } } else { soap_obj = &tmp_soap; From 9b8b55bc16aaddb7b7fcaefcffd72e788e2536bf Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 16 May 2014 01:29:40 +0400 Subject: [PATCH 6/9] Fixed handling of compressed SOAP requests --- ext/soap/soap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 36c6ec5c50b..1f7dbdeeac3 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1572,7 +1572,7 @@ PHP_METHOD(SoapServer, handle) zval filter_params; array_init_size(&filter_params, 1); - add_assoc_long_ex(&filter_params, ZEND_STRS("window"), 0x2f); /* ANY WBITS */ + add_assoc_long_ex(&filter_params, "window", sizeof("window")-1, 0x2f); /* ANY WBITS */ zf = php_stream_filter_create("zlib.inflate", &filter_params, 0 TSRMLS_CC); zval_dtor(&filter_params); From 5a9de70ba7d7f03a4775ab448bade579f1310c74 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 16 May 2014 01:49:04 +0400 Subject: [PATCH 7/9] Partial fix for XML references handling --- ext/soap/php_encoding.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 261912b75b9..2aa004c8618 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -355,7 +355,7 @@ static zval* soap_find_xml_ref(xmlNodePtr node TSRMLS_DC) zval *data_ptr; if (SOAP_GLOBAL(ref_map) && - (data_ptr = zend_hash_index_find(SOAP_GLOBAL(ref_map), (ulong)node)) != NULL) { + (data_ptr = zend_hash_index_find_ptr(SOAP_GLOBAL(ref_map), (ulong)node)) != NULL) { //??? Z_SET_ISREF_PP(data_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(data_ptr); Z_ADDREF_P(data_ptr); @@ -369,7 +369,7 @@ static zend_bool soap_check_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) zval *data_ptr; if (SOAP_GLOBAL(ref_map)) { - if ((data_ptr = zend_hash_index_find(SOAP_GLOBAL(ref_map), (ulong)node)) != NULL) { + if ((data_ptr = zend_hash_index_find_ptr(SOAP_GLOBAL(ref_map), (ulong)node)) != NULL) { if (data != data_ptr) { zval_ptr_dtor(data); ZVAL_COPY_VALUE(data, data_ptr); @@ -379,7 +379,7 @@ static zend_bool soap_check_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) return 1; } } else { - zend_hash_index_update(SOAP_GLOBAL(ref_map), (ulong)node, data); + zend_hash_index_update_ptr(SOAP_GLOBAL(ref_map), (ulong)node, data); } } return 0; @@ -1484,8 +1484,11 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST && sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) { + zval *ref; + CHECK_XML_NULL(data); - if ((ret = soap_find_xml_ref(data TSRMLS_CC)) != NULL) { + if ((ref = soap_find_xml_ref(data TSRMLS_CC)) != NULL) { + ZVAL_COPY_VALUE(ret, ref); return ret; } From 51c55a1ed3f14e0f59764ebd4abe7e8a8a7d7126 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 16 May 2014 02:04:50 +0400 Subject: [PATCH 8/9] fixed reference counting and memory leak --- ext/soap/php_encoding.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 2aa004c8618..8ea419dc1bb 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1199,14 +1199,14 @@ static void set_zval_property(zval* object, char* name, zval* val TSRMLS_DC) static zval* get_zval_property(zval* object, char* name, zval *rv TSRMLS_DC) { if (Z_TYPE_P(object) == IS_OBJECT) { - zval member, rv; + zval member; zval *data; zend_class_entry *old_scope; ZVAL_STRING(&member, name); old_scope = EG(scope); EG(scope) = Z_OBJCE_P(object); - data = Z_OBJ_HT_P(object)->read_property(object, &member, BP_VAR_IS, -1, &rv TSRMLS_CC); + data = Z_OBJ_HT_P(object)->read_property(object, &member, BP_VAR_IS, -1, rv TSRMLS_CC); if (data == &EG(uninitialized_zval)) { /* Hack for bug #32455 */ zend_property_info *property_info; @@ -1239,13 +1239,12 @@ static void unset_zval_property(zval* object, char* name TSRMLS_DC) zval member; zend_class_entry *old_scope; -//??? INIT_PZVAL(&member); -//??? ZVAL_STRING(&member, name, 0); ZVAL_STRING(&member, name); old_scope = EG(scope); EG(scope) = Z_OBJCE_P(object); Z_OBJ_HT_P(object)->unset_property(object, &member, 0 TSRMLS_CC); EG(scope) = old_scope; + zval_ptr_dtor(&member); } else if (Z_TYPE_P(object) == IS_ARRAY) { zend_hash_str_del(Z_ARRVAL_P(object), name, strlen(name)); } @@ -1535,7 +1534,7 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z } if (sdlType->model) { if (redo_any) { - Z_ADDREF_P(redo_any); + if (Z_REFCOUNTED_P(redo_any)) Z_ADDREF_P(redo_any); unset_zval_property(ret, "any" TSRMLS_CC); } model_to_zval_object(ret, sdlType->model, data, sdl TSRMLS_CC); @@ -1544,9 +1543,6 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z if (tmp == NULL) { model_to_zval_any(ret, data->children TSRMLS_CC); - } else if (Z_REFCOUNT_P(tmp) == 0) { - zval_dtor(tmp); - efree(tmp); } zval_ptr_dtor(redo_any); } From b1f88c9a13f363499fc05a03394aad9f2866ae32 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 16 May 2014 02:36:52 +0400 Subject: [PATCH 9/9] Fixed WSDL attibute parsing --- ext/soap/php_schema.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c index 4895bf78764..5ba3bd3de55 100644 --- a/ext/soap/php_schema.c +++ b/ext/soap/php_schema.c @@ -2165,7 +2165,7 @@ static void schema_attributegroup_fixup(sdlCtx *ctx, sdlAttributePtr attr, HashT } zend_hash_get_current_key_ex(tmp->attributes, &_key, NULL, 0, &tmp->attributes->nInternalPointer); - zend_hash_add_ptr(ht, _key, &newAttr); + zend_hash_add_ptr(ht, _key, newAttr); zend_hash_move_forward(tmp->attributes); } else { @@ -2273,7 +2273,6 @@ static void schema_type_fixup(sdlCtx *ctx, sdlTypePtr type) ZEND_HASH_FOREACH_KEY_PTR(type->attributes, index, str_key, attr) { if (str_key) { schema_attribute_fixup(ctx, attr); - zend_hash_move_forward(type->attributes); } else { schema_attributegroup_fixup(ctx, attr, type->attributes); zend_hash_index_del(type->attributes, index);