Skip to content

Commit

Permalink
encoding/csv: preserve \r\n in quoted fields
Browse files Browse the repository at this point in the history
The parser mistakenly assumed it could always fold \r\n into \n, which
is not true since a \r\n inside a quoted fields has no special meaning
and should be kept as is.

Fix this by not folding \r\n to \n inside quotes fields.

Fixes #21201

Change-Id: Ifebc302e49cf63e0a027ee90f088dbc050a2b7a6
Reviewed-on: https://go-review.googlesource.com/52810
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
  • Loading branch information
nussjustin authored and ianlancetaylor committed Aug 14, 2017
1 parent f9cf8e5 commit 9fbc06e
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/encoding/csv/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,13 @@ func (r *Reader) readRune() (rune, error) {
return r1, err
}

// readRawRune works the same way as readRune, but does not fold \r\n to \n.
func (r *Reader) readRawRune() (rune, error) {
r1, _, err := r.r.ReadRune()
r.column++
return r1, err
}

// skip reads runes up to and including the rune delim or until error.
func (r *Reader) skip(delim rune) error {
for {
Expand Down Expand Up @@ -351,7 +358,9 @@ func (r *Reader) parseField() (haveField bool, delim rune, err error) {
// quoted field
Quoted:
for {
r1, err = r.readRune()
// use readRawRune instead of readRune to preserve \r\n
// in quotes fields.
r1, err = r.readRawRune()
if err != nil {
if err == io.EOF {
if r.LazyQuotes {
Expand Down
7 changes: 7 additions & 0 deletions src/encoding/csv/reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,13 @@ x,,,
Line: 2,
Column: 2,
},
{ // issue 21201
Name: "CRLFInQuotedField",
Input: "\"Hello\r\nHi\"",
Output: [][]string{
{"Hello\r\nHi"},
},
},
}

func TestRead(t *testing.T) {
Expand Down

0 comments on commit 9fbc06e

Please sign in to comment.