From: Felipe Pena Date: Tue, 24 Nov 2009 11:32:31 +0000 (+0000) Subject: - Fixed bug #50282 (xmlrpc_encode_request() changes object into array in calling... X-Git-Tag: php-5.2.12RC2~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7a5348280e722338fe90195181770d4b4745f9b5;p=php - Fixed bug #50282 (xmlrpc_encode_request() changes object into array in calling function) --- diff --git a/NEWS b/NEWS index 5d2f660143..c8f18c8970 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ PHP NEWS - Fixed error_log() to be binary safe when using message_type 3. (Jani) +- Fixed bug #50282 (xmlrpc_encode_request() changes object into array in + calling function). (Felipe) - Fixed bug #50219 (soap call Segmentation fault on a redirected url). (Pierrick) - Fixed bug #50207 (segmentation fault when concatenating very large strings diff --git a/ext/xmlrpc/tests/bug50282.phpt b/ext/xmlrpc/tests/bug50282.phpt new file mode 100644 index 0000000000..eb35fe3f2d --- /dev/null +++ b/ext/xmlrpc/tests/bug50282.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #50282 (xmlrpc_encode_request() changes object into array in calling function) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +object(One)#%d (1) { + ["x"]=> + int(10) +} +string(279) " + +test + + + + + + x + + 10 + + + + + + + +" +object(One)#%d (1) { + ["x"]=> + int(10) +} diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 9f3842c8c5..c8272f929b 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -499,6 +499,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep zval** pIter; char* my_key; HashTable *ht = NULL; + zval *val_arr; ht = HASH_OF(val); if (ht && ht->nApplyCount > 1) { @@ -506,12 +507,16 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep return NULL; } - convert_to_array(val); - xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val))); + MAKE_STD_ZVAL(val_arr); + *val_arr = *val; + zval_copy_ctor(val_arr); + INIT_PZVAL(val_arr); + convert_to_array(val_arr); + xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val_arr))); - zend_hash_internal_pointer_reset(Z_ARRVAL_P(val)); - while(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) { - int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val), &my_key, &num_index); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(val_arr)); + while(zend_hash_get_current_data(Z_ARRVAL_P(val_arr), (void**)&pIter) == SUCCESS) { + int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val_arr), &my_key, &num_index); switch (res) { case HASH_KEY_NON_EXISTANT: @@ -532,8 +537,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep } break; } - zend_hash_move_forward(Z_ARRVAL_P(val)); + zend_hash_move_forward(Z_ARRVAL_P(val_arr)); } + zval_ptr_dtor(&val_arr); } break; default: