From c6728643e64a5eaa407930c1c8c80f05aa3890e2 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Mon, 6 Mar 2023 17:34:14 -0800 Subject: [PATCH] reflect: loosen unaddressable array rules for Copy() --- src/reflect/value.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index a30d8f77..6ed8cbfc 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1199,6 +1199,11 @@ func Copy(dst, src Value) int { panic("Copy: type mismatch: " + dst.typecode.String() + "/" + src.typecode.String()) } + // Can read from an unaddressable array but not write to one. + if dst.typecode.Kind() == Array && !dst.isIndirect() { + panic("reflect.Copy: unaddressable array value") + } + dstbuf, dstlen := buflen(dst) srcbuf, srclen := buflen(src) @@ -1216,10 +1221,10 @@ func buflen(v Value) (unsafe.Pointer, uintptr) { case Array: if v.isIndirect() { buf = v.value - len = uintptr(v.Len()) } else { - panic("reflect.Copy: unaddressable array value") + buf = unsafe.Pointer(&v.value) } + len = uintptr(v.Len()) case String: hdr := (*stringHeader)(v.value) buf = hdr.data