From: Martin Möhrmann Date: Sun, 18 Feb 2018 13:12:52 +0000 (+0100) Subject: runtime: avoid clearing memory during byte slice allocation in gobytes X-Git-Tag: go1.11beta1~1558 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=dfb0e4f6c744eb9bf629658bf7da313b2d1518e1;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- 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 {