]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/csv: preserve \r\n in quoted fields
authorJustin Nuß <nuss.justin@gmail.com>
Wed, 2 Aug 2017 17:46:41 +0000 (19:46 +0200)
committerIan Lance Taylor <iant@golang.org>
Mon, 14 Aug 2017 18:42:20 +0000 (18:42 +0000)
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>

src/encoding/csv/reader.go
src/encoding/csv/reader_test.go

index 4085321a71c16ac1afdeb43cd6880b5128d10a33..e49240fb53d17f830fca7bf9efb278f83075dfe7 100644 (file)
@@ -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 {
@@ -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 {
index 76e94bab3ea2830ea576abd3023034e0b81bb77d..3811629aad681e516f6e77c0b5ef6a8ad7a8f93f 100644 (file)
@@ -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) {