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.4.0alpha1~191^2~2356 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c78ca26d9ea0e149aa125af55ea6f9cd4526616e;p=php - Fixed bug #50282 (xmlrpc_encode_request() changes object into array in calling function) --- 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 4234cc5d4b..5e0430862d 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -560,6 +560,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep zval** pIter; zstr my_key; HashTable *ht = NULL; + zval *val_arr; ht = HASH_OF(val); if (ht && ht->nApplyCount > 1) { @@ -567,12 +568,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: @@ -592,8 +597,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: