diff options
-rw-r--r-- | ext/standard/file.c | 25 | ||||
-rw-r--r-- | ext/standard/tests/file/fputcsv_002.phpt | 43 |
2 files changed, 59 insertions, 9 deletions
diff --git a/ext/standard/file.c b/ext/standard/file.c index 617afb62b3..d826d00b9c 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1866,7 +1866,7 @@ quit_loop: } /* }}} */ -#define FPUTCSV_FLD_CHK(c) memchr(Z_STRVAL_PP(field), c, Z_STRLEN_PP(field)) +#define FPUTCSV_FLD_CHK(c) memchr(Z_STRVAL(field), c, Z_STRLEN(field)) /* {{{ proto int fputcsv(resource fp, array fields [, string delimiter [, string enclosure]]) Format line as CSV and write to file pointer */ @@ -1877,7 +1877,7 @@ PHP_FUNCTION(fputcsv) const char escape_char = '\\'; php_stream *stream; int ret; - zval *fp = NULL, *fields = NULL, **field = NULL; + zval *fp = NULL, *fields = NULL, **field_tmp = NULL, field; char *delimiter_str = NULL, *enclosure_str = NULL; int delimiter_str_len, enclosure_str_len; HashPosition pos; @@ -1918,11 +1918,14 @@ PHP_FUNCTION(fputcsv) count = zend_hash_num_elements(Z_ARRVAL_P(fields)); zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(fields), &pos); - while (zend_hash_get_current_data_ex(Z_ARRVAL_P(fields), (void **) &field, &pos) == SUCCESS) { - if (Z_TYPE_PP(field) != IS_STRING) { - SEPARATE_ZVAL(field); - convert_to_string(*field); + while (zend_hash_get_current_data_ex(Z_ARRVAL_P(fields), (void **) &field_tmp, &pos) == SUCCESS) { + field = **field_tmp; + + if (Z_TYPE_PP(field_tmp) != IS_STRING) { + zval_copy_ctor(&field); + convert_to_string(&field); } + /* enclose a field that contains a delimiter, an enclosure character, or a newline */ if (FPUTCSV_FLD_CHK(delimiter) || FPUTCSV_FLD_CHK(enclosure) || @@ -1932,8 +1935,8 @@ PHP_FUNCTION(fputcsv) FPUTCSV_FLD_CHK('\t') || FPUTCSV_FLD_CHK(' ') ) { - char *ch = Z_STRVAL_PP(field); - char *end = ch + Z_STRLEN_PP(field); + char *ch = Z_STRVAL(field); + char *end = ch + Z_STRLEN(field); int escaped = 0; smart_str_appendc(&csvline, enclosure); @@ -1950,13 +1953,17 @@ PHP_FUNCTION(fputcsv) } smart_str_appendc(&csvline, enclosure); } else { - smart_str_appendl(&csvline, Z_STRVAL_PP(field), Z_STRLEN_PP(field)); + smart_str_appendl(&csvline, Z_STRVAL(field), Z_STRLEN(field)); } if (++i != count) { smart_str_appendl(&csvline, &delimiter, 1); } zend_hash_move_forward_ex(Z_ARRVAL_P(fields), &pos); + + if (Z_TYPE_PP(field_tmp) != IS_STRING) { + zval_dtor(&field); + } } smart_str_appendc(&csvline, '\n'); diff --git a/ext/standard/tests/file/fputcsv_002.phpt b/ext/standard/tests/file/fputcsv_002.phpt new file mode 100644 index 0000000000..544ad306ff --- /dev/null +++ b/ext/standard/tests/file/fputcsv_002.phpt @@ -0,0 +1,43 @@ +--TEST-- +fputcsv(): Checking data after calling the function +--FILE-- +<?php + +$file = dirname(__FILE__) .'/fgetcsv-test.csv'; + +$data = array(1, 2, 'foo', 'haha', array(4, 5, 6), 1.3, null); + +$fp = fopen($file, 'w'); + +fputcsv($fp, $data); + +var_dump($data); + +@unlink($file); + +?> +--EXPECTF-- +Notice: Array to string conversion in %s on line %d +array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(3) "foo" + [3]=> + string(4) "haha" + [4]=> + array(3) { + [0]=> + int(4) + [1]=> + int(5) + [2]=> + int(6) + } + [5]=> + float(1.3) + [6]=> + NULL +} |