summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2013-01-15 15:32:42 +0800
committerXinchen Hui <laruence@php.net>2013-01-15 15:32:42 +0800
commit3bc74903706ab08e916905a0bd634e77aa804def (patch)
tree6d700cbe895d4c2d00696a187e7d81b967836754
parent4fcf4e084508ae18dddc02891f7c6fb10e49447e (diff)
parenta4191b0aad94fb7bebb8fd5c4233006849845c31 (diff)
downloadphp-git-3bc74903706ab08e916905a0bd634e77aa804def.tar.gz
Merge branch 'PHP-5.4' of git.php.net:php-src into PHP-5.4
-rw-r--r--ext/standard/file.c8
-rw-r--r--ext/standard/tests/file/fputcsv.phpt10
-rw-r--r--ext/standard/tests/file/fputcsv_bug43225.phpt20
3 files changed, 27 insertions, 11 deletions
diff --git a/ext/standard/file.c b/ext/standard/file.c
index f7af63bcf4..b2d44f113b 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1871,20 +1871,16 @@ PHPAPI int php_fputcsv(php_stream *stream, zval *fields, char delimiter, char en
FPUTCSV_FLD_CHK('\n') ||
FPUTCSV_FLD_CHK('\r') ||
FPUTCSV_FLD_CHK('\t') ||
+ FPUTCSV_FLD_CHK('\\') ||
FPUTCSV_FLD_CHK(' ')
) {
char *ch = Z_STRVAL(field);
char *end = ch + Z_STRLEN(field);
- int escaped = 0;
smart_str_appendc(&csvline, enclosure);
while (ch < end) {
- if (*ch == escape_char) {
- escaped = 1;
- } else if (!escaped && *ch == enclosure) {
+ if (*ch == enclosure) {
smart_str_appendc(&csvline, enclosure);
- } else {
- escaped = 0;
}
smart_str_appendc(&csvline, *ch);
ch++;
diff --git a/ext/standard/tests/file/fputcsv.phpt b/ext/standard/tests/file/fputcsv.phpt
index 63c41509bd..d71f777143 100644
--- a/ext/standard/tests/file/fputcsv.phpt
+++ b/ext/standard/tests/file/fputcsv.phpt
@@ -44,7 +44,7 @@ echo '$list = ';var_export($res);echo ";\n";
$fp = fopen($file, "r");
$res = array();
-while($l=fgetcsv($fp))
+while($l=fgetcsv($fp, 0, ',', '"', '"'))
{
$res[] = join(',',$l);
}
@@ -75,10 +75,10 @@ $list = array (
13 => 'aaa,"""bbb """',
14 => '"aaa""aaa""","""bbb""bbb"',
15 => '"aaa""aaa""""""",bbb',
- 16 => 'aaa,"""\\"bbb",ccc',
- 17 => '"aaa""\\"a""","""bbb"""',
- 18 => '"""\\"""","""aaa"""',
- 19 => '"""\\"""""",aaa',
+ 16 => 'aaa,"""\\""bbb",ccc',
+ 17 => '"aaa""\\""a""","""bbb"""',
+ 18 => '"""\\""""","""aaa"""',
+ 19 => '"""\\""""""",aaa',
);
$list = array (
0 => 'aaa,bbb',
diff --git a/ext/standard/tests/file/fputcsv_bug43225.phpt b/ext/standard/tests/file/fputcsv_bug43225.phpt
new file mode 100644
index 0000000000..1de3b5fa02
--- /dev/null
+++ b/ext/standard/tests/file/fputcsv_bug43225.phpt
@@ -0,0 +1,20 @@
+--TEST--
+fputcsv(): bug #43225 (fputcsv incorrectly handles cells ending in \ followed by ")
+--FILE--
+<?php
+
+$row = array(
+ 'a\\"',
+ 'bbb',
+);
+
+$file = dirname(__FILE__) . 'fgetcsv_bug43225.csv';
+$fp = fopen($file, 'w');
+fputcsv($fp, $row);
+fclose($fp);
+readfile($file);
+unlink($file);
+
+?>
+--EXPECT--
+"a\""",bbb