aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/string.go
diff options
context:
space:
mode:
authorMartin Möhrmann <moehrmann@google.com>2018-02-18 14:12:52 +0100
committerMartin Möhrmann <moehrmann@google.com>2018-02-19 05:58:51 +0000
commitdfb0e4f6c744eb9bf629658bf7da313b2d1518e1 (patch)
treecf1d10cda3558d42ba307010dcca595710cbc378 /src/runtime/string.go
parenta4e950ec9ed4b862245451a5d167138c73d8c2e9 (diff)
downloadgo-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.go15
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 {