From 813d953eebc2c2cf9d7622eb9a5a2f8a39bf462c Mon Sep 17 00:00:00 2001 From: Johannes Lauinger Date: Sun, 31 May 2020 21:32:17 +0200 Subject: [PATCH 1/2] fix possible memory confusion in unsafe slice cast --- util/util_unsafe.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util/util_unsafe.go b/util/util_unsafe.go index beeae29..e604c75 100644 --- a/util/util_unsafe.go +++ b/util/util_unsafe.go @@ -4,6 +4,7 @@ package util import ( "reflect" + "runtime" "unsafe" ) @@ -14,7 +15,12 @@ func BytesToReadOnlyString(b []byte) string { // StringToReadOnlyBytes returns bytes converted from given string. func StringToReadOnlyBytes(s string) []byte { + b := make([]byte, 0) sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) - bh := reflect.SliceHeader{Data: sh.Data, Len: sh.Len, Cap: sh.Len} - return *(*[]byte)(unsafe.Pointer(&bh)) + bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bh.Data = sh.Data + bh.Cap = sh.Len + bh.Len = sh.Len + runtime.KeepAlive(s) + return b } From 214153756107199cc9141812af3c7dca22440dc2 Mon Sep 17 00:00:00 2001 From: Johannes Lauinger Date: Wed, 3 Jun 2020 15:45:44 +0200 Subject: [PATCH 2/2] update util_unsafe.go to use simpler, yet still safe, cast --- util/util_unsafe.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/util/util_unsafe.go b/util/util_unsafe.go index e604c75..d098811 100644 --- a/util/util_unsafe.go +++ b/util/util_unsafe.go @@ -4,7 +4,6 @@ package util import ( "reflect" - "runtime" "unsafe" ) @@ -14,13 +13,11 @@ func BytesToReadOnlyString(b []byte) string { } // StringToReadOnlyBytes returns bytes converted from given string. -func StringToReadOnlyBytes(s string) []byte { - b := make([]byte, 0) +func StringToReadOnlyBytes(s string) (bs []byte) { sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) - bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bh := (*reflect.SliceHeader)(unsafe.Pointer(&bs)) bh.Data = sh.Data bh.Cap = sh.Len bh.Len = sh.Len - runtime.KeepAlive(s) - return b + return }