From: Didier Spezia Date: Sat, 10 Oct 2015 16:53:09 +0000 (+0000) Subject: net/textproto: properly trim continued lines in MIME headers X-Git-Tag: go1.6beta1~857 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6f772787f97720aeeb98d37b2c63b1a3155588d1;p=gostls13.git net/textproto: properly trim continued lines in MIME headers A MIME header can include values defined on several lines. Only the first line of each value was trimmed. Make sure all the lines are trimmed before being aggregated. Fixes #11204 Change-Id: Id92f384044bc6c4ca836e5dba2081fe82c82dc85 Reviewed-on: https://go-review.googlesource.com/15683 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go index 91303fec61..17edfadad2 100644 --- a/src/net/textproto/reader.go +++ b/src/net/textproto/reader.go @@ -150,7 +150,7 @@ func (r *Reader) readContinuedLineSlice() ([]byte, error) { break } r.buf = append(r.buf, ' ') - r.buf = append(r.buf, line...) + r.buf = append(r.buf, trim(line)...) } return r.buf, nil } diff --git a/src/net/textproto/reader_test.go b/src/net/textproto/reader_test.go index 8fce7ddeb1..db7d8ab41c 100644 --- a/src/net/textproto/reader_test.go +++ b/src/net/textproto/reader_test.go @@ -205,6 +205,32 @@ func TestReadMIMEHeaderNonCompliant(t *testing.T) { } } +// Test that continued lines are properly trimmed. Issue 11204. +func TestReadMIMEHeaderTrimContinued(t *testing.T) { + // In this header, \n and \r\n terminated lines are mixed on purpose. + // We expect each line to be trimmed (prefix and suffix) before being concatenated. + // Keep the spaces as they are. + r := reader("" + // for code formatting purpose. + "a:\n" + + " 0 \r\n" + + "b:1 \t\r\n" + + "c: 2\r\n" + + " 3\t\n" + + " \t 4 \r\n\n") + m, err := r.ReadMIMEHeader() + if err != nil { + t.Fatal(err) + } + want := MIMEHeader{ + "A": {"0"}, + "B": {"1"}, + "C": {"2 3 4"}, + } + if !reflect.DeepEqual(m, want) { + t.Fatalf("ReadMIMEHeader mismatch.\n got: %q\nwant: %q", m, want) + } +} + type readResponseTest struct { in string inCode int