libgo: update to Go 1.6.1 release
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 13 Apr 2016 19:11:16 +0000 (19:11 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 13 Apr 2016 19:11:16 +0000 (19:11 +0000)
    Reviewed-on: https://go-review.googlesource.com/22007

From-SVN: r234958

13 files changed:
gcc/go/gofrontend/MERGE
libgo/MERGE
libgo/VERSION
libgo/go/crypto/dsa/dsa.go
libgo/go/crypto/ecdsa/ecdsa.go
libgo/go/crypto/rsa/rsa.go
libgo/go/go/build/deps_test.go
libgo/go/internal/syscall/windows/registry/syscall.go
libgo/go/internal/syscall/windows/registry/zsyscall_windows.go
libgo/go/internal/syscall/windows/syscall_windows.go
libgo/go/internal/syscall/windows/sysdll/sysdll.go [new file with mode: 0644]
libgo/go/internal/syscall/windows/zsyscall_windows.go
libgo/go/runtime/export_windows_test.go

index cc386134d146be8d1fe86b10a0a87bfc0567e8e5..ce20dad142f7dcbc8423b8d482da3662bdf9d485 100644 (file)
@@ -1,4 +1,4 @@
-8e7b5e777333fa4cd070d96e94ea82e3e1132739
+ff29ea8e4e69eb94958aef4388da09a61b2b52b6
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 3cb26c37c07deaa51b4b97629fb7909397854b22..a40967cea246fe63f9e71a5c2818c53139dbaa4d 100644 (file)
@@ -1,4 +1,4 @@
-7bc40ffb05d8813bf9b41a331b45d37216f9e747
+f5cf5673590a68c55b2330df9dfcdd6fac75b893
 
 The first line of this file holds the git revision number of the
 last merge done from the master library sources.
index 0be00434da52a0f8ec972e3ee0a5abf702a117d9..e1bf218d1df385d3380e281e07ab51d25db3fc21 100644 (file)
@@ -1 +1 @@
-go1.6
\ No newline at end of file
+go1.6.1
\ No newline at end of file
index 28e981b9dde5a3dfdad1194375c8f866e8e43a8f..9f414a470c79529af94a14a7377f0f5322d166f9 100644 (file)
@@ -249,6 +249,10 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
 func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {
        // FIPS 186-3, section 4.7
 
+       if pub.P.Sign() == 0 {
+               return false
+       }
+
        if r.Sign() < 1 || r.Cmp(pub.Q) >= 0 {
                return false
        }
index 0731f2b670345dc0336f231cafaf454647dc46dc..e54488c9cf6b699d4d8d5716101d278218400b06 100644 (file)
@@ -23,6 +23,7 @@ import (
        "crypto/elliptic"
        "crypto/sha512"
        "encoding/asn1"
+       "errors"
        "io"
        "math/big"
 )
@@ -140,6 +141,8 @@ func fermatInverse(k, N *big.Int) *big.Int {
        return new(big.Int).Exp(k, nMinus2, N)
 }
 
+var errZeroParam = errors.New("zero parameter")
+
 // Sign signs an arbitrary length hash (which should be the result of hashing a
 // larger message) using the private key, priv. It returns the signature as a
 // pair of integers. The security of the private key depends on the entropy of
@@ -180,7 +183,9 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
        // See [NSA] 3.4.1
        c := priv.PublicKey.Curve
        N := c.Params().N
-
+       if N.Sign() == 0 {
+               return nil, nil, errZeroParam
+       }
        var k, kInv *big.Int
        for {
                for {
@@ -193,7 +198,7 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
                        if in, ok := priv.Curve.(invertible); ok {
                                kInv = in.Inverse(k)
                        } else {
-                               kInv = fermatInverse(k, N)
+                               kInv = fermatInverse(k, N) // N != 0
                        }
 
                        r, _ = priv.Curve.ScalarBaseMult(k.Bytes())
@@ -207,7 +212,7 @@ func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err err
                s = new(big.Int).Mul(priv.D, r)
                s.Add(s, e)
                s.Mul(s, kInv)
-               s.Mod(s, N)
+               s.Mod(s, N) // N != 0
                if s.Sign() != 0 {
                        break
                }
index ee022b803ae21fffd6d67ed2922a883c6d56dcbf..0f487fe1524b2137cefd05a6ba90e1fee99e4ec6 100644 (file)
@@ -465,6 +465,9 @@ func decrypt(random io.Reader, priv *PrivateKey, c *big.Int) (m *big.Int, err er
                err = ErrDecryption
                return
        }
+       if priv.N.Sign() == 0 {
+               return nil, ErrDecryption
+       }
 
        var ir *big.Int
        if random != nil {
@@ -490,7 +493,7 @@ func decrypt(random io.Reader, priv *PrivateKey, c *big.Int) (m *big.Int, err er
                        }
                }
                bigE := big.NewInt(int64(priv.E))
-               rpowe := new(big.Int).Exp(r, bigE, priv.N)
+               rpowe := new(big.Int).Exp(r, bigE, priv.N) // N != 0
                cCopy := new(big.Int).Set(c)
                cCopy.Mul(cCopy, rpowe)
                cCopy.Mod(cCopy, priv.N)
index bd8b343adbe5a7ed2aa2d4331ac39958f29a7c2b..c7cd8804da7b75e68488e2a3bfcdd90455b426ac 100644 (file)
@@ -132,10 +132,10 @@ var pkgDeps = map[string][]string{
        // End of linear dependency definitions.
 
        // Operating system access.
-       "syscall":                           {"L0", "internal/race", "unicode/utf16"},
+       "syscall":                           {"L0", "internal/race", "internal/syscall/windows/sysdll", "unicode/utf16"},
        "internal/syscall/unix":             {"L0", "syscall"},
-       "internal/syscall/windows":          {"L0", "syscall"},
-       "internal/syscall/windows/registry": {"L0", "syscall", "unicode/utf16"},
+       "internal/syscall/windows":          {"L0", "syscall", "internal/syscall/windows/sysdll"},
+       "internal/syscall/windows/registry": {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"},
        "time":          {"L0", "syscall", "internal/syscall/windows/registry"},
        "os":            {"L1", "os", "syscall", "time", "internal/syscall/windows"},
        "path/filepath": {"L2", "os", "syscall"},
index 5426cae90963308313cc186026e9187dcd0b6b78..02d985cec90b0f9ccdf40179a9c5540a1f1f2d93 100644 (file)
@@ -8,7 +8,7 @@ package registry
 
 import "syscall"
 
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go -systemdll syscall.go
 
 const (
        _REG_OPTION_NON_VOLATILE = 0
index 9c17675a249a9c0e47eeb931cda9caba5b6b2cd2..7e473d4e1de7b2609cb645a05060f02e1803c205 100644 (file)
@@ -4,12 +4,13 @@ package registry
 
 import "unsafe"
 import "syscall"
+import "internal/syscall/windows/sysdll"
 
 var _ unsafe.Pointer
 
 var (
-       modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
-       modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+       modadvapi32 = syscall.NewLazyDLL(sysdll.Add("advapi32.dll"))
+       modkernel32 = syscall.NewLazyDLL(sysdll.Add("kernel32.dll"))
 
        procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW")
        procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW")
index 165e8945ec37a547d93c15992219eac2de0c5e4e..e6a3f238d884ff125e49a46b6deccea9df75f70e 100644 (file)
@@ -6,7 +6,7 @@ package windows
 
 import "syscall"
 
-//go:generate go run ../../../syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
+//go:generate go run ../../../syscall/mksyscall_windows.go -output zsyscall_windows.go -systemdll syscall_windows.go
 
 const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
 
diff --git a/libgo/go/internal/syscall/windows/sysdll/sysdll.go b/libgo/go/internal/syscall/windows/sysdll/sysdll.go
new file mode 100644 (file)
index 0000000..4e0018f
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2016 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 sysdll is an internal leaf package that records and reports
+// which Windows DLL names are used by Go itself. These DLLs are then
+// only loaded from the System32 directory. See Issue 14959.
+package sysdll
+
+// IsSystemDLL reports whether the named dll key (a base name, like
+// "foo.dll") is a system DLL which should only be loaded from the
+// Windows SYSTEM32 directory.
+//
+// Filenames are case sensitive, but that doesn't matter because
+// the case registered with Add is also the same case used with
+// LoadDLL later.
+//
+// It has no associated mutex and should only be mutated serially
+// (currently: during init), and not concurrent with DLL loading.
+var IsSystemDLL = map[string]bool{}
+
+// Add notes that dll is a system32 DLL which should only be loaded
+// from the Windows SYSTEM32 directory. It returns its argument back,
+// for ease of use in generated code.
+func Add(dll string) string {
+       IsSystemDLL[dll] = true
+       return dll
+}
index de41786c76e77950ffa5940c9023fc93b5b8e8a7..d599258976b81d014b3e7fee43520223c770aab6 100644 (file)
@@ -4,12 +4,13 @@ package windows
 
 import "unsafe"
 import "syscall"
+import "internal/syscall/windows/sysdll"
 
 var _ unsafe.Pointer
 
 var (
-       modiphlpapi = syscall.NewLazyDLL("iphlpapi.dll")
-       modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+       modiphlpapi = syscall.NewLazyDLL(sysdll.Add("iphlpapi.dll"))
+       modkernel32 = syscall.NewLazyDLL(sysdll.Add("kernel32.dll"))
 
        procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
        procGetComputerNameExW   = modkernel32.NewProc("GetComputerNameExW")
index f712c6f65353c60df57708949c369f7399055ab4..7b269ecccb4db7d3be2f9b0f7f1046974d30bdf2 100644 (file)
@@ -15,3 +15,7 @@ func NumberOfProcessors() int32 {
        stdcall1(_GetSystemInfo, uintptr(unsafe.Pointer(&info)))
        return int32(info.dwnumberofprocessors)
 }
+
+func LoadLibraryExStatus() (useEx, haveEx, haveFlags bool) {
+       return useLoadLibraryEx, _LoadLibraryExW != nil, _AddDllDirectory != nil
+}