]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: look up runtime env variables case insensitively on Windows
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 2 Nov 2018 15:47:40 +0000 (15:47 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 2 Nov 2018 17:05:38 +0000 (17:05 +0000)
Fixes #28557

Change-Id: Ifca958b78e8c62fbc66515e693f528d799e8e84b
Reviewed-on: https://go-review.googlesource.com/c/147039
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/env_posix.go

index a2daeb7f273dc542cf6243a6b571a7bb25dccb69..03208c7c10f239686e10f3d69dc824506a78bf9f 100644 (file)
@@ -14,13 +14,36 @@ func gogetenv(key string) string {
                throw("getenv before env init")
        }
        for _, s := range env {
-               if len(s) > len(key) && s[len(key)] == '=' && s[:len(key)] == key {
+               if len(s) > len(key) && s[len(key)] == '=' && envKeyEqual(s[:len(key)], key) {
                        return s[len(key)+1:]
                }
        }
        return ""
 }
 
+// envKeyEqual reports whether a == b, with ASCII-only case insensitivity
+// on Windows. The two strings must have the same length.
+func envKeyEqual(a, b string) bool {
+       if GOOS == "windows" { // case insensitive
+               for i := 0; i < len(a); i++ {
+                       ca, cb := a[i], b[i]
+                       if ca == cb || lowerASCII(ca) == lowerASCII(cb) {
+                               continue
+                       }
+                       return false
+               }
+               return true
+       }
+       return a == b
+}
+
+func lowerASCII(c byte) byte {
+       if 'A' <= c && c <= 'Z' {
+               return c + ('a' - 'A')
+       }
+       return c
+}
+
 var _cgo_setenv unsafe.Pointer   // pointer to C function
 var _cgo_unsetenv unsafe.Pointer // pointer to C function