From 04b405c7fc99008b3cf90f4c067e81001af2de29 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Thu, 27 Jun 2013 10:11:30 +1000 Subject: [PATCH] syscall: handle empty environment variable values properly on windows Setenv("AN_ENV_VAR", "") deletes AN_ENV_VAR instead of setting it to "" at this moment. Also Getenv("AN_ENV_VAR") returns "not found", if AN_ENV_VAR is "". Change it, so they behave like unix. Fixes #5610 R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/10594043 --- src/pkg/syscall/env_windows.go | 13 +++---------- src/pkg/syscall/syscall_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 src/pkg/syscall/syscall_test.go diff --git a/src/pkg/syscall/env_windows.go b/src/pkg/syscall/env_windows.go index 39bd5022ef..420b387246 100644 --- a/src/pkg/syscall/env_windows.go +++ b/src/pkg/syscall/env_windows.go @@ -28,20 +28,13 @@ func Getenv(key string) (value string, found bool) { n = 0 } } - if n == 0 { - return "", false - } return string(utf16.Decode(b[0:n])), true } func Setenv(key, value string) error { - var v *uint16 - var err error - if len(value) > 0 { - v, err = UTF16PtrFromString(value) - if err != nil { - return err - } + v, err := UTF16PtrFromString(value) + if err != nil { + return err } keyp, err := UTF16PtrFromString(key) if err != nil { diff --git a/src/pkg/syscall/syscall_test.go b/src/pkg/syscall/syscall_test.go new file mode 100644 index 0000000000..2a39b54f1b --- /dev/null +++ b/src/pkg/syscall/syscall_test.go @@ -0,0 +1,30 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syscall_test + +import ( + "syscall" + "testing" +) + +func testSetGetenv(t *testing.T, key, value string) { + err := syscall.Setenv(key, value) + if err != nil { + t.Fatalf("Setenv failed to set %q: %v", value, err) + } + newvalue, found := syscall.Getenv(key) + if !found { + t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) + } + if newvalue != value { + t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) + } +} + +func TestEnv(t *testing.T) { + testSetGetenv(t, "TESTENV", "AVALUE") + // make sure TESTENV gets set to "", not deleted + testSetGetenv(t, "TESTENV", "") +} -- 2.48.1