From: Zeev Suraski Date: Fri, 9 Jun 2000 15:13:36 +0000 (+0000) Subject: @- Fixed var_dump() not to modify the internal order of array elements (Zeev) X-Git-Tag: PRE_EIGHT_BYTE_ALLOC_PATCH~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d9756780068a2acd0d1ced9a7a93b2a26fd342a4;p=php @- Fixed var_dump() not to modify the internal order of array elements (Zeev) Fixed the buffer overflow as well --- diff --git a/ext/standard/var.c b/ext/standard/var.c index ef327d2b08..5b342471a6 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -30,102 +30,79 @@ #include "php_string.h" #include "php_var.h" -#define COMMON level, ' ', ((*struc)->is_ref?"&":"") +#define COMMON ((*struc)->is_ref?"&":"") /* }}} */ /* {{{ php_var_dump */ +static int php_array_element_dump(zval **zv, int num_args, va_list args, zend_hash_key *hash_key) +{ + int level; + + level = va_arg(args, int); + + if (hash_key->nKeyLength==0) { /* numeric key */ + php_printf("%*c[%ld]=>\n", level + 1, ' ', hash_key->h); + } else { /* string key */ + php_printf("%*c[\"%s\"]=>\n", level + 1, ' ', hash_key->arKey); + } + php_var_dump(zv, level + 2); + return 0; +} + + void php_var_dump(pval **struc, int level) { - ulong index; - char *key; - int i; - pval **data; - char buf[512]; HashTable *myht; + if (level>1) { + php_printf("%*c", level-1, ' '); + } + switch ((*struc)->type) { case IS_BOOL: - i = sprintf(buf, "%*c%sbool(%s)\n", COMMON, ((*struc)->value.lval?"true":"false")); - PHPWRITE(&buf[1], i - 1); + php_printf("%sbool(%s)\n", COMMON, ((*struc)->value.lval?"true":"false")); break; - case IS_NULL: - i = sprintf(buf, "%*c%sNULL\n", COMMON); - PHPWRITE(&buf[1], i - 1); + php_printf("%sNULL\n", COMMON); break; - case IS_LONG: - i = sprintf(buf, "%*c%sint(%ld)\n", COMMON, (*struc)->value.lval); - PHPWRITE(&buf[1], i - 1); + php_printf("%sint(%ld)\n", COMMON, (*struc)->value.lval); break; - case IS_DOUBLE: { ELS_FETCH(); - i = sprintf(buf, "%*c%sfloat(%.*G)\n", COMMON, (int) EG(precision), (*struc)->value.dval); - PHPWRITE(&buf[1], i - 1); + + php_printf("%sfloat(%.*G)\n", COMMON, (int) EG(precision), (*struc)->value.dval); } break; - case IS_STRING: - i = sprintf(buf, "%*c%sstring(%d) \"", COMMON, (*struc)->value.str.len); - PHPWRITE(&buf[1], i - 1); + php_printf("%sstring(%d) \"", COMMON, (*struc)->value.str.len); PHPWRITE((*struc)->value.str.val, (*struc)->value.str.len); - strcpy(buf, "\"\n"); - PHPWRITE(buf, strlen(buf)); + PUTS("\"\n"); break; - case IS_ARRAY: myht = HASH_OF(*struc); - i = sprintf(buf, "%*c%sarray(%d) {\n", COMMON, zend_hash_num_elements(myht)); - PHPWRITE(&buf[1], i - 1); + php_printf("%sarray(%d) {\n", COMMON, zend_hash_num_elements(myht)); goto head_done; - case IS_OBJECT: myht = HASH_OF(*struc); - i = sprintf(buf, "%*c%sobject(%s)(%d) {\n", COMMON, (*struc)->value.obj.ce->name, zend_hash_num_elements(myht)); - PHPWRITE(&buf[1], i - 1); - head_done: - - zend_hash_internal_pointer_reset(myht); - for (;; zend_hash_move_forward(myht)) { - if ((i = zend_hash_get_current_key(myht, &key, &index)) == HASH_KEY_NON_EXISTANT) - break; - - if (zend_hash_get_current_data(myht, (void **) (&data)) != SUCCESS || !data || (data == struc)) { - if (i == HASH_KEY_IS_STRING) - efree(key); - continue; - } - switch (i) { - case HASH_KEY_IS_LONG: - sprintf(buf, "%*c[%ld]=>\n", level + 1, ' ', index); - PHPWRITE(buf,strlen(buf)); - break; - - case HASH_KEY_IS_STRING: - sprintf(buf, "%*c[\"%s\"]=>\n", level + 1, ' ', key); - PHPWRITE(buf, strlen(buf)); - efree(key); - break; - } - php_var_dump(data, level + 2); + php_printf("%sobject(%s)(%d) {\n", COMMON, (*struc)->value.obj.ce->name, zend_hash_num_elements(myht)); +head_done: + zend_hash_apply_with_arguments(myht, php_array_element_dump, 1, level); + if (level>1) { + php_printf("%*c\n", level-1, ' '); } - i = sprintf(buf, "%*c}\n", level, ' '); - PHPWRITE(&buf[1], i - 1); - break; - + PUTS("}\n"); + break; case IS_RESOURCE: { int type; zend_list_find((*struc)->value.lval, &type); - i = sprintf(buf, "%*c%sresource(%ld) of type %d\n", COMMON,(*struc)->value.lval, type); - PHPWRITE(&buf[1], i - 1); + php_printf("%sresource(%ld) of type %d\n", COMMON, (*struc)->value.lval, type); break; } - default: - i = sprintf(buf, "%*c%sUNKNOWN:0\n",COMMON); - PHPWRITE(&buf[1], i - 1); + php_printf("%sUNKNOWN:0\n",COMMON); + break; } }