mirror of
https://github.com/minio/minio.git
synced 2024-12-25 22:55:54 -05:00
Buffconn should buffer upto maxHeaderBytes to avoid ErrBufferFull (#7017)
It can happen with erroneous clients which do not send `Host:` header until 4k worth of header bytes have been read. This can lead to Peek() method of bufio to fail with ErrBufferFull. To avoid this we should make sure that Peek buffer is as large as our maxHeaderBytes count.
This commit is contained in:
parent
b9b68e9331
commit
a536cf5dc0
@ -99,10 +99,10 @@ func (c *BufConn) Write(b []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newBufConn - creates a new connection object wrapping net.Conn.
|
// newBufConn - creates a new connection object wrapping net.Conn.
|
||||||
func newBufConn(c net.Conn, readTimeout, writeTimeout time.Duration) *BufConn {
|
func newBufConn(c net.Conn, readTimeout, writeTimeout time.Duration, maxHeaderBytes int) *BufConn {
|
||||||
return &BufConn{
|
return &BufConn{
|
||||||
QuirkConn: QuirkConn{Conn: c},
|
QuirkConn: QuirkConn{Conn: c},
|
||||||
bufReader: bufio.NewReader(c),
|
bufReader: bufio.NewReaderSize(c, maxHeaderBytes),
|
||||||
readTimeout: readTimeout,
|
readTimeout: readTimeout,
|
||||||
writeTimeout: writeTimeout,
|
writeTimeout: writeTimeout,
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ func TestBuffConnReadTimeout(t *testing.T) {
|
|||||||
t.Errorf("failed to accept new connection. %v", terr)
|
t.Errorf("failed to accept new connection. %v", terr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bufconn := newBufConn(tcpConn, 1*time.Second, 1*time.Second)
|
bufconn := newBufConn(tcpConn, 1*time.Second, 1*time.Second, 4096)
|
||||||
defer bufconn.Close()
|
defer bufconn.Close()
|
||||||
|
|
||||||
// Read a line
|
// Read a line
|
||||||
|
@ -222,7 +222,7 @@ func (listener *httpListener) start() {
|
|||||||
tcpConn.SetKeepAlive(true)
|
tcpConn.SetKeepAlive(true)
|
||||||
tcpConn.SetKeepAlivePeriod(listener.tcpKeepAliveTimeout)
|
tcpConn.SetKeepAlivePeriod(listener.tcpKeepAliveTimeout)
|
||||||
|
|
||||||
bufconn := newBufConn(tcpConn, listener.readTimeout, listener.writeTimeout)
|
bufconn := newBufConn(tcpConn, listener.readTimeout, listener.writeTimeout, listener.maxHeaderBytes)
|
||||||
if listener.tlsConfig != nil {
|
if listener.tlsConfig != nil {
|
||||||
ok, err := getPlainText(bufconn)
|
ok, err := getPlainText(bufconn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -261,7 +261,7 @@ func (listener *httpListener) start() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
bufconn = newBufConn(tlsConn, listener.readTimeout, listener.writeTimeout)
|
bufconn = newBufConn(tlsConn, listener.readTimeout, listener.writeTimeout, listener.maxHeaderBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
method, resource, host, err := getMethodResourceHost(bufconn, listener.maxHeaderBytes)
|
method, resource, host, err := getMethodResourceHost(bufconn, listener.maxHeaderBytes)
|
||||||
|
Loading…
Reference in New Issue
Block a user