Update to go1.24.5
This commit is contained in:
@@ -114,7 +114,11 @@ func Init() {
|
||||
fsys.Bind(Dir(), filepath.Join(cfg.GOROOT, "src/crypto/internal/fips140"))
|
||||
}
|
||||
|
||||
if cfg.Experiment.BoringCrypto && Enabled() {
|
||||
// ExperimentErr != nil if GOEXPERIMENT failed to parse. Typically
|
||||
// cmd/go main will exit in this case, but it is allowed during
|
||||
// toolchain selection, as the GOEXPERIMENT may be valid for the
|
||||
// selected toolchain version.
|
||||
if cfg.ExperimentErr == nil && cfg.Experiment.BoringCrypto && Enabled() {
|
||||
base.Fatalf("go: cannot use GOFIPS140 with GOEXPERIMENT=boringcrypto")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2534,7 +2534,6 @@ func (p *Package) setBuildInfo(ctx context.Context, autoVCS bool) {
|
||||
var repoDir string
|
||||
var vcsCmd *vcs.Cmd
|
||||
var err error
|
||||
const allowNesting = true
|
||||
|
||||
wantVCS := false
|
||||
switch cfg.BuildBuildvcs {
|
||||
@@ -2554,7 +2553,7 @@ func (p *Package) setBuildInfo(ctx context.Context, autoVCS bool) {
|
||||
// (so the bootstrap toolchain packages don't even appear to be in GOROOT).
|
||||
goto omitVCS
|
||||
}
|
||||
repoDir, vcsCmd, err = vcs.FromDir(base.Cwd(), "", allowNesting)
|
||||
repoDir, vcsCmd, err = vcs.FromDir(base.Cwd(), "")
|
||||
if err != nil && !errors.Is(err, os.ErrNotExist) {
|
||||
setVCSError(err)
|
||||
return
|
||||
@@ -2577,10 +2576,11 @@ func (p *Package) setBuildInfo(ctx context.Context, autoVCS bool) {
|
||||
}
|
||||
if repoDir != "" && vcsCmd.Status != nil {
|
||||
// Check that the current directory, package, and module are in the same
|
||||
// repository. vcs.FromDir allows nested Git repositories, but nesting
|
||||
// is not allowed for other VCS tools. The current directory may be outside
|
||||
// p.Module.Dir when a workspace is used.
|
||||
pkgRepoDir, _, err := vcs.FromDir(p.Dir, "", allowNesting)
|
||||
// repository. vcs.FromDir disallows nested VCS and multiple VCS in the
|
||||
// same repository, unless the GODEBUG allowmultiplevcs is set. The
|
||||
// current directory may be outside p.Module.Dir when a workspace is
|
||||
// used.
|
||||
pkgRepoDir, _, err := vcs.FromDir(p.Dir, "")
|
||||
if err != nil {
|
||||
setVCSError(err)
|
||||
return
|
||||
@@ -2592,7 +2592,7 @@ func (p *Package) setBuildInfo(ctx context.Context, autoVCS bool) {
|
||||
}
|
||||
goto omitVCS
|
||||
}
|
||||
modRepoDir, _, err := vcs.FromDir(p.Module.Dir, "", allowNesting)
|
||||
modRepoDir, _, err := vcs.FromDir(p.Module.Dir, "")
|
||||
if err != nil {
|
||||
setVCSError(err)
|
||||
return
|
||||
|
||||
@@ -230,7 +230,7 @@ func LookupLocal(ctx context.Context, path string) Repo {
|
||||
|
||||
return lookupLocalCache.Do(path, func() Repo {
|
||||
return newCachingRepo(ctx, path, func(ctx context.Context) (Repo, error) {
|
||||
repoDir, vcsCmd, err := vcs.FromDir(path, "", true)
|
||||
repoDir, vcsCmd, err := vcs.FromDir(path, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"internal/godebug"
|
||||
"internal/lazyregexp"
|
||||
"internal/singleflight"
|
||||
"io/fs"
|
||||
@@ -839,11 +840,13 @@ type vcsPath struct {
|
||||
schemelessRepo bool // if true, the repo pattern lacks a scheme
|
||||
}
|
||||
|
||||
var allowmultiplevcs = godebug.New("allowmultiplevcs")
|
||||
|
||||
// FromDir inspects dir and its parents to determine the
|
||||
// version control system and code repository to use.
|
||||
// If no repository is found, FromDir returns an error
|
||||
// equivalent to os.ErrNotExist.
|
||||
func FromDir(dir, srcRoot string, allowNesting bool) (repoDir string, vcsCmd *Cmd, err error) {
|
||||
func FromDir(dir, srcRoot string) (repoDir string, vcsCmd *Cmd, err error) {
|
||||
// Clean and double-check that dir is in (a subdirectory of) srcRoot.
|
||||
dir = filepath.Clean(dir)
|
||||
if srcRoot != "" {
|
||||
@@ -857,21 +860,28 @@ func FromDir(dir, srcRoot string, allowNesting bool) (repoDir string, vcsCmd *Cm
|
||||
for len(dir) > len(srcRoot) {
|
||||
for _, vcs := range vcsList {
|
||||
if isVCSRoot(dir, vcs.RootNames) {
|
||||
// Record first VCS we find.
|
||||
// If allowNesting is false (as it is in GOPATH), keep looking for
|
||||
// repositories in parent directories and report an error if one is
|
||||
// found to mitigate VCS injection attacks.
|
||||
if vcsCmd == nil {
|
||||
// Record first VCS we find.
|
||||
vcsCmd = vcs
|
||||
repoDir = dir
|
||||
if allowNesting {
|
||||
if allowmultiplevcs.Value() == "1" {
|
||||
allowmultiplevcs.IncNonDefault()
|
||||
return repoDir, vcsCmd, nil
|
||||
}
|
||||
// If allowmultiplevcs is not set, keep looking for
|
||||
// repositories in current and parent directories and report
|
||||
// an error if one is found to mitigate VCS injection
|
||||
// attacks.
|
||||
continue
|
||||
}
|
||||
// Otherwise, we have one VCS inside a different VCS.
|
||||
return "", nil, fmt.Errorf("directory %q uses %s, but parent %q uses %s",
|
||||
repoDir, vcsCmd.Cmd, dir, vcs.Cmd)
|
||||
if vcsCmd == vcsGit && vcs == vcsGit {
|
||||
// Nested Git is allowed, as this is how things like
|
||||
// submodules work. Git explicitly protects against
|
||||
// injection against itself.
|
||||
continue
|
||||
}
|
||||
return "", nil, fmt.Errorf("multiple VCS detected: %s in %q, and %s in %q",
|
||||
vcsCmd.Cmd, repoDir, vcs.Cmd, dir)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ func TestFromDir(t *testing.T) {
|
||||
}
|
||||
|
||||
wantRepoDir := filepath.Dir(dir)
|
||||
gotRepoDir, gotVCS, err := FromDir(dir, tempDir, false)
|
||||
gotRepoDir, gotVCS, err := FromDir(dir, tempDir)
|
||||
if err != nil {
|
||||
t.Errorf("FromDir(%q, %q): %v", dir, tempDir, err)
|
||||
continue
|
||||
|
||||
54
src/cmd/go/testdata/script/test_multivcs.txt
vendored
Normal file
54
src/cmd/go/testdata/script/test_multivcs.txt
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
# To avoid VCS injection attacks, we should not accept multiple different VCS metadata
|
||||
# folders within a single module (either in the same directory, or nested in different
|
||||
# directories.)
|
||||
#
|
||||
# This behavior should be disabled by setting the allowmultiplevcs GODEBUG.
|
||||
|
||||
[short] skip
|
||||
[!git] skip
|
||||
|
||||
cd samedir
|
||||
|
||||
exec git init .
|
||||
|
||||
# Without explicitly requesting buildvcs, the go command should silently continue
|
||||
# without determining the correct VCS.
|
||||
go test -c -o $devnull .
|
||||
|
||||
# If buildvcs is explicitly requested, we expect the go command to fail
|
||||
! go test -buildvcs -c -o $devnull .
|
||||
stderr '^error obtaining VCS status: multiple VCS detected:'
|
||||
|
||||
env GODEBUG=allowmultiplevcs=1
|
||||
go test -buildvcs -c -o $devnull .
|
||||
|
||||
env GODEBUG=
|
||||
cd ../nested
|
||||
exec git init .
|
||||
# cd a
|
||||
go test -c -o $devnull ./a
|
||||
! go test -buildvcs -c -o $devnull ./a
|
||||
stderr '^error obtaining VCS status: multiple VCS detected:'
|
||||
# allowmultiplevcs doesn't disable the check that the current directory, package, and
|
||||
# module are in the same repository.
|
||||
env GODEBUG=allowmultiplevcs=1
|
||||
! go test -buildvcs -c -o $devnull ./a
|
||||
stderr '^error obtaining VCS status: main package is in repository'
|
||||
|
||||
-- samedir/go.mod --
|
||||
module example
|
||||
|
||||
go 1.18
|
||||
-- samedir/example.go --
|
||||
package main
|
||||
-- samedir/.bzr/test --
|
||||
hello
|
||||
|
||||
-- nested/go.mod --
|
||||
module example
|
||||
|
||||
go 1.18
|
||||
-- nested/a/example.go --
|
||||
package main
|
||||
-- nested/a/.bzr/test --
|
||||
hello
|
||||
@@ -9,25 +9,35 @@ cd root
|
||||
go mod init example.com/root
|
||||
exec git init
|
||||
|
||||
# Nesting repositories in parent directories are ignored, as the current
|
||||
# directory main package, and containing main module are in the same repository.
|
||||
# This is an error in GOPATH mode (to prevent VCS injection), but for modules,
|
||||
# we assume users have control over repositories they've checked out.
|
||||
|
||||
# Nesting repositories in parent directories are an error, to prevent VCS injection.
|
||||
# This can be disabled with the allowmultiplevcs GODEBUG.
|
||||
mkdir hgsub
|
||||
cd hgsub
|
||||
exec hg init
|
||||
cp ../../main.go main.go
|
||||
! go build
|
||||
stderr '^error obtaining VCS status: multiple VCS detected: hg in ".*hgsub", and git in ".*root"$'
|
||||
stderr '^\tUse -buildvcs=false to disable VCS stamping.$'
|
||||
env GODEBUG=allowmultiplevcs=1
|
||||
! go build
|
||||
stderr '^error obtaining VCS status: main module is in repository ".*root" but current directory is in repository ".*hgsub"$'
|
||||
stderr '^\tUse -buildvcs=false to disable VCS stamping.$'
|
||||
go build -buildvcs=false
|
||||
env GODEBUG=
|
||||
go mod init example.com/root/hgsub
|
||||
! go build
|
||||
stderr '^error obtaining VCS status: multiple VCS detected: hg in ".*hgsub", and git in ".*root"$'
|
||||
stderr '^\tUse -buildvcs=false to disable VCS stamping.$'
|
||||
env GODEBUG=allowmultiplevcs=1
|
||||
go build
|
||||
env GODEBUG=
|
||||
cd ..
|
||||
|
||||
# It's an error to build a package from a nested Git repository if the package
|
||||
# is in a separate repository from the current directory or from the module
|
||||
# root directory.
|
||||
# root directory. Otherwise nested Git repositories are allowed, as this is
|
||||
# how Git implements submodules (and protects against Git based VCS injection.)
|
||||
mkdir gitsub
|
||||
cd gitsub
|
||||
exec git init
|
||||
|
||||
Reference in New Issue
Block a user