mirror of
https://github.com/golang/go
synced 2024-11-18 01:04:48 -07:00
internal/saferio: handle potential total size overflow in SliceCap
Before the change, "SliceCap((*int64)(nil), 1<<62)" returns 1<<62.
That's because "uintptr(c)*size" overflows and gives 0 which is less
than the "chunk". SliceCap should return -1 in this case.
Change-Id: I4e99224c8ac0fc72032c6be86d7318d33d083cd8
GitHub-Last-Rev: ca30bcce45
GitHub-Pull-Request: golang/go#55870
Reviewed-on: https://go-review.googlesource.com/c/go/+/434335
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
bd8a5b00fc
commit
4da2bc2eeb
@ -121,8 +121,11 @@ func SliceCap(v any, c uint64) int {
|
|||||||
if typ.Kind() != reflect.Ptr {
|
if typ.Kind() != reflect.Ptr {
|
||||||
panic("SliceCap called with non-pointer type")
|
panic("SliceCap called with non-pointer type")
|
||||||
}
|
}
|
||||||
size := typ.Elem().Size()
|
size := uint64(typ.Elem().Size())
|
||||||
if uintptr(c)*size > chunk {
|
if size > 0 && c > (1<<64-1)/size {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if c*size > chunk {
|
||||||
c = uint64(chunk / size)
|
c = uint64(chunk / size)
|
||||||
if c == 0 {
|
if c == 0 {
|
||||||
c = 1
|
c = 1
|
||||||
|
@ -126,4 +126,11 @@ func TestSliceCap(t *testing.T) {
|
|||||||
t.Errorf("SliceCap returned %d, expected failure", c)
|
t.Errorf("SliceCap returned %d, expected failure", c)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("overflow", func(t *testing.T) {
|
||||||
|
c := SliceCap((*int64)(nil), 1<<62)
|
||||||
|
if c >= 0 {
|
||||||
|
t.Errorf("SliceCap returned %d, expected failure", c)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user