]> Cypherpunks repositories - gostls13.git/commitdiff
mime/multipart: handle ReadForm(math.MaxInt64) better
authorRuss Cox <rsc@golang.org>
Thu, 3 Dec 2020 14:45:07 +0000 (09:45 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 3 Dec 2020 16:05:09 +0000 (16:05 +0000)
Returning an error about integer overflow is needlessly pedantic.
The meaning of ReadForm(MaxInt64) is easily understood
(accept a lot of data) and can be implemented.

Fixes #40430.

Change-Id: I8a522033dd9a2f9ad31dd2ad82cf08d553736ab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/275112
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/mime/multipart/formdata.go
src/mime/multipart/formdata_test.go
src/net/http/request_test.go

index 4eb31012941ac8eec0cfeb9e3ecc41ed7e2cffd8..9c42ea8c023b58ef42a617dc994b349653fbe241 100644 (file)
@@ -7,9 +7,9 @@ package multipart
 import (
        "bytes"
        "errors"
-       "fmt"
        "io"
        "io/ioutil"
+       "math"
        "net/textproto"
        "os"
 )
@@ -43,7 +43,11 @@ func (r *Reader) readForm(maxMemory int64) (_ *Form, err error) {
        // Reserve an additional 10 MB for non-file parts.
        maxValueBytes := maxMemory + int64(10<<20)
        if maxValueBytes <= 0 {
-               return nil, fmt.Errorf("multipart: integer overflow from maxMemory(%d) + 10MiB for non-file parts", maxMemory)
+               if maxMemory < 0 {
+                       maxValueBytes = 0
+               } else {
+                       maxValueBytes = math.MaxInt64
+               }
        }
        for {
                p, err := r.NextPart()
index 7112e0d3727fe0201368006cf95fe6ee382138f6..e3a3a3eae8e1565391b5a60745d3b7b477338b63 100644 (file)
@@ -53,20 +53,16 @@ func TestReadFormWithNamelessFile(t *testing.T) {
        }
 }
 
-// Issue 40430: Ensure that we report integer overflows in additions of maxMemory,
-// instead of silently and subtly failing without indication.
+// Issue 40430: Handle ReadForm(math.MaxInt64)
 func TestReadFormMaxMemoryOverflow(t *testing.T) {
        b := strings.NewReader(strings.ReplaceAll(messageWithTextContentType, "\n", "\r\n"))
        r := NewReader(b, boundary)
        f, err := r.ReadForm(math.MaxInt64)
-       if err == nil {
-               t.Fatal("Unexpected a non-nil error")
-       }
-       if f != nil {
-               t.Fatalf("Unexpected returned a non-nil form: %v\n", f)
+       if err != nil {
+               t.Fatalf("ReadForm(MaxInt64): %v", err)
        }
-       if g, w := err.Error(), "integer overflow from maxMemory"; !strings.Contains(g, w) {
-               t.Errorf(`Error mismatch\n%q\ndid not contain\n%q`, g, w)
+       if f == nil {
+               t.Fatal("ReadForm(MaxInt64): missing form")
        }
 }
 
index 19526b9ad791adf1260d61e44f09e0dcbdd21531..689498e19d5dd8414848d7929f82e4a228004c66 100644 (file)
@@ -285,7 +285,7 @@ func TestMaxInt64ForMultipartFormMaxMemoryOverflow(t *testing.T) {
                t.Fatal(err)
        }
        res.Body.Close()
-       if g, w := res.StatusCode, StatusBadRequest; g != w {
+       if g, w := res.StatusCode, StatusOK; g != w {
                t.Fatalf("Status code mismatch: got %d, want %d", g, w)
        }
 }