From c077074c1379b5faed386106fdbb53f5d17fd6e7 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 15 Jan 2013 17:33:54 +0800 Subject: [PATCH 1/2] Revert "Update fputcsv() to escape all characters equally." On second thoughts, while the behaviour _is_ broken, this isn't the right fix. This reverts commit 9b5cb0e8059b1e8bec096067491ed8d75f878938. --- NEWS | 2 -- ext/standard/file.c | 10 ++++++++-- ext/standard/tests/file/fputcsv.phpt | 10 +++++----- ext/standard/tests/file/fputcsv_bug43225.phpt | 20 ------------------- 4 files changed, 13 insertions(+), 29 deletions(-) delete mode 100644 ext/standard/tests/file/fputcsv_bug43225.phpt diff --git a/NEWS b/NEWS index a7c2fa47e9c..e78af2339d8 100644 --- a/NEWS +++ b/NEWS @@ -12,8 +12,6 @@ PHP NEWS - Core . Fixed bug #63943 (Bad warning text from strpos() on empty needle). (Laruence) - . Fixed bug #43225 (fputcsv incorrectly handles cells ending in \ followed - by "). (Adam) - cURL extension: . Fixed bug (segfault due to libcurl connection caching). (Pierrick) diff --git a/ext/standard/file.c b/ext/standard/file.c index fa85bf1b3a9..8b18155cf89 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1953,6 +1953,7 @@ PHP_FUNCTION(fputcsv) { char delimiter = ','; /* allow this to be set as parameter */ char enclosure = '"'; /* allow this to be set as parameter */ + const char escape_char = '\\'; php_stream *stream; int ret; zval *fp = NULL, *fields = NULL, **field_tmp = NULL, field; @@ -2007,19 +2008,24 @@ PHP_FUNCTION(fputcsv) /* enclose a field that contains a delimiter, an enclosure character, or a newline */ if (FPUTCSV_FLD_CHK(delimiter) || FPUTCSV_FLD_CHK(enclosure) || + FPUTCSV_FLD_CHK(escape_char) || 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 == enclosure) { + if (*ch == escape_char) { + escaped = 1; + } else if (!escaped && *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 d71f777143c..63c41509bdd 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, 0, ',', '"', '"')) +while($l=fgetcsv($fp)) { $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 deleted file mode 100644 index 1de3b5fa023..00000000000 --- a/ext/standard/tests/file/fputcsv_bug43225.phpt +++ /dev/null @@ -1,20 +0,0 @@ ---TEST-- -fputcsv(): bug #43225 (fputcsv incorrectly handles cells ending in \ followed by ") ---FILE-- - ---EXPECT-- -"a\""",bbb From 83864b470b030a7d1bd0a1b46d3be75ce301304c Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 15 Jan 2013 17:37:21 +0800 Subject: [PATCH 2/2] Revert "Apply the fputcsv test fix to SplFileObject_fputcsv.phpt. Mea culpa." This reverts commit 0510701474e8d99b5b30139b5599e44f9b555a5a. --- ext/spl/tests/SplFileObject_fputcsv.phpt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/spl/tests/SplFileObject_fputcsv.phpt b/ext/spl/tests/SplFileObject_fputcsv.phpt index 601edab47fc..66fdbfd1b9b 100644 --- a/ext/spl/tests/SplFileObject_fputcsv.phpt +++ b/ext/spl/tests/SplFileObject_fputcsv.phpt @@ -42,7 +42,7 @@ echo '$list = ';var_export($res);echo ";\n"; $fp = fopen($file, "r"); $res = array(); -while($l=fgetcsv($fp, 0, ',', '"', '"')) +while($l=fgetcsv($fp)) { $res[] = join(',',$l); } @@ -76,10 +76,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',