cmd/go: fix toolchain escape via PATH in covermode#77818
cmd/go: fix toolchain escape via PATH in covermode#77818zccold wants to merge 1 commit intogolang:masterfrom
Conversation
When running `go test` with `-covermode=count` or `-coverpkg=./...`, `b.CovData` uses the hardcoded "go" command to invoke `go tool covdata`. If GOTOOLCHAIN has auto-switched to a newer toolchain, `exec.LookPath` resolves this hardcoded "go" using the unmodified system $PATH, which often points to the host's older Go version. Since `covdata` is a builtin tool that is built and run dynamically by the `go` command, invoking the older `go` binary causes it to fail with a "version does not match" compile error when interacting with the newer toolchain's files. This CL fixes the issue by replacing the hardcoded "go" with the absolute path to the current toolchain's `go` executable, ensuring the correct toolchain context is maintained.
|
This PR (HEAD: 050e88c) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/go/+/749360. Important tips:
|
|
Message from Gopher Robot: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/749360. |
|
Message from Gopher Robot: Patch Set 1: Congratulations on opening your first change. Thank you for your contribution! Next steps: Most changes in the Go project go through a few rounds of revision. This can be During May-July and Nov-Jan the Go project is in a code freeze, during which Please don’t reply on this GitHub thread. Visit golang.org/cl/749360. |
|
Message from ZC cold: Patch Set 1: (2 comments) Please don’t reply on this GitHub thread. Visit golang.org/cl/749360. |
Fixes #77820
When a user has a local Go installation of 1.25.5 but their go.mod
specifies 1.26.0, running a test command with coverage flags like
go test -covermode=count -coverpkg=./... ./... triggers the
GOTOOLCHAIN auto-switch mechanism to use the newer toolchain.
However, b.CovData uses the hardcoded 'go' command to invoke the
builtin tool covdata. Because GOTOOLCHAIN does not modify the system
PATH, exec.LookPath resolves this hardcoded 'go' to the host's older
Go version (e.g., 1.25.5).
Since covdata is a builtin tool built and run dynamically by the go
command, invoking the older go binary to handle the new toolchain's
files causes a fatal mismatch. The build fails with an error like:
compile: version "go1.26.0" does not match go tool version "go1.25.5..."
This CL fixes the issue by replacing the hardcoded 'go' with the
absolute path to the current toolchain's go executable, ensuring the
correct toolchain context is maintained and preventing PATH escape.