Skip to content

x/sys: windows token.Environ() unicode bug #65055

@xuyang2

Description

@xuyang2

Go version

go version go1.20.12 windows/amd64

Output of go env in your module/workspace:

set GO111MODULE=on
set GOARCH=amd64                               
set GOBIN=                                     
set GOCACHE=C:\Users\nobody\AppData\Local\go-build
set GOENV=C:\Users\nobody\AppData\Roaming\go\env  
set GOEXE=.exe                                 
set GOEXPERIMENT=                              
set GOFLAGS=                                   
set GOHOSTARCH=amd64                           
set GOHOSTOS=windows                           
set GOINSECURE=                                
set GOMODCACHE=C:\Users\nobody\go\pkg\mod         
set GONOPROXY=none
set GONOSUMDB=none
set GOOS=windows
set GOPATH=C:\Users\nobody\go
set GOPRIVATE=
set GOPROXY=https://goproxy.cn,direct
set GOROOT=D:\sdk\go\go1.20.12
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\sdk\go\go1.20.12\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.20.12
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=0
set GOMOD=D:\play-go\proc-demo\go.mod
set GOWORK=
set CGO_CFLAGS=-O2 -g
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-O2 -g
set CGO_FFLAGS=-O2 -g
set CGO_LDFLAGS=-O2 -g
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -fno-caret-diagnostics -Qunused-arguments -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=C:\Users\nobody\AppData\Local\Temp\go-build3786666021=/tmp/go-build -gno-record-gcc-switches

What did you do?

Set a non-ASCII JAVA_HOME system environment variable

# cmd.exe
set
...
JAVA_HOME=D:\投资监督系统\apache-tomcat\jdk
LOCALAPPDATA=C:\Windows\system32\config\systemprofile\AppData\Local
...

Run a command prompt in the Local System context

PsExec.exe -s -i cmd.exe

https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite

Compile and run this

package main

import (
	"log"

	"golang.org/x/sys/windows"
)

func main() {
	// run `query session` in cmd.exe to get actual sessionId
	var sessionId uint32 = 2

	var userToken windows.Token
	if err := windows.WTSQueryUserToken(sessionId, &userToken); err != nil {
		panic(err)
	}

	env, err := userToken.Environ(false)
	if err != nil {
		panic(err)
	}

	log.Printf("user env: %q", env)
}

What did you see happen?

with some env entry omitted:

2024/01/11 10:08:04 user env: [ ... "HOMEDRIVE=C:" "HOMEPATH=\\Users\\nobody" "JAVA_HOME=D:\\投资监督系统\\apache-tomcat\\jdk" "=C:\\Users\\nobody\\AppData\\Local" "LOGONSERVER=\\\\DESKTOP-******" ... ]

What did you expect to see?

2024/01/11 10:08:04 user env: [ ... "HOMEDRIVE=C:" "HOMEPATH=\\Users\\nobody" "JAVA_HOME=D:\\投资监督系统\\apache-tomcat\\jdk" "LOCALAPPDATA=C:\\Users\\nobody\\AppData\\Local" "LOGONSERVER=\\\\DESKTOP-******" ... ]

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions