Signed-off-by: Shijiang Wei <mountkin@gmail.com>
| ... | ... |
@@ -48,13 +48,18 @@ func (l *MalformedHostHeaderOverrideConn) Read(b []byte) (n int, err error) {
|
| 48 | 48 |
firstLineFeed = -1 |
| 49 | 49 |
buf []byte |
| 50 | 50 |
) |
| 51 |
- for i, bb := range b[:c] {
|
|
| 52 |
- if bb == '\n' && firstLineFeed == -1 {
|
|
| 51 |
+ for i := 0; i <= c-1-7; i++ {
|
|
| 52 |
+ if b[i] == '\n' && firstLineFeed == -1 {
|
|
| 53 | 53 |
firstLineFeed = i |
| 54 | 54 |
} |
| 55 |
- if bb != '\n' {
|
|
| 55 |
+ if b[i] != '\n' {
|
|
| 56 | 56 |
continue |
| 57 | 57 |
} |
| 58 |
+ |
|
| 59 |
+ if b[i+1] == '\r' && b[i+2] == '\n' {
|
|
| 60 |
+ return c, nil |
|
| 61 |
+ } |
|
| 62 |
+ |
|
| 58 | 63 |
if b[i+1] != 'H' {
|
| 59 | 64 |
continue |
| 60 | 65 |
} |
| ... | ... |
@@ -10,8 +10,16 @@ import ( |
| 10 | 10 |
"testing" |
| 11 | 11 |
) |
| 12 | 12 |
|
| 13 |
+type bufConn struct {
|
|
| 14 |
+ net.Conn |
|
| 15 |
+ buf *bytes.Buffer |
|
| 16 |
+} |
|
| 17 |
+ |
|
| 18 |
+func (bc *bufConn) Read(b []byte) (int, error) {
|
|
| 19 |
+ return bc.buf.Read(b) |
|
| 20 |
+} |
|
| 21 |
+ |
|
| 13 | 22 |
func TestHeaderOverrideHack(t *testing.T) {
|
| 14 |
- client, srv := net.Pipe() |
|
| 15 | 23 |
tests := [][2][]byte{
|
| 16 | 24 |
{
|
| 17 | 25 |
[]byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"),
|
| ... | ... |
@@ -34,13 +42,19 @@ func TestHeaderOverrideHack(t *testing.T) {
|
| 34 | 34 |
[]byte("GET /foo\nFoo: Bar\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"),
|
| 35 | 35 |
}, |
| 36 | 36 |
} |
| 37 |
- l := MalformedHostHeaderOverrideConn{client, true}
|
|
| 38 |
- read := make([]byte, 4096) |
|
| 37 |
+ |
|
| 38 |
+ // Test for https://github.com/docker/docker/issues/23045 |
|
| 39 |
+ h0 := "GET /foo\nUser-Agent: Docker\r\n\r\n" |
|
| 40 |
+ h0 = h0 + strings.Repeat("a", 4096-len(h0)-1) + "\n"
|
|
| 41 |
+ tests = append(tests, [2][]byte{[]byte(h0), []byte(h0)})
|
|
| 39 | 42 |
|
| 40 | 43 |
for _, pair := range tests {
|
| 41 |
- go func(x []byte) {
|
|
| 42 |
- srv.Write(x) |
|
| 43 |
- }(pair[0]) |
|
| 44 |
+ read := make([]byte, 4096) |
|
| 45 |
+ client := &bufConn{
|
|
| 46 |
+ buf: bytes.NewBuffer(pair[0]), |
|
| 47 |
+ } |
|
| 48 |
+ l := MalformedHostHeaderOverrideConn{client, true}
|
|
| 49 |
+ |
|
| 44 | 50 |
n, err := l.Read(read) |
| 45 | 51 |
if err != nil && err != io.EOF {
|
| 46 | 52 |
t.Fatalf("read: %d - %d, err: %v\n%s", n, len(pair[0]), err, string(read[:n]))
|
| ... | ... |
@@ -48,12 +62,7 @@ func TestHeaderOverrideHack(t *testing.T) {
|
| 48 | 48 |
if !bytes.Equal(read[:n], pair[1][:n]) {
|
| 49 | 49 |
t.Fatalf("\n%s\n%s\n", read[:n], pair[1][:n])
|
| 50 | 50 |
} |
| 51 |
- l.first = true |
|
| 52 |
- // clean out the slice |
|
| 53 |
- read = read[:0] |
|
| 54 | 51 |
} |
| 55 |
- srv.Close() |
|
| 56 |
- l.Close() |
|
| 57 | 52 |
} |
| 58 | 53 |
|
| 59 | 54 |
func BenchmarkWithHack(b *testing.B) {
|