Przeglądaj źródła

Merge pull request #13 from jlauinger/fix-unsafe-slice-cast

fix possible memory confusion in unsafe slice cast
Tao Wen 5 lat temu
rodzic
commit
f721678cae
1 zmienionych plików z 7 dodań i 6 usunięć
  1. 7 6
      reflect2.go

+ 7 - 6
reflect2.go

@@ -288,11 +288,12 @@ func NoEscape(p unsafe.Pointer) unsafe.Pointer {
 }
 
 func UnsafeCastString(str string) []byte {
+	bytes := make([]byte, 0)
 	stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&str))
-	sliceHeader := &reflect.SliceHeader{
-		Data: stringHeader.Data,
-		Cap: stringHeader.Len,
-		Len: stringHeader.Len,
-	}
-	return *(*[]byte)(unsafe.Pointer(sliceHeader))
+	sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&bytes))
+	sliceHeader.Data = stringHeader.Data
+	sliceHeader.Cap = stringHeader.Len
+	sliceHeader.Len = stringHeader.Len
+	runtime.KeepAlive(str)
+	return bytes
 }