Index: php_variables.c =================================================================== RCS file: /repository/php-src/main/php_variables.c,v retrieving revision 1.45.2.6 diff -u -r1.45.2.6 php_variables.c --- main/php_variables.c 14 Oct 2003 03:48:09 -0000 1.45.2.6 +++ main/php_variables.c 4 Mar 2004 01:33:51 -0000 @@ -178,13 +178,43 @@ if (!index) { zend_hash_next_index_insert(symtable1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); } else { - if (PG(magic_quotes_gpc) && (index!=var)) { - char *escaped_index = php_addslashes(index, index_len, &index_len, 0 TSRMLS_CC); - zend_hash_update(symtable1, escaped_index, index_len+1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); - efree(escaped_index); - } else { - zend_hash_update(symtable1, index, index_len+1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); - } + /* + * a=1&a=2 hack. If var already exists, turn it into an array if it isn't already + * and stick the existing value into the first element and this one into the second + */ + if (zend_hash_find(symtable1, index, index_len+1, (void **) &gpc_element_p)==FAILURE) { + if (PG(magic_quotes_gpc) && (index!=var)) { + char *escaped_index = php_addslashes(index, index_len, &index_len, 0 TSRMLS_CC); + zend_hash_update(symtable1, escaped_index, index_len+1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); + efree(escaped_index); + } else { + zend_hash_update(symtable1, index, index_len+1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); + } + } else { + if(Z_TYPE_PP(gpc_element_p) != IS_ARRAY) { + zval *new_element, **new_element_p, *old; + MAKE_STD_ZVAL(new_element); + array_init(new_element); + ALLOC_ZVAL(old); + *old = **gpc_element_p; + zval_copy_ctor(old); + if (PG(magic_quotes_gpc) && (index!=var)) { + char *escaped_index = php_addslashes(index, index_len, &index_len, 0 TSRMLS_CC); + zend_hash_update(symtable1, escaped_index, index_len+1, &new_element, sizeof(zval *), (void **) &new_element_p); + efree(escaped_index); + } else { + zend_hash_update(symtable1, index, index_len+1, &new_element, sizeof(zval *), (void **) &new_element_p); + } + + symtable1 = Z_ARRVAL_P(new_element); + zend_hash_next_index_insert(symtable1, &old, sizeof(zval *), NULL); + zend_hash_next_index_insert(symtable1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); + } else { + symtable1 = Z_ARRVAL_PP(gpc_element_p); + zend_hash_next_index_insert(symtable1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p); + } + } + } break; }