From 74d4059fb1114b65cd531597158ac68ee2e2b46a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 25 Nov 2009 02:03:02 +0000 Subject: - Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays) --- ext/xmlrpc/xmlrpc-epi-php.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'ext/xmlrpc/xmlrpc-epi-php.c') diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index df63759dcb..01de63fec2 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -484,7 +484,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); @@ -495,8 +495,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) { @@ -557,6 +561,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) { @@ -570,7 +575,8 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep 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) { @@ -586,7 +592,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)); } -- cgit v1.2.1