mirror of
https://github.com/golang/go
synced 2024-11-26 09:58:04 -07:00
mime/multipart: handle ReadForm(math.MaxInt64) better
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>
This commit is contained in:
parent
07cba70d57
commit
5246fa5e75
@ -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()
|
||||
|
@ -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 err != nil {
|
||||
t.Fatalf("ReadForm(MaxInt64): %v", err)
|
||||
}
|
||||
if f != nil {
|
||||
t.Fatalf("Unexpected returned a non-nil form: %v\n", f)
|
||||
}
|
||||
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")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user