]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/internal: return unexpected EOF on incomplete chunk read
authorAlexander Yastrebov <yastrebov.alex@gmail.com>
Sat, 16 Oct 2021 02:19:20 +0000 (02:19 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Wed, 20 Oct 2021 07:21:22 +0000 (07:21 +0000)
Fixes #48861

Change-Id: I3f55bfbdc4f2cf5b33d1ab2d76e01335bb497c6f
GitHub-Last-Rev: 0ecd790b87ddd31d0cf08e8f2726f918a2edd1fb
GitHub-Pull-Request: golang/go#48903
Reviewed-on: https://go-review.googlesource.com/c/go/+/355029
Trust: Damien Neil <dneil@google.com>
Trust: Daniel Martí <mvdan@mvdan.cc>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
src/net/http/internal/chunked.go
src/net/http/internal/chunked_test.go

index 923e6a6d2cb0c621d87e4674a19bda642756ffde..37a72e9031a1127f573d3f34f42d1ad0740593ae 100644 (file)
@@ -81,6 +81,11 @@ func (cr *chunkedReader) Read(b []uint8) (n int, err error) {
                                        cr.err = errors.New("malformed chunked encoding")
                                        break
                                }
+                       } else {
+                               if cr.err == io.EOF {
+                                       cr.err = io.ErrUnexpectedEOF
+                               }
+                               break
                        }
                        cr.checkEnd = false
                }
@@ -109,6 +114,8 @@ func (cr *chunkedReader) Read(b []uint8) (n int, err error) {
                // bytes to verify they are "\r\n".
                if cr.n == 0 && cr.err == nil {
                        cr.checkEnd = true
+               } else if cr.err == io.EOF {
+                       cr.err = io.ErrUnexpectedEOF
                }
        }
        return n, cr.err
index 08152ed1e24d67cbc439a4d90ffbe65682144ad6..5e29a786dd61e42d9380df0aaa6bf9d343293fa3 100644 (file)
@@ -11,6 +11,7 @@ import (
        "io"
        "strings"
        "testing"
+       "testing/iotest"
 )
 
 func TestChunk(t *testing.T) {
@@ -211,3 +212,30 @@ func TestChunkReadPartial(t *testing.T) {
        }
 
 }
+
+// Issue 48861: ChunkedReader should report incomplete chunks
+func TestIncompleteChunk(t *testing.T) {
+       const valid = "4\r\nabcd\r\n" + "5\r\nabc\r\n\r\n" + "0\r\n"
+
+       for i := 0; i < len(valid); i++ {
+               incomplete := valid[:i]
+               r := NewChunkedReader(strings.NewReader(incomplete))
+               if _, err := io.ReadAll(r); err != io.ErrUnexpectedEOF {
+                       t.Errorf("expected io.ErrUnexpectedEOF for %q, got %v", incomplete, err)
+               }
+       }
+
+       r := NewChunkedReader(strings.NewReader(valid))
+       if _, err := io.ReadAll(r); err != nil {
+               t.Errorf("unexpected error for %q: %v", valid, err)
+       }
+}
+
+func TestChunkEndReadError(t *testing.T) {
+       readErr := fmt.Errorf("chunk end read error")
+
+       r := NewChunkedReader(io.MultiReader(strings.NewReader("4\r\nabcd"), iotest.ErrReader(readErr)))
+       if _, err := io.ReadAll(r); err != readErr {
+               t.Errorf("expected %v, got %v", readErr, err)
+       }
+}