dmitry Tue Dec 7 12:29:24 2004 EDT Added files: (Branch: PHP_5_0) /php-src/ext/soap/tests/bugs bug30928.phpt bug30928.wsdl
Modified files: /php-src NEWS /php-src/ext/soap php_encoding.c Log: Fixed bug #30928 (When Using WSDL, SoapServer doesn't handle private or protected properties)
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1760.2.147&r2=1.1760.2.148&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1760.2.147 php-src/NEWS:1.1760.2.148 --- php-src/NEWS:1.1760.2.147 Tue Dec 7 03:44:07 2004 +++ php-src/NEWS Tue Dec 7 12:29:23 2004 @@ -10,6 +10,8 @@ - Fixed bug #30995 (snmp extension does not build with net-snmp 5.2). (Ilia) - Fixed bug #30990 (allow popen() on *NIX to accept 'b' flag). (Ilia) - Fixed bug #30967 (properties in extended mysqli classes don't work). (Georg) +- Fixed bug #30928 (When Using WSDL, SoapServer doesn't handle private or + protected properties). (Dmitry) - Fixed bug #30922 (reflective functions crash PHP when interfaces extend themselves). (Tony, Dmitry) - Fixed bug #30904 (segfault when recording soapclient into session). (Tony, http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.71.2.11&r2=1.71.2.12&ty=u Index: php-src/ext/soap/php_encoding.c diff -u php-src/ext/soap/php_encoding.c:1.71.2.11 php-src/ext/soap/php_encoding.c:1.71.2.12 --- php-src/ext/soap/php_encoding.c:1.71.2.11 Tue Nov 16 08:51:32 2004 +++ php-src/ext/soap/php_encoding.c Tue Dec 7 12:29:24 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c,v 1.71.2.11 2004/11/16 13:51:32 dmitry Exp $ */ +/* $Id: php_encoding.c,v 1.71.2.12 2004/12/07 17:29:24 dmitry Exp $ */ #include <time.h> @@ -864,6 +864,45 @@ return ret; } +static void set_zval_property(zval* object, char* name, zval* val TSRMLS_DC) +{ + zend_class_entry *old_scope; + + old_scope = EG(scope); + EG(scope) = Z_OBJCE_P(object); +#ifdef ZEND_ENGINE_2 + val->refcount--; +#endif + add_property_zval(object, name, val); + EG(scope) = old_scope; +} + +static zval* get_zval_property(zval* object, char* name TSRMLS_DC) +{ + if (Z_TYPE_P(object) == IS_OBJECT) { + zval member; + zval *data; + zend_class_entry *old_scope; + + ZVAL_STRING(&member, name, 0); + old_scope = EG(scope); + EG(scope) = Z_OBJCE_P(object); + data = Z_OBJ_HT_P(object)->read_property(object, &member, BP_VAR_IS TSRMLS_CC); + EG(scope) = old_scope; + if (data == EG(uninitialized_zval_ptr)) { + return NULL; + } + return data; + } else if (Z_TYPE_P(object) == IS_ARRAY) { + zval **data_ptr; + + if (zend_hash_find(Z_ARRVAL_P(object), name, strlen(name)+1, (void**)&data_ptr) == SUCCESS) { + return *data_ptr; + } + } + return NULL; +} + static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr data, sdlPtr sdl TSRMLS_DC) { switch (model->kind) { @@ -920,10 +959,7 @@ } while ((node = get_node(node->next, model->u.element->name)) != NULL); val = array; } -#ifdef ZEND_ENGINE_2 - val->refcount--; -#endif - add_property_zval(ret, model->u.element->name, val); + set_zval_property(ret, model->u.element->name, val TSRMLS_CC); } } break; @@ -965,7 +1001,7 @@ if (zend_hash_find(SOAP_GLOBAL(class_map), type->type_str, strlen(type->type_str)+1, (void**)&classname) == SUCCESS && Z_TYPE_PP(classname) == IS_STRING && (tmp = zend_fetch_class(Z_STRVAL_PP(classname), Z_STRLEN_PP(classname), ZEND_FETCH_CLASS_AUTO TSRMLS_CC)) != NULL) { - ce = tmp; + ce = tmp; } } sdl = SOAP_GLOBAL(sdl); @@ -988,10 +1024,7 @@ object_init_ex(ret, ce); base = master_to_zval_int(enc, data); -#ifdef ZEND_ENGINE_2 - base->refcount--; -#endif - add_property_zval(ret, "_", base); + set_zval_property(ret, "_", base TSRMLS_CC); } else { MAKE_STD_ZVAL(ret); FIND_XML_NULL(data, ret); @@ -1013,10 +1046,7 @@ object_init_ex(ret, ce); base = master_to_zval_int(sdlType->encode, data); -#ifdef ZEND_ENGINE_2 - base->refcount--; -#endif - add_property_zval(ret, "_", base); + set_zval_property(ret, "_", base TSRMLS_CC); } } else { MAKE_STD_ZVAL(ret); @@ -1054,10 +1084,7 @@ xmlNodeSetContent(dummy, str_val); data = master_to_zval((*attr)->encode, dummy); xmlFreeNode(dummy); -#ifdef ZEND_ENGINE_2 - data->refcount--; -#endif - add_property_zval(ret, (*attr)->name, data); + set_zval_property(ret, (*attr)->name, data TSRMLS_CC); } } zend_hash_move_forward_ex(sdlType->attributes, &pos); @@ -1074,30 +1101,28 @@ while (trav != NULL) { if (trav->type == XML_ELEMENT_NODE) { zval *tmpVal; - zval **prop; - int key_len; + zval *prop; tmpVal = master_to_zval(NULL, trav); - key_len = strlen(trav->name) + 1; - if (zend_hash_find(Z_OBJPROP_P(ret), (char*)trav->name, key_len, (void **) &prop) == FAILURE) { -#ifdef ZEND_ENGINE_2 - tmpVal->refcount--; -#endif - add_property_zval_ex(ret, (char*)trav->name, key_len, tmpVal TSRMLS_CC); + prop = get_zval_property(ret, (char*)trav->name TSRMLS_CC); + if (!prop) { + set_zval_property(ret, (char*)trav->name, tmpVal TSRMLS_CC); } else { /* Property already exist - make array */ - if (Z_TYPE_PP(prop) != IS_ARRAY) { + if (Z_TYPE_P(prop) != IS_ARRAY) { /* Convert into array */ zval *arr; MAKE_STD_ZVAL(arr); array_init(arr); - add_next_index_zval(arr, *prop); - *prop = arr; + prop->refcount++; + add_next_index_zval(arr, prop); + set_zval_property(ret, (char*)trav->name, arr TSRMLS_CC); + prop = arr; } /* Add array element */ - add_next_index_zval(*prop, tmpVal); + add_next_index_zval(prop, tmpVal); } } trav = trav->next; @@ -1106,18 +1131,19 @@ return ret; } -static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, HashTable *prop, int style, int strict) +static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *object, int style, int strict TSRMLS_DC) { switch (model->kind) { case XSD_CONTENT_ELEMENT: { - zval **data; + zval *data; xmlNodePtr property; encodePtr enc; - if (zend_hash_find(prop, model->u.element->name, strlen(model->u.element->name)+1, (void**)&data) == SUCCESS) { + data = get_zval_property(object, model->u.element->name TSRMLS_CC); + if (data) { enc = model->u.element->encode; - if ((model->max_occurs == -1 || model->max_occurs > 1) && Z_TYPE_PP(data) == IS_ARRAY) { - HashTable *ht = Z_ARRVAL_PP(data); + if ((model->max_occurs == -1 || model->max_occurs > 1) && Z_TYPE_P(data) == IS_ARRAY) { + HashTable *ht = Z_ARRVAL_P(data); zval **val; zend_hash_internal_pointer_reset(ht); @@ -1146,7 +1172,7 @@ zend_hash_move_forward(ht); } } else { - if (Z_TYPE_PP(data) == IS_NULL && model->u.element->nillable) { + if (Z_TYPE_P(data) == IS_NULL && model->u.element->nillable) { property = xmlNewNode(NULL,"BOGUS"); xmlAddChild(node, property); if (style == SOAP_ENCODED) { @@ -1156,7 +1182,7 @@ xmlSetNsProp(property, xsi, "nil", "1"); } } else { - property = master_to_xml(enc, *data, style, node); + property = master_to_xml(enc, data, style, node); if (property->children && property->children->content && model->u.element->fixed && strcmp(model->u.element->fixed,property->children->content) != 0) { soap_error3(E_ERROR, "Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)", model->u.element->name, model->u.element->fixed, property->children->content); @@ -1186,7 +1212,7 @@ zend_hash_internal_pointer_reset_ex(model->u.content, &pos); while (zend_hash_get_current_data_ex(model->u.content, (void**)&tmp, &pos) == SUCCESS) { - if (!model_to_xml_object(node, *tmp, prop, style, model->min_occurs > 0)) { + if (!model_to_xml_object(node, *tmp, object, style, model->min_occurs > 0 TSRMLS_CC)) { return 0; } zend_hash_move_forward_ex(model->u.content, &pos); @@ -1200,7 +1226,7 @@ zend_hash_internal_pointer_reset_ex(model->u.content, &pos); while (zend_hash_get_current_data_ex(model->u.content, (void**)&tmp, &pos) == SUCCESS) { - int tmp_ret = model_to_xml_object(node, *tmp, prop, style, 0); + int tmp_ret = model_to_xml_object(node, *tmp, object, style, 0 TSRMLS_CC); if (tmp_ret == 1) { return 1; } else if (tmp_ret != 0) { @@ -1211,7 +1237,7 @@ return ret; } case XSD_CONTENT_GROUP: { - return model_to_xml_object(node, model->u.group->model, prop, style, model->min_occurs > 0); + return model_to_xml_object(node, model->u.group->model, object, style, model->min_occurs > 0 TSRMLS_CC); } default: break; @@ -1287,9 +1313,9 @@ enc = enc->details.sdl_type->encode; } if (enc) { - zval **tmp; - if (prop && zend_hash_find(prop, "_", sizeof("_"), (void**)&tmp) == SUCCESS) { - xmlParam = master_to_xml(enc, *tmp, style, parent); + zval *tmp = get_zval_property(data, "_" TSRMLS_CC); + if (tmp) { + xmlParam = master_to_xml(enc, tmp, style, parent); } else if (prop == NULL) { xmlParam = master_to_xml(enc, data, style, parent); } else { @@ -1308,10 +1334,10 @@ sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) { xmlParam = master_to_xml(sdlType->encode, data, style, parent); } else { - zval **tmp; + zval *tmp = get_zval_property(data, "_" TSRMLS_CC); - if (prop && zend_hash_find(prop, "_", sizeof("_"), (void**)&tmp) == SUCCESS) { - xmlParam = master_to_xml(sdlType->encode, *tmp, style, parent); + if (tmp) { + xmlParam = master_to_xml(sdlType->encode, tmp, style, parent); } else if (prop == NULL) { xmlParam = master_to_xml(sdlType->encode, data, style, parent); } else { @@ -1358,25 +1384,26 @@ zend_hash_move_forward(prop); } } else if (sdlType->model) { - model_to_xml_object(xmlParam, sdlType->model, prop, style, 1); + model_to_xml_object(xmlParam, sdlType->model, data, style, 1 TSRMLS_CC); } if (sdlType->attributes) { sdlAttributePtr *attr; - zval **data; + zval *zattr; HashPosition pos; zend_hash_internal_pointer_reset_ex(sdlType->attributes, &pos); while (zend_hash_get_current_data_ex(sdlType->attributes, (void**)&attr, &pos) == SUCCESS) { if ((*attr)->name) { - if (zend_hash_find(prop, (*attr)->name, strlen((*attr)->name)+1, (void**)&data) == SUCCESS) { + zattr = get_zval_property(data, (*attr)->name TSRMLS_CC); + if (zattr) { xmlNodePtr dummy; - dummy = master_to_xml((*attr)->encode, *data, SOAP_LITERAL, xmlParam); + dummy = master_to_xml((*attr)->encode, zattr, SOAP_LITERAL, xmlParam); if (dummy->children && dummy->children->content) { if ((*attr)->fixed && strcmp((*attr)->fixed,dummy->children->content) != 0) { soap_error3(E_ERROR, "Encoding: Attribute '%s' has fixed value '%s' (value '%s' is not allowed)", (*attr)->name, (*attr)->fixed, dummy->children->content); } - if ((*attr)->namens && + if ((*attr)->namens && (type->ns == NULL || strcmp((*attr)->namens, type->ns))) { xmlNsPtr nsp = encode_add_ns(xmlParam, (*attr)->namens); http://cvs.php.net/co.php/php-src/ext/soap/tests/bugs/bug30928.phpt?r=1.1&p=1 Index: php-src/ext/soap/tests/bugs/bug30928.phpt +++ php-src/ext/soap/tests/bugs/bug30928.phpt http://cvs.php.net/co.php/php-src/ext/soap/tests/bugs/bug30928.wsdl?r=1.1&p=1 Index: php-src/ext/soap/tests/bugs/bug30928.wsdl +++ php-src/ext/soap/tests/bugs/bug30928.wsdl
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php