Commit 2af114ab authored by Filippo Valsorda's avatar Filippo Valsorda

[release-branch.go1.12] all: merge release-branch.go1.12-security into release-branch.go1.12

Change-Id: I6c822dfc305d629022c7da21ab399367bf021cf7
parents cf06b9aa 6c15c7cc
go1.12.9 go1.12.10
\ No newline at end of file \ No newline at end of file
...@@ -98,6 +98,13 @@ See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.9+labe ...@@ -98,6 +98,13 @@ See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.9+labe
1.12.9 milestone</a> on our issue tracker for details. 1.12.9 milestone</a> on our issue tracker for details.
</p> </p>
<p>
go1.12.10 (released 2019/09/25) includes security fixes to the
<code>net/http</code> and <code>net/textproto</code> packages.
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.10">Go
1.12.10 milestone</a> on our issue tracker for details.
</p>
<h2 id="go1.11">go1.11 (released 2018/08/24)</h2> <h2 id="go1.11">go1.11 (released 2018/08/24)</h2>
<p> <p>
......
...@@ -4748,6 +4748,10 @@ func TestServerValidatesHeaders(t *testing.T) { ...@@ -4748,6 +4748,10 @@ func TestServerValidatesHeaders(t *testing.T) {
{"foo\xffbar: foo\r\n", 400}, // binary in header {"foo\xffbar: foo\r\n", 400}, // binary in header
{"foo\x00bar: foo\r\n", 400}, // binary in header {"foo\x00bar: foo\r\n", 400}, // binary in header
{"Foo: " + strings.Repeat("x", 1<<21) + "\r\n", 431}, // header too large {"Foo: " + strings.Repeat("x", 1<<21) + "\r\n", 431}, // header too large
// Spaces between the header key and colon are not allowed.
// See RFC 7230, Section 3.2.4.
{"Foo : bar\r\n", 400},
{"Foo\t: bar\r\n", 400},
{"foo: foo foo\r\n", 200}, // LWS space is okay {"foo: foo foo\r\n", 200}, // LWS space is okay
{"foo: foo\tfoo\r\n", 200}, // LWS tab is okay {"foo: foo\tfoo\r\n", 200}, // LWS tab is okay
......
...@@ -5133,3 +5133,30 @@ func TestTransportIgnores408(t *testing.T) { ...@@ -5133,3 +5133,30 @@ func TestTransportIgnores408(t *testing.T) {
} }
t.Fatalf("timeout after %v waiting for Transport connections to die off", time.Since(t0)) t.Fatalf("timeout after %v waiting for Transport connections to die off", time.Since(t0))
} }
func TestInvalidHeaderResponse(t *testing.T) {
setParallel(t)
defer afterTest(t)
cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
conn, buf, _ := w.(Hijacker).Hijack()
buf.Write([]byte("HTTP/1.1 200 OK\r\n" +
"Date: Wed, 30 Aug 2017 19:09:27 GMT\r\n" +
"Content-Type: text/html; charset=utf-8\r\n" +
"Content-Length: 0\r\n" +
"Foo : bar\r\n\r\n"))
buf.Flush()
conn.Close()
}))
defer cst.close()
res, err := cst.c.Get(cst.ts.URL)
if err != nil {
t.Fatal(err)
}
defer res.Body.Close()
if v := res.Header.Get("Foo"); v != "" {
t.Errorf(`unexpected "Foo" header: %q`, v)
}
if v := res.Header.Get("Foo "); v != "bar" {
t.Errorf(`bad "Foo " header value: %q, want %q`, v, "bar")
}
}
...@@ -493,18 +493,12 @@ func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) { ...@@ -493,18 +493,12 @@ func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) {
return m, err return m, err
} }
// Key ends at first colon; should not have trailing spaces // Key ends at first colon.
// but they appear in the wild, violating specs, so we remove
// them if present.
i := bytes.IndexByte(kv, ':') i := bytes.IndexByte(kv, ':')
if i < 0 { if i < 0 {
return m, ProtocolError("malformed MIME header line: " + string(kv)) return m, ProtocolError("malformed MIME header line: " + string(kv))
} }
endKey := i key := canonicalMIMEHeaderKey(kv[:i])
for endKey > 0 && kv[endKey-1] == ' ' {
endKey--
}
key := canonicalMIMEHeaderKey(kv[:endKey])
// As per RFC 7230 field-name is a token, tokens consist of one or more chars. // As per RFC 7230 field-name is a token, tokens consist of one or more chars.
// We could return a ProtocolError here, but better to be liberal in what we // We could return a ProtocolError here, but better to be liberal in what we
......
...@@ -188,11 +188,10 @@ func TestLargeReadMIMEHeader(t *testing.T) { ...@@ -188,11 +188,10 @@ func TestLargeReadMIMEHeader(t *testing.T) {
} }
} }
// Test that we read slightly-bogus MIME headers seen in the wild, // TestReadMIMEHeaderNonCompliant checks that we don't normalize headers
// with spaces before colons, and spaces in keys. // with spaces before colons, and accept spaces in keys.
func TestReadMIMEHeaderNonCompliant(t *testing.T) { func TestReadMIMEHeaderNonCompliant(t *testing.T) {
// Invalid HTTP response header as sent by an Axis security // These invalid headers will be rejected by net/http according to RFC 7230.
// camera: (this is handled by IE, Firefox, Chrome, curl, etc.)
r := reader("Foo: bar\r\n" + r := reader("Foo: bar\r\n" +
"Content-Language: en\r\n" + "Content-Language: en\r\n" +
"SID : 0\r\n" + "SID : 0\r\n" +
...@@ -202,9 +201,9 @@ func TestReadMIMEHeaderNonCompliant(t *testing.T) { ...@@ -202,9 +201,9 @@ func TestReadMIMEHeaderNonCompliant(t *testing.T) {
want := MIMEHeader{ want := MIMEHeader{
"Foo": {"bar"}, "Foo": {"bar"},
"Content-Language": {"en"}, "Content-Language": {"en"},
"Sid": {"0"}, "SID ": {"0"},
"Audio Mode": {"None"}, "Audio Mode ": {"None"},
"Privilege": {"127"}, "Privilege ": {"127"},
} }
if !reflect.DeepEqual(m, want) || err != nil { if !reflect.DeepEqual(m, want) || err != nil {
t.Fatalf("ReadMIMEHeader =\n%v, %v; want:\n%v", m, err, want) t.Fatalf("ReadMIMEHeader =\n%v, %v; want:\n%v", m, err, want)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment