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.4.0alpha1~191^2~2349 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0085a466b69d375b0d6a5db297b2195cf1fd64e9;p=php - Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays) --- 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 5e0430862d..589f1e6c1e 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -489,7 +489,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; zstr my_key; zend_hash_internal_pointer_reset(ht); @@ -499,8 +499,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; } else if (res == HASH_KEY_IS_STRING || res == HASH_KEY_IS_UNICODE) { @@ -561,6 +565,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep zstr my_key; HashTable *ht = NULL; zval *val_arr; + XMLRPC_VECTOR_TYPE vtype; ht = HASH_OF(val); if (ht && ht->nApplyCount > 1) { @@ -573,7 +578,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) { @@ -588,7 +595,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.s, *pIter, depth++ TSRMLS_CC)); }