diff options
| author | Martin Möhrmann <moehrmann@google.com> | 2018-02-18 14:12:52 +0100 |
|---|---|---|
| committer | Martin Möhrmann <moehrmann@google.com> | 2018-02-19 05:58:51 +0000 |
| commit | dfb0e4f6c744eb9bf629658bf7da313b2d1518e1 (patch) | |
| tree | cf1d10cda3558d42ba307010dcca595710cbc378 /src/runtime/string.go | |
| parent | a4e950ec9ed4b862245451a5d167138c73d8c2e9 (diff) | |
| download | go-dfb0e4f6c744eb9bf629658bf7da313b2d1518e1.tar.xz | |
runtime: avoid clearing memory during byte slice allocation in gobytes
Avoid using make in gobytes which clears the byte slice backing
array unnecessarily since the content is overwritten immediately again.
Check that the user provided length is positive and below the maximum
allowed allocation size explicitly in gobytes as this was done in makeslice
before this change.
Fixes #23634
Change-Id: Id852619e932aabfc468871c42ad07d34da91f45c
Reviewed-on: https://go-review.googlesource.com/94760
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/string.go')
| -rw-r--r-- | src/runtime/string.go | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/runtime/string.go b/src/runtime/string.go index 97909196e9..cfe2959b36 100644 --- a/src/runtime/string.go +++ b/src/runtime/string.go @@ -280,13 +280,20 @@ func rawruneslice(size int) (b []rune) { } // used by cmd/cgo -func gobytes(p *byte, n int) []byte { +func gobytes(p *byte, n int) (b []byte) { if n == 0 { return make([]byte, 0) } - x := make([]byte, n) - memmove(unsafe.Pointer(&x[0]), unsafe.Pointer(p), uintptr(n)) - return x + + if n < 0 || uintptr(n) > maxAlloc { + panic(errorString("gobytes: length out of range")) + } + + bp := mallocgc(uintptr(n), nil, false) + memmove(bp, unsafe.Pointer(p), uintptr(n)) + + *(*slice)(unsafe.Pointer(&b)) = slice{bp, n, n} + return } func gostring(p *byte) string { |
