From: Felipe Pena Date: Wed, 25 Nov 2009 02:03:02 +0000 (+0000) Subject: - Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays) X-Git-Tag: php-5.2.12RC2~14 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=50ca6f0fa193da23d2c8f20e5b2ae71a59f261b7;p=php - Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays) --- diff --git a/NEWS b/NEWS index 0c8ea4a60d..4a4a5d112f 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,8 @@ PHP NEWS - Fixed error_log() to be binary safe when using message_type 3. (Jani) +- Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays). + (Felipe) - Fixed bug #50282 (xmlrpc_encode_request() changes object into array in calling function). (Felipe) - Fixed bug #50255 (isset() and empty() silently casts array to object). diff --git a/ext/xmlrpc/tests/bug50285.phpt b/ext/xmlrpc/tests/bug50285.phpt new file mode 100644 index 0000000000..cf766fc40f --- /dev/null +++ b/ext/xmlrpc/tests/bug50285.phpt @@ -0,0 +1,115 @@ +--TEST-- +Bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays) +--FILE-- +'One', 3=>'Three', 5=>'Five'); +} + +function test2($func, $params) { + return array('One', 'Three', 'Five', 5); +} + +function test3($func, $params) { + return array('One', 3 => 'Three', b'Five' => 5, 'Six'); +} + +function test4($func, $params) { + return array('One', 'Three', 'Five', b'Six' => 6); +} + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test1', 'test1'); +$HTTP_RAW_POST_DATA = << + +test1 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +// ------------ + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test2', 'test2'); +$HTTP_RAW_POST_DATA = << + +test2 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +// ------------ + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test3', 'test3'); +$HTTP_RAW_POST_DATA = << + +test3 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +// ------------ + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test4', 'test4'); +$HTTP_RAW_POST_DATA = << + +test4 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +?> +--EXPECT-- +array(3) { + [1]=> + string(3) "One" + [3]=> + string(5) "Three" + [5]=> + string(4) "Five" +} +array(4) { + [0]=> + string(3) "One" + [1]=> + string(5) "Three" + [2]=> + string(4) "Five" + [3]=> + int(5) +} +array(4) { + [0]=> + string(3) "One" + [3]=> + string(5) "Three" + ["Five"]=> + int(5) + [4]=> + string(3) "Six" +} +array(4) { + [0]=> + string(3) "One" + [1]=> + string(5) "Three" + [2]=> + string(4) "Five" + ["Six"]=> + int(6) +} diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index c8272f929b..ffa98b29ab 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -428,7 +428,7 @@ static void set_output_options(php_output_options* options, zval* output_opts) static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) { int bArray = 0, bStruct = 0, bMixed = 0; - unsigned long num_index; + unsigned long num_index, last_num = 0; char* my_key; zend_hash_internal_pointer_reset(ht); @@ -438,8 +438,12 @@ static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) if(bStruct) { bMixed = 1; break; + } else if (last_num > 0 && last_num != num_index-1) { + bStruct = 1; + break; } bArray = 1; + last_num = num_index; } else if(res == HASH_KEY_NON_EXISTANT) { break; @@ -500,6 +504,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep char* my_key; HashTable *ht = NULL; zval *val_arr; + XMLRPC_VECTOR_TYPE vtype; ht = HASH_OF(val); if (ht && ht->nApplyCount > 1) { @@ -512,7 +517,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep 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))); + + vtype = determine_vector_type(Z_ARRVAL_P(val_arr)); + xReturn = XMLRPC_CreateVector(key, vtype); zend_hash_internal_pointer_reset(Z_ARRVAL_P(val_arr)); while(zend_hash_get_current_data(Z_ARRVAL_P(val_arr), (void**)&pIter) == SUCCESS) { @@ -528,7 +535,15 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep ht->nApplyCount++; } if (res == HASH_KEY_IS_LONG) { - XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(0, *pIter, depth++ TSRMLS_CC)); + char *num_str = NULL; + + if (vtype != xmlrpc_vector_array) { + spprintf(&num_str, 0, "%ld", num_index); + } + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(num_str, *pIter, depth++ TSRMLS_CC)); + if (num_str) { + efree(num_str); + } } else { XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(my_key, *pIter, depth++ TSRMLS_CC)); }