# Obtained from PHP_5_2 CVS in 20061214 # # php_encoding.c: # # Fixed decoding list of arrays (related to bug #39121) # Fixed bug #38536 (SOAP returns an array of values instead of an object) # Fixed bug #39454 (Returning a SOAP array segfaults PHP) # # php_http.c: # # Replace non-threadsafe rand() with php_rand_r() # # php_packet_soap.c: # # Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client) # # php_sdl.c: # # Small hash table optimization # Index: php_encoding.c =================================================================== RCS file: /repository/php-src/ext/soap/php_encoding.c,v retrieving revision 1.103.2.21.2.13 retrieving revision 1.103.2.21.2.16 diff -u -r1.103.2.21.2.13 -r1.103.2.21.2.16 --- php_encoding.c 24 Oct 2006 05:20:50 -0000 1.103.2.21.2.13 +++ php_encoding.c 10 Nov 2006 15:05:22 -0000 1.103.2.21.2.16 @@ -1102,23 +1102,23 @@ } add_string_to_string(val, val, val2); zval_ptr_dtor(&val2); - node = node->next; + node = node->next; } } if (any == NULL) { any = val; } else { if (Z_TYPE_P(any) != IS_ARRAY) { - /* Convert into array */ - zval *arr; + /* Convert into array */ + zval *arr; - MAKE_STD_ZVAL(arr); - array_init(arr); - add_next_index_zval(arr, any); - any = arr; - } - /* Add array element */ - add_next_index_zval(any, val); + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, any); + any = arr; + } + /* Add array element */ + add_next_index_zval(any, val); } } node = node->next; @@ -1137,13 +1137,14 @@ if (node) { zval *val; + xmlNodePtr r_node; - node = check_and_resolve_href(node); - if (node && node->children && node->children->content) { - if (model->u.element->fixed && strcmp(model->u.element->fixed, (char*)node->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, node->children->content); + r_node = check_and_resolve_href(node); + if (r_node && r_node->children && r_node->children->content) { + if (model->u.element->fixed && strcmp(model->u.element->fixed, (char*)r_node->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, r_node->children->content); } - val = master_to_zval(model->u.element->encode, node); + val = master_to_zval(model->u.element->encode, r_node); } else if (model->u.element->fixed) { xmlNodePtr dummy = xmlNewNode(NULL, BAD_CAST("BOGUS")); xmlNodeSetContent(dummy, BAD_CAST(model->u.element->fixed)); @@ -1155,7 +1156,7 @@ val = master_to_zval(model->u.element->encode, dummy); xmlFreeNode(dummy); } else { - val = master_to_zval(model->u.element->encode, node); + val = master_to_zval(model->u.element->encode, r_node); } if ((node = get_node(node->next, model->u.element->name)) != NULL) { zval *array; @@ -1378,22 +1379,31 @@ prop = get_zval_property(ret, (char*)trav->name TSRMLS_CC); if (!prop) { - set_zval_property(ret, (char*)trav->name, tmpVal TSRMLS_CC); + if (!trav->next || !get_node(trav->next, (char*)trav->name)) { + set_zval_property(ret, (char*)trav->name, tmpVal TSRMLS_CC); + } else { + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, tmpVal); + set_zval_property(ret, (char*)trav->name, arr TSRMLS_CC); + } } else { - /* Property already exist - make array */ - if (Z_TYPE_P(prop) != IS_ARRAY) { - /* Convert into array */ - zval *arr; - - MAKE_STD_ZVAL(arr); - array_init(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); + /* Property already exist - make array */ + if (Z_TYPE_P(prop) != IS_ARRAY) { + /* Convert into array */ + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(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); } } trav = trav->next; @@ -2013,6 +2023,7 @@ zend_hash_find(sdl_type->attributes, SOAP_1_1_ENC_NAMESPACE":arrayType", sizeof(SOAP_1_1_ENC_NAMESPACE":arrayType"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arrayType", sizeof(WSDL_NAMESPACE":arrayType"), (void **)&ext) == SUCCESS) { char *value, *end; @@ -2061,6 +2072,7 @@ zend_hash_find(sdl_type->attributes, SOAP_1_2_ENC_NAMESPACE":itemType", sizeof(SOAP_1_2_ENC_NAMESPACE":itemType"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":itemType", sizeof(WSDL_NAMESPACE":itemType"), (void **)&ext) == SUCCESS) { if ((*ext)->ns != NULL) { enc = get_encoder(SOAP_GLOBAL(sdl), (*ext)->ns, (*ext)->val); @@ -2071,6 +2083,7 @@ if (zend_hash_find(sdl_type->attributes, SOAP_1_2_ENC_NAMESPACE":arraySize", sizeof(SOAP_1_2_ENC_NAMESPACE":arraySize"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arraySize", sizeof(WSDL_NAMESPACE":arraysize"), (void **)&ext) == SUCCESS) { dimension = calc_dimension_12((*ext)->val); dims = get_position_12(dimension, (*ext)->val); @@ -2091,6 +2104,7 @@ zend_hash_find(sdl_type->attributes, SOAP_1_2_ENC_NAMESPACE":arraySize", sizeof(SOAP_1_2_ENC_NAMESPACE":arraySize"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arraySize", sizeof(WSDL_NAMESPACE":arraySize"), (void **)&ext) == SUCCESS) { dimension = calc_dimension_12((*ext)->val); dims = get_position_12(dimension, (*ext)->val); @@ -2248,6 +2262,7 @@ zend_hash_find(type->sdl_type->attributes, SOAP_1_1_ENC_NAMESPACE":arrayType", sizeof(SOAP_1_1_ENC_NAMESPACE":arrayType"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arrayType", sizeof(WSDL_NAMESPACE":arrayType"), (void **)&ext) == SUCCESS) { char *type, *end; @@ -2269,6 +2284,7 @@ zend_hash_find(type->sdl_type->attributes, SOAP_1_2_ENC_NAMESPACE":itemType", sizeof(SOAP_1_2_ENC_NAMESPACE":itemType"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":itemType", sizeof(WSDL_NAMESPACE":itemType"), (void **)&ext) == SUCCESS) { if ((*ext)->ns != NULL) { @@ -2278,6 +2294,7 @@ if (zend_hash_find(type->sdl_type->attributes, SOAP_1_2_ENC_NAMESPACE":arraySize", sizeof(SOAP_1_2_ENC_NAMESPACE":arraySize"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arraySize", sizeof(WSDL_NAMESPACE":arraysize"), (void **)&ext) == SUCCESS) { dimension = calc_dimension_12((*ext)->val); dims = get_position_12(dimension, (*ext)->val); @@ -2290,6 +2307,7 @@ zend_hash_find(type->sdl_type->attributes, SOAP_1_2_ENC_NAMESPACE":arraySize", sizeof(SOAP_1_2_ENC_NAMESPACE":arraySize"), (void **)&arrayType) == SUCCESS && + (*arrayType)->extraAttributes && zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arraySize", sizeof(WSDL_NAMESPACE":arraysize"), (void **)&ext) == SUCCESS) { dimension = calc_dimension_12((*ext)->val); Index: php_http.c =================================================================== RCS file: /repository/php-src/ext/soap/php_http.c,v retrieving revision 1.77.2.11.2.3 retrieving revision 1.77.2.11.2.4 diff -u -r1.77.2.11.2.3 -r1.77.2.11.2.4 --- php_http.c 6 Sep 2006 11:03:45 -0000 1.77.2.11.2.3 +++ php_http.c 28 Nov 2006 00:22:05 -0000 1.77.2.11.2.4 @@ -469,9 +469,10 @@ char HA1[33], HA2[33], response[33], cnonce[33], nc[9]; PHP_MD5_CTX md5ctx; unsigned char hash[16]; + unsigned int ctx; PHP_MD5Init(&md5ctx); - sprintf(cnonce, "%d", rand()); + sprintf(cnonce, "%d", php_rand_r(&ctx)); PHP_MD5Update(&md5ctx, (unsigned char*)cnonce, strlen(cnonce)); PHP_MD5Final(hash, &md5ctx); make_digest(cnonce, hash); Index: php_packet_soap.c =================================================================== RCS file: /repository/php-src/ext/soap/php_packet_soap.c,v retrieving revision 1.42.2.1.2.2 retrieving revision 1.42.2.1.2.3 diff -u -r1.42.2.1.2.2 -r1.42.2.1.2.3 --- php_packet_soap.c 11 Jul 2006 14:24:18 -0000 1.42.2.1.2.2 +++ php_packet_soap.c 6 Nov 2006 16:36:43 -0000 1.42.2.1.2.3 @@ -350,10 +350,22 @@ if (val != NULL) { if (!node_is_equal_ex(val,"result",RPC_SOAP12_NAMESPACE)) { zval *tmp; + zval **arr; tmp = master_to_zval(NULL, val); if (val->name) { - add_assoc_zval(return_value, (char*)val->name, tmp); + if (zend_hash_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name)+1, (void**)&arr) == SUCCESS) { + add_next_index_zval(*arr, tmp); + } else if (val->next && get_node(val->next, (char*)val->name)) { + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, tmp); + add_assoc_zval(return_value, (char*)val->name, arr); + } else { + add_assoc_zval(return_value, (char*)val->name, tmp); + } } else { add_next_index_zval(return_value, tmp); } Index: php_sdl.c =================================================================== RCS file: /repository/php-src/ext/soap/php_sdl.c,v retrieving revision 1.88.2.12.2.3 retrieving revision 1.88.2.12.2.4 diff -u -r1.88.2.12.2.3 -r1.88.2.12.2.4 --- php_sdl.c 20 Sep 2006 13:42:50 -0000 1.88.2.12.2.3 +++ php_sdl.c 30 Nov 2006 23:51:24 -0000 1.88.2.12.2.4 @@ -1863,7 +1863,7 @@ sdlTypePtr *tmp; tmp_elements = emalloc(sizeof(HashTable)); - zend_hash_init(tmp_elements, 0, NULL, NULL, 0); + zend_hash_init(tmp_elements, zend_hash_num_elements(type->elements), NULL, NULL, 0); zend_hash_internal_pointer_reset(type->elements); while (zend_hash_get_current_data(type->elements, (void**)&tmp) == SUCCESS) {