Commit f753e3fa authored by Mike Solomon's avatar Mike Solomon Committed by Brad Fitzpatrick

textproto: prevent long lines in HTTP headers from causing HTTP 400 responses.

This fixes the issue without an extra copy in the average case.

R=golang-dev, ality, bradfitz
CC=golang-dev
https://golang.org/cl/5272049
parent cf7281e7
......@@ -50,8 +50,22 @@ func (r *Reader) ReadLineBytes() ([]byte, os.Error) {
func (r *Reader) readLineSlice() ([]byte, os.Error) {
r.closeDot()
line, _, err := r.R.ReadLine()
return line, err
var line []byte
for {
l, more, err := r.R.ReadLine()
if err != nil {
return nil, err
}
// Avoid the copy if the first call produced a full line.
if line == nil && !more {
return l, nil
}
line = append(line, l...)
if !more {
break
}
}
return line, nil
}
// ReadContinuedLine reads a possibly continued line from r,
......
......@@ -139,6 +139,23 @@ func TestReadMIMEHeader(t *testing.T) {
}
}
func TestLargeReadMIMEHeader(t *testing.T) {
data := make([]byte, 16*1024)
for i := 0; i < len(data); i++ {
data[i] = 'x'
}
sdata := string(data)
r := reader("Cookie: " + sdata + "\r\n\n")
m, err := r.ReadMIMEHeader()
if err != nil {
t.Fatalf("ReadMIMEHeader: %v", err)
}
cookie := m.Get("Cookie")
if cookie != sdata {
t.Fatalf("ReadMIMEHeader: %v bytes, want %v bytes", len(cookie), len(sdata))
}
}
type readResponseTest struct {
in string
inCode int
......
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