From 249ced11f4536e669551c75d9d2212126b95363c Mon Sep 17 00:00:00 2001 From: 0xc0d Date: Mon, 23 Aug 2021 01:06:02 +0200 Subject: [PATCH 1/4] net/mail: Fix EOF error while reading header-only message --- src/net/mail/message.go | 7 +++++++ src/net/mail/message_test.go | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index 47bbf6ca9771bd..447c9028e073df 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -54,6 +54,13 @@ func ReadMessage(r io.Reader) (msg *Message, err error) { tp := textproto.NewReader(bufio.NewReader(r)) hdr, err := tp.ReadMIMEHeader() + // Header-Only messages + if err == io.EOF && len(hdr) > 0 { + return &Message{ + Header: Header(hdr), + Body: tp.R, + }, nil + } if err != nil { return nil, err } diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go index 80a17b2853ae45..b4e187bae7cfe5 100644 --- a/src/net/mail/message_test.go +++ b/src/net/mail/message_test.go @@ -39,6 +39,19 @@ So, "Hello". }, body: "This is a message just to say hello.\nSo, \"Hello\".\n", }, + { + // RFC 5965, Appendix B.1, a part of the multipart message (a header-only sub message) + in: `Feedback-Type: abuse +User-Agent: SomeGenerator/1.0 +Version: 1 +`, + header: Header{ + "Feedback-Type": []string{"abuse"}, + "User-Agent": []string{"SomeGenerator/1.0"}, + "Version": []string{"1"}, + }, + body: "", + }, } func TestParsing(t *testing.T) { From 90fd18645156d6045f331d3e5a9d9a60533bbc5e Mon Sep 17 00:00:00 2001 From: 0xc0d Date: Mon, 23 Aug 2021 01:22:02 +0200 Subject: [PATCH 2/4] net/mail: simplify the ReadMessage function --- src/net/mail/message.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index 447c9028e073df..fda4517c88d9fb 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -54,14 +54,7 @@ func ReadMessage(r io.Reader) (msg *Message, err error) { tp := textproto.NewReader(bufio.NewReader(r)) hdr, err := tp.ReadMIMEHeader() - // Header-Only messages - if err == io.EOF && len(hdr) > 0 { - return &Message{ - Header: Header(hdr), - Body: tp.R, - }, nil - } - if err != nil { + if err != nil && err != io.EOF { return nil, err } From 4dbbbc48d3f4d4d35bc375d863eff51f4982c65f Mon Sep 17 00:00:00 2001 From: 0xc0d Date: Mon, 23 Aug 2021 02:16:42 +0200 Subject: [PATCH 3/4] net/mail: ensure there is at least one header --- src/net/mail/message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index fda4517c88d9fb..97260392b60809 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -54,7 +54,7 @@ func ReadMessage(r io.Reader) (msg *Message, err error) { tp := textproto.NewReader(bufio.NewReader(r)) hdr, err := tp.ReadMIMEHeader() - if err != nil && err != io.EOF { + if err != nil && (err != io.EOF || len(hdr) == 0) { return nil, err } From 356a9420837bf7e247247f7dc7c8a1d218684aeb Mon Sep 17 00:00:00 2001 From: 0xc0d Date: Mon, 23 Aug 2021 02:20:47 +0200 Subject: [PATCH 4/4] net/mail: gofmt --- src/net/mail/message_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go index b4e187bae7cfe5..9624ce5b7c8cd3 100644 --- a/src/net/mail/message_test.go +++ b/src/net/mail/message_test.go @@ -47,8 +47,8 @@ Version: 1 `, header: Header{ "Feedback-Type": []string{"abuse"}, - "User-Agent": []string{"SomeGenerator/1.0"}, - "Version": []string{"1"}, + "User-Agent": []string{"SomeGenerator/1.0"}, + "Version": []string{"1"}, }, body: "", },