]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: don't panic on very large MaxBytesReaderLimit
authorcuiweixie <cuiweixie@gmail.com>
Fri, 12 Aug 2022 16:47:31 +0000 (16:47 +0000)
committerGopher Robot <gobot@golang.org>
Fri, 26 Aug 2022 18:17:27 +0000 (18:17 +0000)
Fixes #54408

Change-Id: I454199ae5bcd087b8fc4169b7622412105e71113
GitHub-Last-Rev: a33fe7e206d0c394440962acd360df3aa9b117c3
GitHub-Pull-Request: golang/go#54415
Reviewed-on: https://go-review.googlesource.com/c/go/+/423314
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
Run-TryBot: xie cui <523516579@qq.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: hopehook <hopehook@qq.com>
src/net/http/request.go
src/net/http/request_test.go

index a03a54b9437870e4cacf865033afd51cde277009..924ca1b390bf084cd805d8a12574b163e0428ee8 100644 (file)
@@ -1169,7 +1169,8 @@ func (l *maxBytesReader) Read(p []byte) (n int, err error) {
        // If they asked for a 32KB byte read but only 5 bytes are
        // remaining, no need to read 32KB. 6 bytes will answer the
        // question of the whether we hit the limit or go past it.
-       if int64(len(p)) > l.n+1 {
+       // 0 < len(p) < 2^63
+       if int64(len(p))-1 > l.n {
                p = p[:l.n+1]
        }
        n, err = l.r.Read(p)
index ce673d34a232856ae6fa6a7332312e79ef4cfb7e..672c01c38753fc1fdef308bdbd5558890576989f 100644 (file)
@@ -982,6 +982,12 @@ func TestMaxBytesReaderDifferentLimits(t *testing.T) {
                        wantN:   len(testStr),
                        wantErr: false,
                },
+               10: { /* Issue 54408 */
+                       limit:   int64(1<<63-1),
+                       lenP:    len(testStr),
+                       wantN:   len(testStr),
+                       wantErr: false,
+               },
        }
        for i, tt := range tests {
                rc := MaxBytesReader(nil, io.NopCloser(strings.NewReader(testStr)), tt.limit)