From 974236bda9b9aad87b4b10ec9af2cc01b14e382f Mon Sep 17 00:00:00 2001 From: qmuntal Date: Fri, 5 May 2023 18:17:18 +0200 Subject: os, syscall: support ill-formed UTF-16 strings on Windows Windows UTF-16 strings can contain unpaired surrogates, which can't be decoded into a valid UTF-8 string. This file defines a set of functions that can be used to encode and decode potentially ill-formed UTF-16 strings by using the [the WTF-8 encoding](https://simonsapin.github.io/wtf-8/). WTF-8 is a strict superset of UTF-8, i.e. any string that is well-formed in UTF-8 is also well-formed in WTF-8 and the content is unchanged. Also, the conversion never fails and is lossless. The benefit of using WTF-8 instead of UTF-8 when decoding a UTF-16 string is that the conversion is lossless even for ill-formed UTF-16 strings. This property allows to read an ill-formed UTF-16 string, convert it to a Go string, and convert it back to the same original UTF-16 string. Fixes #59971 Change-Id: Id6007f6e537844913402b233e73d698688cd5ba6 Reviewed-on: https://go-review.googlesource.com/c/go/+/493036 TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills Run-TryBot: Quim Muntal Reviewed-by: Cherry Mui Reviewed-by: Paul Hampson --- src/internal/syscall/execenv/execenv_windows.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/internal/syscall/execenv/execenv_windows.go') diff --git a/src/internal/syscall/execenv/execenv_windows.go b/src/internal/syscall/execenv/execenv_windows.go index 46ba12efc5..2a89ed1f58 100644 --- a/src/internal/syscall/execenv/execenv_windows.go +++ b/src/internal/syscall/execenv/execenv_windows.go @@ -9,7 +9,6 @@ package execenv import ( "internal/syscall/windows" "syscall" - "unicode/utf16" "unsafe" ) @@ -41,7 +40,7 @@ func Default(sys *syscall.SysProcAttr) (env []string, err error) { } entry := unsafe.Slice(blockp, (uintptr(end)-uintptr(unsafe.Pointer(blockp)))/2) - env = append(env, string(utf16.Decode(entry))) + env = append(env, syscall.UTF16ToString(entry)) blockp = (*uint16)(unsafe.Add(end, size)) } return -- cgit v1.3-5-g9baa