From 2e35533fc67456b5542977aecf325dc06c9d69d7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 24 Nov 2009 11:32:31 +0000 Subject: [PATCH] - Fixed bug #50282 (xmlrpc_encode_request() changes object into array in calling function) --- NEWS | 2 ++ ext/xmlrpc/tests/bug50282.phpt | 43 ++++++++++++++++++++++++++++++++++ ext/xmlrpc/xmlrpc-epi-php.c | 21 +++++++++++------ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 ext/xmlrpc/tests/bug50282.phpt diff --git a/NEWS b/NEWS index 3cbbc4d1af..a4730dae97 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,8 @@ PHP NEWS - Fixed memory leak in extension loading when an error occurs on Windows. (Pierre) +- Fixed bug #50282 (xmlrpc_encode_request() changes object into array in + calling function). (Felipe) - Fixed bug #50267 (get_browser(null) does not use HTTP_USER_AGENT). (Jani) - Fixed bug #50240 (pdo_mysql.default_socket in php.ini shouldn't used if it is empty). (foutrelis at gmail dot com, Ilia) 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 533b06aaee..df63759dcb 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -556,6 +556,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) { @@ -563,12 +564,17 @@ 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: @@ -589,8 +595,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: -- 2.50.1