From af725f42864c8fb56afcf3ba76d2df7d372534e4 Mon Sep 17 00:00:00 2001 From: AndreasHGK Date: Thu, 30 Jun 2022 15:59:30 +0000 Subject: [PATCH 01/78] os: fix a typo in path_windows.go I believe the path_windows.go file has a typo, which is fixed in this PR Change-Id: Ibf1a7189a6312dbb3b1e6b512beeb6d99da5b5bc GitHub-Last-Rev: cedac7eaa07d26667e6800c5ac96239d5ccf6ba8 GitHub-Pull-Request: golang/go#53629 Reviewed-on: https://go-review.googlesource.com/c/go/+/415434 Auto-Submit: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov Run-TryBot: Ian Lance Taylor --- src/os/path_windows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/path_windows.go b/src/os/path_windows.go index a96245f358..3356908a36 100644 --- a/src/os/path_windows.go +++ b/src/os/path_windows.go @@ -11,7 +11,7 @@ const ( // IsPathSeparator reports whether c is a directory separator character. func IsPathSeparator(c uint8) bool { - // NOTE: Windows accept / as path separator. + // NOTE: Windows accepts / as path separator. return c == '\\' || c == '/' } From aad9382e590265efb5e5fa3591c30486dcf215e0 Mon Sep 17 00:00:00 2001 From: Ben Sarah Golightly Date: Wed, 29 Jun 2022 19:42:46 +0100 Subject: [PATCH 02/78] go/doc/comment: support links in lists in comments The proposed (#51082) new go doc comment additions supports lists, links, and doc links, but does not support links and doc links inside lists, so implemnent this. Fixes #53610 Change-Id: I4fa17d204fc9efa8f3633133e4a49e56cf1aa9bc Reviewed-on: https://go-review.googlesource.com/c/go/+/415174 Reviewed-by: Ben Golightly Reviewed-by: Dmitri Shuralyov Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor --- src/go/doc/comment/parse.go | 7 ++++ src/go/doc/comment/testdata/linklist.txt | 18 +++++++++++ src/go/doc/comment/testdata/linklist2.txt | 39 +++++++++++++++++++++++ src/go/doc/comment/testdata/linklist3.txt | 31 ++++++++++++++++++ src/go/doc/comment/testdata/linklist4.txt | 36 +++++++++++++++++++++ 5 files changed, 131 insertions(+) create mode 100644 src/go/doc/comment/testdata/linklist.txt create mode 100644 src/go/doc/comment/testdata/linklist2.txt create mode 100644 src/go/doc/comment/testdata/linklist3.txt create mode 100644 src/go/doc/comment/testdata/linklist4.txt diff --git a/src/go/doc/comment/parse.go b/src/go/doc/comment/parse.go index 4de8ce710d..e8d844c491 100644 --- a/src/go/doc/comment/parse.go +++ b/src/go/doc/comment/parse.go @@ -326,6 +326,13 @@ func (p *Parser) Parse(text string) *Doc { switch b := b.(type) { case *Paragraph: b.Text = d.parseLinkedText(string(b.Text[0].(Plain))) + case *List: + for _, i := range b.Items { + for _, c := range i.Content { + p := c.(*Paragraph) + p.Text = d.parseLinkedText(string(p.Text[0].(Plain))) + } + } } } diff --git a/src/go/doc/comment/testdata/linklist.txt b/src/go/doc/comment/testdata/linklist.txt new file mode 100644 index 0000000000..baf40624b3 --- /dev/null +++ b/src/go/doc/comment/testdata/linklist.txt @@ -0,0 +1,18 @@ +{"DocLinkBaseURL": "https://pkg.go.dev"} +-- input -- +Did you know? + + - [encoding/json.Marshal] is a doc link. So is [encoding/json.Unmarshal]. +-- text -- +Did you know? + + - encoding/json.Marshal is a doc link. So is encoding/json.Unmarshal. +-- markdown -- +Did you know? + + - [encoding/json.Marshal](https://pkg.go.dev/encoding/json#Marshal) is a doc link. So is [encoding/json.Unmarshal](https://pkg.go.dev/encoding/json#Unmarshal). +-- html -- +

Did you know? +

diff --git a/src/go/doc/comment/testdata/linklist2.txt b/src/go/doc/comment/testdata/linklist2.txt new file mode 100644 index 0000000000..81b306100f --- /dev/null +++ b/src/go/doc/comment/testdata/linklist2.txt @@ -0,0 +1,39 @@ +{"DocLinkBaseURL": "https://pkg.go.dev"} +-- input -- +Did you know? + + - [testing.T] is one doc link. + - So is [testing.M]. + - So is [testing.B]. + This is the same list paragraph. + + There is [testing.PB] in this list item, too! +-- text -- +Did you know? + + - testing.T is one doc link. + + - So is testing.M. + + - So is testing.B. This is the same list paragraph. + + There is testing.PB in this list item, too! +-- markdown -- +Did you know? + + - [testing.T](https://pkg.go.dev/testing#T) is one doc link. + + - So is [testing.M](https://pkg.go.dev/testing#M). + + - So is [testing.B](https://pkg.go.dev/testing#B). This is the same list paragraph. + + There is [testing.PB](https://pkg.go.dev/testing#PB) in this list item, too! +-- html -- +

Did you know? +

diff --git a/src/go/doc/comment/testdata/linklist3.txt b/src/go/doc/comment/testdata/linklist3.txt new file mode 100644 index 0000000000..701a54ecff --- /dev/null +++ b/src/go/doc/comment/testdata/linklist3.txt @@ -0,0 +1,31 @@ +{"DocLinkBaseURL": "https://pkg.go.dev"} +-- input -- +Cool things: + + - Foo + - [Go] + - Bar + +[Go]: https://go.dev/ +-- text -- +Cool things: + + - Foo + - Go + - Bar + +[Go]: https://go.dev/ +-- markdown -- +Cool things: + + - Foo + - [Go](https://go.dev/) + - Bar + +-- html -- +

Cool things: +

    +
  • Foo +
  • Go +
  • Bar +
diff --git a/src/go/doc/comment/testdata/linklist4.txt b/src/go/doc/comment/testdata/linklist4.txt new file mode 100644 index 0000000000..db39ec4ee1 --- /dev/null +++ b/src/go/doc/comment/testdata/linklist4.txt @@ -0,0 +1,36 @@ +{"DocLinkBaseURL": "https://pkg.go.dev"} +-- input -- +Cool things: + + - Foo + - [Go] is great + + [Go]: https://go.dev/ + - Bar + +-- text -- +Cool things: + + - Foo + + - Go is great + + - Bar + +[Go]: https://go.dev/ +-- markdown -- +Cool things: + + - Foo + + - [Go](https://go.dev/) is great + + - Bar + +-- html -- +

Cool things: +

    +
  • Foo +

  • Go is great +

  • Bar +

From 405c269b858941c46e35fb9a92b45aa75c61561c Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 29 Jun 2022 18:21:32 -0700 Subject: [PATCH 03/78] go/types, types2: re-enable a couple of commented out tests Change-Id: Ibb27012b18fc0f0f9f9ef74cc120e7ef981e6d43 Reviewed-on: https://go-review.googlesource.com/c/go/+/415156 TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor Auto-Submit: Robert Griesemer Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer --- .../types2/testdata/fixedbugs/issue39634.go | 13 +++++-------- src/go/types/testdata/fixedbugs/issue39634.go | 13 +++++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue39634.go b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue39634.go index b408dd7003..b7d99f96c2 100644 --- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue39634.go +++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue39634.go @@ -31,10 +31,8 @@ type x7[A any] struct{ foo7 } func main7() { var _ foo7 = x7[int]{} } // crash 8 -// Embedding stand-alone type parameters is not permitted for now. Disabled. -// type foo8[A any] interface { ~A } -// func bar8[A foo8[A]](a A) {} -// func main8() {} +type foo8[A any] interface { ~A /* ERROR cannot be a type parameter */ } +func bar8[A foo8[A]](a A) {} // crash 9 type foo9[A any] interface { foo9 /* ERROR illegal cycle */ [A] } @@ -74,10 +72,9 @@ func F20[t Z20]() { F20(t /* ERROR invalid composite literal type */ {}) } type Z21 /* ERROR illegal cycle */ interface{ Z21 } func F21[T Z21]() { ( /* ERROR not used */ F21[Z21]) } -// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639). -// // crash 24 -// type T24[P any] P -// func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() } +// crash 24 +type T24[P any] P // ERROR cannot use a type parameter as RHS in type declaration +func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() } // crash 25 type T25[A any] int diff --git a/src/go/types/testdata/fixedbugs/issue39634.go b/src/go/types/testdata/fixedbugs/issue39634.go index 8cba2e735a..ce84299a61 100644 --- a/src/go/types/testdata/fixedbugs/issue39634.go +++ b/src/go/types/testdata/fixedbugs/issue39634.go @@ -31,10 +31,8 @@ type x7[A any] struct{ foo7 } func main7() { var _ foo7 = x7[int]{} } // crash 8 -// Embedding stand-alone type parameters is not permitted for now. Disabled. -// type foo8[A any] interface { ~A } -// func bar8[A foo8[A]](a A) {} -// func main8() {} +type foo8[A any] interface { ~A /* ERROR cannot be a type parameter */ } +func bar8[A foo8[A]](a A) {} // crash 9 type foo9[A any] interface { foo9 /* ERROR illegal cycle */ [A] } @@ -74,10 +72,9 @@ func F20[t Z20]() { F20(t /* ERROR invalid composite literal type */ {}) } type Z21 /* ERROR illegal cycle */ interface{ Z21 } func F21[T Z21]() { ( /* ERROR not used */ F21[Z21]) } -// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639). -// // crash 24 -// type T24[P any] P -// func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() } +// crash 24 +type T24[P any] P // ERROR cannot use a type parameter as RHS in type declaration +func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() } // crash 25 type T25[A any] int From c847a2c9f024f47eee25c132f2d80e7037adea36 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 30 Jun 2022 16:41:31 -0700 Subject: [PATCH 04/78] go/types, types2: document that exported predicates are unspecified for invalid type arguments Per discussion on the issue. For #53595. Change-Id: Iefd161e5c7e792d454652cbe831a0c2d769f748e Reviewed-on: https://go-review.googlesource.com/c/go/+/415574 Reviewed-by: Robert Findley Reviewed-by: Robert Griesemer Reviewed-by: Ian Lance Taylor --- src/cmd/compile/internal/types2/api.go | 15 ++++++++------- src/go/types/api.go | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/cmd/compile/internal/types2/api.go b/src/cmd/compile/internal/types2/api.go index a22ea5d12f..94c290b9ee 100644 --- a/src/cmd/compile/internal/types2/api.go +++ b/src/cmd/compile/internal/types2/api.go @@ -418,7 +418,8 @@ func (conf *Config) Check(path string, files []*syntax.File, info *Info) (*Packa // AssertableTo reports whether a value of type V can be asserted to have type T. // -// The behavior of AssertableTo is undefined in two cases: +// The behavior of AssertableTo is unspecified in three cases: +// - if T is Typ[Invalid] // - if V is a generalized interface; i.e., an interface that may only be used // as a type constraint in Go code // - if T is an uninstantiated generic type @@ -434,8 +435,8 @@ func AssertableTo(V *Interface, T Type) bool { // AssignableTo reports whether a value of type V is assignable to a variable // of type T. // -// The behavior of AssignableTo is undefined if V or T is an uninstantiated -// generic type. +// The behavior of AssignableTo is unspecified if V or T is Typ[Invalid] or an +// uninstantiated generic type. func AssignableTo(V, T Type) bool { x := operand{mode: value, typ: V} ok, _ := x.assignableTo(nil, T, nil) // check not needed for non-constant x @@ -445,8 +446,8 @@ func AssignableTo(V, T Type) bool { // ConvertibleTo reports whether a value of type V is convertible to a value of // type T. // -// The behavior of ConvertibleTo is undefined if V or T is an uninstantiated -// generic type. +// The behavior of ConvertibleTo is unspecified if V or T is Typ[Invalid] or an +// uninstantiated generic type. func ConvertibleTo(V, T Type) bool { x := operand{mode: value, typ: V} return x.convertibleTo(nil, T, nil) // check not needed for non-constant x @@ -454,8 +455,8 @@ func ConvertibleTo(V, T Type) bool { // Implements reports whether type V implements interface T. // -// The behavior of Implements is undefined if V is an uninstantiated generic -// type. +// The behavior of Implements is unspecified if V is Typ[Invalid] or an uninstantiated +// generic type. func Implements(V Type, T *Interface) bool { if T.Empty() { // All types (even Typ[Invalid]) implement the empty interface. diff --git a/src/go/types/api.go b/src/go/types/api.go index 0915d6a6ee..5e7be29b3c 100644 --- a/src/go/types/api.go +++ b/src/go/types/api.go @@ -413,7 +413,8 @@ func (conf *Config) Check(path string, fset *token.FileSet, files []*ast.File, i // AssertableTo reports whether a value of type V can be asserted to have type T. // -// The behavior of AssertableTo is undefined in two cases: +// The behavior of AssertableTo is unspecified in three cases: +// - if T is Typ[Invalid] // - if V is a generalized interface; i.e., an interface that may only be used // as a type constraint in Go code // - if T is an uninstantiated generic type @@ -429,8 +430,8 @@ func AssertableTo(V *Interface, T Type) bool { // AssignableTo reports whether a value of type V is assignable to a variable // of type T. // -// The behavior of AssignableTo is undefined if V or T is an uninstantiated -// generic type. +// The behavior of AssignableTo is unspecified if V or T is Typ[Invalid] or an +// uninstantiated generic type. func AssignableTo(V, T Type) bool { x := operand{mode: value, typ: V} ok, _ := x.assignableTo(nil, T, nil) // check not needed for non-constant x @@ -440,8 +441,8 @@ func AssignableTo(V, T Type) bool { // ConvertibleTo reports whether a value of type V is convertible to a value of // type T. // -// The behavior of ConvertibleTo is undefined if V or T is an uninstantiated -// generic type. +// The behavior of ConvertibleTo is unspecified if V or T is Typ[Invalid] or an +// uninstantiated generic type. func ConvertibleTo(V, T Type) bool { x := operand{mode: value, typ: V} return x.convertibleTo(nil, T, nil) // check not needed for non-constant x @@ -449,8 +450,8 @@ func ConvertibleTo(V, T Type) bool { // Implements reports whether type V implements interface T. // -// The behavior of Implements is undefined if V is an uninstantiated generic -// type. +// The behavior of Implements is unspecified if V is Typ[Invalid] or an uninstantiated +// generic type. func Implements(V Type, T *Interface) bool { if T.Empty() { // All types (even Typ[Invalid]) implement the empty interface. From 9a4d5357f40c367fcad279184f245290ba0a8fb9 Mon Sep 17 00:00:00 2001 From: Sebastian Gassner Date: Thu, 30 Jun 2022 13:37:04 +0000 Subject: [PATCH 05/78] flag: highlight support for double dashes in docs Updating examples, to show that double dashes are also permitted. This has been easy to miss previously. Change-Id: Ib67b4e39fea90ef4cb9e894709c53baedfc18fc2 GitHub-Last-Rev: f7df57b646d6412c1346e85c3a7353a8df41afc6 GitHub-Pull-Request: golang/go#53628 Reviewed-on: https://go-review.googlesource.com/c/go/+/415374 Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: David Chase TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor --- src/flag/flag.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/flag/flag.go b/src/flag/flag.go index a0762441a5..9abf8d769e 100644 --- a/src/flag/flag.go +++ b/src/flag/flag.go @@ -49,10 +49,11 @@ The arguments are indexed from 0 through flag.NArg()-1. The following forms are permitted: -flag + --flag // double dashes are also permitted -flag=x -flag x // non-boolean flags only -One or two minus signs may be used; they are equivalent. +One or two dashes may be used; they are equivalent. The last form is not permitted for boolean flags because the meaning of the command From 4a2a3bca180509bc39fe99992e16b5e0a45e0e43 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 10 Jun 2022 15:58:22 -0700 Subject: [PATCH 06/78] cmd/go, go/build: clarify build constraint docs Clarify that the //go:build line is an expression of constraints, not a constraint itself. Fixes #53308 Change-Id: Ib67243c6ee5cfe3b688c12b943b5e7496f686035 Reviewed-on: https://go-review.googlesource.com/c/go/+/411697 Reviewed-by: Rob Pike TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: David Chase --- src/cmd/go/alldocs.go | 22 +++++++++++----------- src/cmd/go/internal/help/helpdoc.go | 13 +++++++------ src/cmd/go/internal/work/build.go | 9 ++++----- src/go/build/doc.go | 7 ++++--- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index fdb7a085b0..78128dcf23 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -195,11 +195,10 @@ // For example, when building with a non-standard configuration, // use -pkgdir to keep generated packages in a separate location. // -tags tag,list -// a comma-separated list of build tags to consider satisfied during the -// build. For more information about build tags, see the description of -// build constraints in the documentation for the go/build package. -// (Earlier versions of Go used a space-separated list, and that form -// is deprecated but still recognized.) +// a comma-separated list of additional build tags to consider satisfied +// during the build. For more information about build tags, see +// 'go help buildconstraint'. (Earlier versions of Go used a +// space-separated list, and that form is deprecated but still recognized.) // -trimpath // remove all file system paths from the resulting executable. // Instead of absolute file system paths, the recorded file names @@ -1797,11 +1796,12 @@ // // # Build constraints // -// A build constraint, also known as a build tag, is a line comment that begins +// A build constraint, also known as a build tag, is a condition under which a +// file should be included in the package. Build constraints are given by a +// line comment that begins // // //go:build // -// that lists the conditions under which a file should be included in the package. // Constraints may appear in any kind of source file (not just Go), but // they must appear near the top of the file, preceded // only by blank lines and other line comments. These rules mean that in Go @@ -1810,9 +1810,9 @@ // To distinguish build constraints from package documentation, // a build constraint should be followed by a blank line. // -// A build constraint is evaluated as an expression containing options -// combined by ||, &&, and ! operators and parentheses. Operators have -// the same meaning as in Go. +// A build constraint comment is evaluated as an expression containing +// build tags combined by ||, &&, and ! operators and parentheses. +// Operators have the same meaning as in Go. // // For example, the following build constraint constrains a file to // build when the "linux" and "386" constraints are satisfied, or when @@ -1822,7 +1822,7 @@ // // It is an error for a file to have more than one //go:build line. // -// During a particular build, the following words are satisfied: +// During a particular build, the following build tags are satisfied: // // - the target operating system, as spelled by runtime.GOOS, set with the // GOOS environment variable. diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index 36bc4f28b7..c38c403006 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -812,11 +812,12 @@ var HelpBuildConstraint = &base.Command{ UsageLine: "buildconstraint", Short: "build constraints", Long: ` -A build constraint, also known as a build tag, is a line comment that begins +A build constraint, also known as a build tag, is a condition under which a +file should be included in the package. Build constraints are given by a +line comment that begins //go:build -that lists the conditions under which a file should be included in the package. Constraints may appear in any kind of source file (not just Go), but they must appear near the top of the file, preceded only by blank lines and other line comments. These rules mean that in Go @@ -825,9 +826,9 @@ files a build constraint must appear before the package clause. To distinguish build constraints from package documentation, a build constraint should be followed by a blank line. -A build constraint is evaluated as an expression containing options -combined by ||, &&, and ! operators and parentheses. Operators have -the same meaning as in Go. +A build constraint comment is evaluated as an expression containing +build tags combined by ||, &&, and ! operators and parentheses. +Operators have the same meaning as in Go. For example, the following build constraint constrains a file to build when the "linux" and "386" constraints are satisfied, or when @@ -837,7 +838,7 @@ build when the "linux" and "386" constraints are satisfied, or when It is an error for a file to have more than one //go:build line. -During a particular build, the following words are satisfied: +During a particular build, the following build tags are satisfied: - the target operating system, as spelled by runtime.GOOS, set with the GOOS environment variable. diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index feb82d8d38..42745d9928 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -151,11 +151,10 @@ and test commands: For example, when building with a non-standard configuration, use -pkgdir to keep generated packages in a separate location. -tags tag,list - a comma-separated list of build tags to consider satisfied during the - build. For more information about build tags, see the description of - build constraints in the documentation for the go/build package. - (Earlier versions of Go used a space-separated list, and that form - is deprecated but still recognized.) + a comma-separated list of additional build tags to consider satisfied + during the build. For more information about build tags, see + 'go help buildconstraint'. (Earlier versions of Go used a + space-separated list, and that form is deprecated but still recognized.) -trimpath remove all file system paths from the resulting executable. Instead of absolute file system paths, the recorded file names diff --git a/src/go/build/doc.go b/src/go/build/doc.go index 262f6709af..cd1d3fd33e 100644 --- a/src/go/build/doc.go +++ b/src/go/build/doc.go @@ -57,12 +57,13 @@ // // # Build Constraints // -// A build constraint, also known as a build tag, is a line comment that begins +// A build constraint, also known as a build tag, is a condition under which a +// file should be included in the package. Build constraints are given by a +// line comment that begins // // //go:build // -// that lists the conditions under which a file should be included in the -// package. Build constraints may also be part of a file's name +// Build constraints may also be part of a file's name // (for example, source_windows.go will only be included if the target // operating system is windows). // From e822b1e26e20ef1c76672c0b77b0fd8a97a1fe84 Mon Sep 17 00:00:00 2001 From: Alexander Yastrebov Date: Thu, 14 Oct 2021 22:01:49 +0000 Subject: [PATCH 07/78] net/http: omit invalid header value from error message Updates #43631 Change-Id: I0fe3aafdf7ef889fed1a830128721393f8d020e6 GitHub-Last-Rev: c359542d741b17f4e2cb0d50982bf341246233b0 GitHub-Pull-Request: golang/go#48979 Reviewed-on: https://go-review.googlesource.com/c/go/+/355929 Reviewed-by: Dmitri Shuralyov Run-TryBot: Cherry Mui Reviewed-by: Damien Neil Reviewed-by: David Chase TryBot-Result: Gopher Robot --- src/net/http/transport.go | 3 ++- src/net/http/transport_test.go | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index f2d538b04a..e470a6c080 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -525,7 +525,8 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) { for _, v := range vv { if !httpguts.ValidHeaderFieldValue(v) { req.closeBody() - return nil, fmt.Errorf("net/http: invalid header field value %q for key %v", v, k) + // Don't include the value in the error, because it may be sensitive. + return nil, fmt.Errorf("net/http: invalid header field value for %q", k) } } } diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 84868e2c5e..cba35db257 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -6085,14 +6085,14 @@ func TestTransportClosesBodyOnInvalidRequests(t *testing.T) { Method: " ", URL: u, }, - wantErr: "invalid method", + wantErr: `invalid method " "`, }, { name: "nil URL", req: &Request{ Method: "GET", }, - wantErr: "nil Request.URL", + wantErr: `nil Request.URL`, }, { name: "invalid header key", @@ -6101,7 +6101,7 @@ func TestTransportClosesBodyOnInvalidRequests(t *testing.T) { Header: Header{"💡": {"emoji"}}, URL: u, }, - wantErr: "invalid header field name", + wantErr: `invalid header field name "💡"`, }, { name: "invalid header value", @@ -6110,7 +6110,7 @@ func TestTransportClosesBodyOnInvalidRequests(t *testing.T) { Header: Header{"key": {"\x19"}}, URL: u, }, - wantErr: "invalid header field value", + wantErr: `invalid header field value for "key"`, }, { name: "non HTTP(s) scheme", @@ -6118,7 +6118,7 @@ func TestTransportClosesBodyOnInvalidRequests(t *testing.T) { Method: "POST", URL: &url.URL{Scheme: "faux"}, }, - wantErr: "unsupported protocol scheme", + wantErr: `unsupported protocol scheme "faux"`, }, { name: "no Host in URL", @@ -6126,7 +6126,7 @@ func TestTransportClosesBodyOnInvalidRequests(t *testing.T) { Method: "POST", URL: &url.URL{Scheme: "http"}, }, - wantErr: "no Host", + wantErr: `no Host in request URL`, }, } @@ -6142,8 +6142,8 @@ func TestTransportClosesBodyOnInvalidRequests(t *testing.T) { if !bc { t.Fatal("Expected body to have been closed") } - if g, w := err.Error(), tt.wantErr; !strings.Contains(g, w) { - t.Fatalf("Error mismatch\n\t%q\ndoes not contain\n\t%q", g, w) + if g, w := err.Error(), tt.wantErr; !strings.HasSuffix(g, w) { + t.Fatalf("Error mismatch: %q does not end with %q", g, w) } }) } From 3cf79d96105d890d7097d274804644b2a2093df1 Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sun, 3 Jul 2022 12:26:30 -0400 Subject: [PATCH 08/78] runtime: pass correct string to exits on Plan 9 In CL 405901 the definition of exit in the Plan 9 go runtime was changed like so: - status = append(itoa(tmp[:len(tmp)-1], uint64(e)), 0) + sl := itoa(tmp[:len(tmp)-1], uint64(e)) + // Don't append, rely on the existing data being zero. + status = tmp[:len(sl)+1] However, itoa only puts the converted number "somewhere" in the buffer. Specifically, it builds it from the end of the buffer towards the start, meaning the first byte of the buffer is a 0 byte, and the resulting string that's passed to exits is empty, leading to a falsely successful exit. This change uses the returned value from itoa, rather than the buffer that was passed in, so that we start from the correct location in the string. Fixes #53669 Change-Id: I63f0c7641fc6f55250857dc17a1eeb12ae0c2e10 Reviewed-on: https://go-review.googlesource.com/c/go/+/415680 Reviewed-by: David Chase Reviewed-by: Ian Lance Taylor --- src/runtime/os_plan9.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index 13bc3be4ab..f0e7c6ae70 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -439,7 +439,7 @@ func exit(e int32) { var tmp [32]byte sl := itoa(tmp[:len(tmp)-1], uint64(e)) // Don't append, rely on the existing data being zero. - status = tmp[:len(sl)+1] + status = sl[:len(sl)+1] } goexitsall(&status[0]) exits(&status[0]) From ceda93ed673294f0ce5eb3a723d563091bff0a39 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Sun, 3 Jul 2022 11:04:04 +0000 Subject: [PATCH 09/78] build/constraint: update doc to mention a feature added in Go 1.17 The pkg documentation mentions that the "//go:build" syntax "will be" added in Go 1.17. In fact, it has been added in that Go release, so the documentation can now be updated. Change-Id: I72f24063c3be62d97ca78bf724d56599f5f19460 GitHub-Last-Rev: 4371886f6ce9f2c2a370df047a5baa1f122c681f GitHub-Pull-Request: golang/go#53647 Reviewed-on: https://go-review.googlesource.com/c/go/+/415774 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Benny Siegert Auto-Submit: Ian Lance Taylor --- src/go/build/constraint/expr.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/go/build/constraint/expr.go b/src/go/build/constraint/expr.go index d64eead654..505cbffa4c 100644 --- a/src/go/build/constraint/expr.go +++ b/src/go/build/constraint/expr.go @@ -5,9 +5,7 @@ // Package constraint implements parsing and evaluation of build constraint lines. // See https://golang.org/cmd/go/#hdr-Build_constraints for documentation about build constraints themselves. // -// This package parses both the original “// +build” syntax and the “//go:build” syntax that will be added in Go 1.17. -// The parser is being included in Go 1.16 to allow tools that need to process Go 1.17 source code -// to still be built against the Go 1.16 release. +// This package parses both the original “// +build” syntax and the “//go:build” syntax that was added in Go 1.17. // See https://golang.org/design/draft-gobuild for details about the “//go:build” syntax. package constraint From 84e091eef033255b4a3fdb515d677faa135714dc Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 8 Jun 2022 23:56:28 -0400 Subject: [PATCH 10/78] cmd/go: record origin metadata during module download This change adds an "Origin" JSON key to the output of go list -json -m and go mod download -json. The associated value is a JSON object with metadata about the source control system. For Git, that metadata is sufficient to evaluate whether the remote server has changed in any interesting way that might invalidate the cached data. In most cases, it will not have, and a fetch could then avoid downloading a full repo from the server. This origin metadata is also now recorded in the .info file for a given module@version, for informational and debugging purposes. This change only adds the metadata. It does not use it to optimize away unnecessary git fetch operations. (That's the next change.) For #53644. Change-Id: I4a1712a2386d1d8ab4e02ffdf0f72ba75d556115 Reviewed-on: https://go-review.googlesource.com/c/go/+/411397 TryBot-Result: Gopher Robot Run-TryBot: Russ Cox Reviewed-by: Bryan Mills --- src/cmd/go/internal/modcmd/download.go | 2 +- src/cmd/go/internal/modfetch/cache.go | 44 +++++--- .../go/internal/modfetch/codehost/codehost.go | 90 ++++++++++++++- src/cmd/go/internal/modfetch/codehost/git.go | 106 ++++++++++++++++-- .../go/internal/modfetch/codehost/git_test.go | 87 ++++++++++---- src/cmd/go/internal/modfetch/codehost/vcs.go | 43 ++++++- src/cmd/go/internal/modfetch/coderepo.go | 64 ++++++++--- src/cmd/go/internal/modfetch/coderepo_test.go | 12 +- src/cmd/go/internal/modfetch/proxy.go | 38 +++---- src/cmd/go/internal/modfetch/repo.go | 39 +++++-- src/cmd/go/internal/modload/mvs.go | 4 +- src/cmd/go/internal/modload/query.go | 27 +++-- 12 files changed, 435 insertions(+), 121 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 5bc6cbc4bb..ea4f9f8663 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -149,7 +149,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { downloadModule := func(m *moduleJSON) { var err error - m.Info, err = modfetch.InfoFile(m.Path, m.Version) + _, m.Info, err = modfetch.InfoFile(m.Path, m.Version) if err != nil { m.Error = err.Error() return diff --git a/src/cmd/go/internal/modfetch/cache.go b/src/cmd/go/internal/modfetch/cache.go index b0dae1cb3d..417c5598fb 100644 --- a/src/cmd/go/internal/modfetch/cache.go +++ b/src/cmd/go/internal/modfetch/cache.go @@ -164,7 +164,7 @@ func SideLock() (unlock func(), err error) { } // A cachingRepo is a cache around an underlying Repo, -// avoiding redundant calls to ModulePath, Versions, Stat, Latest, and GoMod (but not Zip). +// avoiding redundant calls to ModulePath, Versions, Stat, Latest, and GoMod (but not CheckReuse or Zip). // It is also safe for simultaneous use by multiple goroutines // (so that it can be returned from Lookup multiple times). // It serializes calls to the underlying Repo. @@ -195,24 +195,32 @@ func (r *cachingRepo) repo() Repo { return r.r } +func (r *cachingRepo) CheckReuse(old *codehost.Origin) error { + return r.repo().CheckReuse(old) +} + func (r *cachingRepo) ModulePath() string { return r.path } -func (r *cachingRepo) Versions(prefix string) ([]string, error) { +func (r *cachingRepo) Versions(prefix string) (*Versions, error) { type cached struct { - list []string - err error + v *Versions + err error } c := r.cache.Do("versions:"+prefix, func() any { - list, err := r.repo().Versions(prefix) - return cached{list, err} + v, err := r.repo().Versions(prefix) + return cached{v, err} }).(cached) if c.err != nil { return nil, c.err } - return append([]string(nil), c.list...), nil + v := &Versions{ + Origin: c.v.Origin, + List: append([]string(nil), c.v.List...), + } + return v, nil } type cachedInfo struct { @@ -310,31 +318,35 @@ func (r *cachingRepo) Zip(dst io.Writer, version string) error { return r.repo().Zip(dst, version) } -// InfoFile is like Lookup(path).Stat(version) but returns the name of the file +// InfoFile is like Lookup(path).Stat(version) but also returns the name of the file // containing the cached information. -func InfoFile(path, version string) (string, error) { +func InfoFile(path, version string) (*RevInfo, string, error) { if !semver.IsValid(version) { - return "", fmt.Errorf("invalid version %q", version) + return nil, "", fmt.Errorf("invalid version %q", version) } - if file, _, err := readDiskStat(path, version); err == nil { - return file, nil + if file, info, err := readDiskStat(path, version); err == nil { + return info, file, nil } + var info *RevInfo err := TryProxies(func(proxy string) error { - _, err := Lookup(proxy, path).Stat(version) + i, err := Lookup(proxy, path).Stat(version) + if err == nil { + info = i + } return err }) if err != nil { - return "", err + return nil, "", err } // Stat should have populated the disk cache for us. file, err := CachePath(module.Version{Path: path, Version: version}, "info") if err != nil { - return "", err + return nil, "", err } - return file, nil + return info, file, nil } // GoMod is like Lookup(path).GoMod(rev) but avoids the diff --git a/src/cmd/go/internal/modfetch/codehost/codehost.go b/src/cmd/go/internal/modfetch/codehost/codehost.go index e08a84b32c..3d9eb0c712 100644 --- a/src/cmd/go/internal/modfetch/codehost/codehost.go +++ b/src/cmd/go/internal/modfetch/codehost/codehost.go @@ -22,6 +22,9 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/lockedfile" "cmd/go/internal/str" + + "golang.org/x/mod/module" + "golang.org/x/mod/semver" ) // Downloaded size limits. @@ -36,8 +39,15 @@ const ( // remote version control servers, and code hosting sites. // A Repo must be safe for simultaneous use by multiple goroutines. type Repo interface { + // CheckReuse checks whether the old origin information + // remains up to date. If so, whatever cached object it was + // taken from can be reused. + // The subdir gives subdirectory name where the module root is expected to be found, + // "" for the root or "sub/dir" for a subdirectory (no trailing slash). + CheckReuse(old *Origin, subdir string) error + // List lists all tags with the given prefix. - Tags(prefix string) (tags []string, err error) + Tags(prefix string) (*Tags, error) // Stat returns information about the revision rev. // A revision can be any identifier known to the underlying service: @@ -74,8 +84,84 @@ type Repo interface { DescendsFrom(rev, tag string) (bool, error) } -// A Rev describes a single revision in a source code repository. +// An Origin describes the provenance of a given repo method result. +// It can be passed to CheckReuse (usually in a different go command invocation) +// to see whether the result remains up-to-date. +type Origin struct { + VCS string `json:",omitempty"` // "git" etc + URL string `json:",omitempty"` // URL of repository + Subdir string `json:",omitempty"` // subdirectory in repo + + // If TagSum is non-empty, then the resolution of this module version + // depends on the set of tags present in the repo, specifically the tags + // of the form TagPrefix + a valid semver version. + // If the matching repo tags and their commit hashes still hash to TagSum, + // the Origin is still valid (at least as far as the tags are concerned). + // The exact checksum is up to the Repo implementation; see (*gitRepo).Tags. + TagPrefix string `json:",omitempty"` + TagSum string `json:",omitempty"` + + // If Ref is non-empty, then the resolution of this module version + // depends on Ref resolving to the revision identified by Hash. + // If Ref still resolves to Hash, the Origin is still valid (at least as far as Ref is concerned). + // For Git, the Ref is a full ref like "refs/heads/main" or "refs/tags/v1.2.3", + // and the Hash is the Git object hash the ref maps to. + // Other VCS might choose differently, but the idea is that Ref is the name + // with a mutable meaning while Hash is a name with an immutable meaning. + Ref string `json:",omitempty"` + Hash string `json:",omitempty"` +} + +// Checkable reports whether the Origin contains anything that can be checked. +// If not, it's purely informational and should fail a CheckReuse call. +func (o *Origin) Checkable() bool { + return o.TagSum != "" || o.Ref != "" || o.Hash != "" +} + +func (o *Origin) Merge(other *Origin) { + if o.TagSum == "" { + o.TagPrefix = other.TagPrefix + o.TagSum = other.TagSum + } + if o.Ref == "" { + o.Ref = other.Ref + o.Hash = other.Hash + } +} + +// A Tags describes the available tags in a code repository. +type Tags struct { + Origin *Origin + List []Tag +} + +// A Tag describes a single tag in a code repository. +type Tag struct { + Name string + Hash string // content hash identifying tag's content, if available +} + +// isOriginTag reports whether tag should be preserved +// in the Tags method's Origin calculation. +// We can safely ignore tags that are not look like pseudo-versions, +// because ../coderepo.go's (*codeRepo).Versions ignores them too. +// We can also ignore non-semver tags, but we have to include semver +// tags with extra suffixes, because the pseudo-version base finder uses them. +func isOriginTag(tag string) bool { + // modfetch.(*codeRepo).Versions uses Canonical == tag, + // but pseudo-version calculation has a weaker condition that + // the canonical is a prefix of the tag. + // Include those too, so that if any new one appears, we'll invalidate the cache entry. + // This will lead to spurious invalidation of version list results, + // but tags of this form being created should be fairly rare + // (and invalidate pseudo-version results anyway). + c := semver.Canonical(tag) + return c != "" && strings.HasPrefix(tag, c) && !module.IsPseudoVersion(tag) +} + +// A RevInfo describes a single revision in a source code repository. type RevInfo struct { + Origin *Origin Name string // complete ID in underlying repository Short string // shortened ID, for use in pseudo-version Version string // version used in lookup diff --git a/src/cmd/go/internal/modfetch/codehost/git.go b/src/cmd/go/internal/modfetch/codehost/git.go index 034abf360b..3129a31786 100644 --- a/src/cmd/go/internal/modfetch/codehost/git.go +++ b/src/cmd/go/internal/modfetch/codehost/git.go @@ -6,6 +6,8 @@ package codehost import ( "bytes" + "crypto/sha256" + "encoding/base64" "errors" "fmt" "io" @@ -169,6 +171,53 @@ func (r *gitRepo) loadLocalTags() { } } +func (r *gitRepo) CheckReuse(old *Origin, subdir string) error { + if old == nil { + return fmt.Errorf("missing origin") + } + if old.VCS != "git" || old.URL != r.remoteURL { + return fmt.Errorf("origin moved from %v %q to %v %q", old.VCS, old.URL, "git", r.remoteURL) + } + if old.Subdir != subdir { + return fmt.Errorf("origin moved from %v %q %q to %v %q %q", old.VCS, old.URL, old.Subdir, "git", r.remoteURL, subdir) + } + + // Note: Can have Hash with no Ref and no TagSum, + // meaning the Hash simply has to remain in the repo. + // In that case we assume it does in the absence of any real way to check. + // But if neither Hash nor TagSum is present, we have nothing to check, + // which we take to mean we didn't record enough information to be sure. + if old.Hash == "" && old.TagSum == "" { + return fmt.Errorf("non-specific origin") + } + + r.loadRefs() + if r.refsErr != nil { + return r.refsErr + } + + if old.Ref != "" { + hash, ok := r.refs[old.Ref] + if !ok { + return fmt.Errorf("ref %q deleted", old.Ref) + } + if hash != old.Hash { + return fmt.Errorf("ref %q moved from %s to %s", old.Ref, old.Hash, hash) + } + } + if old.TagSum != "" { + tags, err := r.Tags(old.TagPrefix) + if err != nil { + return err + } + if tags.Origin.TagSum != old.TagSum { + return fmt.Errorf("tags changed") + } + } + + return nil +} + // loadRefs loads heads and tags references from the remote into the map r.refs. // The result is cached in memory. func (r *gitRepo) loadRefs() (map[string]string, error) { @@ -219,14 +268,21 @@ func (r *gitRepo) loadRefs() (map[string]string, error) { return r.refs, r.refsErr } -func (r *gitRepo) Tags(prefix string) ([]string, error) { +func (r *gitRepo) Tags(prefix string) (*Tags, error) { refs, err := r.loadRefs() if err != nil { return nil, err } - tags := []string{} - for ref := range refs { + tags := &Tags{ + Origin: &Origin{ + VCS: "git", + URL: r.remoteURL, + TagPrefix: prefix, + }, + List: []Tag{}, + } + for ref, hash := range refs { if !strings.HasPrefix(ref, "refs/tags/") { continue } @@ -234,9 +290,20 @@ func (r *gitRepo) Tags(prefix string) ([]string, error) { if !strings.HasPrefix(tag, prefix) { continue } - tags = append(tags, tag) + tags.List = append(tags.List, Tag{tag, hash}) } - sort.Strings(tags) + sort.Slice(tags.List, func(i, j int) bool { + return tags.List[i].Name < tags.List[j].Name + }) + + dir := prefix[:strings.LastIndex(prefix, "/")+1] + h := sha256.New() + for _, tag := range tags.List { + if isOriginTag(strings.TrimPrefix(tag.Name, dir)) { + fmt.Fprintf(h, "%q %s\n", tag.Name, tag.Hash) + } + } + tags.Origin.TagSum = "t1:" + base64.StdEncoding.EncodeToString(h.Sum(nil)) return tags, nil } @@ -248,7 +315,13 @@ func (r *gitRepo) Latest() (*RevInfo, error) { if refs["HEAD"] == "" { return nil, ErrNoCommits } - return r.Stat(refs["HEAD"]) + info, err := r.Stat(refs["HEAD"]) + if err != nil { + return nil, err + } + info.Origin.Ref = "HEAD" + info.Origin.Hash = refs["HEAD"] + return info, nil } // findRef finds some ref name for the given hash, @@ -278,7 +351,7 @@ const minHashDigits = 7 // stat stats the given rev in the local repository, // or else it fetches more info from the remote repository and tries again. -func (r *gitRepo) stat(rev string) (*RevInfo, error) { +func (r *gitRepo) stat(rev string) (info *RevInfo, err error) { if r.local { return r.statLocal(rev, rev) } @@ -348,6 +421,13 @@ func (r *gitRepo) stat(rev string) (*RevInfo, error) { return nil, &UnknownRevisionError{Rev: rev} } + defer func() { + if info != nil { + info.Origin.Ref = ref + info.Origin.Hash = info.Name + } + }() + // Protect r.fetchLevel and the "fetch more and more" sequence. unlock, err := r.mu.Lock() if err != nil { @@ -465,11 +545,19 @@ func (r *gitRepo) statLocal(version, rev string) (*RevInfo, error) { } info := &RevInfo{ + Origin: &Origin{ + VCS: "git", + URL: r.remoteURL, + Hash: hash, + }, Name: hash, Short: ShortenSHA1(hash), Time: time.Unix(t, 0).UTC(), Version: hash, } + if !strings.HasPrefix(hash, rev) { + info.Origin.Ref = rev + } // Add tags. Output looks like: // ede458df7cd0fdca520df19a33158086a8a68e81 1523994202 HEAD -> master, tag: v1.2.4-annotated, tag: v1.2.3, origin/master, origin/HEAD @@ -580,7 +668,7 @@ func (r *gitRepo) RecentTag(rev, prefix string, allowed func(tag string) bool) ( if err != nil { return "", err } - if len(tags) == 0 { + if len(tags.List) == 0 { return "", nil } @@ -634,7 +722,7 @@ func (r *gitRepo) DescendsFrom(rev, tag string) (bool, error) { if err != nil { return false, err } - if len(tags) == 0 { + if len(tags.List) == 0 { return false, nil } diff --git a/src/cmd/go/internal/modfetch/codehost/git_test.go b/src/cmd/go/internal/modfetch/codehost/git_test.go index a684fa1a9b..6a4212fc5a 100644 --- a/src/cmd/go/internal/modfetch/codehost/git_test.go +++ b/src/cmd/go/internal/modfetch/codehost/git_test.go @@ -43,7 +43,7 @@ var altRepos = []string{ // For now, at least the hgrepo1 tests check the general vcs.go logic. // localGitRepo is like gitrepo1 but allows archive access. -var localGitRepo string +var localGitRepo, localGitURL string func testMain(m *testing.M) int { dir, err := os.MkdirTemp("", "gitrepo-test-") @@ -65,6 +65,15 @@ func testMain(m *testing.M) int { if _, err := Run(localGitRepo, "git", "config", "daemon.uploadarch", "true"); err != nil { log.Fatal(err) } + + // Convert absolute path to file URL. LocalGitRepo will not accept + // Windows absolute paths because they look like a host:path remote. + // TODO(golang.org/issue/32456): use url.FromFilePath when implemented. + if strings.HasPrefix(localGitRepo, "/") { + localGitURL = "file://" + localGitRepo + } else { + localGitURL = "file:///" + filepath.ToSlash(localGitRepo) + } } } @@ -73,17 +82,8 @@ func testMain(m *testing.M) int { func testRepo(t *testing.T, remote string) (Repo, error) { if remote == "localGitRepo" { - // Convert absolute path to file URL. LocalGitRepo will not accept - // Windows absolute paths because they look like a host:path remote. - // TODO(golang.org/issue/32456): use url.FromFilePath when implemented. - var url string - if strings.HasPrefix(localGitRepo, "/") { - url = "file://" + localGitRepo - } else { - url = "file:///" + filepath.ToSlash(localGitRepo) - } testenv.MustHaveExecPath(t, "git") - return LocalGitRepo(url) + return LocalGitRepo(localGitURL) } vcs := "git" for _, k := range []string{"hg"} { @@ -98,13 +98,28 @@ func testRepo(t *testing.T, remote string) (Repo, error) { var tagsTests = []struct { repo string prefix string - tags []string + tags []Tag }{ - {gitrepo1, "xxx", []string{}}, - {gitrepo1, "", []string{"v1.2.3", "v1.2.4-annotated", "v2.0.1", "v2.0.2", "v2.3"}}, - {gitrepo1, "v", []string{"v1.2.3", "v1.2.4-annotated", "v2.0.1", "v2.0.2", "v2.3"}}, - {gitrepo1, "v1", []string{"v1.2.3", "v1.2.4-annotated"}}, - {gitrepo1, "2", []string{}}, + {gitrepo1, "xxx", []Tag{}}, + {gitrepo1, "", []Tag{ + {"v1.2.3", "ede458df7cd0fdca520df19a33158086a8a68e81"}, + {"v1.2.4-annotated", "ede458df7cd0fdca520df19a33158086a8a68e81"}, + {"v2.0.1", "76a00fb249b7f93091bc2c89a789dab1fc1bc26f"}, + {"v2.0.2", "9d02800338b8a55be062c838d1f02e0c5780b9eb"}, + {"v2.3", "76a00fb249b7f93091bc2c89a789dab1fc1bc26f"}, + }}, + {gitrepo1, "v", []Tag{ + {"v1.2.3", "ede458df7cd0fdca520df19a33158086a8a68e81"}, + {"v1.2.4-annotated", "ede458df7cd0fdca520df19a33158086a8a68e81"}, + {"v2.0.1", "76a00fb249b7f93091bc2c89a789dab1fc1bc26f"}, + {"v2.0.2", "9d02800338b8a55be062c838d1f02e0c5780b9eb"}, + {"v2.3", "76a00fb249b7f93091bc2c89a789dab1fc1bc26f"}, + }}, + {gitrepo1, "v1", []Tag{ + {"v1.2.3", "ede458df7cd0fdca520df19a33158086a8a68e81"}, + {"v1.2.4-annotated", "ede458df7cd0fdca520df19a33158086a8a68e81"}, + }}, + {gitrepo1, "2", []Tag{}}, } func TestTags(t *testing.T) { @@ -121,13 +136,24 @@ func TestTags(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tags, tt.tags) { - t.Errorf("Tags: incorrect tags\nhave %v\nwant %v", tags, tt.tags) + if tags == nil || !reflect.DeepEqual(tags.List, tt.tags) { + t.Errorf("Tags(%q): incorrect tags\nhave %v\nwant %v", tt.prefix, tags, tt.tags) } } t.Run(path.Base(tt.repo)+"/"+tt.prefix, f) if tt.repo == gitrepo1 { + // Clear hashes. + clearTags := []Tag{} + for _, tag := range tt.tags { + clearTags = append(clearTags, Tag{tag.Name, ""}) + } + tags := tt.tags for _, tt.repo = range altRepos { + if strings.Contains(tt.repo, "Git") { + tt.tags = tags + } else { + tt.tags = clearTags + } t.Run(path.Base(tt.repo)+"/"+tt.prefix, f) } } @@ -141,6 +167,12 @@ var latestTests = []struct { { gitrepo1, &RevInfo{ + Origin: &Origin{ + VCS: "git", + URL: "https://vcs-test.golang.org/git/gitrepo1", + Ref: "HEAD", + Hash: "ede458df7cd0fdca520df19a33158086a8a68e81", + }, Name: "ede458df7cd0fdca520df19a33158086a8a68e81", Short: "ede458df7cd0", Version: "ede458df7cd0fdca520df19a33158086a8a68e81", @@ -151,6 +183,11 @@ var latestTests = []struct { { hgrepo1, &RevInfo{ + Origin: &Origin{ + VCS: "hg", + URL: "https://vcs-test.golang.org/hg/hgrepo1", + Hash: "18518c07eb8ed5c80221e997e518cccaa8c0c287", + }, Name: "18518c07eb8ed5c80221e997e518cccaa8c0c287", Short: "18518c07eb8e", Version: "18518c07eb8ed5c80221e997e518cccaa8c0c287", @@ -174,12 +211,17 @@ func TestLatest(t *testing.T) { t.Fatal(err) } if !reflect.DeepEqual(info, tt.info) { - t.Errorf("Latest: incorrect info\nhave %+v\nwant %+v", *info, *tt.info) + t.Errorf("Latest: incorrect info\nhave %+v (origin %+v)\nwant %+v (origin %+v)", info, info.Origin, tt.info, tt.info.Origin) } } t.Run(path.Base(tt.repo), f) if tt.repo == gitrepo1 { tt.repo = "localGitRepo" + info := *tt.info + tt.info = &info + o := *info.Origin + info.Origin = &o + o.URL = localGitURL t.Run(path.Base(tt.repo), f) } } @@ -590,11 +632,12 @@ func TestStat(t *testing.T) { if !strings.Contains(err.Error(), tt.err) { t.Fatalf("Stat: wrong error %q, want %q", err, tt.err) } - if info != nil { - t.Errorf("Stat: non-nil info with error %q", err) + if info != nil && info.Origin == nil { + t.Errorf("Stat: non-nil info with nil Origin with error %q", err) } return } + info.Origin = nil // TestLatest and ../../../testdata/script/reuse_git.txt test Origin well enough if !reflect.DeepEqual(info, tt.info) { t.Errorf("Stat: incorrect info\nhave %+v\nwant %+v", *info, *tt.info) } diff --git a/src/cmd/go/internal/modfetch/codehost/vcs.go b/src/cmd/go/internal/modfetch/codehost/vcs.go index de62265efc..f1c40998b2 100644 --- a/src/cmd/go/internal/modfetch/codehost/vcs.go +++ b/src/cmd/go/internal/modfetch/codehost/vcs.go @@ -290,7 +290,13 @@ func (r *vcsRepo) loadBranches() { } } -func (r *vcsRepo) Tags(prefix string) ([]string, error) { +var ErrNoRepoHash = errors.New("RepoHash not supported") + +func (r *vcsRepo) CheckReuse(old *Origin, subdir string) error { + return fmt.Errorf("vcs %s does not implement CheckReuse", r.cmd.vcs) +} + +func (r *vcsRepo) Tags(prefix string) (*Tags, error) { unlock, err := r.mu.Lock() if err != nil { return nil, err @@ -298,14 +304,24 @@ func (r *vcsRepo) Tags(prefix string) ([]string, error) { defer unlock() r.tagsOnce.Do(r.loadTags) - - tags := []string{} + tags := &Tags{ + // None of the other VCS provide a reasonable way to compute TagSum + // without downloading the whole repo, so we only include VCS and URL + // in the Origin. + Origin: &Origin{ + VCS: r.cmd.vcs, + URL: r.remote, + }, + List: []Tag{}, + } for tag := range r.tags { if strings.HasPrefix(tag, prefix) { - tags = append(tags, tag) + tags.List = append(tags.List, Tag{tag, ""}) } } - sort.Strings(tags) + sort.Slice(tags.List, func(i, j int) bool { + return tags.List[i].Name < tags.List[j].Name + }) return tags, nil } @@ -352,7 +368,16 @@ func (r *vcsRepo) statLocal(rev string) (*RevInfo, error) { if err != nil { return nil, &UnknownRevisionError{Rev: rev} } - return r.cmd.parseStat(rev, string(out)) + info, err := r.cmd.parseStat(rev, string(out)) + if err != nil { + return nil, err + } + if info.Origin == nil { + info.Origin = new(Origin) + } + info.Origin.VCS = r.cmd.vcs + info.Origin.URL = r.remote + return info, nil } func (r *vcsRepo) Latest() (*RevInfo, error) { @@ -491,6 +516,9 @@ func hgParseStat(rev, out string) (*RevInfo, error) { sort.Strings(tags) info := &RevInfo{ + Origin: &Origin{ + Hash: hash, + }, Name: hash, Short: ShortenSHA1(hash), Time: time.Unix(t, 0).UTC(), @@ -569,6 +597,9 @@ func fossilParseStat(rev, out string) (*RevInfo, error) { version = hash // extend to full hash } info := &RevInfo{ + Origin: &Origin{ + Hash: hash, + }, Name: hash, Short: ShortenSHA1(hash), Time: t, diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index ff1cea1d94..a994f79d4b 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -130,12 +130,16 @@ func (r *codeRepo) ModulePath() string { return r.modPath } -func (r *codeRepo) Versions(prefix string) ([]string, error) { +func (r *codeRepo) CheckReuse(old *codehost.Origin) error { + return r.code.CheckReuse(old, r.codeDir) +} + +func (r *codeRepo) Versions(prefix string) (*Versions, error) { // Special case: gopkg.in/macaroon-bakery.v2-unstable // does not use the v2 tags (those are for macaroon-bakery.v2). // It has no possible tags at all. if strings.HasPrefix(r.modPath, "gopkg.in/") && strings.HasSuffix(r.modPath, "-unstable") { - return nil, nil + return &Versions{}, nil } p := prefix @@ -151,14 +155,16 @@ func (r *codeRepo) Versions(prefix string) ([]string, error) { } var list, incompatible []string - for _, tag := range tags { - if !strings.HasPrefix(tag, p) { + for _, tag := range tags.List { + if !strings.HasPrefix(tag.Name, p) { continue } - v := tag + v := tag.Name if r.codeDir != "" { v = v[len(r.codeDir)+1:] } + // Note: ./codehost/codehost.go's isOriginTag knows about these conditions too. + // If these are relaxed, isOriginTag will need to be relaxed as well. if v == "" || v != semver.Canonical(v) { // Ignore non-canonical tags: Stat rewrites those to canonical // pseudo-versions. Note that we compare against semver.Canonical here @@ -186,7 +192,7 @@ func (r *codeRepo) Versions(prefix string) ([]string, error) { semver.Sort(list) semver.Sort(incompatible) - return r.appendIncompatibleVersions(list, incompatible) + return r.appendIncompatibleVersions(tags.Origin, list, incompatible) } // appendIncompatibleVersions appends "+incompatible" versions to list if @@ -196,10 +202,14 @@ func (r *codeRepo) Versions(prefix string) ([]string, error) { // prefix. // // Both list and incompatible must be sorted in semantic order. -func (r *codeRepo) appendIncompatibleVersions(list, incompatible []string) ([]string, error) { +func (r *codeRepo) appendIncompatibleVersions(origin *codehost.Origin, list, incompatible []string) (*Versions, error) { + versions := &Versions{ + Origin: origin, + List: list, + } if len(incompatible) == 0 || r.pathMajor != "" { // No +incompatible versions are possible, so no need to check them. - return list, nil + return versions, nil } versionHasGoMod := func(v string) (bool, error) { @@ -232,7 +242,7 @@ func (r *codeRepo) appendIncompatibleVersions(list, incompatible []string) ([]st // (github.com/russross/blackfriday@v2.0.0 and // github.com/libp2p/go-libp2p@v6.0.23), and (as of 2019-10-29) have no // concrete examples for which it is undesired. - return list, nil + return versions, nil } } @@ -271,10 +281,10 @@ func (r *codeRepo) appendIncompatibleVersions(list, incompatible []string) ([]st // bounds. continue } - list = append(list, v+"+incompatible") + versions.List = append(versions.List, v+"+incompatible") } - return list, nil + return versions, nil } func (r *codeRepo) Stat(rev string) (*RevInfo, error) { @@ -439,7 +449,28 @@ func (r *codeRepo) convert(info *codehost.RevInfo, statVers string) (*RevInfo, e return nil, errIncompatible } + origin := info.Origin + if module.IsPseudoVersion(v) { + // Add tags that are relevant to pseudo-version calculation to origin. + prefix := "" + if r.codeDir != "" { + prefix = r.codeDir + "/" + } + if r.pathMajor != "" { // "/v2" or "/.v2" + prefix += r.pathMajor[1:] + "." // += "v2." + } + tags, err := r.code.Tags(prefix) + if err != nil { + return nil, err + } + o := *origin + origin = &o + origin.TagPrefix = tags.Origin.TagPrefix + origin.TagSum = tags.Origin.TagSum + } + return &RevInfo{ + Origin: origin, Name: info.Name, Short: info.Short, Time: info.Time, @@ -674,11 +705,11 @@ func (r *codeRepo) validatePseudoVersion(info *codehost.RevInfo, version string) var lastTag string // Prefer to log some real tag rather than a canonically-equivalent base. ancestorFound := false - for _, tag := range tags { - versionOnly := strings.TrimPrefix(tag, tagPrefix) + for _, tag := range tags.List { + versionOnly := strings.TrimPrefix(tag.Name, tagPrefix) if semver.Compare(versionOnly, base) == 0 { - lastTag = tag - ancestorFound, err = r.code.DescendsFrom(info.Name, tag) + lastTag = tag.Name + ancestorFound, err = r.code.DescendsFrom(info.Name, tag.Name) if ancestorFound { break } @@ -922,10 +953,11 @@ func (r *codeRepo) modPrefix(rev string) string { } func (r *codeRepo) retractedVersions() (func(string) bool, error) { - versions, err := r.Versions("") + vs, err := r.Versions("") if err != nil { return nil, err } + versions := vs.List for i, v := range versions { if strings.HasSuffix(v, "+incompatible") { diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go index 8d0eb00544..967978cd4d 100644 --- a/src/cmd/go/internal/modfetch/coderepo_test.go +++ b/src/cmd/go/internal/modfetch/coderepo_test.go @@ -823,7 +823,7 @@ func TestCodeRepoVersions(t *testing.T) { if err != nil { t.Fatalf("Versions(%q): %v", tt.prefix, err) } - if !reflect.DeepEqual(list, tt.versions) { + if !reflect.DeepEqual(list.List, tt.versions) { t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions) } }) @@ -921,7 +921,13 @@ type fixedTagsRepo struct { codehost.Repo } -func (ch *fixedTagsRepo) Tags(string) ([]string, error) { return ch.tags, nil } +func (ch *fixedTagsRepo) Tags(string) (*codehost.Tags, error) { + tags := &codehost.Tags{} + for _, t := range ch.tags { + tags.List = append(tags.List, codehost.Tag{Name: t}) + } + return tags, nil +} func TestNonCanonicalSemver(t *testing.T) { root := "golang.org/x/issue24476" @@ -945,7 +951,7 @@ func TestNonCanonicalSemver(t *testing.T) { if err != nil { t.Fatal(err) } - if len(v) != 1 || v[0] != "v1.0.1" { + if len(v.List) != 1 || v.List[0] != "v1.0.1" { t.Fatal("unexpected versions returned:", v) } } diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go index 2491b7d185..d2374680d8 100644 --- a/src/cmd/go/internal/modfetch/proxy.go +++ b/src/cmd/go/internal/modfetch/proxy.go @@ -225,6 +225,12 @@ func (p *proxyRepo) ModulePath() string { return p.path } +var errProxyReuse = fmt.Errorf("proxy does not support CheckReuse") + +func (p *proxyRepo) CheckReuse(old *codehost.Origin) error { + return errProxyReuse +} + // versionError returns err wrapped in a ModuleError for p.path. func (p *proxyRepo) versionError(version string, err error) error { if version != "" && version != module.CanonicalVersion(version) { @@ -279,7 +285,7 @@ func (p *proxyRepo) getBody(path string) (r io.ReadCloser, err error) { return resp.Body, nil } -func (p *proxyRepo) Versions(prefix string) ([]string, error) { +func (p *proxyRepo) Versions(prefix string) (*Versions, error) { data, err := p.getBytes("@v/list") if err != nil { p.listLatestOnce.Do(func() { @@ -299,7 +305,7 @@ func (p *proxyRepo) Versions(prefix string) ([]string, error) { p.listLatest, p.listLatestErr = p.latestFromList(allLine) }) semver.Sort(list) - return list, nil + return &Versions{List: list}, nil } func (p *proxyRepo) latest() (*RevInfo, error) { @@ -317,9 +323,8 @@ func (p *proxyRepo) latest() (*RevInfo, error) { func (p *proxyRepo) latestFromList(allLine []string) (*RevInfo, error) { var ( - bestTime time.Time - bestTimeIsFromPseudo bool - bestVersion string + bestTime time.Time + bestVersion string ) for _, line := range allLine { f := strings.Fields(line) @@ -327,14 +332,12 @@ func (p *proxyRepo) latestFromList(allLine []string) (*RevInfo, error) { // If the proxy includes timestamps, prefer the timestamp it reports. // Otherwise, derive the timestamp from the pseudo-version. var ( - ft time.Time - ftIsFromPseudo = false + ft time.Time ) if len(f) >= 2 { ft, _ = time.Parse(time.RFC3339, f[1]) } else if module.IsPseudoVersion(f[0]) { ft, _ = module.PseudoVersionTime(f[0]) - ftIsFromPseudo = true } else { // Repo.Latest promises that this method is only called where there are // no tagged versions. Ignore any tagged versions that were added in the @@ -343,7 +346,6 @@ func (p *proxyRepo) latestFromList(allLine []string) (*RevInfo, error) { } if bestTime.Before(ft) { bestTime = ft - bestTimeIsFromPseudo = ftIsFromPseudo bestVersion = f[0] } } @@ -352,22 +354,8 @@ func (p *proxyRepo) latestFromList(allLine []string) (*RevInfo, error) { return nil, p.versionError("", codehost.ErrNoCommits) } - if bestTimeIsFromPseudo { - // We parsed bestTime from the pseudo-version, but that's in UTC and we're - // supposed to report the timestamp as reported by the VCS. - // Stat the selected version to canonicalize the timestamp. - // - // TODO(bcmills): Should we also stat other versions to ensure that we - // report the correct Name and Short for the revision? - return p.Stat(bestVersion) - } - - return &RevInfo{ - Version: bestVersion, - Name: bestVersion, - Short: bestVersion, - Time: bestTime, - }, nil + // Call Stat to get all the other fields, including Origin information. + return p.Stat(bestVersion) } func (p *proxyRepo) Stat(rev string) (*RevInfo, error) { diff --git a/src/cmd/go/internal/modfetch/repo.go b/src/cmd/go/internal/modfetch/repo.go index 1b42ecb6ed..d4c57bb300 100644 --- a/src/cmd/go/internal/modfetch/repo.go +++ b/src/cmd/go/internal/modfetch/repo.go @@ -29,6 +29,12 @@ type Repo interface { // ModulePath returns the module path. ModulePath() string + // CheckReuse checks whether the validation criteria in the origin + // are still satisfied on the server corresponding to this module. + // If so, the caller can reuse any cached Versions or RevInfo containing + // this origin rather than redownloading those from the server. + CheckReuse(old *codehost.Origin) error + // Versions lists all known versions with the given prefix. // Pseudo-versions are not included. // @@ -42,7 +48,7 @@ type Repo interface { // // If the underlying repository does not exist, // Versions returns an error matching errors.Is(_, os.NotExist). - Versions(prefix string) ([]string, error) + Versions(prefix string) (*Versions, error) // Stat returns information about the revision rev. // A revision can be any identifier known to the underlying service: @@ -61,7 +67,14 @@ type Repo interface { Zip(dst io.Writer, version string) error } -// A Rev describes a single revision in a module repository. +// A Versions describes the available versions in a module repository. +type Versions struct { + Origin *codehost.Origin `json:",omitempty"` // origin information for reuse + + List []string // semver versions +} + +// A RevInfo describes a single revision in a module repository. type RevInfo struct { Version string // suggested version string for this revision Time time.Time // commit time @@ -70,6 +83,8 @@ type RevInfo struct { // but they are not recorded when talking about module versions. Name string `json:"-"` // complete ID in underlying repository Short string `json:"-"` // shortened ID, for use in pseudo-version + + Origin *codehost.Origin `json:",omitempty"` // provenance for reuse } // Re: module paths, import paths, repository roots, and lookups @@ -320,7 +335,14 @@ func (l *loggingRepo) ModulePath() string { return l.r.ModulePath() } -func (l *loggingRepo) Versions(prefix string) (tags []string, err error) { +func (l *loggingRepo) CheckReuse(old *codehost.Origin) (err error) { + defer func() { + logCall("CheckReuse[%s]: %v", l.r.ModulePath(), err) + }() + return l.r.CheckReuse(old) +} + +func (l *loggingRepo) Versions(prefix string) (*Versions, error) { defer logCall("Repo[%s]: Versions(%q)", l.r.ModulePath(), prefix)() return l.r.Versions(prefix) } @@ -360,11 +382,12 @@ type errRepo struct { func (r errRepo) ModulePath() string { return r.modulePath } -func (r errRepo) Versions(prefix string) (tags []string, err error) { return nil, r.err } -func (r errRepo) Stat(rev string) (*RevInfo, error) { return nil, r.err } -func (r errRepo) Latest() (*RevInfo, error) { return nil, r.err } -func (r errRepo) GoMod(version string) ([]byte, error) { return nil, r.err } -func (r errRepo) Zip(dst io.Writer, version string) error { return r.err } +func (r errRepo) CheckReuse(old *codehost.Origin) error { return r.err } +func (r errRepo) Versions(prefix string) (*Versions, error) { return nil, r.err } +func (r errRepo) Stat(rev string) (*RevInfo, error) { return nil, r.err } +func (r errRepo) Latest() (*RevInfo, error) { return nil, r.err } +func (r errRepo) GoMod(version string) ([]byte, error) { return nil, r.err } +func (r errRepo) Zip(dst io.Writer, version string) error { return r.err } // A notExistError is like fs.ErrNotExist, but with a custom message type notExistError struct { diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 588bcf4bdc..2055303efe 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -91,8 +91,8 @@ func versions(ctx context.Context, path string, allowed AllowedFunc) ([]string, if err != nil { return err } - allowedVersions := make([]string, 0, len(allVersions)) - for _, v := range allVersions { + allowedVersions := make([]string, 0, len(allVersions.List)) + for _, v := range allVersions.List { if err := allowed(ctx, module.Version{Path: path, Version: v}); err == nil { allowedVersions = append(allowedVersions, v) } else if !errors.Is(err, ErrDisallowed) { diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index ae5304f87e..051a4fe822 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -177,7 +177,7 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if err != nil { return nil, err } - releases, prereleases, err := qm.filterVersions(ctx, versions) + releases, prereleases, err := qm.filterVersions(ctx, versions.List) if err != nil { return nil, err } @@ -991,7 +991,7 @@ func versionHasGoMod(_ context.Context, m module.Version) (bool, error) { // available versions, but cannot fetch specific source files. type versionRepo interface { ModulePath() string - Versions(prefix string) ([]string, error) + Versions(prefix string) (*modfetch.Versions, error) Stat(rev string) (*modfetch.RevInfo, error) Latest() (*modfetch.RevInfo, error) } @@ -1023,8 +1023,10 @@ type emptyRepo struct { var _ versionRepo = emptyRepo{} -func (er emptyRepo) ModulePath() string { return er.path } -func (er emptyRepo) Versions(prefix string) ([]string, error) { return nil, nil } +func (er emptyRepo) ModulePath() string { return er.path } +func (er emptyRepo) Versions(prefix string) (*modfetch.Versions, error) { + return &modfetch.Versions{}, nil +} func (er emptyRepo) Stat(rev string) (*modfetch.RevInfo, error) { return nil, er.err } func (er emptyRepo) Latest() (*modfetch.RevInfo, error) { return nil, er.err } @@ -1044,13 +1046,16 @@ func (rr *replacementRepo) ModulePath() string { return rr.repo.ModulePath() } // Versions returns the versions from rr.repo augmented with any matching // replacement versions. -func (rr *replacementRepo) Versions(prefix string) ([]string, error) { +func (rr *replacementRepo) Versions(prefix string) (*modfetch.Versions, error) { repoVersions, err := rr.repo.Versions(prefix) - if err != nil && !errors.Is(err, os.ErrNotExist) { - return nil, err + if err != nil { + if !errors.Is(err, os.ErrNotExist) { + return nil, err + } + repoVersions = new(modfetch.Versions) } - versions := repoVersions + versions := repoVersions.List for _, mm := range MainModules.Versions() { if index := MainModules.Index(mm); index != nil && len(index.replace) > 0 { path := rr.ModulePath() @@ -1062,15 +1067,15 @@ func (rr *replacementRepo) Versions(prefix string) ([]string, error) { } } - if len(versions) == len(repoVersions) { // No replacement versions added. - return versions, nil + if len(versions) == len(repoVersions.List) { // replacement versions added + return repoVersions, nil } sort.Slice(versions, func(i, j int) bool { return semver.Compare(versions[i], versions[j]) < 0 }) str.Uniq(&versions) - return versions, nil + return &modfetch.Versions{List: versions}, nil } func (rr *replacementRepo) Stat(rev string) (*modfetch.RevInfo, error) { From 5f305ae8e5796ea3821088863a6842117c58da72 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 10 Jun 2022 12:03:06 -0400 Subject: [PATCH 11/78] cmd/go: add -reuse flag to make proxy invocations more efficient The go list -m and go mod download commands now have a -reuse flag, which is passed the name of a file containing the JSON output from a previous run of the same command. (It is up to the caller to ensure that flags such as -versions or -retracted, which affect the output, are consistent between the old and new run.) The new run uses the old JSON to evaluate whether the answer is unchanged since the old run. If so, it reuses that information, avoiding a costly 'git fetch', and sets a new Reuse: true field in its own JSON output. This dance with saving the JSON output and passing it back to -reuse is not necessary on most systems, because the go command caches version control checkouts in the module cache. That cache means that a new 'git fetch' would only download the commits that are new since the previous one (often none at all). The dance becomes important only on systems that do not preserve the module cache, for example by running 'go clean -modcache' aggressively or by running in some environment that starts with an empty file system. For #53644. Change-Id: I447960abf8055f83cc6dbc699a9fde9931130004 Reviewed-on: https://go-review.googlesource.com/c/go/+/411398 Run-TryBot: Russ Cox Reviewed-by: Bryan Mills --- src/cmd/go/alldocs.go | 26 +- src/cmd/go/internal/list/list.go | 27 +- src/cmd/go/internal/modcmd/download.go | 40 +- src/cmd/go/internal/modcmd/why.go | 2 +- src/cmd/go/internal/modfetch/cache.go | 20 + .../go/internal/modfetch/codehost/codehost.go | 17 +- src/cmd/go/internal/modfetch/codehost/git.go | 5 +- src/cmd/go/internal/modfetch/coderepo.go | 36 +- src/cmd/go/internal/modinfo/info.go | 22 +- src/cmd/go/internal/modload/build.go | 62 ++- src/cmd/go/internal/modload/edit.go | 2 +- src/cmd/go/internal/modload/list.go | 60 ++- src/cmd/go/internal/modload/mvs.go | 11 +- src/cmd/go/internal/modload/query.go | 75 +++- src/cmd/go/testdata/script/reuse_git.txt | 371 ++++++++++++++++++ 15 files changed, 711 insertions(+), 65 deletions(-) create mode 100644 src/cmd/go/testdata/script/reuse_git.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 78128dcf23..db6372642a 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -930,6 +930,7 @@ // // type Module struct { // Path string // module path +// Query string // version query corresponding to this version // Version string // module version // Versions []string // available module versions // Replace *Module // replaced by this module @@ -943,6 +944,8 @@ // Retracted []string // retraction information, if any (with -retracted or -u) // Deprecated string // deprecation message, if any (with -u) // Error *ModuleError // error loading module +// Origin any // provenance of module +// Reuse bool // reuse of old module info is safe // } // // type ModuleError struct { @@ -1019,6 +1022,16 @@ // module as a Module struct. If an error occurs, the result will // be a Module struct with a non-nil Error field. // +// When using -m, the -reuse=old.json flag accepts the name of file containing +// the JSON output of a previous 'go list -m -json' invocation with the +// same set of modifier flags (such as -u, -retracted, and -versions). +// The go command may use this file to determine that a module is unchanged +// since the previous invocation and avoid redownloading information about it. +// Modules that are not redownloaded will be marked in the new output by +// setting the Reuse field to true. Normally the module cache provides this +// kind of reuse automatically; the -reuse flag can be useful on systems that +// do not preserve the module cache. +// // For more about build flags, see 'go help build'. // // For more about specifying packages, see 'go help packages'. @@ -1055,7 +1068,7 @@ // // Usage: // -// go mod download [-x] [-json] [modules] +// go mod download [-x] [-json] [-reuse=old.json] [modules] // // Download downloads the named modules, which can be module patterns selecting // dependencies of the main module or module queries of the form path@version. @@ -1078,6 +1091,7 @@ // // type Module struct { // Path string // module path +// Query string // version query corresponding to this version // Version string // module version // Error string // error loading module // Info string // absolute path to cached .info file @@ -1086,8 +1100,18 @@ // Dir string // absolute path to cached source root directory // Sum string // checksum for path, version (as in go.sum) // GoModSum string // checksum for go.mod (as in go.sum) +// Origin any // provenance of module +// Reuse bool // reuse of old module info is safe // } // +// The -reuse flag accepts the name of file containing the JSON output of a +// previous 'go mod download -json' invocation. The go command may use this +// file to determine that a module is unchanged since the previous invocation +// and avoid redownloading it. Modules that are not redownloaded will be marked +// in the new output by setting the Reuse field to true. Normally the module +// cache provides this kind of reuse automatically; the -reuse flag can be +// useful on systems that do not preserve the module cache. +// // The -x flag causes download to print the commands download executes. // // See https://golang.org/ref/mod#go-mod-download for more about 'go mod download'. diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 9c651f2bf3..5f8be6e3c9 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -223,6 +223,7 @@ applied to a Go struct, but now a Module struct: type Module struct { Path string // module path + Query string // version query corresponding to this version Version string // module version Versions []string // available module versions Replace *Module // replaced by this module @@ -236,6 +237,8 @@ applied to a Go struct, but now a Module struct: Retracted []string // retraction information, if any (with -retracted or -u) Deprecated string // deprecation message, if any (with -u) Error *ModuleError // error loading module + Origin any // provenance of module + Reuse bool // reuse of old module info is safe } type ModuleError struct { @@ -312,6 +315,16 @@ that must be a module path or query and returns the specified module as a Module struct. If an error occurs, the result will be a Module struct with a non-nil Error field. +When using -m, the -reuse=old.json flag accepts the name of file containing +the JSON output of a previous 'go list -m -json' invocation with the +same set of modifier flags (such as -u, -retracted, and -versions). +The go command may use this file to determine that a module is unchanged +since the previous invocation and avoid redownloading information about it. +Modules that are not redownloaded will be marked in the new output by +setting the Reuse field to true. Normally the module cache provides this +kind of reuse automatically; the -reuse flag can be useful on systems that +do not preserve the module cache. + For more about build flags, see 'go help build'. For more about specifying packages, see 'go help packages'. @@ -337,6 +350,7 @@ var ( listJsonFields jsonFlag // If not empty, only output these fields. listM = CmdList.Flag.Bool("m", false, "") listRetracted = CmdList.Flag.Bool("retracted", false, "") + listReuse = CmdList.Flag.String("reuse", "", "") listTest = CmdList.Flag.Bool("test", false, "") listU = CmdList.Flag.Bool("u", false, "") listVersions = CmdList.Flag.Bool("versions", false, "") @@ -398,6 +412,12 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { if *listFmt != "" && listJson == true { base.Fatalf("go list -f cannot be used with -json") } + if *listReuse != "" && !*listM { + base.Fatalf("go list -reuse cannot be used without -m") + } + if *listReuse != "" && modload.HasModRoot() { + base.Fatalf("go list -reuse cannot be used inside a module") + } work.BuildInit() out := newTrackingWriter(os.Stdout) @@ -532,7 +552,10 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { mode |= modload.ListRetractedVersions } } - mods, err := modload.ListModules(ctx, args, mode) + if *listReuse != "" && len(args) == 0 { + base.Fatalf("go: list -m -reuse only has an effect with module@version arguments") + } + mods, err := modload.ListModules(ctx, args, mode, *listReuse) if !*listE { for _, m := range mods { if m.Error != nil { @@ -783,7 +806,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { if *listRetracted { mode |= modload.ListRetracted } - rmods, err := modload.ListModules(ctx, args, mode) + rmods, err := modload.ListModules(ctx, args, mode, *listReuse) if err != nil && !*listE { base.Errorf("go: %v", err) } diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index ea4f9f8663..a5fc63ed26 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -13,6 +13,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modfetch" + "cmd/go/internal/modfetch/codehost" "cmd/go/internal/modload" "golang.org/x/mod/module" @@ -20,7 +21,7 @@ import ( ) var cmdDownload = &base.Command{ - UsageLine: "go mod download [-x] [-json] [modules]", + UsageLine: "go mod download [-x] [-json] [-reuse=old.json] [modules]", Short: "download modules to local cache", Long: ` Download downloads the named modules, which can be module patterns selecting @@ -44,6 +45,7 @@ corresponding to this Go struct: type Module struct { Path string // module path + Query string // version query corresponding to this version Version string // module version Error string // error loading module Info string // absolute path to cached .info file @@ -52,8 +54,18 @@ corresponding to this Go struct: Dir string // absolute path to cached source root directory Sum string // checksum for path, version (as in go.sum) GoModSum string // checksum for go.mod (as in go.sum) + Origin any // provenance of module + Reuse bool // reuse of old module info is safe } +The -reuse flag accepts the name of file containing the JSON output of a +previous 'go mod download -json' invocation. The go command may use this +file to determine that a module is unchanged since the previous invocation +and avoid redownloading it. Modules that are not redownloaded will be marked +in the new output by setting the Reuse field to true. Normally the module +cache provides this kind of reuse automatically; the -reuse flag can be +useful on systems that do not preserve the module cache. + The -x flag causes download to print the commands download executes. See https://golang.org/ref/mod#go-mod-download for more about 'go mod download'. @@ -62,7 +74,10 @@ See https://golang.org/ref/mod#version-queries for more about version queries. `, } -var downloadJSON = cmdDownload.Flag.Bool("json", false, "") +var ( + downloadJSON = cmdDownload.Flag.Bool("json", false, "") + downloadReuse = cmdDownload.Flag.String("reuse", "", "") +) func init() { cmdDownload.Run = runDownload // break init cycle @@ -75,6 +90,7 @@ func init() { type moduleJSON struct { Path string `json:",omitempty"` Version string `json:",omitempty"` + Query string `json:",omitempty"` Error string `json:",omitempty"` Info string `json:",omitempty"` GoMod string `json:",omitempty"` @@ -82,6 +98,9 @@ type moduleJSON struct { Dir string `json:",omitempty"` Sum string `json:",omitempty"` GoModSum string `json:",omitempty"` + + Origin *codehost.Origin `json:",omitempty"` + Reuse bool `json:",omitempty"` } func runDownload(ctx context.Context, cmd *base.Command, args []string) { @@ -148,12 +167,12 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { } downloadModule := func(m *moduleJSON) { - var err error - _, m.Info, err = modfetch.InfoFile(m.Path, m.Version) + _, file, err := modfetch.InfoFile(m.Path, m.Version) if err != nil { m.Error = err.Error() return } + m.Info = file m.GoMod, err = modfetch.GoModFile(m.Path, m.Version) if err != nil { m.Error = err.Error() @@ -179,9 +198,14 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { } var mods []*moduleJSON + + if *downloadReuse != "" && modload.HasModRoot() { + base.Fatalf("go mod download -reuse cannot be used inside a module") + } + type token struct{} sem := make(chan token, runtime.GOMAXPROCS(0)) - infos, infosErr := modload.ListModules(ctx, args, 0) + infos, infosErr := modload.ListModules(ctx, args, 0, *downloadReuse) if !haveExplicitArgs { // 'go mod download' is sometimes run without arguments to pre-populate the // module cache. It may fetch modules that aren't needed to build packages @@ -209,12 +233,18 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { m := &moduleJSON{ Path: info.Path, Version: info.Version, + Query: info.Query, + Reuse: info.Reuse, + Origin: info.Origin, } mods = append(mods, m) if info.Error != nil { m.Error = info.Error.Err continue } + if m.Reuse { + continue + } sem <- token{} go func() { downloadModule(m) diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index 2d3f1eb05b..8e929a0001 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -82,7 +82,7 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { } } - mods, err := modload.ListModules(ctx, args, 0) + mods, err := modload.ListModules(ctx, args, 0, "") if err != nil { base.Fatalf("go: %v", err) } diff --git a/src/cmd/go/internal/modfetch/cache.go b/src/cmd/go/internal/modfetch/cache.go index 417c5598fb..7ebe208c12 100644 --- a/src/cmd/go/internal/modfetch/cache.go +++ b/src/cmd/go/internal/modfetch/cache.go @@ -573,6 +573,26 @@ func writeDiskStat(file string, info *RevInfo) error { if file == "" { return nil } + + if info.Origin != nil { + // Clean the origin information, which might have too many + // validation criteria, for example if we are saving the result of + // m@master as m@pseudo-version. + clean := *info + info = &clean + o := *info.Origin + info.Origin = &o + + // Tags never matter if you are starting with a semver version, + // as we would be when finding this cache entry. + o.TagSum = "" + o.TagPrefix = "" + // Ref doesn't matter if you have a pseudoversion. + if module.IsPseudoVersion(info.Version) { + o.Ref = "" + } + } + js, err := json.Marshal(info) if err != nil { return err diff --git a/src/cmd/go/internal/modfetch/codehost/codehost.go b/src/cmd/go/internal/modfetch/codehost/codehost.go index 3d9eb0c712..937ac6819a 100644 --- a/src/cmd/go/internal/modfetch/codehost/codehost.go +++ b/src/cmd/go/internal/modfetch/codehost/codehost.go @@ -113,20 +113,17 @@ type Origin struct { } // Checkable reports whether the Origin contains anything that can be checked. -// If not, it's purely informational and should fail a CheckReuse call. +// If not, the Origin is purely informational and should fail a CheckReuse call. func (o *Origin) Checkable() bool { return o.TagSum != "" || o.Ref != "" || o.Hash != "" } -func (o *Origin) Merge(other *Origin) { - if o.TagSum == "" { - o.TagPrefix = other.TagPrefix - o.TagSum = other.TagSum - } - if o.Ref == "" { - o.Ref = other.Ref - o.Hash = other.Hash - } +// ClearCheckable clears the Origin enough to make Checkable return false. +func (o *Origin) ClearCheckable() { + o.TagSum = "" + o.TagPrefix = "" + o.Ref = "" + o.Hash = "" } // A Tags describes the available tags in a code repository. diff --git a/src/cmd/go/internal/modfetch/codehost/git.go b/src/cmd/go/internal/modfetch/codehost/git.go index 3129a31786..a225aaf1ed 100644 --- a/src/cmd/go/internal/modfetch/codehost/git.go +++ b/src/cmd/go/internal/modfetch/codehost/git.go @@ -423,8 +423,11 @@ func (r *gitRepo) stat(rev string) (info *RevInfo, err error) { defer func() { if info != nil { - info.Origin.Ref = ref info.Origin.Hash = info.Name + // There's a ref = hash below; don't write that hash down as Origin.Ref. + if ref != info.Origin.Hash { + info.Origin.Ref = ref + } } }() diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index a994f79d4b..86e3ee9d1c 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -153,6 +153,9 @@ func (r *codeRepo) Versions(prefix string) (*Versions, error) { Err: err, } } + if tags.Origin != nil { + tags.Origin.Subdir = r.codeDir + } var list, incompatible []string for _, tag := range tags.List { @@ -450,23 +453,26 @@ func (r *codeRepo) convert(info *codehost.RevInfo, statVers string) (*RevInfo, e } origin := info.Origin - if module.IsPseudoVersion(v) { - // Add tags that are relevant to pseudo-version calculation to origin. - prefix := "" - if r.codeDir != "" { - prefix = r.codeDir + "/" - } - if r.pathMajor != "" { // "/v2" or "/.v2" - prefix += r.pathMajor[1:] + "." // += "v2." - } - tags, err := r.code.Tags(prefix) - if err != nil { - return nil, err - } + if origin != nil { o := *origin origin = &o - origin.TagPrefix = tags.Origin.TagPrefix - origin.TagSum = tags.Origin.TagSum + origin.Subdir = r.codeDir + if module.IsPseudoVersion(v) && (v != statVers || !strings.HasPrefix(v, "v0.0.0-")) { + // Add tags that are relevant to pseudo-version calculation to origin. + prefix := r.codeDir + if prefix != "" { + prefix += "/" + } + if r.pathMajor != "" { // "/v2" or "/.v2" + prefix += r.pathMajor[1:] + "." // += "v2." + } + tags, err := r.code.Tags(prefix) + if err != nil { + return nil, err + } + origin.TagPrefix = tags.Origin.TagPrefix + origin.TagSum = tags.Origin.TagSum + } } return &RevInfo{ diff --git a/src/cmd/go/internal/modinfo/info.go b/src/cmd/go/internal/modinfo/info.go index 19088352f0..b0adcbcfb3 100644 --- a/src/cmd/go/internal/modinfo/info.go +++ b/src/cmd/go/internal/modinfo/info.go @@ -4,7 +4,11 @@ package modinfo -import "time" +import ( + "cmd/go/internal/modfetch/codehost" + "encoding/json" + "time" +) // Note that these structs are publicly visible (part of go list's API) // and the fields are documented in the help text in ../list/list.go @@ -12,6 +16,7 @@ import "time" type ModulePublic struct { Path string `json:",omitempty"` // module path Version string `json:",omitempty"` // module version + Query string `json:",omitempty"` // version query corresponding to this version Versions []string `json:",omitempty"` // available module versions Replace *ModulePublic `json:",omitempty"` // replaced by this module Time *time.Time `json:",omitempty"` // time version was created @@ -24,12 +29,27 @@ type ModulePublic struct { Retracted []string `json:",omitempty"` // retraction information, if any (with -retracted or -u) Deprecated string `json:",omitempty"` // deprecation message, if any (with -u) Error *ModuleError `json:",omitempty"` // error loading module + + Origin *codehost.Origin `json:",omitempty"` // provenance of module + Reuse bool `json:",omitempty"` // reuse of old module info is safe } type ModuleError struct { Err string // error text } +type moduleErrorNoMethods ModuleError + +// UnmarshalJSON accepts both {"Err":"text"} and "text", +// so that the output of go mod download -json can still +// be unmarshalled into a ModulePublic during -reuse processing. +func (e *ModuleError) UnmarshalJSON(data []byte) error { + if len(data) > 0 && data[0] == '"' { + return json.Unmarshal(data, &e.Err) + } + return json.Unmarshal(data, (*moduleErrorNoMethods)(e)) +} + func (m *ModulePublic) String() string { s := m.Path versionString := func(mm *ModulePublic) string { diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 0799fec35c..e983e0ae0c 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -17,6 +17,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modfetch" + "cmd/go/internal/modfetch/codehost" "cmd/go/internal/modindex" "cmd/go/internal/modinfo" "cmd/go/internal/search" @@ -60,7 +61,7 @@ func PackageModuleInfo(ctx context.Context, pkgpath string) *modinfo.ModulePubli } rs := LoadModFile(ctx) - return moduleInfo(ctx, rs, m, 0) + return moduleInfo(ctx, rs, m, 0, nil) } // PackageModRoot returns the module root directory for the module that provides @@ -90,7 +91,7 @@ func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { if i := strings.Index(path, "@"); i >= 0 { m := module.Version{Path: path[:i], Version: path[i+1:]} - return moduleInfo(ctx, nil, m, 0) + return moduleInfo(ctx, nil, m, 0, nil) } rs := LoadModFile(ctx) @@ -119,7 +120,7 @@ func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { } } - return moduleInfo(ctx, rs, module.Version{Path: path, Version: v}, 0) + return moduleInfo(ctx, rs, module.Version{Path: path, Version: v}, 0, nil) } // addUpdate fills in m.Update if an updated version is available. @@ -156,6 +157,45 @@ func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { } } +// mergeOrigin merges two origins, +// returning and possibly modifying one of its arguments. +// If the two origins conflict, mergeOrigin returns a non-specific one +// that will not pass CheckReuse. +// If m1 or m2 is nil, the other is returned unmodified. +// But if m1 or m2 is non-nil and uncheckable, the result is also uncheckable, +// to preserve uncheckability. +func mergeOrigin(m1, m2 *codehost.Origin) *codehost.Origin { + if m1 == nil { + return m2 + } + if m2 == nil { + return m1 + } + if !m1.Checkable() { + return m1 + } + if !m2.Checkable() { + return m2 + } + if m2.TagSum != "" { + if m1.TagSum != "" && (m1.TagSum != m2.TagSum || m1.TagPrefix != m2.TagPrefix) { + m1.ClearCheckable() + return m1 + } + m1.TagSum = m2.TagSum + m1.TagPrefix = m2.TagPrefix + } + if m2.Hash != "" { + if m1.Hash != "" && (m1.Hash != m2.Hash || m1.Ref != m2.Ref) { + m1.ClearCheckable() + return m1 + } + m1.Hash = m2.Hash + m1.Ref = m2.Ref + } + return m1 +} + // addVersions fills in m.Versions with the list of known versions. // Excluded versions will be omitted. If listRetracted is false, retracted // versions will also be omitted. @@ -164,11 +204,12 @@ func addVersions(ctx context.Context, m *modinfo.ModulePublic, listRetracted boo if listRetracted { allowed = CheckExclusions } - var err error - m.Versions, err = versions(ctx, m.Path, allowed) + v, origin, err := versions(ctx, m.Path, allowed) if err != nil && m.Error == nil { m.Error = &modinfo.ModuleError{Err: err.Error()} } + m.Versions = v + m.Origin = mergeOrigin(m.Origin, origin) } // addRetraction fills in m.Retracted if the module was retracted by its author. @@ -230,7 +271,7 @@ func addDeprecation(ctx context.Context, m *modinfo.ModulePublic) { // moduleInfo returns information about module m, loaded from the requirements // in rs (which may be nil to indicate that m was not loaded from a requirement // graph). -func moduleInfo(ctx context.Context, rs *Requirements, m module.Version, mode ListMode) *modinfo.ModulePublic { +func moduleInfo(ctx context.Context, rs *Requirements, m module.Version, mode ListMode, reuse map[module.Version]*modinfo.ModulePublic) *modinfo.ModulePublic { if m.Version == "" && MainModules.Contains(m.Path) { info := &modinfo.ModulePublic{ Path: m.Path, @@ -260,6 +301,15 @@ func moduleInfo(ctx context.Context, rs *Requirements, m module.Version, mode Li // completeFromModCache fills in the extra fields in m using the module cache. completeFromModCache := func(m *modinfo.ModulePublic) { + if old := reuse[module.Version{Path: m.Path, Version: m.Version}]; old != nil { + if err := checkReuse(ctx, m.Path, old.Origin); err == nil { + *m = *old + m.Query = "" + m.Dir = "" + return + } + } + checksumOk := func(suffix string) bool { return rs == nil || m.Version == "" || cfg.BuildMod == "mod" || modfetch.HaveSum(module.Version{Path: m.Path, Version: m.Version + suffix}) diff --git a/src/cmd/go/internal/modload/edit.go b/src/cmd/go/internal/modload/edit.go index c556664c35..f6937a48b4 100644 --- a/src/cmd/go/internal/modload/edit.go +++ b/src/cmd/go/internal/modload/edit.go @@ -509,7 +509,7 @@ func (l *versionLimiter) UpgradeToward(ctx context.Context, m module.Version) er } if l.check(m, l.pruning).isDisqualified() { - candidates, err := versions(ctx, m.Path, CheckAllowed) + candidates, _, err := versions(ctx, m.Path, CheckAllowed) if err != nil { // This is likely a transient error reaching the repository, // rather than a permanent error with the retrieved version. diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index f782cd93db..e822d06504 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -5,15 +5,19 @@ package modload import ( + "bytes" "context" + "encoding/json" "errors" "fmt" + "io" "os" "runtime" "strings" "cmd/go/internal/base" "cmd/go/internal/cfg" + "cmd/go/internal/modfetch/codehost" "cmd/go/internal/modinfo" "cmd/go/internal/search" @@ -34,13 +38,44 @@ const ( // along with any error preventing additional matches from being identified. // // The returned slice can be nonempty even if the error is non-nil. -func ListModules(ctx context.Context, args []string, mode ListMode) ([]*modinfo.ModulePublic, error) { - rs, mods, err := listModules(ctx, LoadModFile(ctx), args, mode) +func ListModules(ctx context.Context, args []string, mode ListMode, reuseFile string) ([]*modinfo.ModulePublic, error) { + var reuse map[module.Version]*modinfo.ModulePublic + if reuseFile != "" { + data, err := os.ReadFile(reuseFile) + if err != nil { + return nil, err + } + dec := json.NewDecoder(bytes.NewReader(data)) + reuse = make(map[module.Version]*modinfo.ModulePublic) + for { + var m modinfo.ModulePublic + if err := dec.Decode(&m); err != nil { + if err == io.EOF { + break + } + return nil, fmt.Errorf("parsing %s: %v", reuseFile, err) + } + if m.Origin == nil || !m.Origin.Checkable() { + // Nothing to check to validate reuse. + continue + } + m.Reuse = true + reuse[module.Version{Path: m.Path, Version: m.Version}] = &m + if m.Query != "" { + reuse[module.Version{Path: m.Path, Version: m.Query}] = &m + } + } + } + + rs, mods, err := listModules(ctx, LoadModFile(ctx), args, mode, reuse) type token struct{} sem := make(chan token, runtime.GOMAXPROCS(0)) if mode != 0 { for _, m := range mods { + if m.Reuse { + continue + } add := func(m *modinfo.ModulePublic) { sem <- token{} go func() { @@ -80,11 +115,11 @@ func ListModules(ctx context.Context, args []string, mode ListMode) ([]*modinfo. return mods, err } -func listModules(ctx context.Context, rs *Requirements, args []string, mode ListMode) (_ *Requirements, mods []*modinfo.ModulePublic, mgErr error) { +func listModules(ctx context.Context, rs *Requirements, args []string, mode ListMode, reuse map[module.Version]*modinfo.ModulePublic) (_ *Requirements, mods []*modinfo.ModulePublic, mgErr error) { if len(args) == 0 { var ms []*modinfo.ModulePublic for _, m := range MainModules.Versions() { - ms = append(ms, moduleInfo(ctx, rs, m, mode)) + ms = append(ms, moduleInfo(ctx, rs, m, mode, reuse)) } return rs, ms, nil } @@ -157,12 +192,17 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List // specific revision or used 'go list -retracted'. allowed = nil } - info, err := Query(ctx, path, vers, current, allowed) + info, err := queryReuse(ctx, path, vers, current, allowed, reuse) if err != nil { + var origin *codehost.Origin + if info != nil { + origin = info.Origin + } mods = append(mods, &modinfo.ModulePublic{ Path: path, Version: vers, Error: modinfoError(path, vers, err), + Origin: origin, }) continue } @@ -171,7 +211,11 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List // *Requirements instead. var noRS *Requirements - mod := moduleInfo(ctx, noRS, module.Version{Path: path, Version: info.Version}, mode) + mod := moduleInfo(ctx, noRS, module.Version{Path: path, Version: info.Version}, mode, reuse) + if vers != mod.Version { + mod.Query = vers + } + mod.Origin = info.Origin mods = append(mods, mod) continue } @@ -200,7 +244,7 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List continue } if v != "none" { - mods = append(mods, moduleInfo(ctx, rs, module.Version{Path: arg, Version: v}, mode)) + mods = append(mods, moduleInfo(ctx, rs, module.Version{Path: arg, Version: v}, mode, reuse)) } else if cfg.BuildMod == "vendor" { // In vendor mode, we can't determine whether a missing module is “a // known dependency” because the module graph is incomplete. @@ -229,7 +273,7 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List matched = true if !matchedModule[m] { matchedModule[m] = true - mods = append(mods, moduleInfo(ctx, rs, m, mode)) + mods = append(mods, moduleInfo(ctx, rs, m, mode, reuse)) } } } diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 2055303efe..ea1c21b4f1 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -11,6 +11,7 @@ import ( "sort" "cmd/go/internal/modfetch" + "cmd/go/internal/modfetch/codehost" "golang.org/x/mod/module" "golang.org/x/mod/semver" @@ -78,11 +79,10 @@ func (*mvsReqs) Upgrade(m module.Version) (module.Version, error) { return m, nil } -func versions(ctx context.Context, path string, allowed AllowedFunc) ([]string, error) { +func versions(ctx context.Context, path string, allowed AllowedFunc) (versions []string, origin *codehost.Origin, err error) { // Note: modfetch.Lookup and repo.Versions are cached, // so there's no need for us to add extra caching here. - var versions []string - err := modfetch.TryProxies(func(proxy string) error { + err = modfetch.TryProxies(func(proxy string) error { repo, err := lookupRepo(proxy, path) if err != nil { return err @@ -100,9 +100,10 @@ func versions(ctx context.Context, path string, allowed AllowedFunc) ([]string, } } versions = allowedVersions + origin = allVersions.Origin return nil }) - return versions, err + return versions, origin, err } // previousVersion returns the tagged version of m.Path immediately prior to @@ -117,7 +118,7 @@ func previousVersion(m module.Version) (module.Version, error) { return module.Version{Path: m.Path, Version: "none"}, nil } - list, err := versions(context.TODO(), m.Path, CheckAllowed) + list, _, err := versions(context.TODO(), m.Path, CheckAllowed) if err != nil { if errors.Is(err, os.ErrNotExist) { return module.Version{Path: m.Path, Version: "none"}, nil diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 051a4fe822..1d2f5d5e15 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -20,6 +20,8 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/imports" "cmd/go/internal/modfetch" + "cmd/go/internal/modfetch/codehost" + "cmd/go/internal/modinfo" "cmd/go/internal/search" "cmd/go/internal/str" "cmd/go/internal/trace" @@ -72,18 +74,39 @@ import ( // // If path is the path of the main module and the query is "latest", // Query returns Target.Version as the version. +// +// Query often returns a non-nil *RevInfo with a non-nil error, +// to provide an info.Origin that can allow the error to be cached. func Query(ctx context.Context, path, query, current string, allowed AllowedFunc) (*modfetch.RevInfo, error) { ctx, span := trace.StartSpan(ctx, "modload.Query "+path) defer span.Done() + return queryReuse(ctx, path, query, current, allowed, nil) +} + +// queryReuse is like Query but also takes a map of module info that can be reused +// if the validation criteria in Origin are met. +func queryReuse(ctx context.Context, path, query, current string, allowed AllowedFunc, reuse map[module.Version]*modinfo.ModulePublic) (*modfetch.RevInfo, error) { var info *modfetch.RevInfo err := modfetch.TryProxies(func(proxy string) (err error) { - info, err = queryProxy(ctx, proxy, path, query, current, allowed) + info, err = queryProxy(ctx, proxy, path, query, current, allowed, reuse) return err }) return info, err } +// checkReuse checks whether a revision of a given module or a version list +// for a given module may be reused, according to the information in origin. +func checkReuse(ctx context.Context, path string, old *codehost.Origin) error { + return modfetch.TryProxies(func(proxy string) error { + repo, err := lookupRepo(proxy, path) + if err != nil { + return err + } + return repo.CheckReuse(old) + }) +} + // AllowedFunc is used by Query and other functions to filter out unsuitable // versions, for example, those listed in exclude directives in the main // module's go.mod file. @@ -106,7 +129,7 @@ func (queryDisabledError) Error() string { return fmt.Sprintf("cannot query module due to -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) } -func queryProxy(ctx context.Context, proxy, path, query, current string, allowed AllowedFunc) (*modfetch.RevInfo, error) { +func queryProxy(ctx context.Context, proxy, path, query, current string, allowed AllowedFunc, reuse map[module.Version]*modinfo.ModulePublic) (*modfetch.RevInfo, error) { ctx, span := trace.StartSpan(ctx, "modload.queryProxy "+path+" "+query) defer span.Done() @@ -137,6 +160,19 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return nil, err } + if old := reuse[module.Version{Path: path, Version: query}]; old != nil { + if err := repo.CheckReuse(old.Origin); err == nil { + info := &modfetch.RevInfo{ + Version: old.Version, + Origin: old.Origin, + } + if old.Time != nil { + info.Time = *old.Time + } + return info, nil + } + } + // Parse query to detect parse errors (and possibly handle query) // before any network I/O. qm, err := newQueryMatcher(path, query, current, allowed) @@ -177,15 +213,23 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if err != nil { return nil, err } + revErr := &modfetch.RevInfo{Origin: versions.Origin} // RevInfo to return with error + releases, prereleases, err := qm.filterVersions(ctx, versions.List) if err != nil { - return nil, err + return revErr, err } lookup := func(v string) (*modfetch.RevInfo, error) { rev, err := repo.Stat(v) + // Stat can return a non-nil rev and a non-nil err, + // in order to provide origin information to make the error cacheable. + if rev == nil && err != nil { + return revErr, err + } + rev.Origin = mergeOrigin(rev.Origin, versions.Origin) if err != nil { - return nil, err + return rev, err } if (query == "upgrade" || query == "patch") && module.IsPseudoVersion(current) && !rev.Time.IsZero() { @@ -210,9 +254,14 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed currentTime, err := module.PseudoVersionTime(current) if err == nil && rev.Time.Before(currentTime) { if err := allowed(ctx, module.Version{Path: path, Version: current}); errors.Is(err, ErrDisallowed) { - return nil, err + return revErr, err } - return repo.Stat(current) + info, err := repo.Stat(current) + if info == nil && err != nil { + return revErr, err + } + info.Origin = mergeOrigin(info.Origin, versions.Origin) + return info, err } } @@ -242,7 +291,7 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return lookup(latest.Version) } } else if !errors.Is(err, fs.ErrNotExist) { - return nil, err + return revErr, err } } @@ -254,7 +303,7 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return lookup(current) } - return nil, &NoMatchingVersionError{query: query, current: current} + return revErr, &NoMatchingVersionError{query: query, current: current} } // IsRevisionQuery returns true if vers is a version query that may refer to @@ -663,7 +712,7 @@ func QueryPattern(ctx context.Context, pattern, query string, current func(strin pathCurrent := current(path) r.Mod.Path = path - r.Rev, err = queryProxy(ctx, proxy, path, query, pathCurrent, allowed) + r.Rev, err = queryProxy(ctx, proxy, path, query, pathCurrent, allowed, nil) if err != nil { return r, err } @@ -991,6 +1040,7 @@ func versionHasGoMod(_ context.Context, m module.Version) (bool, error) { // available versions, but cannot fetch specific source files. type versionRepo interface { ModulePath() string + CheckReuse(*codehost.Origin) error Versions(prefix string) (*modfetch.Versions, error) Stat(rev string) (*modfetch.RevInfo, error) Latest() (*modfetch.RevInfo, error) @@ -1024,6 +1074,9 @@ type emptyRepo struct { var _ versionRepo = emptyRepo{} func (er emptyRepo) ModulePath() string { return er.path } +func (er emptyRepo) CheckReuse(old *codehost.Origin) error { + return fmt.Errorf("empty repo") +} func (er emptyRepo) Versions(prefix string) (*modfetch.Versions, error) { return &modfetch.Versions{}, nil } @@ -1044,6 +1097,10 @@ var _ versionRepo = (*replacementRepo)(nil) func (rr *replacementRepo) ModulePath() string { return rr.repo.ModulePath() } +func (rr *replacementRepo) CheckReuse(old *codehost.Origin) error { + return fmt.Errorf("replacement repo") +} + // Versions returns the versions from rr.repo augmented with any matching // replacement versions. func (rr *replacementRepo) Versions(prefix string) (*modfetch.Versions, error) { diff --git a/src/cmd/go/testdata/script/reuse_git.txt b/src/cmd/go/testdata/script/reuse_git.txt new file mode 100644 index 0000000000..7d8844d932 --- /dev/null +++ b/src/cmd/go/testdata/script/reuse_git.txt @@ -0,0 +1,371 @@ +[short] skip +[!exec:git] skip +[!net] skip + +env GO111MODULE=on +env GOPROXY=direct +env GOSUMDB=off + +# go mod download with the pseudo-version should invoke git but not have a TagSum or Ref. +go mod download -x -json vcs-test.golang.org/git/hello.git@v0.0.0-20170922010558-fc3a09f3dc5c +stderr 'git fetch' +cp stdout hellopseudo.json +! stdout '"(Query|TagPrefix|TagSum|Ref)"' +stdout '"Version": "v0.0.0-20170922010558-fc3a09f3dc5c"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/hello"' +stdout '"Hash": "fc3a09f3dc5cfe0d7a743ea18f1f5226e68b3777"' +go clean -modcache + +# go mod download vcstest/hello should invoke git, print origin info +go mod download -x -json vcs-test.golang.org/git/hello.git@latest +stderr 'git fetch' +cp stdout hello.json +stdout '"Version": "v0.0.0-20170922010558-fc3a09f3dc5c"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/hello"' +stdout '"Query": "latest"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +stdout '"Ref": "HEAD"' +stdout '"Hash": "fc3a09f3dc5cfe0d7a743ea18f1f5226e68b3777"' + +# pseudo-version again should not invoke git fetch (it has the version from the @latest query) +# but still be careful not to include a TagSum or a Ref, especially not Ref set to HEAD, +# which is easy to do when reusing the cached version from the @latest query. +go mod download -x -json vcs-test.golang.org/git/hello.git@v0.0.0-20170922010558-fc3a09f3dc5c +! stderr 'git fetch' +cp stdout hellopseudo2.json +cmp hellopseudo.json hellopseudo2.json + +# go mod download vcstest/hello@hash needs to check TagSum to find pseudoversion base. +go mod download -x -json vcs-test.golang.org/git/hello.git@fc3a09f3dc5c +! stderr 'git fetch' +cp stdout hellohash.json +stdout '"Version": "v0.0.0-20170922010558-fc3a09f3dc5c"' +stdout '"Query": "fc3a09f3dc5c"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/hello"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +stdout '"Hash": "fc3a09f3dc5cfe0d7a743ea18f1f5226e68b3777"' + +# go mod download vcstest/hello/v9 should fail, still print origin info +! go mod download -x -json vcs-test.golang.org/git/hello.git/v9@latest +cp stdout hellov9.json +stdout '"Version": "latest"' +stdout '"Error":.*no matching versions' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +! stdout '"Ref":' +! stdout '"Hash":' + +# go mod download vcstest/hello/sub/v9 should also fail, print origin info with TagPrefix +! go mod download -x -json vcs-test.golang.org/git/hello.git/sub/v9@latest +cp stdout hellosubv9.json +stdout '"Version": "latest"' +stdout '"Error":.*no matching versions' +stdout '"TagPrefix": "sub/"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +! stdout '"Ref":' +! stdout '"Hash":' + +# go mod download vcstest/tagtests should invoke git, print origin info +go mod download -x -json vcs-test.golang.org/git/tagtests.git@latest +stderr 'git fetch' +cp stdout tagtests.json +stdout '"Version": "v0.2.2"' +stdout '"Query": "latest"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo="' +stdout '"Ref": "refs/tags/v0.2.2"' +stdout '"Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952"' + +# go mod download vcstest/tagtests@v0.2.2 should print origin info, no TagSum needed +go mod download -x -json vcs-test.golang.org/git/tagtests.git@v0.2.2 +cp stdout tagtestsv022.json +stdout '"Version": "v0.2.2"' +! stdout '"Query":' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +! stdout '"TagSum"' +stdout '"Ref": "refs/tags/v0.2.2"' +stdout '"Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952"' + +# go mod download vcstest/tagtests@master needs a TagSum again +go mod download -x -json vcs-test.golang.org/git/tagtests.git@master +cp stdout tagtestsmaster.json +stdout '"Version": "v0.2.3-0.20190509225625-c7818c24fa2f"' +stdout '"Query": "master"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo="' +stdout '"Ref": "refs/heads/master"' +stdout '"Hash": "c7818c24fa2f3f714c67d0a6d3e411c85a518d1f"' + +# go mod download vcstest/prefixtagtests should invoke git, print origin info +go mod download -x -json vcs-test.golang.org/git/prefixtagtests.git/sub@latest +stderr 'git fetch' +cp stdout prefixtagtests.json +stdout '"Version": "v0.0.10"' +stdout '"Query": "latest"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/prefixtagtests"' +stdout '"Subdir": "sub"' +stdout '"TagPrefix": "sub/"' +stdout '"TagSum": "t1:YGSbWkJ8dn9ORAr[+]BlKHFK/2ZhXLb9hVuYfTZ9D8C7g="' +stdout '"Ref": "refs/tags/sub/v0.0.10"' +stdout '"Hash": "2b7c4692e12c109263cab51b416fcc835ddd7eae"' + +# go mod download of a bunch of these should fail (some are invalid) but write good JSON for later +! go mod download -json vcs-test.golang.org/git/hello.git@latest vcs-test.golang.org/git/hello.git/v9@latest vcs-test.golang.org/git/hello.git/sub/v9@latest vcs-test.golang.org/git/tagtests.git@latest vcs-test.golang.org/git/tagtests.git@v0.2.2 vcs-test.golang.org/git/tagtests.git@master +cp stdout all.json + +# clean the module cache, make sure that makes go mod download re-run git fetch, clean again +go clean -modcache +go mod download -x -json vcs-test.golang.org/git/hello.git@latest +stderr 'git fetch' +go clean -modcache + +# reuse go mod download vcstest/hello result +go mod download -reuse=hello.json -x -json vcs-test.golang.org/git/hello.git@latest +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.0.0-20170922010558-fc3a09f3dc5c"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/hello"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +stdout '"Ref": "HEAD"' +stdout '"Hash": "fc3a09f3dc5cfe0d7a743ea18f1f5226e68b3777"' +! stdout '"Dir"' +! stdout '"Info"' +! stdout '"GoMod"' +! stdout '"Zip"' + +# reuse go mod download vcstest/hello pseudoversion result +go mod download -reuse=hellopseudo.json -x -json vcs-test.golang.org/git/hello.git@v0.0.0-20170922010558-fc3a09f3dc5c +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.0.0-20170922010558-fc3a09f3dc5c"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/hello"' +! stdout '"(Query|TagPrefix|TagSum|Ref)"' +stdout '"Hash": "fc3a09f3dc5cfe0d7a743ea18f1f5226e68b3777"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/hello@hash +go mod download -reuse=hellohash.json -x -json vcs-test.golang.org/git/hello.git@fc3a09f3dc5c +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Query": "fc3a09f3dc5c"' +stdout '"Version": "v0.0.0-20170922010558-fc3a09f3dc5c"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/hello"' +! stdout '"(TagPrefix|Ref)"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +stdout '"Hash": "fc3a09f3dc5cfe0d7a743ea18f1f5226e68b3777"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/hello/v9 error result +! go mod download -reuse=hellov9.json -x -json vcs-test.golang.org/git/hello.git/v9@latest +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Error":.*no matching versions' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +! stdout '"(Ref|Hash)":' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/hello/sub/v9 error result +! go mod download -reuse=hellosubv9.json -x -json vcs-test.golang.org/git/hello.git/sub/v9@latest +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Error":.*no matching versions' +stdout '"TagPrefix": "sub/"' +stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' +! stdout '"(Ref|Hash)":' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/tagtests result +go mod download -reuse=tagtests.json -x -json vcs-test.golang.org/git/tagtests.git@latest +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.2.2"' +stdout '"Query": "latest"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo="' +stdout '"Ref": "refs/tags/v0.2.2"' +stdout '"Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/tagtests@v0.2.2 result +go mod download -reuse=tagtestsv022.json -x -json vcs-test.golang.org/git/tagtests.git@v0.2.2 +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.2.2"' +! stdout '"Query":' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +! stdout '"TagSum"' +stdout '"Ref": "refs/tags/v0.2.2"' +stdout '"Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/tagtests@master result +go mod download -reuse=tagtestsmaster.json -x -json vcs-test.golang.org/git/tagtests.git@master +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.2.3-0.20190509225625-c7818c24fa2f"' +stdout '"Query": "master"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo="' +stdout '"Ref": "refs/heads/master"' +stdout '"Hash": "c7818c24fa2f3f714c67d0a6d3e411c85a518d1f"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/tagtests@master result again with all.json +go mod download -reuse=all.json -x -json vcs-test.golang.org/git/tagtests.git@master +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.2.3-0.20190509225625-c7818c24fa2f"' +stdout '"Query": "master"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"TagPrefix"' +stdout '"TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo="' +stdout '"Ref": "refs/heads/master"' +stdout '"Hash": "c7818c24fa2f3f714c67d0a6d3e411c85a518d1f"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# go mod download vcstest/prefixtagtests result with json +go mod download -reuse=prefixtagtests.json -x -json vcs-test.golang.org/git/prefixtagtests.git/sub@latest +! stderr 'git fetch' +stdout '"Version": "v0.0.10"' +stdout '"Query": "latest"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/prefixtagtests"' +stdout '"Subdir": "sub"' +stdout '"TagPrefix": "sub/"' +stdout '"TagSum": "t1:YGSbWkJ8dn9ORAr[+]BlKHFK/2ZhXLb9hVuYfTZ9D8C7g="' +stdout '"Ref": "refs/tags/sub/v0.0.10"' +stdout '"Hash": "2b7c4692e12c109263cab51b416fcc835ddd7eae"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse the bulk results with all.json +! go mod download -reuse=all.json -json vcs-test.golang.org/git/hello.git@latest vcs-test.golang.org/git/hello.git/v9@latest vcs-test.golang.org/git/hello.git/sub/v9@latest vcs-test.golang.org/git/tagtests.git@latest vcs-test.golang.org/git/tagtests.git@v0.2.2 vcs-test.golang.org/git/tagtests.git@master +! stderr 'git fetch' +stdout '"Reuse": true' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse attempt with stale hash should reinvoke git, not report reuse +go mod download -reuse=tagtestsv022badhash.json -x -json vcs-test.golang.org/git/tagtests.git@v0.2.2 +stderr 'git fetch' +! stdout '"Reuse": true' +stdout '"Version": "v0.2.2"' +! stdout '"Query"' +stdout '"VCS": "git"' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +! stdout '"(TagPrefix|TagSum)"' +stdout '"Ref": "refs/tags/v0.2.2"' +stdout '"Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952"' +stdout '"Dir"' +stdout '"Info"' +stdout '"GoMod"' +stdout '"Zip"' + +# reuse with stale repo URL +go mod download -reuse=tagtestsv022badurl.json -x -json vcs-test.golang.org/git/tagtests.git@v0.2.2 +! stdout '"Reuse": true' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' +stdout '"Dir"' +stdout '"Info"' +stdout '"GoMod"' +stdout '"Zip"' + +# reuse with stale VCS +go mod download -reuse=tagtestsv022badvcs.json -x -json vcs-test.golang.org/git/tagtests.git@v0.2.2 +! stdout '"Reuse": true' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' + +# reuse with stale Dir +go mod download -reuse=tagtestsv022baddir.json -x -json vcs-test.golang.org/git/tagtests.git@v0.2.2 +! stdout '"Reuse": true' +stdout '"URL": "https://vcs-test.golang.org/git/tagtests"' + +# reuse with stale TagSum +go mod download -reuse=tagtestsbadtagsum.json -x -json vcs-test.golang.org/git/tagtests.git@latest +! stdout '"Reuse": true' +stdout '"TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo="' + +-- tagtestsv022badhash.json -- +{ + "Path": "vcs-test.golang.org/git/tagtests.git", + "Version": "v0.2.2", + "Origin": { + "VCS": "git", + "URL": "https://vcs-test.golang.org/git/tagtests", + "Ref": "refs/tags/v0.2.2", + "Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952XXX" + } +} + +-- tagtestsbadtagsum.json -- +{ + "Path": "vcs-test.golang.org/git/tagtests.git", + "Version": "v0.2.2", + "Query": "latest", + "Origin": { + "VCS": "git", + "URL": "https://vcs-test.golang.org/git/tagtests", + "TagSum": "t1:Dp7yRKDuE8WjG0429PN9hYWjqhy2te7P9Oki/sMEOGo=XXX", + "Ref": "refs/tags/v0.2.2", + "Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952" + }, + "Reuse": true +} + +-- tagtestsv022badvcs.json -- +{ + "Path": "vcs-test.golang.org/git/tagtests.git", + "Version": "v0.2.2", + "Origin": { + "VCS": "gitXXX", + "URL": "https://vcs-test.golang.org/git/tagtests", + "Ref": "refs/tags/v0.2.2", + "Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952" + } +} + +-- tagtestsv022baddir.json -- +{ + "Path": "vcs-test.golang.org/git/tagtests.git", + "Version": "v0.2.2", + "Origin": { + "VCS": "git", + "URL": "https://vcs-test.golang.org/git/tagtests", + "Subdir": "subdir", + "Ref": "refs/tags/v0.2.2", + "Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952" + } +} + +-- tagtestsv022badurl.json -- +{ + "Path": "vcs-test.golang.org/git/tagtests.git", + "Version": "v0.2.2", + "Origin": { + "VCS": "git", + "URL": "https://vcs-test.golang.org/git/tagtestsXXX", + "Ref": "refs/tags/v0.2.2", + "Hash": "59356c8cd18c5fe9a598167d98a6843e52d57952" + } +} From c1110910713766eb06d75ed48db3722d318a845e Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 1 Jul 2022 16:10:19 -0400 Subject: [PATCH 12/78] cmd/go: make module@nonexistentversion failures reusable CL 411398 added the -reuse flag for reusing cached JSON output when the remote Git repository has not changed. One case that was not yet cached is a lookup of a nonexistent version. This CL adds caching of failed lookups of nonexistent versions, by saving a checksum of all the heads and tags refs on the remote server (we never consider other kinds of refs). If none of those have changed, then we don't need to download the full server. Fixes #53644. Change-Id: I428bbc8ec8475bd7d03788934d643e1e2be3add0 Reviewed-on: https://go-review.googlesource.com/c/go/+/415678 Run-TryBot: Russ Cox Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot --- src/cmd/go/internal/modfetch/cache.go | 26 +++++--- .../go/internal/modfetch/codehost/codehost.go | 9 ++- src/cmd/go/internal/modfetch/codehost/git.go | 48 ++++++++++++-- src/cmd/go/internal/modfetch/coderepo.go | 10 ++- src/cmd/go/internal/modload/query.go | 2 +- src/cmd/go/testdata/script/reuse_git.txt | 62 +++++++++++++++++-- 6 files changed, 136 insertions(+), 21 deletions(-) diff --git a/src/cmd/go/internal/modfetch/cache.go b/src/cmd/go/internal/modfetch/cache.go index 7ebe208c12..c1ed18736c 100644 --- a/src/cmd/go/internal/modfetch/cache.go +++ b/src/cmd/go/internal/modfetch/cache.go @@ -253,11 +253,12 @@ func (r *cachingRepo) Stat(rev string) (*RevInfo, error) { return cachedInfo{info, err} }).(cachedInfo) - if c.err != nil { - return nil, c.err + info := c.info + if info != nil { + copy := *info + info = © } - info := *c.info - return &info, nil + return info, c.err } func (r *cachingRepo) Latest() (*RevInfo, error) { @@ -277,11 +278,12 @@ func (r *cachingRepo) Latest() (*RevInfo, error) { return cachedInfo{info, err} }).(cachedInfo) - if c.err != nil { - return nil, c.err + info := c.info + if info != nil { + copy := *info + info = © } - info := *c.info - return &info, nil + return info, c.err } func (r *cachingRepo) GoMod(version string) ([]byte, error) { @@ -330,15 +332,21 @@ func InfoFile(path, version string) (*RevInfo, string, error) { } var info *RevInfo + var err2info map[error]*RevInfo err := TryProxies(func(proxy string) error { i, err := Lookup(proxy, path).Stat(version) if err == nil { info = i + } else { + if err2info == nil { + err2info = make(map[error]*RevInfo) + } + err2info[err] = info } return err }) if err != nil { - return nil, "", err + return err2info[err], "", err } // Stat should have populated the disk cache for us. diff --git a/src/cmd/go/internal/modfetch/codehost/codehost.go b/src/cmd/go/internal/modfetch/codehost/codehost.go index 937ac6819a..8eaf254b44 100644 --- a/src/cmd/go/internal/modfetch/codehost/codehost.go +++ b/src/cmd/go/internal/modfetch/codehost/codehost.go @@ -110,12 +110,18 @@ type Origin struct { // with a mutable meaning while Hash is a name with an immutable meaning. Ref string `json:",omitempty"` Hash string `json:",omitempty"` + + // If RepoSum is non-empty, then the resolution of this module version + // failed due to the repo being available but the version not being present. + // This depends on the entire state of the repo, which RepoSum summarizes. + // For Git, this is a hash of all the refs and their hashes. + RepoSum string `json:",omitempty"` } // Checkable reports whether the Origin contains anything that can be checked. // If not, the Origin is purely informational and should fail a CheckReuse call. func (o *Origin) Checkable() bool { - return o.TagSum != "" || o.Ref != "" || o.Hash != "" + return o.TagSum != "" || o.Ref != "" || o.Hash != "" || o.RepoSum != "" } // ClearCheckable clears the Origin enough to make Checkable return false. @@ -124,6 +130,7 @@ func (o *Origin) ClearCheckable() { o.TagPrefix = "" o.Ref = "" o.Hash = "" + o.RepoSum = "" } // A Tags describes the available tags in a code repository. diff --git a/src/cmd/go/internal/modfetch/codehost/git.go b/src/cmd/go/internal/modfetch/codehost/git.go index a225aaf1ed..35f77e870e 100644 --- a/src/cmd/go/internal/modfetch/codehost/git.go +++ b/src/cmd/go/internal/modfetch/codehost/git.go @@ -182,12 +182,12 @@ func (r *gitRepo) CheckReuse(old *Origin, subdir string) error { return fmt.Errorf("origin moved from %v %q %q to %v %q %q", old.VCS, old.URL, old.Subdir, "git", r.remoteURL, subdir) } - // Note: Can have Hash with no Ref and no TagSum, + // Note: Can have Hash with no Ref and no TagSum and no RepoSum, // meaning the Hash simply has to remain in the repo. // In that case we assume it does in the absence of any real way to check. // But if neither Hash nor TagSum is present, we have nothing to check, // which we take to mean we didn't record enough information to be sure. - if old.Hash == "" && old.TagSum == "" { + if old.Hash == "" && old.TagSum == "" && old.RepoSum == "" { return fmt.Errorf("non-specific origin") } @@ -214,7 +214,11 @@ func (r *gitRepo) CheckReuse(old *Origin, subdir string) error { return fmt.Errorf("tags changed") } } - + if old.RepoSum != "" { + if r.repoSum(r.refs) != old.RepoSum { + return fmt.Errorf("refs changed") + } + } return nil } @@ -307,6 +311,35 @@ func (r *gitRepo) Tags(prefix string) (*Tags, error) { return tags, nil } +// repoSum returns a checksum of the entire repo state, +// which can be checked (as Origin.RepoSum) to cache +// the absence of a specific module version. +// The caller must supply refs, the result of a successful r.loadRefs. +func (r *gitRepo) repoSum(refs map[string]string) string { + var list []string + for ref := range refs { + list = append(list, ref) + } + sort.Strings(list) + h := sha256.New() + for _, ref := range list { + fmt.Fprintf(h, "%q %s\n", ref, refs[ref]) + } + return "r1:" + base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +// unknownRevisionInfo returns a RevInfo containing an Origin containing a RepoSum of refs, +// for use when returning an UnknownRevisionError. +func (r *gitRepo) unknownRevisionInfo(refs map[string]string) *RevInfo { + return &RevInfo{ + Origin: &Origin{ + VCS: "git", + URL: r.remoteURL, + RepoSum: r.repoSum(refs), + }, + } +} + func (r *gitRepo) Latest() (*RevInfo, error) { refs, err := r.loadRefs() if err != nil { @@ -418,7 +451,7 @@ func (r *gitRepo) stat(rev string) (info *RevInfo, err error) { hash = rev } } else { - return nil, &UnknownRevisionError{Rev: rev} + return r.unknownRevisionInfo(refs), &UnknownRevisionError{Rev: rev} } defer func() { @@ -532,7 +565,12 @@ func (r *gitRepo) fetchRefsLocked() error { func (r *gitRepo) statLocal(version, rev string) (*RevInfo, error) { out, err := Run(r.dir, "git", "-c", "log.showsignature=false", "log", "--no-decorate", "-n1", "--format=format:%H %ct %D", rev, "--") if err != nil { - return nil, &UnknownRevisionError{Rev: rev} + // Return info with Origin.RepoSum if possible to allow caching of negative lookup. + var info *RevInfo + if refs, err := r.loadRefs(); err == nil { + info = r.unknownRevisionInfo(refs) + } + return info, &UnknownRevisionError{Rev: rev} } f := strings.Fields(string(out)) if len(f) < 2 { diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index 86e3ee9d1c..b934e362a4 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -297,7 +297,15 @@ func (r *codeRepo) Stat(rev string) (*RevInfo, error) { codeRev := r.revToRev(rev) info, err := r.code.Stat(codeRev) if err != nil { - return nil, &module.ModuleError{ + // Note: info may be non-nil to supply Origin for caching error. + var revInfo *RevInfo + if info != nil { + revInfo = &RevInfo{ + Origin: info.Origin, + Version: rev, + } + } + return revInfo, &module.ModuleError{ Path: r.modPath, Err: &module.InvalidVersionError{ Version: rev, diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 1d2f5d5e15..01df14fca4 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -197,7 +197,7 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed } } if err != nil { - return nil, queryErr + return info, queryErr } } if err := allowed(ctx, module.Version{Path: path, Version: info.Version}); errors.Is(err, ErrDisallowed) { diff --git a/src/cmd/go/testdata/script/reuse_git.txt b/src/cmd/go/testdata/script/reuse_git.txt index 7d8844d932..a5a0c8a9a0 100644 --- a/src/cmd/go/testdata/script/reuse_git.txt +++ b/src/cmd/go/testdata/script/reuse_git.txt @@ -56,8 +56,7 @@ stdout '"Version": "latest"' stdout '"Error":.*no matching versions' ! stdout '"TagPrefix"' stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' -! stdout '"Ref":' -! stdout '"Hash":' +! stdout '"(Ref|Hash|RepoSum)":' # go mod download vcstest/hello/sub/v9 should also fail, print origin info with TagPrefix ! go mod download -x -json vcs-test.golang.org/git/hello.git/sub/v9@latest @@ -66,8 +65,33 @@ stdout '"Version": "latest"' stdout '"Error":.*no matching versions' stdout '"TagPrefix": "sub/"' stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' -! stdout '"Ref":' -! stdout '"Hash":' +! stdout '"(Ref|Hash|RepoSum)":' + +# go mod download vcstest/hello@nonexist should fail, still print origin info +! go mod download -x -json vcs-test.golang.org/git/hello.git@nonexist +cp stdout hellononexist.json +stdout '"Version": "nonexist"' +stdout '"Error":.*unknown revision nonexist' +stdout '"RepoSum": "r1:c0/9JCZ25lxoBiK3[+]3BhACU4giH49flcJmBynJ[+]Jvmc="' +! stdout '"(TagPrefix|TagSum|Ref|Hash)"' + +# go mod download vcstest/hello@1234567890123456789012345678901234567890 should fail, still print origin info +# (40 hex digits is assumed to be a full hash and is a slightly different code path from @nonexist) +! go mod download -x -json vcs-test.golang.org/git/hello.git@1234567890123456789012345678901234567890 +cp stdout hellononhash.json +stdout '"Version": "1234567890123456789012345678901234567890"' +stdout '"Error":.*unknown revision 1234567890123456789012345678901234567890' +stdout '"RepoSum": "r1:c0/9JCZ25lxoBiK3[+]3BhACU4giH49flcJmBynJ[+]Jvmc="' +! stdout '"(TagPrefix|TagSum|Ref|Hash)"' + +# go mod download vcstest/hello@v0.0.0-20220101120101-123456789abc should fail, still print origin info +# (non-existent pseudoversion) +! go mod download -x -json vcs-test.golang.org/git/hello.git@v0.0.0-20220101120101-123456789abc +cp stdout hellononpseudo.json +stdout '"Version": "v0.0.0-20220101120101-123456789abc"' +stdout '"Error":.*unknown revision 123456789abc' +stdout '"RepoSum": "r1:c0/9JCZ25lxoBiK3[+]3BhACU4giH49flcJmBynJ[+]Jvmc="' +! stdout '"(TagPrefix|TagSum|Ref|Hash)"' # go mod download vcstest/tagtests should invoke git, print origin info go mod download -x -json vcs-test.golang.org/git/tagtests.git@latest @@ -190,6 +214,36 @@ stdout '"TagSum": "t1:47DEQpj8HBSa[+]/TImW[+]5JCeuQeRkm5NMpJWZG3hSuFU="' ! stdout '"(Ref|Hash)":' ! stdout '"(Dir|Info|GoMod|Zip)"' +# reuse go mod download vcstest/hello@nonexist +! go mod download -reuse=hellononexist.json -x -json vcs-test.golang.org/git/hello.git@nonexist +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "nonexist"' +stdout '"Error":.*unknown revision nonexist' +stdout '"RepoSum": "r1:c0/9JCZ25lxoBiK3[+]3BhACU4giH49flcJmBynJ[+]Jvmc="' +! stdout '"(TagPrefix|TagSum|Ref|Hash)"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/hello@1234567890123456789012345678901234567890 +! go mod download -reuse=hellononhash.json -x -json vcs-test.golang.org/git/hello.git@1234567890123456789012345678901234567890 +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "1234567890123456789012345678901234567890"' +stdout '"Error":.*unknown revision 1234567890123456789012345678901234567890' +stdout '"RepoSum": "r1:c0/9JCZ25lxoBiK3[+]3BhACU4giH49flcJmBynJ[+]Jvmc="' +! stdout '"(TagPrefix|TagSum|Ref|Hash)"' +! stdout '"(Dir|Info|GoMod|Zip)"' + +# reuse go mod download vcstest/hello@v0.0.0-20220101120101-123456789abc +! go mod download -reuse=hellononpseudo.json -x -json vcs-test.golang.org/git/hello.git@v0.0.0-20220101120101-123456789abc +! stderr 'git fetch' +stdout '"Reuse": true' +stdout '"Version": "v0.0.0-20220101120101-123456789abc"' +stdout '"Error":.*unknown revision 123456789abc' +stdout '"RepoSum": "r1:c0/9JCZ25lxoBiK3[+]3BhACU4giH49flcJmBynJ[+]Jvmc="' +! stdout '"(TagPrefix|TagSum|Ref|Hash)"' +! stdout '"(Dir|Info|GoMod|Zip)"' + # reuse go mod download vcstest/tagtests result go mod download -reuse=tagtests.json -x -json vcs-test.golang.org/git/tagtests.git@latest ! stderr 'git fetch' From d602380f58e2a2ab4b262c7d69b78ff634cba5e8 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Tue, 28 Jun 2022 14:47:49 -0400 Subject: [PATCH 13/78] cmd/compile: drop "buildcfg" from no instrument packages Package buildcfg was added to this list by CL 403851, but package buildcfg does not exist. This was probably intended to refer to internal/buildcfg, but internal/buildcfg is only used by the compiler so it is not clear why it couldn't be instrumented. For #44853. Change-Id: Iad2517358be79c3eabf240376156bcff0c4bcefc Reviewed-on: https://go-review.googlesource.com/c/go/+/414516 Reviewed-by: Bryan Mills Reviewed-by: Cherry Mui TryBot-Result: Gopher Robot Run-TryBot: Michael Pratt --- src/cmd/compile/internal/base/base.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cmd/compile/internal/base/base.go b/src/cmd/compile/internal/base/base.go index 5e1493e275..39ce8e66f7 100644 --- a/src/cmd/compile/internal/base/base.go +++ b/src/cmd/compile/internal/base/base.go @@ -70,7 +70,6 @@ var NoInstrumentPkgs = []string{ "runtime/msan", "runtime/asan", "internal/cpu", - "buildcfg", } // Don't insert racefuncenter/racefuncexit into the following packages. From 2007599dc83aff17d8261338e8d2ab1f2c518a9b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 4 Jul 2022 13:16:46 -0700 Subject: [PATCH 14/78] test: recognize new gofrontend error message The new gofrontend message matches other gofrontend error messages, so adjust the test to accept it. For #27938 For #51237 Change-Id: I29b536f83a0cf22b1dbdae9abc2f5f6cf21d522d Reviewed-on: https://go-review.googlesource.com/c/go/+/416014 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Than McIntosh --- test/fixedbugs/issue27938.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fixedbugs/issue27938.go b/test/fixedbugs/issue27938.go index 2589e1eff8..5392c65f1f 100644 --- a/test/fixedbugs/issue27938.go +++ b/test/fixedbugs/issue27938.go @@ -11,13 +11,13 @@ package p type _ struct { - F sync.Mutex // ERROR "undefined: sync|expected package" + F sync.Mutex // ERROR "undefined: sync|expected package|reference to undefined name" } type _ struct { - sync.Mutex // ERROR "undefined: sync|expected package" + sync.Mutex // ERROR "undefined: sync|expected package|reference to undefined name" } type _ interface { - sync.Mutex // ERROR "undefined: sync|expected package|expected signature or type name" + sync.Mutex // ERROR "undefined: sync|expected package|expected signature or type name|reference to undefined name" } From 4484c30f788835d8dda0afcefdb12e4b25b2c312 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Fri, 1 Jul 2022 12:56:39 -0400 Subject: [PATCH 15/78] misc/cgo/test: make TestSetgidStress cheaper TestSetgidStress spawns 1000 threads, which can be expensive on some platforms or slow builders. Run with 50 threads in short mode instead. This makes the failure less reproducible even with buggy code. But one can manually stress test it (e.g. when a flaky failure appear on the builder). Fixes #53641. Change-Id: I33b5ea5ecaa8c7a56f59c16f9171657ee295db47 Reviewed-on: https://go-review.googlesource.com/c/go/+/415677 Reviewed-by: Austin Clements TryBot-Result: Gopher Robot Run-TryBot: Cherry Mui --- misc/cgo/test/setgid2_linux.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/misc/cgo/test/setgid2_linux.go b/misc/cgo/test/setgid2_linux.go index d239893f43..9069cff334 100644 --- a/misc/cgo/test/setgid2_linux.go +++ b/misc/cgo/test/setgid2_linux.go @@ -20,7 +20,10 @@ import ( ) func testSetgidStress(t *testing.T) { - const N = 1000 + var N = 1000 + if testing.Short() { + N = 50 + } ch := make(chan int, N) for i := 0; i < N; i++ { go func() { From f4755fc7333f524666f6ba3140cee0d180bce8b3 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 3 Jul 2022 13:32:54 -0700 Subject: [PATCH 16/78] cmd/dist: use purego tag when building the bootstrap binaries This is in addition to the current math_big_pure_go tag. Using purego ensures that we can build the cmd binaries with gccgo. For #53662 Change-Id: Ib82f8bf10659b5f94935f2b427ae8b2da875cd3b Reviewed-on: https://go-review.googlesource.com/c/go/+/415934 Reviewed-by: David Chase Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Auto-Submit: Ian Lance Taylor --- src/cmd/dist/buildtool.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 947da115e3..400c2e85b6 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -204,6 +204,8 @@ func bootstrapBuildTools() { // https://groups.google.com/d/msg/golang-dev/Ss7mCKsvk8w/Gsq7VYI0AwAJ // Use the math_big_pure_go build tag to disable the assembly in math/big // which may contain unsupported instructions. + // Use the purego build tag to disable other assembly code, + // such as in cmd/internal/notsha256. // Note that if we are using Go 1.10 or later as bootstrap, the -gcflags=-l // only applies to the final cmd/go binary, but that's OK: if this is Go 1.10 // or later we don't need to disable inlining to work around bugs in the Go 1.4 compiler. @@ -211,7 +213,7 @@ func bootstrapBuildTools() { pathf("%s/bin/go", goroot_bootstrap), "install", "-gcflags=-l", - "-tags=math_big_pure_go compiler_bootstrap", + "-tags=math_big_pure_go compiler_bootstrap purego", } if vflag > 0 { cmd = append(cmd, "-v") From 177306f6305b35bf6993c2d74baa7fb60cd3f5d4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 3 Jul 2022 13:34:47 -0700 Subject: [PATCH 17/78] cmd/internal/notsha256: add purego tag as needed This permits building the package with gccgo, when using gccgo as a bootstrap compiler. Fixes #53662 Change-Id: Ic7ae9323ec5954e9306a32e1160e9aa1ed3aa202 Reviewed-on: https://go-review.googlesource.com/c/go/+/415935 TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Reviewed-by: David Chase --- src/cmd/internal/notsha256/sha256block_386.s | 3 +++ src/cmd/internal/notsha256/sha256block_amd64.go | 3 +++ src/cmd/internal/notsha256/sha256block_amd64.s | 3 +++ src/cmd/internal/notsha256/sha256block_decl.go | 3 ++- src/cmd/internal/notsha256/sha256block_generic.go | 4 ++-- src/cmd/internal/notsha256/sha256block_ppc64x.s | 3 ++- 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/cmd/internal/notsha256/sha256block_386.s b/src/cmd/internal/notsha256/sha256block_386.s index 086a0ab25c..f2ba7d7a9b 100644 --- a/src/cmd/internal/notsha256/sha256block_386.s +++ b/src/cmd/internal/notsha256/sha256block_386.s @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !purego +// +build !purego + // SHA256 block routine. See sha256block.go for Go equivalent. // // The algorithm is detailed in FIPS 180-4: diff --git a/src/cmd/internal/notsha256/sha256block_amd64.go b/src/cmd/internal/notsha256/sha256block_amd64.go index 676c4f70d9..27b84a86b1 100644 --- a/src/cmd/internal/notsha256/sha256block_amd64.go +++ b/src/cmd/internal/notsha256/sha256block_amd64.go @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !purego +// +build !purego + package notsha256 var useAVX2 = false diff --git a/src/cmd/internal/notsha256/sha256block_amd64.s b/src/cmd/internal/notsha256/sha256block_amd64.s index b2ae7c5fc9..36ea74451d 100644 --- a/src/cmd/internal/notsha256/sha256block_amd64.s +++ b/src/cmd/internal/notsha256/sha256block_amd64.s @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !purego +// +build !purego + #include "textflag.h" // SHA256 block routine. See sha256block.go for Go equivalent. diff --git a/src/cmd/internal/notsha256/sha256block_decl.go b/src/cmd/internal/notsha256/sha256block_decl.go index 5a822ee479..631f1a4a1b 100644 --- a/src/cmd/internal/notsha256/sha256block_decl.go +++ b/src/cmd/internal/notsha256/sha256block_decl.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build 386 || amd64 || ppc64le || ppc64 +//go:build !purego && (386 || amd64 || ppc64le || ppc64) +// +build !purego // +build 386 amd64 ppc64le ppc64 package notsha256 diff --git a/src/cmd/internal/notsha256/sha256block_generic.go b/src/cmd/internal/notsha256/sha256block_generic.go index 20ae841383..2664722bc2 100644 --- a/src/cmd/internal/notsha256/sha256block_generic.go +++ b/src/cmd/internal/notsha256/sha256block_generic.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !amd64 && !386 && !ppc64le && !ppc64 -// +build !amd64,!386,!ppc64le,!ppc64 +//go:build purego || (!amd64 && !386 && !ppc64le && !ppc64) +// +build purego !amd64,!386,!ppc64le,!ppc64 package notsha256 diff --git a/src/cmd/internal/notsha256/sha256block_ppc64x.s b/src/cmd/internal/notsha256/sha256block_ppc64x.s index 6e0f1d6133..e907d3b71b 100644 --- a/src/cmd/internal/notsha256/sha256block_ppc64x.s +++ b/src/cmd/internal/notsha256/sha256block_ppc64x.s @@ -8,7 +8,8 @@ // bootstrap toolchain. // -//go:build ppc64 || ppc64le +//go:build !purego && (ppc64 || ppc64le) +// +build !purego // +build ppc64 ppc64le // Based on CRYPTOGAMS code with the following comment: From 53a4152d478d75ef4b71e428b9d69ed54144081f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 24 Jun 2022 14:34:28 -0700 Subject: [PATCH 18/78] os/exec: clarify that Wait must be called Fixes #52580 Change-Id: Ib2dd8a793b9c6fcb083abb3f7c346f6279adefc9 Reviewed-on: https://go-review.googlesource.com/c/go/+/414056 Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Alan Donovan Reviewed-by: Cherry Mui --- src/os/exec/exec.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index f0dc7dab7d..57d18420bb 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -462,8 +462,8 @@ func lookExtensions(path, dir string) (string, error) { // // If Start returns successfully, the c.Process field will be set. // -// The Wait method will return the exit code and release associated resources -// once the command exits. +// After a successful call to Start the Wait method must be called in +// order to release associated system resources. func (c *Cmd) Start() error { if c.Path == "" && c.Err == nil && c.lookPathErr == nil { c.Err = errors.New("exec: no command") From 2acd3646fc448b760e82fcace189adda94a1904a Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sat, 2 Jul 2022 11:07:55 -0700 Subject: [PATCH 19/78] cmd/compile: rework induction variable detector Induction variable detection is still not quite right. I've added another failing test. Redo the overflow/underflow detector so it is more obviously correct. Update #53600 Fixes #53653 Fixes #53663 Change-Id: Id95228e282fdbf6bd80b26e1c41d62e935ba08ff Reviewed-on: https://go-review.googlesource.com/c/go/+/415874 Run-TryBot: Keith Randall TryBot-Result: Gopher Robot Reviewed-by: Russ Cox Reviewed-by: David Chase --- src/cmd/compile/internal/ssa/loopbce.go | 350 ++++++++++++++---------- test/fixedbugs/issue53600.go | 11 + test/fixedbugs/issue53600.out | 1 + test/fixedbugs/issue53653.go | 42 +++ test/fixedbugs/issue53653.out | 8 + test/loopbce.go | 65 ++++- 6 files changed, 324 insertions(+), 153 deletions(-) create mode 100644 test/fixedbugs/issue53653.go create mode 100644 test/fixedbugs/issue53653.out diff --git a/src/cmd/compile/internal/ssa/loopbce.go b/src/cmd/compile/internal/ssa/loopbce.go index a934cd2c7b..22fb5118ce 100644 --- a/src/cmd/compile/internal/ssa/loopbce.go +++ b/src/cmd/compile/internal/ssa/loopbce.go @@ -5,6 +5,7 @@ package ssa import ( + "cmd/compile/internal/base" "fmt" "math" ) @@ -90,41 +91,42 @@ func findIndVar(f *Func) []indVar { continue } - var flags indVarFlags - var ind, max *Value // induction, and maximum + var ind *Value // induction variable + var init *Value // starting value + var limit *Value // ending value - // Check thet the control if it either ind />= ind. + // Check thet the control if it either ind i; i++ - min, inc, nxt = parseIndVar(max) - if min == nil { + // whether the control op was written with the induction variable on the RHS + // instead of the LHS. This happens for the downwards case, like: + // for i := len(n)-1; i >= 0; i-- + init, inc, nxt = parseIndVar(limit) + if init == nil { // No recognied induction variable on either operand continue } // Ok, the arguments were reversed. Swap them, and remember that we're // looking at a ind >/>= loop (so the induction must be decrementing). - ind, max = max, ind + ind, limit = limit, ind less = false } @@ -138,8 +140,8 @@ func findIndVar(f *Func) []indVar { } // Increment sign must match comparison direction. - // When incrementing, the termination comparison must be ind />= max. + // When incrementing, the termination comparison must be ind />= limit. // See issue 26116. if step > 0 && !less { continue @@ -148,177 +150,229 @@ func findIndVar(f *Func) []indVar { continue } - // If the increment is negative, swap min/max and their flags - if step < 0 { - min, max = max, min - oldf := flags - flags = indVarMaxInc - if oldf&indVarMaxInc == 0 { - flags |= indVarMinExc - } - step = -step - } - - if flags&indVarMaxInc != 0 && max.Op == OpConst64 && max.AuxInt+step < max.AuxInt { - // For a <= comparison, we need to make sure that a value equal to - // max can be incremented without overflowing. - // (For a < comparison, the %step check below ensures no overflow.) - continue - } - // Up to now we extracted the induction variable (ind), // the increment delta (inc), the temporary sum (nxt), - // the minimum value (min) and the maximum value (max). + // the initial value (init) and the limiting value (limit). // - // We also know that ind has the form (Phi min nxt) where + // We also know that ind has the form (Phi init nxt) where // nxt is (Add inc nxt) which means: 1) inc dominates nxt // and 2) there is a loop starting at inc and containing nxt. // // We need to prove that the induction variable is incremented - // only when it's smaller than the maximum value. + // only when it's smaller than the limiting value. // Two conditions must happen listed below to accept ind // as an induction variable. // First condition: loop entry has a single predecessor, which // is the header block. This implies that b.Succs[0] is - // reached iff ind < max. + // reached iff ind < limit. if len(b.Succs[0].b.Preds) != 1 { // b.Succs[1] must exit the loop. continue } // Second condition: b.Succs[0] dominates nxt so that - // nxt is computed when inc < max, meaning nxt <= max. + // nxt is computed when inc < limit. if !sdom.IsAncestorEq(b.Succs[0].b, nxt.Block) { // inc+ind can only be reached through the branch that enters the loop. continue } - // We can only guarantee that the loop runs within limits of induction variable - // if (one of) - // (1) the increment is ±1 - // (2) the limits are constants - // (3) loop is of the form k0 upto Known_not_negative-k inclusive, step <= k - // (4) loop is of the form k0 upto Known_not_negative-k exclusive, step <= k+1 - // (5) loop is of the form Known_not_negative downto k0, minint+step < k0 - if step > 1 { - ok := false - if min.Op == OpConst64 && max.Op == OpConst64 { - if max.AuxInt > min.AuxInt && max.AuxInt%step == min.AuxInt%step { // handle overflow - ok = true - } - } - // Handle induction variables of these forms. - // KNN is known-not-negative. - // SIGNED ARITHMETIC ONLY. (see switch on c above) - // Possibilities for KNN are len and cap; perhaps we can infer others. - // for i := 0; i <= KNN-k ; i += k - // for i := 0; i < KNN-(k-1); i += k - // Also handle decreasing. - - // "Proof" copied from https://go-review.googlesource.com/c/go/+/104041/10/src/cmd/compile/internal/ssa/loopbce.go#164 - // - // In the case of - // // PC is Positive Constant - // L := len(A)-PC - // for i := 0; i < L; i = i+PC - // - // we know: - // - // 0 + PC does not over/underflow. - // len(A)-PC does not over/underflow - // maximum value for L is MaxInt-PC - // i < L <= MaxInt-PC means i + PC < MaxInt hence no overflow. - - // To match in SSA: - // if (a) min.Op == OpConst64(k0) - // and (b) k0 >= MININT + step - // and (c) max.Op == OpSubtract(Op{StringLen,SliceLen,SliceCap}, k) - // or (c) max.Op == OpAdd(Op{StringLen,SliceLen,SliceCap}, -k) - // or (c) max.Op == Op{StringLen,SliceLen,SliceCap} - // and (d) if upto loop, require indVarMaxInc && step <= k or !indVarMaxInc && step-1 <= k - - if min.Op == OpConst64 && min.AuxInt >= step+math.MinInt64 { - knn := max - k := int64(0) - var kArg *Value - - switch max.Op { - case OpSub64: - knn = max.Args[0] - kArg = max.Args[1] - - case OpAdd64: - knn = max.Args[0] - kArg = max.Args[1] - if knn.Op == OpConst64 { - knn, kArg = kArg, knn - } - } - switch knn.Op { - case OpSliceLen, OpStringLen, OpSliceCap: - default: - knn = nil - } - - if kArg != nil && kArg.Op == OpConst64 { - k = kArg.AuxInt - if max.Op == OpAdd64 { - k = -k - } - } - if k >= 0 && knn != nil { - if inc.AuxInt > 0 { // increasing iteration - // The concern for the relation between step and k is to ensure that iv never exceeds knn - // i.e., iv < knn-(K-1) ==> iv + K <= knn; iv <= knn-K ==> iv +K < knn - if step <= k || flags&indVarMaxInc == 0 && step-1 == k { - ok = true + // Check for overflow/underflow. We need to make sure that inc never causes + // the induction variable to wrap around. + // We use a function wrapper here for easy return true / return false / keep going logic. + // This function returns true if the increment will never overflow/underflow. + ok := func() bool { + if step > 0 { + if limit.Op == OpConst64 { + // Figure out the actual largest value. + v := limit.AuxInt + if !inclusive { + if v == math.MinInt64 { + return false // < minint is never satisfiable. } - } else { // decreasing iteration - // Will be decrementing from max towards min; max is knn-k; will only attempt decrement if - // knn-k >[=] min; underflow is only a concern if min-step is not smaller than min. - // This all assumes signed integer arithmetic - // This is already assured by the test above: min.AuxInt >= step+math.MinInt64 - ok = true + v-- } + if init.Op == OpConst64 { + // Use stride to compute a better lower limit. + if init.AuxInt > v { + return false + } + v = addU(init.AuxInt, diff(v, init.AuxInt)/uint64(step)*uint64(step)) + } + // It is ok if we can't overflow when incrementing from the largest value. + return !addWillOverflow(v, step) + } + if step == 1 && !inclusive { + // Can't overflow because maxint is never a possible value. + return true + } + // If the limit is not a constant, check to see if it is a + // negative offset from a known non-negative value. + knn, k := findKNN(limit) + if knn == nil || k < 0 { + return false + } + // limit == (something nonnegative) - k. That subtraction can't underflow, so + // we can trust it. + if inclusive { + // ind <= knn - k cannot overflow if step is at most k + return step <= k + } + // ind < knn - k cannot overflow if step is at most k+1 + return step <= k+1 && k != math.MaxInt64 + } else { // step < 0 + if limit.Op == OpConst64 { + // Figure out the actual smallest value. + v := limit.AuxInt + if !inclusive { + if v == math.MaxInt64 { + return false // > maxint is never satisfiable. + } + v++ + } + if init.Op == OpConst64 { + // Use stride to compute a better lower limit. + if init.AuxInt < v { + return false + } + v = subU(init.AuxInt, diff(init.AuxInt, v)/uint64(-step)*uint64(-step)) + } + // It is ok if we can't underflow when decrementing from the smallest value. + return !subWillUnderflow(v, -step) + } + if step == -1 && !inclusive { + // Can't underflow because minint is never a possible value. + return true } } + return false - // TODO: other unrolling idioms - // for i := 0; i < KNN - KNN % k ; i += k - // for i := 0; i < KNN&^(k-1) ; i += k // k a power of 2 - // for i := 0; i < KNN&(-k) ; i += k // k a power of 2 + } - if !ok { - continue + if ok() { + flags := indVarFlags(0) + var min, max *Value + if step > 0 { + min = init + max = limit + if inclusive { + flags |= indVarMaxInc + } + } else { + min = limit + max = init + flags |= indVarMaxInc + if !inclusive { + flags |= indVarMinExc + } + step = -step } + if f.pass.debug >= 1 { + printIndVar(b, ind, min, max, step, flags) + } + + iv = append(iv, indVar{ + ind: ind, + min: min, + max: max, + entry: b.Succs[0].b, + flags: flags, + }) + b.Logf("found induction variable %v (inc = %v, min = %v, max = %v)\n", ind, inc, min, max) } - if f.pass.debug >= 1 { - printIndVar(b, ind, min, max, step, flags) - } - - iv = append(iv, indVar{ - ind: ind, - min: min, - max: max, - entry: b.Succs[0].b, - flags: flags, - }) - b.Logf("found induction variable %v (inc = %v, min = %v, max = %v)\n", ind, inc, min, max) + // TODO: other unrolling idioms + // for i := 0; i < KNN - KNN % k ; i += k + // for i := 0; i < KNN&^(k-1) ; i += k // k a power of 2 + // for i := 0; i < KNN&(-k) ; i += k // k a power of 2 } return iv } -func dropAdd64(v *Value) (*Value, int64) { - if v.Op == OpAdd64 && v.Args[0].Op == OpConst64 { - return v.Args[1], v.Args[0].AuxInt +// addWillOverflow reports whether x+y would result in a value more than maxint. +func addWillOverflow(x, y int64) bool { + return x+y < x +} + +// subWillUnderflow reports whether x-y would result in a value less than minint. +func subWillUnderflow(x, y int64) bool { + return x-y > x +} + +// diff returns x-y as a uint64. Requires x>=y. +func diff(x, y int64) uint64 { + if x < y { + base.Fatalf("diff %d - %d underflowed", x, y) } - if v.Op == OpAdd64 && v.Args[1].Op == OpConst64 { - return v.Args[0], v.Args[1].AuxInt + return uint64(x - y) +} + +// addU returns x+y. Requires that x+y does not overflow an int64. +func addU(x int64, y uint64) int64 { + if y >= 1<<63 { + if x >= 0 { + base.Fatalf("addU overflowed %d + %d", x, y) + } + x += 1<<63 - 1 + x += 1 + y -= 1 << 63 } - return v, 0 + if addWillOverflow(x, int64(y)) { + base.Fatalf("addU overflowed %d + %d", x, y) + } + return x + int64(y) +} + +// subU returns x-y. Requires that x-y does not underflow an int64. +func subU(x int64, y uint64) int64 { + if y >= 1<<63 { + if x < 0 { + base.Fatalf("subU underflowed %d - %d", x, y) + } + x -= 1<<63 - 1 + x -= 1 + y -= 1 << 63 + } + if subWillUnderflow(x, int64(y)) { + base.Fatalf("subU underflowed %d - %d", x, y) + } + return x - int64(y) +} + +// if v is known to be x - c, where x is known to be nonnegative and c is a +// constant, return x, c. Otherwise return nil, 0. +func findKNN(v *Value) (*Value, int64) { + var x, y *Value + x = v + switch v.Op { + case OpSub64: + x = v.Args[0] + y = v.Args[1] + + case OpAdd64: + x = v.Args[0] + y = v.Args[1] + if x.Op == OpConst64 { + x, y = y, x + } + } + switch x.Op { + case OpSliceLen, OpStringLen, OpSliceCap: + default: + return nil, 0 + } + if y == nil { + return x, 0 + } + if y.Op != OpConst64 { + return nil, 0 + } + if v.Op == OpAdd64 { + return x, -y.AuxInt + } + return x, y.AuxInt } func printIndVar(b *Block, i, min, max *Value, inc int64, flags indVarFlags) { diff --git a/test/fixedbugs/issue53600.go b/test/fixedbugs/issue53600.go index fd3a9e5e47..ead40b57af 100644 --- a/test/fixedbugs/issue53600.go +++ b/test/fixedbugs/issue53600.go @@ -12,6 +12,7 @@ func main() { f() g() h() + j(math.MinInt64) } func f() { for i := int64(math.MaxInt64); i <= math.MaxInt64; i++ { @@ -40,3 +41,13 @@ func h() { println(i, i < 0) } } + +//go:noinline +func j(i int64) { + for j := int64(math.MaxInt64); j <= i-1; j++ { + if j < 0 { + break + } + println(j) + } +} diff --git a/test/fixedbugs/issue53600.out b/test/fixedbugs/issue53600.out index 5590c7dcfb..577b50fd2c 100644 --- a/test/fixedbugs/issue53600.out +++ b/test/fixedbugs/issue53600.out @@ -6,3 +6,4 @@ done 9223372036854775805 false 9223372036854775807 false done +9223372036854775807 diff --git a/test/fixedbugs/issue53653.go b/test/fixedbugs/issue53653.go new file mode 100644 index 0000000000..555f7da528 --- /dev/null +++ b/test/fixedbugs/issue53653.go @@ -0,0 +1,42 @@ +// run + +// Copyright 2022 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 main + +import "math" + +func main() { + f() + g() + h() +} +func f() { + for i := int64(math.MinInt64); i >= math.MinInt64; i-- { + if i > 0 { + println("done") + return + } + println(i, i > 0) + } +} +func g() { + for i := int64(math.MinInt64) + 1; i >= math.MinInt64; i-- { + if i > 0 { + println("done") + return + } + println(i, i > 0) + } +} +func h() { + for i := int64(math.MinInt64) + 2; i >= math.MinInt64; i -= 2 { + if i > 0 { + println("done") + return + } + println(i, i > 0) + } +} diff --git a/test/fixedbugs/issue53653.out b/test/fixedbugs/issue53653.out new file mode 100644 index 0000000000..f699392cf3 --- /dev/null +++ b/test/fixedbugs/issue53653.out @@ -0,0 +1,8 @@ +-9223372036854775808 false +done +-9223372036854775807 false +-9223372036854775808 false +done +-9223372036854775806 false +-9223372036854775808 false +done diff --git a/test/loopbce.go b/test/loopbce.go index f0c9bd0f81..4ae9a6a630 100644 --- a/test/loopbce.go +++ b/test/loopbce.go @@ -3,6 +3,8 @@ package main +import "math" + func f0a(a []int) int { x := 0 for i := range a { // ERROR "Induction variable: limits \[0,\?\), increment 1$" @@ -281,8 +283,8 @@ func d2(a [100]int) [100]int { func d3(a [100]int) [100]int { for i := 0; i <= 99; i++ { // ERROR "Induction variable: limits \[0,99\], increment 1$" - for j := 0; j <= i-1; j++ { // ERROR "Induction variable: limits \[0,\?\], increment 1$" - a[j] = 0 // ERROR "Proved IsInBounds$" + for j := 0; j <= i-1; j++ { + a[j] = 0 a[j+1] = 0 // ERROR "Proved IsInBounds$" a[j+2] = 0 } @@ -290,7 +292,61 @@ func d3(a [100]int) [100]int { return a } -func nobce1() { +func d4() { + for i := int64(math.MaxInt64 - 9); i < math.MaxInt64-2; i += 4 { // ERROR "Induction variable: limits \[9223372036854775798,9223372036854775805\), increment 4$" + useString("foo") + } + for i := int64(math.MaxInt64 - 8); i < math.MaxInt64-2; i += 4 { // ERROR "Induction variable: limits \[9223372036854775799,9223372036854775805\), increment 4$" + useString("foo") + } + for i := int64(math.MaxInt64 - 7); i < math.MaxInt64-2; i += 4 { + useString("foo") + } + for i := int64(math.MaxInt64 - 6); i < math.MaxInt64-2; i += 4 { // ERROR "Induction variable: limits \[9223372036854775801,9223372036854775805\), increment 4$" + useString("foo") + } + for i := int64(math.MaxInt64 - 9); i <= math.MaxInt64-2; i += 4 { // ERROR "Induction variable: limits \[9223372036854775798,9223372036854775805\], increment 4$" + useString("foo") + } + for i := int64(math.MaxInt64 - 8); i <= math.MaxInt64-2; i += 4 { // ERROR "Induction variable: limits \[9223372036854775799,9223372036854775805\], increment 4$" + useString("foo") + } + for i := int64(math.MaxInt64 - 7); i <= math.MaxInt64-2; i += 4 { + useString("foo") + } + for i := int64(math.MaxInt64 - 6); i <= math.MaxInt64-2; i += 4 { + useString("foo") + } +} + +func d5() { + for i := int64(math.MinInt64 + 9); i > math.MinInt64+2; i -= 4 { // ERROR "Induction variable: limits \(-9223372036854775806,-9223372036854775799\], increment 4" + useString("foo") + } + for i := int64(math.MinInt64 + 8); i > math.MinInt64+2; i -= 4 { // ERROR "Induction variable: limits \(-9223372036854775806,-9223372036854775800\], increment 4" + useString("foo") + } + for i := int64(math.MinInt64 + 7); i > math.MinInt64+2; i -= 4 { + useString("foo") + } + for i := int64(math.MinInt64 + 6); i > math.MinInt64+2; i -= 4 { // ERROR "Induction variable: limits \(-9223372036854775806,-9223372036854775802\], increment 4" + useString("foo") + } + for i := int64(math.MinInt64 + 9); i >= math.MinInt64+2; i -= 4 { // ERROR "Induction variable: limits \[-9223372036854775806,-9223372036854775799\], increment 4" + useString("foo") + } + for i := int64(math.MinInt64 + 8); i >= math.MinInt64+2; i -= 4 { // ERROR "Induction variable: limits \[-9223372036854775806,-9223372036854775800\], increment 4" + useString("foo") + } + for i := int64(math.MinInt64 + 7); i >= math.MinInt64+2; i -= 4 { + useString("foo") + } + for i := int64(math.MinInt64 + 6); i >= math.MinInt64+2; i -= 4 { + useString("foo") + } +} + +func bce1() { // tests overflow of max-min a := int64(9223372036854774057) b := int64(-1547) @@ -300,8 +356,7 @@ func nobce1() { panic("invalid test: modulos should differ") } - for i := b; i < a; i += z { - // No induction variable is possible because i will overflow a first iteration. + for i := b; i < a; i += z { // ERROR "Induction variable: limits \[-1547,9223372036854774057\), increment 1337" useString("foobar") } } From c391156f96357593fa18fccee305401e3f82a1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 5 Jul 2022 16:14:22 +0100 Subject: [PATCH 20/78] cmd/go: set up git identity for build_buildvcs_auto.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Just like in other tests like get_dotfiles.txt or version_buildvcs_git.txt. Without it, I get a failure on my machine: fatal: empty ident name (for ) not allowed Change-Id: I1c17c0d58c539b59154570b5438c7bd850bac5aa Reviewed-on: https://go-review.googlesource.com/c/go/+/416095 Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Run-TryBot: Daniel Martí Reviewed-by: Dmitri Shuralyov --- src/cmd/go/testdata/script/build_buildvcs_auto.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/go/testdata/script/build_buildvcs_auto.txt b/src/cmd/go/testdata/script/build_buildvcs_auto.txt index 9eac568045..dd9eef5f82 100644 --- a/src/cmd/go/testdata/script/build_buildvcs_auto.txt +++ b/src/cmd/go/testdata/script/build_buildvcs_auto.txt @@ -6,11 +6,15 @@ cd sub exec git init . +exec git config user.name 'Nameless Gopher' +exec git config user.email 'nobody@golang.org' exec git add sub.go exec git commit -m 'initial state' cd .. exec git init +exec git config user.name 'Nameless Gopher' +exec git config user.email 'nobody@golang.org' exec git submodule add ./sub exec git add go.mod example.go exec git commit -m 'initial state' From 1243ec9c177007879958443262fe4d25099c5ede Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 29 Jun 2022 02:05:21 +0700 Subject: [PATCH 21/78] cmd/compile: only check implicit dots for method call enabled by a type bound Fixes #53419 Change-Id: Ibad64f5c4af2112deeb0a9ecc9c589b17594bd05 Reviewed-on: https://go-review.googlesource.com/c/go/+/414836 Reviewed-by: Matthew Dempsky Reviewed-by: David Chase Reviewed-by: Keith Randall TryBot-Result: Gopher Robot Run-TryBot: Cuong Manh Le --- src/cmd/compile/internal/noder/stencil.go | 14 ++++++++------ test/run.go | 1 - 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go index cf2f0b38db..796a740528 100644 --- a/src/cmd/compile/internal/noder/stencil.go +++ b/src/cmd/compile/internal/noder/stencil.go @@ -1654,12 +1654,14 @@ func (g *genInst) getDictionarySym(gf *ir.Name, targs []*types.Type, isMeth bool se := call.X.(*ir.SelectorExpr) if se.X.Type().IsShape() { // This is a method call enabled by a type bound. - - // We need this extra check for method expressions, - // which don't add in the implicit XDOTs. - tmpse := ir.NewSelectorExpr(src.NoXPos, ir.OXDOT, se.X, se.Sel) - tmpse = typecheck.AddImplicitDots(tmpse) - tparam := tmpse.X.Type() + tparam := se.X.Type() + if call.X.Op() == ir.ODOTMETH { + // We need this extra check for method expressions, + // which don't add in the implicit XDOTs. + tmpse := ir.NewSelectorExpr(src.NoXPos, ir.OXDOT, se.X, se.Sel) + tmpse = typecheck.AddImplicitDots(tmpse) + tparam = tmpse.X.Type() + } if !tparam.IsShape() { // The method expression is not // really on a typeparam. diff --git a/test/run.go b/test/run.go index 8934e23b38..cb1622ccc9 100644 --- a/test/run.go +++ b/test/run.go @@ -1966,7 +1966,6 @@ var types2Failures32Bit = setOf( var go118Failures = setOf( "typeparam/nested.go", // 1.18 compiler doesn't support function-local types with generics "typeparam/issue51521.go", // 1.18 compiler produces bad panic message and link error - "typeparam/issue53419.go", // 1.18 compiler mishandles generic selector resolution ) // In all of these cases, the 1.17 compiler reports reasonable errors, but either the From eaf21256545ae04a35fa070763faa6eb2098591d Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 6 Jul 2022 07:45:19 -0400 Subject: [PATCH 22/78] cmd/go: default to "exe" build mode for windows -race This patch changes the default build mode from "pie" to "exe" when building programs on windows with "-race" in effect. The Go command already issues an error if users explicitly ask for -buildmode=pie in combination with -race on windows, but wasn't revising the default "pie" build mode if a specific buildmode was not requested. Updates #53539. Updates #35006. Change-Id: I2f81a41a1d15a0b4f5ae943146175c5a1202cbe0 Reviewed-on: https://go-review.googlesource.com/c/go/+/416174 Reviewed-by: Alex Brainman Reviewed-by: Cherry Mui TryBot-Result: Gopher Robot Run-TryBot: Than McIntosh --- src/cmd/go/internal/work/init.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index 5bf548db32..255ff3a0c5 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -211,7 +211,11 @@ func buildModeInit() { codegenArg = "-shared" ldBuildmode = "pie" case "windows": - ldBuildmode = "pie" + if cfg.BuildRace { + ldBuildmode = "exe" + } else { + ldBuildmode = "pie" + } case "ios": codegenArg = "-shared" ldBuildmode = "pie" From 0c7fcf6bd1fd8df2bfae3a482f1261886f6313c1 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 1 Jul 2022 08:39:12 -0400 Subject: [PATCH 23/78] cmd/link: explicitly disable PIE for windows/amd64 -race mode Turn off PIE explicitly for windows/amd64 when -race is in effect, since at the moment the race detector runtime doesn't seem to handle PIE binaries correctly. Note that newer C compilers on windows produce PIE binaries by default, so the Go linker needs to explicitly turn off PIE when invoking the external linker in this case. Updates #53539. Change-Id: Ib990621f22cf61a5fa383584bab81d3dfd7552e8 Reviewed-on: https://go-review.googlesource.com/c/go/+/415676 Reviewed-by: Cherry Mui TryBot-Result: Gopher Robot Run-TryBot: Than McIntosh Reviewed-by: Alex Brainman --- src/cmd/link/internal/ld/lib.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 565ff9d634..18910ddb85 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1426,10 +1426,23 @@ func (ctxt *Link) hostlink() { argv = append(argv, "-Wl,-pagezero_size,4000000") } } + if *flagRace && ctxt.HeadType == objabi.Hwindows { + // Current windows/amd64 race detector tsan support + // library can't handle PIE mode (see #53539 for more details). + // For now, explicitly disable PIE (since some compilers + // default to it) if -race is in effect. + argv = addASLRargs(argv, false) + } case BuildModePIE: switch ctxt.HeadType { case objabi.Hdarwin, objabi.Haix: case objabi.Hwindows: + if *flagAslr && *flagRace { + // Current windows/amd64 race detector tsan support + // library can't handle PIE mode (see #53539 for more details). + // Disable alsr if -race in effect. + *flagAslr = false + } argv = addASLRargs(argv, *flagAslr) default: // ELF. From 8ac58de1857637f372a00ea16ab5497193b784a6 Mon Sep 17 00:00:00 2001 From: Aaron Gable Date: Wed, 6 Jul 2022 16:59:03 -0700 Subject: [PATCH 24/78] crypto/x509: populate Number and AKI of parsed CRLs The x509.RevocationList type has two fields which correspond to extensions, rather than native fields, of the underlying ASN.1 CRL: the .Number field corresponds to the crlNumber extension, and the .AuthorityKeyId field corresponds to the authorityKeyIdentifier extension. The x509.CreateRevocationList() function uses these fields to populate their respective extensions in the resulting CRL. However, the x509.ParseRevocationList() function does not perform the reverse operation: the fields retain their zero-values even after parsing a CRL which contains the relevant extensions. Add code which populates these fields when parsing their extensions. Add assertions to the existing tests to confirm that the values are populated appropriately. Fixes #53726 Change-Id: Ie5b71081e53034e0b5b9ff3c122065c62f15cf23 Reviewed-on: https://go-review.googlesource.com/c/go/+/416354 Run-TryBot: Roland Shoemaker Auto-Submit: Roland Shoemaker Reviewed-by: Roland Shoemaker TryBot-Result: Gopher Robot Reviewed-by: Damien Neil --- src/crypto/x509/parser.go | 17 +++++++++++++---- src/crypto/x509/x509.go | 7 +++++-- src/crypto/x509/x509_test.go | 13 +++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/crypto/x509/parser.go b/src/crypto/x509/parser.go index e0e8f6125f..cd87044d17 100644 --- a/src/crypto/x509/parser.go +++ b/src/crypto/x509/parser.go @@ -1008,22 +1008,22 @@ func ParseRevocationList(der []byte) (*RevocationList, error) { // we can populate RevocationList.Raw, before unwrapping the // SEQUENCE so it can be operated on if !input.ReadASN1Element(&input, cryptobyte_asn1.SEQUENCE) { - return nil, errors.New("x509: malformed certificate") + return nil, errors.New("x509: malformed crl") } rl.Raw = input if !input.ReadASN1(&input, cryptobyte_asn1.SEQUENCE) { - return nil, errors.New("x509: malformed certificate") + return nil, errors.New("x509: malformed crl") } var tbs cryptobyte.String // do the same trick again as above to extract the raw // bytes for Certificate.RawTBSCertificate if !input.ReadASN1Element(&tbs, cryptobyte_asn1.SEQUENCE) { - return nil, errors.New("x509: malformed tbs certificate") + return nil, errors.New("x509: malformed tbs crl") } rl.RawTBSRevocationList = tbs if !tbs.ReadASN1(&tbs, cryptobyte_asn1.SEQUENCE) { - return nil, errors.New("x509: malformed tbs certificate") + return nil, errors.New("x509: malformed tbs crl") } var version int @@ -1148,6 +1148,15 @@ func ParseRevocationList(der []byte) (*RevocationList, error) { if err != nil { return nil, err } + if ext.Id.Equal(oidExtensionAuthorityKeyId) { + rl.AuthorityKeyId = ext.Value + } else if ext.Id.Equal(oidExtensionCRLNumber) { + value := cryptobyte.String(ext.Value) + rl.Number = new(big.Int) + if !value.ReadASN1Integer(rl.Number) { + return nil, errors.New("x509: malformed crl number") + } + } rl.Extensions = append(rl.Extensions, ext) } } diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 87eb1f7720..7dcebfa5f1 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -2109,7 +2109,9 @@ type RevocationList struct { // Issuer contains the DN of the issuing certificate. Issuer pkix.Name // AuthorityKeyId is used to identify the public key associated with the - // issuing certificate. + // issuing certificate. It is populated from the authorityKeyIdentifier + // extension when parsing a CRL. It is ignored when creating a CRL; the + // extension is populated from the issuing certificate itself. AuthorityKeyId []byte Signature []byte @@ -2125,7 +2127,8 @@ type RevocationList struct { // Number is used to populate the X.509 v2 cRLNumber extension in the CRL, // which should be a monotonically increasing sequence number for a given - // CRL scope and CRL issuer. + // CRL scope and CRL issuer. It is also populated from the cRLNumber + // extension when parsing a CRL. Number *big.Int // ThisUpdate is used to populate the thisUpdate field in the CRL, which diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index 8ef6115df4..594ee1dceb 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -2681,6 +2681,19 @@ func TestCreateRevocationList(t *testing.T) { t.Fatalf("Extensions mismatch: got %v; want %v.", parsedCRL.Extensions[2:], tc.template.ExtraExtensions) } + + if tc.template.Number != nil && parsedCRL.Number == nil { + t.Fatalf("Generated CRL missing Number: got nil, want %s", + tc.template.Number.String()) + } + if tc.template.Number != nil && tc.template.Number.Cmp(parsedCRL.Number) != 0 { + t.Fatalf("Generated CRL has wrong Number: got %s, want %s", + parsedCRL.Number.String(), tc.template.Number.String()) + } + if !bytes.Equal(parsedCRL.AuthorityKeyId, expectedAKI) { + t.Fatalf("Generated CRL has wrong Number: got %x, want %x", + parsedCRL.AuthorityKeyId, expectedAKI) + } }) } } From 486fc0177068277a51235c7794660b238e70d622 Mon Sep 17 00:00:00 2001 From: Aaron Gable Date: Tue, 28 Jun 2022 15:28:21 -0700 Subject: [PATCH 25/78] crypto/x509: correctly parse CRL entry extensions When checking to see if a CRL entry has any extensions, attempt to read them from the individual revokedCertificate, rather than from the parent TBSCertList. Additionally, crlEntryExtensions is not an EXPLICIT field (c.f. crlExtension and Certificate extensions), so do not perform an extra layer of unwrapping when parsing the field. The added test case fails without the accompanying changes. Fixes #53592 Change-Id: Icc00e4c911f196aef77e3248117de64ddc5ea27f Reviewed-on: https://go-review.googlesource.com/c/go/+/414877 Reviewed-by: Damien Neil Reviewed-by: Roland Shoemaker Run-TryBot: Roland Shoemaker Auto-Submit: Roland Shoemaker TryBot-Result: Gopher Robot --- src/crypto/x509/parser.go | 5 +---- src/crypto/x509/x509_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/crypto/x509/parser.go b/src/crypto/x509/parser.go index cd87044d17..a2d3d80964 100644 --- a/src/crypto/x509/parser.go +++ b/src/crypto/x509/parser.go @@ -1106,13 +1106,10 @@ func ParseRevocationList(der []byte) (*RevocationList, error) { } var extensions cryptobyte.String var present bool - if !tbs.ReadOptionalASN1(&extensions, &present, cryptobyte_asn1.SEQUENCE) { + if !certSeq.ReadOptionalASN1(&extensions, &present, cryptobyte_asn1.SEQUENCE) { return nil, errors.New("x509: malformed extensions") } if present { - if !extensions.ReadASN1(&extensions, cryptobyte_asn1.SEQUENCE) { - return nil, errors.New("x509: malformed extensions") - } for !extensions.Empty() { var extension cryptobyte.String if !extensions.ReadASN1(&extension, cryptobyte_asn1.SEQUENCE) { diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index 594ee1dceb..cddad1e246 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -2524,6 +2524,34 @@ func TestCreateRevocationList(t *testing.T) { NextUpdate: time.Time{}.Add(time.Hour * 48), }, }, + { + name: "valid, extra entry extension", + key: ec256Priv, + issuer: &Certificate{ + KeyUsage: KeyUsageCRLSign, + Subject: pkix.Name{ + CommonName: "testing", + }, + SubjectKeyId: []byte{1, 2, 3}, + }, + template: &RevocationList{ + RevokedCertificates: []pkix.RevokedCertificate{ + { + SerialNumber: big.NewInt(2), + RevocationTime: time.Time{}.Add(time.Hour), + Extensions: []pkix.Extension{ + { + Id: []int{2, 5, 29, 99}, + Value: []byte{5, 0}, + }, + }, + }, + }, + Number: big.NewInt(5), + ThisUpdate: time.Time{}.Add(time.Hour * 24), + NextUpdate: time.Time{}.Add(time.Hour * 48), + }, + }, { name: "valid, Ed25519 key", key: ed25519Priv, From c177d9d98a7bfb21346f6309c115d0a2bf3167e3 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Wed, 29 Jun 2022 11:30:47 -0700 Subject: [PATCH 26/78] crypto/x509: restrict CRL number to <=20 octets Similar to certificate serial numbers, RFC 5280 restricts the length of the CRL number field to no more than 20 octets. Enforce this in CreateRevocationList. Fixes #53543 Change-Id: If392ef6b0844db716ae9ee6ef317135fceab039c Reviewed-on: https://go-review.googlesource.com/c/go/+/415134 Auto-Submit: Roland Shoemaker Reviewed-by: Tatiana Bradley Reviewed-by: Damien Neil TryBot-Result: Gopher Robot Run-TryBot: Roland Shoemaker --- src/crypto/x509/x509.go | 4 ++++ src/crypto/x509/x509_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 7dcebfa5f1..950f6d08c8 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -2196,6 +2196,10 @@ func CreateRevocationList(rand io.Reader, template *RevocationList, issuer *Cert if err != nil { return nil, err } + + if numBytes := template.Number.Bytes(); len(numBytes) > 20 || (len(numBytes) == 20 && numBytes[0]&0x80 != 0) { + return nil, errors.New("x509: CRL number exceeds 20 octets") + } crlNum, err := asn1.Marshal(template.Number) if err != nil { return nil, err diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index cddad1e246..cba44f6f8c 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -2478,6 +2478,40 @@ func TestCreateRevocationList(t *testing.T) { }, expectedError: "x509: template contains nil Number field", }, + { + name: "long Number", + key: ec256Priv, + issuer: &Certificate{ + KeyUsage: KeyUsageCRLSign, + Subject: pkix.Name{ + CommonName: "testing", + }, + SubjectKeyId: []byte{1, 2, 3}, + }, + template: &RevocationList{ + ThisUpdate: time.Time{}.Add(time.Hour * 24), + NextUpdate: time.Time{}.Add(time.Hour * 48), + Number: big.NewInt(0).SetBytes(append([]byte{1}, make([]byte, 20)...)), + }, + expectedError: "x509: CRL number exceeds 20 octets", + }, + { + name: "long Number (20 bytes, MSB set)", + key: ec256Priv, + issuer: &Certificate{ + KeyUsage: KeyUsageCRLSign, + Subject: pkix.Name{ + CommonName: "testing", + }, + SubjectKeyId: []byte{1, 2, 3}, + }, + template: &RevocationList{ + ThisUpdate: time.Time{}.Add(time.Hour * 24), + NextUpdate: time.Time{}.Add(time.Hour * 48), + Number: big.NewInt(0).SetBytes(append([]byte{255}, make([]byte, 19)...)), + }, + expectedError: "x509: CRL number exceeds 20 octets", + }, { name: "invalid signature algorithm", key: ec256Priv, From 1ebc983000ed411a1c06f6b8a61770be1392e707 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 7 Jul 2022 20:01:21 +0000 Subject: [PATCH 27/78] runtime: overestimate the amount of allocated memory in heapLive CL 377516 made it so that memory metrics are truly monotonic, but also updated how heapLive tracked allocated memory to also be monotonic. The result is that cached spans with allocated memory aren't fully accounted for by the GC, causing it to make a worse assumption (the exact mechanism is at this time unknown), resulting in a memory regression, especially for smaller heaps. This change is a partial revert of CL 377516 that makes heapLive a non-monotonic overestimate again, which appears to resolve the regression. For #53738. Change-Id: I5c51067abc0b8e0a6b89dd8dbd4a0be2e8c0c1b2 Reviewed-on: https://go-review.googlesource.com/c/go/+/416417 Reviewed-by: Michael Pratt Run-TryBot: Michael Knyszek TryBot-Result: Gopher Robot --- src/runtime/mcache.go | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/runtime/mcache.go b/src/runtime/mcache.go index 7c785900db..1f484fb9b6 100644 --- a/src/runtime/mcache.go +++ b/src/runtime/mcache.go @@ -173,10 +173,6 @@ func (c *mcache) refill(spc spanClass) { bytesAllocated := slotsUsed * int64(s.elemsize) gcController.totalAlloc.Add(bytesAllocated) - // Update heapLive and flush scanAlloc. - gcController.update(bytesAllocated, int64(c.scanAlloc)) - c.scanAlloc = 0 - // Clear the second allocCount just to be safe. s.allocCountBeforeCache = 0 } @@ -198,6 +194,23 @@ func (c *mcache) refill(spc spanClass) { // Store the current alloc count for accounting later. s.allocCountBeforeCache = s.allocCount + // Update heapLive and flush scanAlloc. + // + // We have not yet allocated anything new into the span, but we + // assume that all of its slots will get used, so this makes + // heapLive an overestimate. + // + // When the span gets uncached, we'll fix up this overestimate + // if necessary (see releaseAll). + // + // We pick an overestimate here because an underestimate leads + // the pacer to believe that it's in better shape than it is, + // which appears to lead to more memory used. See #53738 for + // more details. + usedBytes := uintptr(s.allocCount) * s.elemsize + gcController.update(int64(s.npages*pageSize)-int64(usedBytes), int64(c.scanAlloc)) + c.scanAlloc = 0 + c.alloc[spc] = s } @@ -247,6 +260,8 @@ func (c *mcache) releaseAll() { scanAlloc := int64(c.scanAlloc) c.scanAlloc = 0 + sg := mheap_.sweepgen + dHeapLive := int64(0) for i := range c.alloc { s := c.alloc[i] if s != &emptymspan { @@ -262,6 +277,15 @@ func (c *mcache) releaseAll() { // We assumed earlier that the full span gets allocated. gcController.totalAlloc.Add(slotsUsed * int64(s.elemsize)) + if s.sweepgen != sg+1 { + // refill conservatively counted unallocated slots in gcController.heapLive. + // Undo this. + // + // If this span was cached before sweep, then gcController.heapLive was totally + // recomputed since caching this span, so we don't do this for stale spans. + dHeapLive -= int64(uintptr(s.nelems)-uintptr(s.allocCount)) * int64(s.elemsize) + } + // Release the span to the mcentral. mheap_.central[i].mcentral.uncacheSpan(s) c.alloc[i] = &emptymspan @@ -277,8 +301,8 @@ func (c *mcache) releaseAll() { c.tinyAllocs = 0 memstats.heapStats.release() - // Updated heapScan. - gcController.update(0, scanAlloc) + // Update heapLive and heapScan. + gcController.update(dHeapLive, scanAlloc) } // prepareForSweep flushes c if the system has entered a new sweep phase From 14abe8aa7324bdf0e09e1dfebfb3519cc30f4918 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 1 Jul 2022 16:33:54 +0700 Subject: [PATCH 28/78] cmd/compile: don't convert to interface{} for un-comparable types in generic switch Fixes #53635 Change-Id: I41f383be8870432fc0d29fa83687911ddd8217f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/415634 TryBot-Result: Gopher Robot Run-TryBot: Cuong Manh Le Reviewed-by: Keith Randall Reviewed-by: Keith Randall Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/noder/stencil.go | 3 +++ test/fixedbugs/issue53635.go | 31 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 test/fixedbugs/issue53635.go diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go index 796a740528..1534a1fa49 100644 --- a/src/cmd/compile/internal/noder/stencil.go +++ b/src/cmd/compile/internal/noder/stencil.go @@ -1214,6 +1214,9 @@ func (subst *subster) node(n ir.Node) ir.Node { if m.Tag != nil && m.Tag.Op() == ir.OTYPESW { break // Nothing to do here for type switches. } + if m.Tag != nil && !types.IsComparable(m.Tag.Type()) { + break // Nothing to do here for un-comparable types. + } if m.Tag != nil && !m.Tag.Type().IsEmptyInterface() && m.Tag.Type().HasShape() { // To implement a switch on a value that is or has a type parameter, we first convert // that thing we're switching on to an interface{}. diff --git a/test/fixedbugs/issue53635.go b/test/fixedbugs/issue53635.go new file mode 100644 index 0000000000..bea5493805 --- /dev/null +++ b/test/fixedbugs/issue53635.go @@ -0,0 +1,31 @@ +// run + +// Copyright 2022 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 main + +func main() { + f[int]() +} + +func f[T any]() { + switch []T(nil) { + case nil: + default: + panic("FAIL") + } + + switch (func() T)(nil) { + case nil: + default: + panic("FAIL") + } + + switch (map[int]T)(nil) { + case nil: + default: + panic("FAIL") + } +} From 180bcad33dcd3d59443fe8eda5ae7556b1b2945b Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Tue, 31 May 2022 14:47:33 -0700 Subject: [PATCH 29/78] net/http: wait for listeners to exit in Server.Close and Shutdown Avoid race conditions when a new connection is accepted just after Server.Close or Server.Shutdown is called by waiting for the listener goroutines to exit before proceeding to clean up active connections. No test because the mechanism required to trigger the race condition reliably requires such tight coupling to the Server internals that any test would be quite fragile in the face of reasonable refactorings. Fixes #48642 Updates #33313, #36819 Change-Id: I109a93362680991bf298e0a95637595dcaa884af Reviewed-on: https://go-review.googlesource.com/c/go/+/409537 TryBot-Result: Gopher Robot Run-TryBot: Damien Neil Reviewed-by: Brad Fitzpatrick Reviewed-by: Bryan Mills --- src/net/http/server.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/net/http/server.go b/src/net/http/server.go index bc3a4633da..87dd412984 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2690,6 +2690,8 @@ type Server struct { activeConn map[*conn]struct{} doneChan chan struct{} onShutdown []func() + + listenerGroup sync.WaitGroup } func (s *Server) getDoneChan() <-chan struct{} { @@ -2732,6 +2734,15 @@ func (srv *Server) Close() error { defer srv.mu.Unlock() srv.closeDoneChanLocked() err := srv.closeListenersLocked() + + // Unlock srv.mu while waiting for listenerGroup. + // The group Add and Done calls are made with srv.mu held, + // to avoid adding a new listener in the window between + // us setting inShutdown above and waiting here. + srv.mu.Unlock() + srv.listenerGroup.Wait() + srv.mu.Lock() + for c := range srv.activeConn { c.rwc.Close() delete(srv.activeConn, c) @@ -2778,6 +2789,7 @@ func (srv *Server) Shutdown(ctx context.Context) error { go f() } srv.mu.Unlock() + srv.listenerGroup.Wait() pollIntervalBase := time.Millisecond nextPollInterval := func() time.Duration { @@ -2794,7 +2806,7 @@ func (srv *Server) Shutdown(ctx context.Context) error { timer := time.NewTimer(nextPollInterval()) defer timer.Stop() for { - if srv.closeIdleConns() && srv.numListeners() == 0 { + if srv.closeIdleConns() { return lnerr } select { @@ -2817,12 +2829,6 @@ func (srv *Server) RegisterOnShutdown(f func()) { srv.mu.Unlock() } -func (s *Server) numListeners() int { - s.mu.Lock() - defer s.mu.Unlock() - return len(s.listeners) -} - // closeIdleConns closes all idle connections and reports whether the // server is quiescent. func (s *Server) closeIdleConns() bool { @@ -3157,8 +3163,10 @@ func (s *Server) trackListener(ln *net.Listener, add bool) bool { return false } s.listeners[ln] = struct{}{} + s.listenerGroup.Add(1) } else { delete(s.listeners, ln) + s.listenerGroup.Done() } return true } From 5c1a13e7a47bc47c07057c0acf626e3fafe064c9 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 8 Jul 2022 10:02:14 -0400 Subject: [PATCH 30/78] cmd/go: avoid setting variables for '/' and ':' in TestScript subprocess environments Also simplify platform-dependent handling of the PATH variable, to make it more like the existing platform-dependent handling for HOME and TMPDIR. Fixes #53671. Change-Id: Ica2665d3f61988c66fb6982b9feb61ca48eced79 Reviewed-on: https://go-review.googlesource.com/c/go/+/416554 Reviewed-by: Ian Lance Taylor Run-TryBot: Bryan Mills TryBot-Result: Gopher Robot --- src/cmd/go/go_test.go | 9 +++++++++ src/cmd/go/script_test.go | 19 ++++++------------- src/cmd/go/testdata/script/README | 17 ++++++++++++----- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index b39a62f3e4..c100316f47 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -1363,6 +1363,15 @@ func tempEnvName() string { } } +func pathEnvName() string { + switch runtime.GOOS { + case "plan9": + return "path" + default: + return "PATH" + } +} + func TestDefaultGOPATH(t *testing.T) { tg := testgo(t) defer tg.cleanup() diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index 5e82929f19..809dfb452f 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -163,7 +163,7 @@ func (ts *testScript) setup() { ts.cd = filepath.Join(ts.workdir, "gopath/src") ts.env = []string{ "WORK=" + ts.workdir, // must be first for ts.abbrev - "PATH=" + testBin + string(filepath.ListSeparator) + os.Getenv("PATH"), + pathEnvName() + "=" + testBin + string(filepath.ListSeparator) + os.Getenv(pathEnvName()), homeEnvName() + "=/no-home", "CCACHE_DISABLE=1", // ccache breaks with non-existent HOME "GOARCH=" + runtime.GOARCH, @@ -187,8 +187,6 @@ func (ts *testScript) setup() { tempEnvName() + "=" + filepath.Join(ts.workdir, "tmp"), "devnull=" + os.DevNull, "goversion=" + goVersion(ts), - ":=" + string(os.PathListSeparator), - "/=" + string(os.PathSeparator), "CMDGO_TEST_RUN_MAIN=true", } if testenv.Builder() != "" || os.Getenv("GIT_TRACE_CURL") == "1" { @@ -203,10 +201,6 @@ func (ts *testScript) setup() { ts.env = append(ts.env, "TESTGONETWORK=panic", "TESTGOVCS=panic") } - if runtime.GOOS == "plan9" { - ts.env = append(ts.env, "path="+testBin+string(filepath.ListSeparator)+os.Getenv("path")) - } - for _, key := range extraEnvKeys { if val := os.Getenv(key); val != "" { ts.env = append(ts.env, key+"="+val) @@ -219,6 +213,10 @@ func (ts *testScript) setup() { ts.envMap[kv[:i]] = kv[i+1:] } } + // Add entries for ${:} and ${/} to make it easier to write platform-independent + // environment variables. + ts.envMap["/"] = string(os.PathSeparator) + ts.envMap[":"] = string(os.PathListSeparator) fmt.Fprintf(&ts.log, "# (%s)\n", time.Now().UTC().Format(time.RFC3339)) ts.mark = ts.log.Len() @@ -1264,12 +1262,7 @@ func (ts *testScript) lookPath(command string) (string, error) { } } - pathName := "PATH" - if runtime.GOOS == "plan9" { - pathName = "path" - } - - for _, dir := range strings.Split(ts.envMap[pathName], string(filepath.ListSeparator)) { + for _, dir := range strings.Split(ts.envMap[pathEnvName()], string(filepath.ListSeparator)) { if searchExt { ents, err := os.ReadDir(dir) if err != nil { diff --git a/src/cmd/go/testdata/script/README b/src/cmd/go/testdata/script/README index c575bff1a5..e52917684f 100644 --- a/src/cmd/go/testdata/script/README +++ b/src/cmd/go/testdata/script/README @@ -41,12 +41,19 @@ Scripts also have access to these other environment variables: GODEBUG= devnull= goversion= - := -The scripts' supporting files are unpacked relative to $GOPATH/src (aka $WORK/gopath/src) -and then the script begins execution in that directory as well. Thus the example above runs -in $WORK/gopath/src with GOPATH=$WORK/gopath and $WORK/gopath/src/hello.go -containing the listed contents. +On Plan 9, the variables $path and $home are set instead of $PATH and $HOME. +On Windows, the variables $USERPROFILE and $TMP are set instead of +$HOME and $TMPDIR. + +In addition, variables named ':' and '/' are expanded within script arguments +(expanding to the value of os.PathListSeparator and os.PathSeparator +respectively) but are not inherited in subprocess environments. + +The scripts' supporting files are unpacked relative to $GOPATH/src +(aka $WORK/gopath/src) and then the script begins execution in that directory as +well. Thus the example above runs in $WORK/gopath/src with GOPATH=$WORK/gopath +and $WORK/gopath/src/hello.go containing the listed contents. The lines at the top of the script are a sequence of commands to be executed by a tiny script engine in ../../script_test.go (not the system shell). From c1a4e0fe014568501b194eb8b04309f54eee6b4c Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 8 Jul 2022 14:52:23 -0700 Subject: [PATCH 31/78] cmd/compile: fix libfuzzer instrumentation line number Set a reasonable starting line number before processing the body of the function in the order pass. We update base.Pos each time we process a node, but some of the libfuzzer instrumentation is added before we process any node, so the base.Pos used is junk. Fixes #53688 Change-Id: I3654b805eabb8866a9a1574845ef4ff062797319 Reviewed-on: https://go-review.googlesource.com/c/go/+/416654 Reviewed-by: David Chase Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gopher Robot --- src/cmd/compile/internal/walk/order.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/walk/order.go b/src/cmd/compile/internal/walk/order.go index 8d1089dcc1..2d1e88238c 100644 --- a/src/cmd/compile/internal/walk/order.go +++ b/src/cmd/compile/internal/walk/order.go @@ -63,7 +63,7 @@ func order(fn *ir.Func) { s := fmt.Sprintf("\nbefore order %v", fn.Sym()) ir.DumpList(s, fn.Body) } - + ir.SetPos(fn) // Set reasonable position for instrumenting code. See issue 53688. orderBlock(&fn.Body, map[string][]*ir.Name{}) } @@ -477,6 +477,12 @@ func (o *orderState) edge() { // and then replaces the old slice in n with the new slice. // free is a map that can be used to obtain temporary variables by type. func orderBlock(n *ir.Nodes, free map[string][]*ir.Name) { + if len(*n) != 0 { + // Set reasonable position for instrumenting code. See issue 53688. + // It would be nice if ir.Nodes had a position (the opening {, probably), + // but it doesn't. So we use the first statement's position instead. + ir.SetPos((*n)[0]) + } var order orderState order.free = free mark := order.markTemp() From 59ab6f351a370a27458755dc69f4a837e55a05a6 Mon Sep 17 00:00:00 2001 From: Mitar Date: Sun, 10 Jul 2022 14:06:09 +0000 Subject: [PATCH 32/78] net/http: remove Content-Encoding in writeNotModified Additional header to remove if set before calling http.ServeContent. The API of ServeContent is that one should set Content-Encoding before calling it, if the content is encoded (e.g., compressed). But then, if content has not been modified, that header should be removed, according to RFC 7232 section 4.1. Change-Id: If51b35b7811a4dbb19de2ddb73f40c5e68fcec7e GitHub-Last-Rev: 53df6e73c44b63f351f7aeeb45cab82d706311eb GitHub-Pull-Request: golang/go#50903 Reviewed-on: https://go-review.googlesource.com/c/go/+/381955 Run-TryBot: hopehook Reviewed-by: Damien Neil TryBot-Result: Gopher Robot Reviewed-by: Benny Siegert --- src/net/http/fs.go | 1 + src/net/http/fs_test.go | 54 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/net/http/fs.go b/src/net/http/fs.go index 7a1d5f4be5..4f144ebad2 100644 --- a/src/net/http/fs.go +++ b/src/net/http/fs.go @@ -541,6 +541,7 @@ func writeNotModified(w ResponseWriter) { h := w.Header() delete(h, "Content-Type") delete(h, "Content-Length") + delete(h, "Content-Encoding") if h.Get("Etag") != "" { delete(h, "Last-Modified") } diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go index d627dfd4be..4be561cdfa 100644 --- a/src/net/http/fs_test.go +++ b/src/net/http/fs_test.go @@ -564,6 +564,60 @@ func testServeFileWithContentEncoding(t *testing.T, h2 bool) { } } +// Tests that ServeFile does not generate representation metadata when +// file has not been modified, as per RFC 7232 section 4.1. +func TestServeFileNotModified_h1(t *testing.T) { testServeFileNotModified(t, h1Mode) } +func TestServeFileNotModified_h2(t *testing.T) { testServeFileNotModified(t, h2Mode) } +func testServeFileNotModified(t *testing.T, h2 bool) { + defer afterTest(t) + cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Content-Encoding", "foo") + w.Header().Set("Etag", `"123"`) + ServeFile(w, r, "testdata/file") + + // Because the testdata is so small, it would fit in + // both the h1 and h2 Server's write buffers. For h1, + // sendfile is used, though, forcing a header flush at + // the io.Copy. http2 doesn't do a header flush so + // buffers all 11 bytes and then adds its own + // Content-Length. To prevent the Server's + // Content-Length and test ServeFile only, flush here. + w.(Flusher).Flush() + })) + defer cst.close() + req, err := NewRequest("GET", cst.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("If-None-Match", `"123"`) + resp, err := cst.c.Do(req) + if err != nil { + t.Fatal(err) + } + b, err := io.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + t.Fatal("reading Body:", err) + } + if len(b) != 0 { + t.Errorf("non-empty body") + } + if g, e := resp.StatusCode, StatusNotModified; g != e { + t.Errorf("status mismatch: got %d, want %d", g, e) + } + // HTTP1 transport sets ContentLength to 0. + if g, e1, e2 := resp.ContentLength, int64(-1), int64(0); g != e1 && g != e2 { + t.Errorf("Content-Length mismatch: got %d, want %d or %d", g, e1, e2) + } + if resp.Header.Get("Content-Type") != "" { + t.Errorf("Content-Type present, but it should not be") + } + if resp.Header.Get("Content-Encoding") != "" { + t.Errorf("Content-Encoding present, but it should not be") + } +} + func TestServeIndexHtml(t *testing.T) { defer afterTest(t) From f956941b0f5a5a841827bd3e84401d32916bb73e Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 5 Jul 2022 13:53:35 -0400 Subject: [PATCH 33/78] cmd/go: use package index for std in load.loadPackageData load.loadPackageData was only using an index for modules, not for standard library packages. Other parts of the code were using the index, so there was some benefit, but not as much as you'd hope. With the index disabled, the Script/work test takes 2.2s on my Mac. With the index enabled before this CL, it took 2.0s. With the index enabled after this CL, it takes 1.6s. Before this CL, the Script/work test issued: 429 IsDir 19 IsDirWithGoFiles 7 Lstat 9072 Open 993 ReadDir 256 Stat 7 Walk 3 indexModule 24 openIndexModule 525 openIndexPackage After this CL, it issued: 19 IsDirWithGoFiles 7 Lstat 60 Open 606 ReadDir 256 Stat 7 Walk 3 indexModule 24 openIndexModule 525 openIndexPackage This speedup helps the Dragonfly builder, which has very slow file I/O and is timing out since a recent indexing change. Times for go test -run=Script/^work$ on the Dragonfly builder: 50s before indexing changes 31s full module indexing of std 46s per-package indexing of std It cuts the time for go test -run=Script/^work$ from 44s to 20s. For #53577. Change-Id: I7189a77fc7fdf61de3ab3447efc4e84d1fc52c25 Reviewed-on: https://go-review.googlesource.com/c/go/+/416134 Reviewed-by: Bryan Mills --- src/cmd/go/internal/fsys/fsys.go | 65 +++++++++++++++++++++++++++- src/cmd/go/internal/load/pkg.go | 9 +++- src/cmd/go/internal/modindex/read.go | 2 + src/cmd/go/internal/modindex/scan.go | 2 + src/cmd/go/testdata/script/index.txt | 6 +++ 5 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/cmd/go/testdata/script/index.txt diff --git a/src/cmd/go/internal/fsys/fsys.go b/src/cmd/go/internal/fsys/fsys.go index 41d0bbfe66..d96a290de5 100644 --- a/src/cmd/go/internal/fsys/fsys.go +++ b/src/cmd/go/internal/fsys/fsys.go @@ -6,16 +6,65 @@ import ( "encoding/json" "errors" "fmt" + "internal/godebug" "io/fs" "io/ioutil" + "log" "os" + pathpkg "path" "path/filepath" "runtime" + "runtime/debug" "sort" "strings" + "sync" "time" ) +// Trace emits a trace event for the operation and file path to the trace log, +// but only when $GODEBUG contains gofsystrace=1. +// The traces are appended to the file named by the $GODEBUG setting gofsystracelog, or else standard error. +// For debugging, if the $GODEBUG setting gofsystracestack is non-empty, then trace events for paths +// matching that glob pattern (using path.Match) will be followed by a full stack trace. +func Trace(op, path string) { + if !doTrace { + return + } + traceMu.Lock() + defer traceMu.Unlock() + fmt.Fprintf(traceFile, "%d gofsystrace %s %s\n", os.Getpid(), op, path) + if traceStack != "" { + if match, _ := pathpkg.Match(traceStack, path); match { + traceFile.Write(debug.Stack()) + } + } +} + +var ( + doTrace bool + traceStack string + traceFile *os.File + traceMu sync.Mutex +) + +func init() { + if godebug.Get("gofsystrace") != "1" { + return + } + doTrace = true + traceStack = godebug.Get("gofsystracestack") + if f := godebug.Get("gofsystracelog"); f != "" { + // Note: No buffering on writes to this file, so no need to worry about closing it at exit. + var err error + traceFile, err = os.OpenFile(f, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) + if err != nil { + log.Fatal(err) + } + } else { + traceFile = os.Stderr + } +} + // OverlayFile is the path to a text file in the OverlayJSON format. // It is the value of the -overlay flag. var OverlayFile string @@ -86,6 +135,7 @@ func Init(wd string) error { return nil } + Trace("ReadFile", OverlayFile) b, err := os.ReadFile(OverlayFile) if err != nil { return fmt.Errorf("reading overlay file: %v", err) @@ -191,6 +241,7 @@ func initFromJSON(overlayJSON OverlayJSON) error { // IsDir returns true if path is a directory on disk or in the // overlay. func IsDir(path string) (bool, error) { + Trace("IsDir", path) path = canonicalize(path) if _, ok := parentIsOverlayFile(path); ok { @@ -260,6 +311,7 @@ func readDir(dir string) ([]fs.FileInfo, error) { // ReadDir provides a slice of fs.FileInfo entries corresponding // to the overlaid files in the directory. func ReadDir(dir string) ([]fs.FileInfo, error) { + Trace("ReadDir", dir) dir = canonicalize(dir) if _, ok := parentIsOverlayFile(dir); ok { return nil, &fs.PathError{Op: "ReadDir", Path: dir, Err: errNotDir} @@ -327,11 +379,17 @@ func OverlayPath(path string) (string, bool) { // Open opens the file at or overlaid on the given path. func Open(path string) (*os.File, error) { - return OpenFile(path, os.O_RDONLY, 0) + Trace("Open", path) + return openFile(path, os.O_RDONLY, 0) } // OpenFile opens the file at or overlaid on the given path with the flag and perm. func OpenFile(path string, flag int, perm os.FileMode) (*os.File, error) { + Trace("OpenFile", path) + return openFile(path, flag, perm) +} + +func openFile(path string, flag int, perm os.FileMode) (*os.File, error) { cpath := canonicalize(path) if node, ok := overlay[cpath]; ok { // Opening a file in the overlay. @@ -360,6 +418,7 @@ func OpenFile(path string, flag int, perm os.FileMode) (*os.File, error) { // IsDirWithGoFiles reports whether dir is a directory containing Go files // either on disk or in the overlay. func IsDirWithGoFiles(dir string) (bool, error) { + Trace("IsDirWithGoFiles", dir) fis, err := ReadDir(dir) if os.IsNotExist(err) || errors.Is(err, errNotDir) { return false, nil @@ -436,6 +495,7 @@ func walk(path string, info fs.FileInfo, walkFn filepath.WalkFunc) error { // Walk walks the file tree rooted at root, calling walkFn for each file or // directory in the tree, including root. func Walk(root string, walkFn filepath.WalkFunc) error { + Trace("Walk", root) info, err := Lstat(root) if err != nil { err = walkFn(root, nil, err) @@ -450,11 +510,13 @@ func Walk(root string, walkFn filepath.WalkFunc) error { // lstat implements a version of os.Lstat that operates on the overlay filesystem. func Lstat(path string) (fs.FileInfo, error) { + Trace("Lstat", path) return overlayStat(path, os.Lstat, "lstat") } // Stat implements a version of os.Stat that operates on the overlay filesystem. func Stat(path string) (fs.FileInfo, error) { + Trace("Stat", path) return overlayStat(path, os.Stat, "stat") } @@ -528,6 +590,7 @@ func (f fakeDir) Sys() any { return nil } // Glob is like filepath.Glob but uses the overlay file system. func Glob(pattern string) (matches []string, err error) { + Trace("Glob", pattern) // Check pattern is well-formed. if _, err := filepath.Match(pattern, ""); err != nil { return nil, err diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index fcb72b07b2..046f508545 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -877,7 +877,14 @@ func loadPackageData(ctx context.Context, path, parentPath, parentDir, parentRoo if !cfg.ModulesEnabled { buildMode = build.ImportComment } - if modroot := modload.PackageModRoot(ctx, r.path); modroot != "" { + modroot := modload.PackageModRoot(ctx, r.path) + if modroot == "" && str.HasPathPrefix(r.dir, cfg.GOROOTsrc) { + modroot = cfg.GOROOTsrc + if str.HasPathPrefix(r.dir, cfg.GOROOTsrc+string(filepath.Separator)+"cmd") { + modroot += string(filepath.Separator) + "cmd" + } + } + if modroot != "" { if rp, err := modindex.GetPackage(modroot, r.dir); err == nil { data.p, data.err = rp.Import(cfg.BuildContext, buildMode) goto Happy diff --git a/src/cmd/go/internal/modindex/read.go b/src/cmd/go/internal/modindex/read.go index 7ee4669e67..436bbebb39 100644 --- a/src/cmd/go/internal/modindex/read.go +++ b/src/cmd/go/internal/modindex/read.go @@ -179,6 +179,7 @@ func openIndexModule(modroot string, ismodcache bool) (*Module, error) { err error } r := mcache.Do(modroot, func() any { + fsys.Trace("openIndexModule", modroot) id, err := moduleHash(modroot, ismodcache) if err != nil { return result{nil, err} @@ -212,6 +213,7 @@ func openIndexPackage(modroot, pkgdir string) (*IndexPackage, error) { err error } r := pcache.Do([2]string{modroot, pkgdir}, func() any { + fsys.Trace("openIndexPackage", pkgdir) id, err := dirHash(modroot, pkgdir) if err != nil { return result{nil, err} diff --git a/src/cmd/go/internal/modindex/scan.go b/src/cmd/go/internal/modindex/scan.go index 1ba7c0cad1..d3f059bcfc 100644 --- a/src/cmd/go/internal/modindex/scan.go +++ b/src/cmd/go/internal/modindex/scan.go @@ -46,6 +46,7 @@ func moduleWalkErr(modroot string, path string, info fs.FileInfo, err error) err // encoded representation. It returns ErrNotIndexed if the module can't // be indexed because it contains symlinks. func indexModule(modroot string) ([]byte, error) { + fsys.Trace("indexModule", modroot) var packages []*rawPackage err := fsys.Walk(modroot, func(path string, info fs.FileInfo, err error) error { if err := moduleWalkErr(modroot, path, info, err); err != nil { @@ -72,6 +73,7 @@ func indexModule(modroot string) ([]byte, error) { // encoded representation. It returns ErrNotIndexed if the package can't // be indexed. func indexPackage(modroot, pkgdir string) []byte { + fsys.Trace("indexPackage", pkgdir) p := importRaw(modroot, relPath(pkgdir, modroot)) return encodePackageBytes(p) } diff --git a/src/cmd/go/testdata/script/index.txt b/src/cmd/go/testdata/script/index.txt new file mode 100644 index 0000000000..6a2d13c8b5 --- /dev/null +++ b/src/cmd/go/testdata/script/index.txt @@ -0,0 +1,6 @@ +# Check that standard library packages are cached. +go list -json math # refresh cache +env GODEBUG=gofsystrace=1,gofsystracelog=fsys.log +go list -json math +! grep math/abs.go fsys.log +grep 'openIndexPackage .*[\\/]math$' fsys.log From 398dcd1cf00a1536dad98cf87c16f8ad0c8913fc Mon Sep 17 00:00:00 2001 From: Dmitri Goutnik Date: Sat, 9 Jul 2022 07:36:45 -0500 Subject: [PATCH 34/78] database/sql: make TestTxContextWaitNoDiscard test more robust Similar to CL 385934, rely on waiter trigger instead of the WAIT query prefix and factor out the common test code. Fixes #53222 Change-Id: I46efc85ca102b350bb4dbe8e514921e016870ffb Reviewed-on: https://go-review.googlesource.com/c/go/+/416655 Reviewed-by: Michael Knyszek TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills Run-TryBot: Dmitri Goutnik Reviewed-by: Bryan Mills --- src/database/sql/sql_test.go | 45 ++++++++++++------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go index 6bc869fc86..8c58723c03 100644 --- a/src/database/sql/sql_test.go +++ b/src/database/sql/sql_test.go @@ -449,6 +449,16 @@ func TestQueryContextWait(t *testing.T) { // TestTxContextWait tests the transaction behavior when the tx context is canceled // during execution of the query. func TestTxContextWait(t *testing.T) { + testContextWait(t, false) +} + +// TestTxContextWaitNoDiscard is the same as TestTxContextWait, but should not discard +// the final connection. +func TestTxContextWaitNoDiscard(t *testing.T) { + testContextWait(t, true) +} + +func testContextWait(t *testing.T, keepConnOnRollback bool) { db := newTestDB(t, "people") defer closeDB(t, db) @@ -458,7 +468,7 @@ func TestTxContextWait(t *testing.T) { if err != nil { t.Fatal(err) } - tx.keepConnOnRollback = false + tx.keepConnOnRollback = keepConnOnRollback tx.dc.ci.(*fakeConn).waiter = func(c context.Context) { cancel() @@ -472,36 +482,11 @@ func TestTxContextWait(t *testing.T) { t.Fatalf("expected QueryContext to error with context canceled but returned %v", err) } - waitForFree(t, db, 0) -} - -// TestTxContextWaitNoDiscard is the same as TestTxContextWait, but should not discard -// the final connection. -func TestTxContextWaitNoDiscard(t *testing.T) { - db := newTestDB(t, "people") - defer closeDB(t, db) - - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Millisecond) - defer cancel() - - tx, err := db.BeginTx(ctx, nil) - if err != nil { - // Guard against the context being canceled before BeginTx completes. - if err == context.DeadlineExceeded { - t.Skip("tx context canceled prior to first use") - } - t.Fatal(err) + if keepConnOnRollback { + waitForFree(t, db, 1) + } else { + waitForFree(t, db, 0) } - - // This will trigger the *fakeConn.Prepare method which will take time - // performing the query. The ctxDriverPrepare func will check the context - // after this and close the rows and return an error. - _, err = tx.QueryContext(ctx, "WAIT|1s|SELECT|people|age,name|") - if err != context.DeadlineExceeded { - t.Fatalf("expected QueryContext to error with context deadline exceeded but returned %v", err) - } - - waitForFree(t, db, 1) } // TestUnsupportedOptions checks that the database fails when a driver that From bf5898ef53d1693aa572da0da746c05e9a6f15c5 Mon Sep 17 00:00:00 2001 From: Sean Liao Date: Sat, 9 Jul 2022 18:38:45 +0100 Subject: [PATCH 35/78] net/url: use EscapedPath for url.JoinPath Fixes #53763 Change-Id: I08b53f159ebdce7907e8cc17316fd0c982363239 Reviewed-on: https://go-review.googlesource.com/c/go/+/416774 TryBot-Result: Gopher Robot Reviewed-by: Damien Neil Reviewed-by: Bryan Mills Run-TryBot: Ian Lance Taylor --- src/net/url/url.go | 2 +- src/net/url/url_test.go | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/net/url/url.go b/src/net/url/url.go index db4d6385e3..e82ae6aeef 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -1193,7 +1193,7 @@ func (u *URL) UnmarshalBinary(text []byte) error { func (u *URL) JoinPath(elem ...string) *URL { url := *u if len(elem) > 0 { - elem = append([]string{u.Path}, elem...) + elem = append([]string{u.EscapedPath()}, elem...) p := path.Join(elem...) // path.Join will remove any trailing slashes. // Preserve at least one. diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go index 478cc34872..263eddffcf 100644 --- a/src/net/url/url_test.go +++ b/src/net/url/url_test.go @@ -2119,6 +2119,16 @@ func TestJoinPath(t *testing.T) { elem: nil, out: "https://go.googlesource.com/", }, + { + base: "https://go.googlesource.com/a%2fb", + elem: []string{"c"}, + out: "https://go.googlesource.com/a%2fb/c", + }, + { + base: "https://go.googlesource.com/a%2fb", + elem: []string{"c%2fd"}, + out: "https://go.googlesource.com/a%2fb/c%2fd", + }, { base: "/", elem: nil, From ad641e8521381886bc6274d78e986f2bb8ac561b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 11 Jul 2022 13:06:56 -0400 Subject: [PATCH 36/78] misc/cgo/testcarchive: don't rely on an erroneous install target in tests Non-main packages in module mode should not be installed to GOPATH/pkg, but due to #37015 they were installed there anyway. This change switches the 'go install' command in TestPIE to instead use 'go build', and switches TestInstall and TestCachedInstall (which appear to be explicitly testing 'go install') to explicitly request GOPATH mode (which does have a well-defined install target). For #37015. Change-Id: Ifb24657d2781d1e35cf40078e8e3ebf56aab9cc8 Reviewed-on: https://go-review.googlesource.com/c/go/+/416954 TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills Auto-Submit: Bryan Mills Reviewed-by: Ian Lance Taylor --- misc/cgo/testcarchive/carchive_test.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go index d36b97b70e..c409c317dc 100644 --- a/misc/cgo/testcarchive/carchive_test.go +++ b/misc/cgo/testcarchive/carchive_test.go @@ -205,6 +205,7 @@ func genHeader(t *testing.T, header, dir string) { func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) { t.Helper() cmd := exec.Command(buildcmd[0], buildcmd[1:]...) + cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode t.Log(buildcmd) if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) @@ -238,7 +239,7 @@ func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) { binArgs := append(cmdToRun(exe), "arg1", "arg2") cmd = exec.Command(binArgs[0], binArgs[1:]...) if runtime.Compiler == "gccgo" { - cmd.Env = append(os.Environ(), "GCCGO=1") + cmd.Env = append(cmd.Environ(), "GCCGO=1") } if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) @@ -822,9 +823,15 @@ func TestPIE(t *testing.T) { t.Skipf("skipping PIE test on %s", GOOS) } + libgoa := "libgo.a" + if runtime.Compiler == "gccgo" { + libgoa = "liblibgo.a" + } + if !testWork { defer func() { os.Remove("testp" + exeSuffix) + os.Remove(libgoa) os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() } @@ -837,18 +844,13 @@ func TestPIE(t *testing.T) { // be running this test in a GOROOT owned by root.) genHeader(t, "p.h", "./p") - cmd := exec.Command("go", "install", "-buildmode=c-archive", "./libgo") + cmd := exec.Command("go", "build", "-buildmode=c-archive", "./libgo") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) } - libgoa := "libgo.a" - if runtime.Compiler == "gccgo" { - libgoa = "liblibgo.a" - } - - ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join(libgodir, libgoa)) + ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", libgoa) if runtime.Compiler == "gccgo" { ccArgs = append(ccArgs, "-lgo") } @@ -1035,6 +1037,7 @@ func TestCachedInstall(t *testing.T) { buildcmd := []string{"go", "install", "-buildmode=c-archive", "./libgo"} cmd := exec.Command(buildcmd[0], buildcmd[1:]...) + cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode t.Log(buildcmd) if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) @@ -1050,6 +1053,7 @@ func TestCachedInstall(t *testing.T) { } cmd = exec.Command(buildcmd[0], buildcmd[1:]...) + cmd.Env = append(cmd.Environ(), "GO111MODULE=off") t.Log(buildcmd) if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) From b8bf820d5d4602f7e83ff89c0f8d0f2bd3a220d4 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 11 Jul 2022 13:32:40 -0400 Subject: [PATCH 37/78] cmd/nm: don't rely on an erroneous install target in tests Non-main packages in module mode should not be installed to GOPATH/pkg, but due to #37015 they were installed there anyway. This change switches the 'go install' command in testGoLib to instead use 'go build -buildmode=archive' with an explicit output file. For #37015. Change-Id: I15781aa33d1b2adc6a4437a58622276f4e20b889 Reviewed-on: https://go-review.googlesource.com/c/go/+/416955 Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills Auto-Submit: Bryan Mills --- src/cmd/nm/nm_test.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index 226c2c3bcd..4bc9bf9079 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -250,23 +250,14 @@ func testGoLib(t *testing.T, iscgo bool) { t.Fatal(err) } - args := []string{"install", "mylib"} - cmd := exec.Command(testenv.GoToolPath(t), args...) + cmd := exec.Command(testenv.GoToolPath(t), "build", "-buildmode=archive", "-o", "mylib.a", ".") cmd.Dir = libpath cmd.Env = append(os.Environ(), "GOPATH="+gopath) out, err := cmd.CombinedOutput() if err != nil { t.Fatalf("building test lib failed: %s %s", err, out) } - pat := filepath.Join(gopath, "pkg", "*", "mylib.a") - ms, err := filepath.Glob(pat) - if err != nil { - t.Fatal(err) - } - if len(ms) == 0 { - t.Fatalf("cannot found paths for pattern %s", pat) - } - mylib := ms[0] + mylib := filepath.Join(libpath, "mylib.a") out, err = exec.Command(testnmpath, mylib).CombinedOutput() if err != nil { From 7510e597def68cee77e8ba280fc0f04d3cfd2a22 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 6 Jul 2022 09:49:32 -0400 Subject: [PATCH 38/78] cmd/go: make module index loading O(1) For a large module, opening the index was populating tables with entries for every package in the module. If we are only using a small number of those packages, this is wasted work that can dwarf the benefit from the index. This CL changes the index reader to avoid loading all packages at module index open time. It also refactors the code somewhat for clarity. It also removes some duplication by defining that a per-package index is a per-module index containing a single package, rather than having two different formats and two different decoders. It also changes the string table to use uvarint-prefixed data instead of having to scan for a NUL byte. This makes random access to long strings more efficient - O(1) instead of O(n) - and can significantly speed up the strings.Compare operation in the binary search looking for a given package. Also add a direct test of the indexing code. For #53577. Change-Id: I7428d28133e4e7fe2d2993fa014896cd15af48af Reviewed-on: https://go-review.googlesource.com/c/go/+/416178 Reviewed-by: Bryan Mills --- src/cmd/go/internal/modindex/index_test.go | 87 ++++ src/cmd/go/internal/modindex/read.go | 514 ++++++++++----------- src/cmd/go/internal/modindex/write.go | 46 +- src/cmd/go/internal/modload/search.go | 13 +- 4 files changed, 356 insertions(+), 304 deletions(-) create mode 100644 src/cmd/go/internal/modindex/index_test.go diff --git a/src/cmd/go/internal/modindex/index_test.go b/src/cmd/go/internal/modindex/index_test.go new file mode 100644 index 0000000000..2c072f909d --- /dev/null +++ b/src/cmd/go/internal/modindex/index_test.go @@ -0,0 +1,87 @@ +// Copyright 2022 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 modindex + +import ( + "encoding/hex" + "encoding/json" + "go/build" + "internal/diff" + "path/filepath" + "reflect" + "runtime" + "testing" +) + +func init() { + isTest = true + enabled = true // to allow GODEBUG=goindex=0 go test, when things are very broken +} + +func TestIndex(t *testing.T) { + src := filepath.Join(runtime.GOROOT(), "src") + checkPkg := func(t *testing.T, m *Module, pkg string, data []byte) { + p := m.Package(pkg) + bp, err := p.Import(build.Default, build.ImportComment) + if err != nil { + t.Fatal(err) + } + bp1, err := build.Default.Import(pkg, filepath.Join(src, pkg), build.ImportComment) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(bp, bp1) { + t.Errorf("mismatch") + t.Logf("index:\n%s", hex.Dump(data)) + + js, err := json.MarshalIndent(bp, "", "\t") + if err != nil { + t.Fatal(err) + } + js1, err := json.MarshalIndent(bp1, "", "\t") + if err != nil { + t.Fatal(err) + } + t.Logf("diff:\n%s", diff.Diff("index", js, "correct", js1)) + t.FailNow() + } + } + + // Check packages in increasing complexity, one at a time. + pkgs := []string{ + "crypto", + "encoding", + "unsafe", + "encoding/json", + "runtime", + "net", + } + var raws []*rawPackage + for _, pkg := range pkgs { + raw := importRaw(src, pkg) + raws = append(raws, raw) + t.Run(pkg, func(t *testing.T) { + data := encodeModuleBytes([]*rawPackage{raw}) + m, err := fromBytes(src, data) + if err != nil { + t.Fatal(err) + } + checkPkg(t, m, pkg, data) + }) + } + + // Check that a multi-package index works too. + t.Run("all", func(t *testing.T) { + data := encodeModuleBytes(raws) + m, err := fromBytes(src, data) + if err != nil { + t.Fatal(err) + } + for _, pkg := range pkgs { + checkPkg(t, m, pkg, data) + } + }) +} diff --git a/src/cmd/go/internal/modindex/read.go b/src/cmd/go/internal/modindex/read.go index 436bbebb39..38ddfec70f 100644 --- a/src/cmd/go/internal/modindex/read.go +++ b/src/cmd/go/internal/modindex/read.go @@ -15,7 +15,6 @@ import ( "internal/godebug" "internal/goroot" "internal/unsafeheader" - "math" "path" "path/filepath" "runtime" @@ -45,10 +44,9 @@ var enabled bool = godebug.Get("goindex") != "0" // do the equivalent of build.Import of packages in the module and answer other // questions based on the index file's data. type Module struct { - modroot string - od offsetDecoder - packages map[string]int // offsets of each package - packagePaths []string // paths to package directories relative to modroot; these are the keys of packages + modroot string + d *decoder + n int // number of packages } // moduleHash returns an ActionID corresponding to the state of the module @@ -236,110 +234,131 @@ func openIndexPackage(modroot, pkgdir string) (*IndexPackage, error) { return r.pkg, r.err } +var errCorrupt = errors.New("corrupt index") + +// protect marks the start of a large section of code that accesses the index. +// It should be used as: +// +// defer unprotect(protect, &err) +// +// It should not be used for trivial accesses which would be +// dwarfed by the overhead of the defer. +func protect() bool { + return debug.SetPanicOnFault(true) +} + +var isTest = false + +// unprotect marks the end of a large section of code that accesses the index. +// It should be used as: +// +// defer unprotect(protect, &err) +// +// end looks for panics due to errCorrupt or bad mmap accesses. +// When it finds them, it adds explanatory text, consumes the panic, and sets *errp instead. +// If errp is nil, end adds the explanatory text but then calls base.Fatalf. +func unprotect(old bool, errp *error) { + // SetPanicOnFault's errors _may_ satisfy this interface. Even though it's not guaranteed + // that all its errors satisfy this interface, we'll only check for these errors so that + // we don't suppress panics that could have been produced from other sources. + type addrer interface { + Addr() uintptr + } + + debug.SetPanicOnFault(old) + + if e := recover(); e != nil { + if _, ok := e.(addrer); ok || e == errCorrupt { + // This panic was almost certainly caused by SetPanicOnFault or our panic(errCorrupt). + err := fmt.Errorf("error reading module index: %v", e) + if errp != nil { + *errp = err + return + } + if isTest { + panic(err) + } + base.Fatalf("%v", err) + } + // The panic was likely not caused by SetPanicOnFault. + panic(e) + } +} + // fromBytes returns a *Module given the encoded representation. -func fromBytes(moddir string, data []byte) (mi *Module, err error) { +func fromBytes(moddir string, data []byte) (m *Module, err error) { if !enabled { panic("use of index") } - // SetPanicOnFault's errors _may_ satisfy this interface. Even though it's not guaranteed - // that all its errors satisfy this interface, we'll only check for these errors so that - // we don't suppress panics that could have been produced from other sources. - type addrer interface { - Addr() uintptr + defer unprotect(protect(), &err) + + if !bytes.HasPrefix(data, []byte(indexVersion+"\n")) { + return nil, errCorrupt } - // set PanicOnFault to true so that we can catch errors on the initial reads of the slice, - // in case it's mmapped (the common case). - old := debug.SetPanicOnFault(true) - defer func() { - debug.SetPanicOnFault(old) - if e := recover(); e != nil { - if _, ok := e.(addrer); ok { - // This panic was almost certainly caused by SetPanicOnFault. - err = fmt.Errorf("error reading module index: %v", e) - return - } - // The panic was likely not caused by SetPanicOnFault. - panic(e) - } - }() - - gotVersion, unread, _ := bytes.Cut(data, []byte{'\n'}) - if string(gotVersion) != indexVersion { - return nil, fmt.Errorf("bad index version string: %q", gotVersion) + const hdr = len(indexVersion + "\n") + d := &decoder{data: data} + str := d.intAt(hdr) + if str < hdr+8 || len(d.data) < str { + return nil, errCorrupt } - stringTableOffset, unread := binary.LittleEndian.Uint32(unread[:4]), unread[4:] - st := newStringTable(data[stringTableOffset:]) - d := decoder{unread, st} - numPackages := d.int() - - packagePaths := make([]string, numPackages) - for i := range packagePaths { - packagePaths[i] = d.string() - } - packageOffsets := make([]int, numPackages) - for i := range packageOffsets { - packageOffsets[i] = d.int() - } - packages := make(map[string]int, numPackages) - for i := range packagePaths { - packages[packagePaths[i]] = packageOffsets[i] + d.data, d.str = data[:str], d.data[str:] + // Check that string table looks valid. + // First string is empty string (length 0), + // and we leave a marker byte 0xFF at the end + // just to make sure that the file is not truncated. + if len(d.str) == 0 || d.str[0] != 0 || d.str[len(d.str)-1] != 0xFF { + return nil, errCorrupt } - return &Module{ + n := d.intAt(hdr + 4) + if n < 0 || n > (len(d.data)-8)/8 { + return nil, errCorrupt + } + + m = &Module{ moddir, - offsetDecoder{data, st}, - packages, - packagePaths, - }, nil + d, + n, + } + return m, nil } // packageFromBytes returns a *IndexPackage given the encoded representation. func packageFromBytes(modroot string, data []byte) (p *IndexPackage, err error) { - if !enabled { - panic("use of package index when not enabled") + m, err := fromBytes(modroot, data) + if err != nil { + return nil, err } - - // SetPanicOnFault's errors _may_ satisfy this interface. Even though it's not guaranteed - // that all its errors satisfy this interface, we'll only check for these errors so that - // we don't suppress panics that could have been produced from other sources. - type addrer interface { - Addr() uintptr + if m.n != 1 { + return nil, fmt.Errorf("corrupt single-package index") } - - // set PanicOnFault to true so that we can catch errors on the initial reads of the slice, - // in case it's mmapped (the common case). - old := debug.SetPanicOnFault(true) - defer func() { - debug.SetPanicOnFault(old) - if e := recover(); e != nil { - if _, ok := e.(addrer); ok { - // This panic was almost certainly caused by SetPanicOnFault. - err = fmt.Errorf("error reading module index: %v", e) - return - } - // The panic was likely not caused by SetPanicOnFault. - panic(e) - } - }() - - gotVersion, unread, _ := bytes.Cut(data, []byte{'\n'}) - if string(gotVersion) != indexVersion { - return nil, fmt.Errorf("bad index version string: %q", gotVersion) - } - stringTableOffset, unread := binary.LittleEndian.Uint32(unread[:4]), unread[4:] - st := newStringTable(data[stringTableOffset:]) - d := &decoder{unread, st} - p = decodePackage(d, offsetDecoder{data, st}) - p.modroot = modroot - return p, nil + return m.pkg(0), nil } -// Returns a list of directory paths, relative to the modroot, for -// packages contained in the module index. -func (mi *Module) Packages() []string { - return mi.packagePaths +// pkgDir returns the dir string of the i'th package in the index. +func (m *Module) pkgDir(i int) string { + if i < 0 || i >= m.n { + panic(errCorrupt) + } + return m.d.stringAt(12 + 8 + 8*i) +} + +// pkgOff returns the offset of the data for the i'th package in the index. +func (m *Module) pkgOff(i int) int { + if i < 0 || i >= m.n { + panic(errCorrupt) + } + return m.d.intAt(12 + 8 + 8*i + 4) +} + +// Walk calls f for each package in the index, passing the path to that package relative to the module root. +func (m *Module) Walk(f func(path string)) { + defer unprotect(protect(), nil) + for i := 0; i < m.n; i++ { + f(m.pkgDir(i)) + } } // relPath returns the path relative to the module's root. @@ -349,11 +368,7 @@ func relPath(path, modroot string) string { // Import is the equivalent of build.Import given the information in Module. func (rp *IndexPackage) Import(bctxt build.Context, mode build.ImportMode) (p *build.Package, err error) { - defer func() { - if e := recover(); e != nil { - err = fmt.Errorf("error reading module index: %v", e) - } - }() + defer unprotect(protect(), &err) ctxt := (*Context)(&bctxt) @@ -794,46 +809,44 @@ type IndexPackage struct { var errCannotFindPackage = errors.New("cannot find package") -// Package returns an IndexPackage constructed using the information in the Module. -func (mi *Module) Package(path string) *IndexPackage { - defer func() { - if e := recover(); e != nil { - base.Fatalf("error reading module index: %v", e) - } - }() - offset, ok := mi.packages[path] - if !ok { - return &IndexPackage{error: fmt.Errorf("%w %q in:\n\t%s", errCannotFindPackage, path, filepath.Join(mi.modroot, path))} - } +// Package and returns finds the package with the given path (relative to the module root). +// If the package does not exist, Package returns an IndexPackage that will return an +// appropriate error from its methods. +func (m *Module) Package(path string) *IndexPackage { + defer unprotect(protect(), nil) - // TODO(matloob): do we want to lock on the module index? - d := mi.od.decoderAt(offset) - p := decodePackage(d, mi.od) - p.modroot = mi.modroot - return p + i, ok := sort.Find(m.n, func(i int) int { + return strings.Compare(path, m.pkgDir(i)) + }) + if !ok { + return &IndexPackage{error: fmt.Errorf("%w %q in:\n\t%s", errCannotFindPackage, path, filepath.Join(m.modroot, path))} + } + return m.pkg(i) } -func decodePackage(d *decoder, od offsetDecoder) *IndexPackage { - rp := new(IndexPackage) - if errstr := d.string(); errstr != "" { - rp.error = errors.New(errstr) +// pkgAt returns the i'th IndexPackage in m. +func (m *Module) pkg(i int) *IndexPackage { + r := m.d.readAt(m.pkgOff(i)) + p := new(IndexPackage) + if errstr := r.string(); errstr != "" { + p.error = errors.New(errstr) } - rp.dir = d.string() - numSourceFiles := d.uint32() - rp.sourceFiles = make([]*sourceFile, numSourceFiles) - for i := uint32(0); i < numSourceFiles; i++ { - offset := d.uint32() - rp.sourceFiles[i] = &sourceFile{ - od: od.offsetDecoderAt(offset), + p.dir = r.string() + p.sourceFiles = make([]*sourceFile, r.int()) + for i := range p.sourceFiles { + p.sourceFiles[i] = &sourceFile{ + d: m.d, + pos: r.int(), } } - return rp + p.modroot = m.modroot + return p } // sourceFile represents the information of a given source file in the module index. type sourceFile struct { - od offsetDecoder // od interprets all offsets relative to the start of the source file's data - + d *decoder // encoding of this source file + pos int // start of sourceFile encoding in d onceReadImports sync.Once savedImports []rawImport // saved imports so that they're only read once } @@ -853,73 +866,67 @@ const ( ) func (sf *sourceFile) error() string { - return sf.od.stringAt(sourceFileError) + return sf.d.stringAt(sf.pos + sourceFileError) } func (sf *sourceFile) parseError() string { - return sf.od.stringAt(sourceFileParseError) + return sf.d.stringAt(sf.pos + sourceFileParseError) } func (sf *sourceFile) synopsis() string { - return sf.od.stringAt(sourceFileSynopsis) + return sf.d.stringAt(sf.pos + sourceFileSynopsis) } func (sf *sourceFile) name() string { - return sf.od.stringAt(sourceFileName) + return sf.d.stringAt(sf.pos + sourceFileName) } func (sf *sourceFile) pkgName() string { - return sf.od.stringAt(sourceFilePkgName) + return sf.d.stringAt(sf.pos + sourceFilePkgName) } func (sf *sourceFile) ignoreFile() bool { - return sf.od.boolAt(sourceFileIgnoreFile) + return sf.d.boolAt(sf.pos + sourceFileIgnoreFile) } func (sf *sourceFile) binaryOnly() bool { - return sf.od.boolAt(sourceFileBinaryOnly) + return sf.d.boolAt(sf.pos + sourceFileBinaryOnly) } func (sf *sourceFile) cgoDirectives() string { - return sf.od.stringAt(sourceFileCgoDirectives) + return sf.d.stringAt(sf.pos + sourceFileCgoDirectives) } func (sf *sourceFile) goBuildConstraint() string { - return sf.od.stringAt(sourceFileGoBuildConstraint) + return sf.d.stringAt(sf.pos + sourceFileGoBuildConstraint) } func (sf *sourceFile) plusBuildConstraints() []string { - d := sf.od.decoderAt(sourceFileNumPlusBuildConstraints) - n := d.int() + pos := sf.pos + sourceFileNumPlusBuildConstraints + n := sf.d.intAt(pos) + pos += 4 ret := make([]string, n) for i := 0; i < n; i++ { - ret[i] = d.string() + ret[i] = sf.d.stringAt(pos) + pos += 4 } return ret } -func importsOffset(numPlusBuildConstraints int) int { - // 4 bytes per uin32, add one to advance past numPlusBuildConstraints itself - return sourceFileNumPlusBuildConstraints + 4*(numPlusBuildConstraints+1) -} - func (sf *sourceFile) importsOffset() int { - numPlusBuildConstraints := sf.od.intAt(sourceFileNumPlusBuildConstraints) - return importsOffset(numPlusBuildConstraints) -} - -func embedsOffset(importsOffset, numImports int) int { - // 4 bytes per uint32; 1 to advance past numImports itself, and 5 uint32s per import - return importsOffset + 4*(1+(5*numImports)) + pos := sf.pos + sourceFileNumPlusBuildConstraints + n := sf.d.intAt(pos) + // each build constraint is 1 uint32 + return pos + 4 + n*4 } func (sf *sourceFile) embedsOffset() int { - importsOffset := sf.importsOffset() - numImports := sf.od.intAt(importsOffset) - return embedsOffset(importsOffset, numImports) + pos := sf.importsOffset() + n := sf.d.intAt(pos) + // each import is 5 uint32s (string + tokpos) + return pos + 4 + n*(4*5) } func (sf *sourceFile) imports() []rawImport { sf.onceReadImports.Do(func() { importsOffset := sf.importsOffset() - d := sf.od.decoderAt(importsOffset) - numImports := d.int() + r := sf.d.readAt(importsOffset) + numImports := r.int() ret := make([]rawImport, numImports) for i := 0; i < numImports; i++ { - ret[i].path = d.string() - ret[i].position = d.tokpos() + ret[i] = rawImport{r.string(), r.tokpos()} } sf.savedImports = ret }) @@ -928,125 +935,15 @@ func (sf *sourceFile) imports() []rawImport { func (sf *sourceFile) embeds() []embed { embedsOffset := sf.embedsOffset() - d := sf.od.decoderAt(embedsOffset) - numEmbeds := d.int() + r := sf.d.readAt(embedsOffset) + numEmbeds := r.int() ret := make([]embed, numEmbeds) for i := range ret { - pattern := d.string() - pos := d.tokpos() - ret[i] = embed{pattern, pos} + ret[i] = embed{r.string(), r.tokpos()} } return ret } -// A decoder reads from the current position of the file and advances its position as it -// reads. -type decoder struct { - b []byte - st *stringTable -} - -func (d *decoder) uint32() uint32 { - n := binary.LittleEndian.Uint32(d.b[:4]) - d.b = d.b[4:] - return n -} - -func (d *decoder) int() int { - n := d.uint32() - if int64(n) > math.MaxInt { - base.Fatalf("go: attempting to read a uint32 from the index that overflows int") - } - return int(n) -} - -func (d *decoder) tokpos() token.Position { - file := d.string() - offset := d.int() - line := d.int() - column := d.int() - return token.Position{ - Filename: file, - Offset: offset, - Line: line, - Column: column, - } -} - -func (d *decoder) string() string { - return d.st.string(d.int()) -} - -// And offset decoder reads information offset from its position in the file. -// It's either offset from the beginning of the index, or the beginning of a sourceFile's data. -type offsetDecoder struct { - b []byte - st *stringTable -} - -func (od *offsetDecoder) uint32At(offset int) uint32 { - if offset > len(od.b) { - base.Fatalf("go: trying to read from index file at offset higher than file length. This indicates a corrupt offset file in the cache.") - } - return binary.LittleEndian.Uint32(od.b[offset:]) -} - -func (od *offsetDecoder) intAt(offset int) int { - n := od.uint32At(offset) - if int64(n) > math.MaxInt { - base.Fatalf("go: attempting to read a uint32 from the index that overflows int") - } - return int(n) -} - -func (od *offsetDecoder) boolAt(offset int) bool { - switch v := od.uint32At(offset); v { - case 0: - return false - case 1: - return true - default: - base.Fatalf("go: invalid bool value in index file encoding: %v", v) - } - panic("unreachable") -} - -func (od *offsetDecoder) stringAt(offset int) string { - return od.st.string(od.intAt(offset)) -} - -func (od *offsetDecoder) decoderAt(offset int) *decoder { - return &decoder{od.b[offset:], od.st} -} - -func (od *offsetDecoder) offsetDecoderAt(offset uint32) offsetDecoder { - return offsetDecoder{od.b[offset:], od.st} -} - -type stringTable struct { - b []byte -} - -func newStringTable(b []byte) *stringTable { - return &stringTable{b: b} -} - -func (st *stringTable) string(pos int) string { - if pos == 0 { - return "" - } - - bb := st.b[pos:] - i := bytes.IndexByte(bb, 0) - - if i == -1 { - panic("reached end of string table trying to read string") - } - s := asString(bb[:i]) - - return s -} - func asString(b []byte) string { p := (*unsafeheader.Slice)(unsafe.Pointer(&b)).Data @@ -1057,3 +954,82 @@ func asString(b []byte) string { return s } + +// A decoder helps decode the index format. +type decoder struct { + data []byte // data after header + str []byte // string table +} + +// intAt returns the int at the given offset in d.data. +func (d *decoder) intAt(off int) int { + if off < 0 || len(d.data)-off < 4 { + panic(errCorrupt) + } + i := binary.LittleEndian.Uint32(d.data[off : off+4]) + if int32(i)>>31 != 0 { + panic(errCorrupt) + } + return int(i) +} + +// boolAt returns the bool at the given offset in d.data. +func (d *decoder) boolAt(off int) bool { + return d.intAt(off) != 0 +} + +// stringTableAt returns the string pointed at by the int at the given offset in d.data. +func (d *decoder) stringAt(off int) string { + return d.stringTableAt(d.intAt(off)) +} + +// stringTableAt returns the string at the given offset in the string table d.str. +func (d *decoder) stringTableAt(off int) string { + if off < 0 || off >= len(d.str) { + panic(errCorrupt) + } + s := d.str[off:] + v, n := binary.Uvarint(s) + if n <= 0 || v > uint64(len(s[n:])) { + panic(errCorrupt) + } + return asString(s[n : n+int(v)]) +} + +// A reader reads sequential fields from a section of the index format. +type reader struct { + d *decoder + pos int +} + +// readAt returns a reader starting at the given position in d. +func (d *decoder) readAt(pos int) *reader { + return &reader{d, pos} +} + +// int reads the next int. +func (r *reader) int() int { + i := r.d.intAt(r.pos) + r.pos += 4 + return i +} + +// string reads the next string. +func (r *reader) string() string { + return r.d.stringTableAt(r.int()) +} + +// bool reads the next bool. +func (r *reader) bool() bool { + return r.int() != 0 +} + +// tokpos reads the next token.Position. +func (r *reader) tokpos() token.Position { + return token.Position{ + Filename: r.string(), + Offset: r.int(), + Line: r.int(), + Column: r.int(), + } +} diff --git a/src/cmd/go/internal/modindex/write.go b/src/cmd/go/internal/modindex/write.go index 3408248bd9..7db1fb0870 100644 --- a/src/cmd/go/internal/modindex/write.go +++ b/src/cmd/go/internal/modindex/write.go @@ -1,54 +1,46 @@ +// Copyright 2022 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 modindex import ( "cmd/go/internal/base" "encoding/binary" "go/token" - "math" "sort" - "strings" ) -const indexVersion = "go index v0" +const indexVersion = "go index v1" // 11 bytes (plus \n), to align uint32s in index // encodeModuleBytes produces the encoded representation of the module index. // encodeModuleBytes may modify the packages slice. func encodeModuleBytes(packages []*rawPackage) []byte { e := newEncoder() - e.Bytes([]byte(indexVersion)) - e.Bytes([]byte{'\n'}) + e.Bytes([]byte(indexVersion + "\n")) stringTableOffsetPos := e.Pos() // fill this at the end e.Uint32(0) // string table offset - e.Int(len(packages)) sort.Slice(packages, func(i, j int) bool { return packages[i].dir < packages[j].dir }) + e.Int(len(packages)) + packagesPos := e.Pos() for _, p := range packages { e.String(p.dir) - } - packagesOffsetPos := e.Pos() - for range packages { e.Int(0) } for i, p := range packages { - e.IntAt(e.Pos(), packagesOffsetPos+4*i) + e.IntAt(e.Pos(), packagesPos+8*i+4) encodePackage(e, p) } e.IntAt(e.Pos(), stringTableOffsetPos) e.Bytes(e.stringTable) + e.Bytes([]byte{0xFF}) // end of string table marker return e.b } func encodePackageBytes(p *rawPackage) []byte { - e := newEncoder() - e.Bytes([]byte(indexVersion)) - e.Bytes([]byte{'\n'}) - stringTableOffsetPos := e.Pos() // fill this at the end - e.Uint32(0) // string table offset - encodePackage(e, p) - e.IntAt(e.Pos(), stringTableOffsetPos) - e.Bytes(e.stringTable) - return e.b + return encodeModuleBytes([]*rawPackage{p}) } func encodePackage(e *encoder, p *rawPackage) { @@ -126,9 +118,6 @@ func (e *encoder) Bytes(b []byte) { } func (e *encoder) String(s string) { - if strings.IndexByte(s, 0) >= 0 { - base.Fatalf("go: attempting to encode a string containing a null byte") - } if n, ok := e.strings[s]; ok { e.Int(n) return @@ -136,8 +125,8 @@ func (e *encoder) String(s string) { pos := len(e.stringTable) e.strings[s] = pos e.Int(pos) + e.stringTable = binary.AppendUvarint(e.stringTable, uint64(len(s))) e.stringTable = append(e.stringTable, []byte(s)...) - e.stringTable = append(e.stringTable, 0) } func (e *encoder) Bool(b bool) { @@ -152,17 +141,18 @@ func (e *encoder) Uint32(n uint32) { e.b = binary.LittleEndian.AppendUint32(e.b, n) } -// Int encodes n. Note that all ints are written to the index as uint32s. +// Int encodes n. Note that all ints are written to the index as uint32s, +// and to avoid problems on 32-bit systems we require fitting into a 32-bit int. func (e *encoder) Int(n int) { - if n < 0 || int64(n) > math.MaxUint32 { - base.Fatalf("go: attempting to write an int to the index that overflows uint32") + if n < 0 || int(int32(n)) != n { + base.Fatalf("go: attempting to write an int to the index that overflows int32") } e.Uint32(uint32(n)) } func (e *encoder) IntAt(n int, at int) { - if n < 0 || int64(n) > math.MaxUint32 { - base.Fatalf("go: attempting to write an int to the index that overflows uint32") + if n < 0 || int(int32(n)) != n { + base.Fatalf("go: attempting to write an int to the index that overflows int32") } binary.LittleEndian.PutUint32(e.b[at:], uint32(n)) } diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 856390a0f2..b2ac7f22b1 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -216,21 +216,20 @@ func matchPackages(ctx context.Context, m *search.Match, tags map[string]bool, f // is the module's root directory on disk, index is the modindex.Module for the // module, and importPathRoot is the module's path prefix. func walkFromIndex(index *modindex.Module, importPathRoot string, isMatch, treeCanMatch func(string) bool, tags, have map[string]bool, addPkg func(string)) { -loopPackages: - for _, reldir := range index.Packages() { + index.Walk(func(reldir string) { // Avoid .foo, _foo, and testdata subdirectory trees. p := reldir for { elem, rest, found := strings.Cut(p, string(filepath.Separator)) if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" { - continue loopPackages + return } if found && elem == "vendor" { // Ignore this path if it contains the element "vendor" anywhere // except for the last element (packages named vendor are allowed // for historical reasons). Note that found is true when this // isn't the last path element. - continue loopPackages + return } if !found { // Didn't find the separator, so we're considering the last element. @@ -241,12 +240,12 @@ loopPackages: // Don't use GOROOT/src. if reldir == "" && importPathRoot == "" { - continue + return } name := path.Join(importPathRoot, filepath.ToSlash(reldir)) if !treeCanMatch(name) { - continue + return } if !have[name] { @@ -257,7 +256,7 @@ loopPackages: } } } - } + }) } // MatchInModule identifies the packages matching the given pattern within the From b75ad09cae8918343000e304c66c5df27101829b Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 11 Jul 2022 19:10:50 +0200 Subject: [PATCH 39/78] cmd/trace: fix typo in web documentation Change-Id: I950224c3f698fbdf2bcab6f847f4afddaa6e9c2d Reviewed-on: https://go-review.googlesource.com/c/go/+/416974 TryBot-Result: Gopher Robot Run-TryBot: Tobias Klauser Run-TryBot: Alan Donovan Reviewed-by: Ian Lance Taylor Reviewed-by: Alan Donovan --- src/cmd/trace/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/trace/main.go b/src/cmd/trace/main.go index 11804d0b90..0e4d882c97 100644 --- a/src/cmd/trace/main.go +++ b/src/cmd/trace/main.go @@ -247,7 +247,7 @@ p { color: grey85; font-size:85%; } because it made a system call or tried to acquire a mutex. Directly underneath each bar, a smaller bar or more commonly a fine - vertical line indicates an event occuring during its execution. + vertical line indicates an event occurring during its execution. Some of these are related to garbage collection; most indicate that a goroutine yielded its logical processor but then immediately resumed execution on the same logical processor. Clicking on the event displays the stack trace @@ -274,7 +274,7 @@ p { color: grey85; font-size:85%; } function written in C.

- Above the event trace for the first logical processor are + Above the event trace for the first logical processor are traces for various runtime-internal events. The "GC" bar shows when the garbage collector is running, and in which stage. From 846490110ab1117b5f7366e3a531d24d88800074 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 11 Jul 2022 15:20:13 -0400 Subject: [PATCH 40/78] runtime/race: update amd64 syso images to avoid sse4 Rebuild selected amd64 syso images with updated LLVM build rules that avoid the use of SSE4, so as to ensure that the Go race detector continues to work on older x86 cpus. No changes to the syso files for openbsd/amd64 (upstream support has been removed in LLVM) or netbsd/amd64 (work still in progress there). Fixes #53743. Change-Id: I738ae4d1e0528c6e06dd4ddb78e7039a30a51779 Reviewed-on: https://go-review.googlesource.com/c/go/+/416857 Reviewed-by: Cherry Mui Run-TryBot: Than McIntosh --- src/runtime/race/README | 6 +++--- src/runtime/race/race_darwin_amd64.syso | Bin 538536 -> 541464 bytes src/runtime/race/race_freebsd_amd64.syso | Bin 710664 -> 712464 bytes src/runtime/race/race_linux_amd64.syso | Bin 552768 -> 557744 bytes 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/runtime/race/README b/src/runtime/race/README index eb18ad600b..ad8f55fb73 100644 --- a/src/runtime/race/README +++ b/src/runtime/race/README @@ -4,9 +4,9 @@ the LLVM project (https://github.com/llvm/llvm-project/tree/main/compiler-rt). To update the .syso files use golang.org/x/build/cmd/racebuild. -race_darwin_amd64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8. -race_freebsd_amd64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8. -race_linux_amd64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8. +race_darwin_amd64.syso built with LLVM 127e59048cd3d8dbb80c14b3036918c114089529 and Go 59ab6f351a370a27458755dc69f4a837e55a05a6. +race_freebsd_amd64.syso built with LLVM 127e59048cd3d8dbb80c14b3036918c114089529 and Go 59ab6f351a370a27458755dc69f4a837e55a05a6. +race_linux_amd64.syso built with LLVM 127e59048cd3d8dbb80c14b3036918c114089529 and Go 59ab6f351a370a27458755dc69f4a837e55a05a6. race_linux_ppc64le.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8. race_netbsd_amd64.syso built with LLVM 41cb504b7c4b18ac15830107431a0c1eec73a6b2 and Go 851ecea4cc99ab276109493477b2c7e30c253ea8. race_windows_amd64.syso built with LLVM 89f7ccea6f6488c443655880229c54db1f180153 and Go f62d3202bf9dbb3a00ad2a2c63ff4fa4188c5d3b. diff --git a/src/runtime/race/race_darwin_amd64.syso b/src/runtime/race/race_darwin_amd64.syso index dde17add91495ad4459c341c1558a3095911be9a..e5d848c883c2bfd36689489939bef4fd42ef4b46 100644 GIT binary patch delta 109938 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%0Dy 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 HZyNm{ZPspH delta 107674 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

IjSkv60?qLY7%vxY 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

w3P}75~)`(47H~{Z-ZTfg$FD)V|=$ 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

aqo0zNI`>3F|#?lJF@ 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 diff --git a/src/runtime/race/race_linux_amd64.syso b/src/runtime/race/race_linux_amd64.syso index a23064efac5c3e74232e4ed270d10f77abfc2c83..6885610f2566a51c74aece0edb1e9bad04be6301 100644 GIT binary patch literal 557744 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 fh_rSWiGr6Aw_{Sa=f?bD+zR$r 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 WvGsS;2fq5l4eaSMS3g~>{{H~Sh($>N literal 552768 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%0Ap(oD@>w$}FM; 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�O=LwQP9c|S$kt+WnmO5pJQ1C`l>)?GRZ zF^@cTO1ZZ+jXDr#&Hm_I0z%Feg6^`j2egIO} z%>iZ@$Hs;tf?9j^N$u^rKaLCcGaOXLFuEmiTa6nB36$BbWR%v^|?6% zi@vWuSm8|JB`Ed-sx#5(^*8uRM4R;Br6SlB6@x-Q)RudrEY4U>qu38kVcoqcaV=g! z!$6kJlACT($5DaacPieCoo+q`x;Ndd_OYF?CvJYOz(c+CO}ImM82Ir==5qRBJ34!1 zKN_#+TQu*4QKhr9wN;Oc9MV*zz8@RxhLi)cv87}`#!cQn_tz`E3Ad{&DShv6j!mZzFlOH_;iM`)-L(22-p7o19rk&EP% z<|<*>IADt>Ba z`0=SC9;NRJ5#gW-B(dxtGSS<^%0IwQJ+b`H;;EJIl2}Z~c%27aKIi2 zb^ob8x=iKb)V#`7?`Uaxk~CdInbf4F(JPRW8;N^e{R^jDj30$d+FJ6HXU1`f(x+Pb z(3nYn337cG*Ag+wFgWM5^_7=S$@FZ1L@O-tmI2t_(q$U8i#ylPSi-298Gg8JU=gNI z^gJ;6iBN{D6oSUS;?}%;1SXA-yGK|(T;NebEDvQY8=xZI;a8cd%x<+hN-LD=Z&4AD z1gj(pxEO*ic&Ru@^-v4`BvR7|?moCK_VZn4H0utc!ee10QTjValrZaDuKJjCVum_x z12&l;2d1dkDrhiPNoI=bCgbf;6U6CL^(`Ud6#8pb-3~Q`8-U{{vi(i@1Fe(W=!Br0 z`ER&3dAseNv556I_RStTFgX8!0)fjN_4-dsJjm&_dO9Pkk^NY4FGA-Dgtx}^yVdPa zM;r*s<@Q<}k2i5j6V9oD=6$vXAk%Ne0OIZefUxj000AxoP~ChB#{jG=Gd|ir_IhX6 zU<81OHC=)@w}KM)5O(>T2rMAX4Yk6n^k_ZvgXL7TDT57{q}%P@M>54+Cj+H6;AF8**xVs@QB zi{%;SFm+}v;9m}j1RQE`^vaV4*Io~!lUbuT{N0~X zJP>3b469O}&+IbgfN*M zGd-Jvm3?#&6qU>^Q~p-hLSAKLP0bO}dtC>^&eAV#h(&Ao#7gVOYHM__!RZ7hDT$ExbtXU`N#yGxV4c4oZLa2?exi*&2#s$6&+)B^8wbsVl7q8k~|EIaSz0?hp{R5vE6xw0;!CB#; zIjN=kBHuXg6^W~)P}de)X{a6~At?T%WDVCEs$1Bqwb^O6D7@0Ad7gkzBA)*@K&vDf zpnXR%J^T30UA~W*%YSQntE$gc|H{M$D*u=oDE%(imkDkhz3wnhuQ8JvN& z)!f6#?K|5s1Ni!Cf5uz6dJaMg^I6}dFg!kJ(876@DV>g7#FXM|!#E}9@5)rJKaJ`l z6w@_MlmOW-cT}i-TqG{)>V#vh6Dox*g#tQ~q>Xo;Ix_EXP;j|nf+J1Y$-|y1oj?&^ zg|@06(oe-Py(3<_XMtC8;r*}@QH4%qUOfFo429}ZJTS;6$VW7>`u9RQH@fQWL>x+V zV#h*)-As1q8j;(VyQuuIc|g%nw*L0Yrngqx?N8&I7G2sp^ErD6gK&Uz1-!8BbUShV zIa0pRas7=ixevK>Grpfli2v+K65lDx3!D|LozU(_UO!Atf?i(GPHO0&xRy02Unky5 z&g1XHd0dX;Z*=36jsw5(x5{rkw-&$gdF8&f9PE9!v_)2@b}NoHB>6ju&kOzJX6)!t#%#ZOK&9+~_W<_#HI|qLJ85Us5heXYmhe5NX7`%3;6cD-R)SzvT;j^#OKEa+_DqYa3#QEiC^+ zvk4VQ+3ByORhwE;12z>32o_=adX;mJB7=YjPd56I3RD$M$*+%RB&+|-qxe2m{bB7r z*+yac;>+J=+vZzge;D)Tt)tfdST{|A5Z0n?Qla>B%@a4lRi$MNF{u9VV#$x z_xw5kn55U&sq7h~Y;?jE?hkVj&q|a62U*%4lzz?PWGhR#pFW!vH=vbAc0$~W7m*^x zOPj%0jsbosliH9iJ(>S}Q=Iio?T#pBjVrvn$71fb6i;Pl%l9ZlN-!dC2C68omS=2Szp0&&75u%rn**U_6PdPT5!VC0{{3)64C$mwn+2Omp zw#`R_n|dr6KEj~yj<`tFu4{vpQoQZYu{k|bH;%p!*hU*y+jY}l?i2JInOiS=YcD1Z zxxpP3AB*hK_A`toiS8~#>^K?^rl@kt6V`xV_%?Qm_b+~xLAc9?Iq-VdZ^OEoe~@%& zY+vh7`nH~5pZ{@*WrsKK6;AALFVAl$2=+q*_@@rY#Sz}Q4Z=6k2#(b0x%2>HZc#lk z%5B%RF%ab~Wk{L=*q@c|QO)=98wRWVO6C6$%J@m#DZC z9joc*6fZb*Ne62;m)8}M%`T|$O9u%e+44KY)48~@KekVc&Gr*vI>Mef__mL(D8;FC z2IW->-D;WSze_6?csGs<`wv?P+}jZpBWs?}>E&gea`((cOAsmUZRuDdSHGOzqE$_Y z<@ufLKXCJKE~Ib`AKo4oUTF)8pQJwpxDU&J&rVFV!J}wCSa`b&S-rZY#oIJ6Iyaiy z2ut##4o3$!Gh+SO>oq*n-`0Ah*r0oGBSmW9z<$C0I{ht}tHG-WmJ+<;`(D0Rfu)Xa zh>2)0^f3|5UP4q|*uTqt6vuPJ*r0w_$z7*TrroPxu|IWq>Ea=NcU3Juo6e0mu3;kf zX6_PKULmZj9d>39YJR|7sZOu6Cw-!0+v9WlQeG#q+R^>W4P6T1X)JH!$c=!-`zJ#= z1t^X4AL@5==ud}uKCo+Z+_sCk4~ecbUd3(0KWD8%ZhK5T#jb&_0rpGvgv9S^4?h-Y zofRB~2p2{|LLcbZMTSb5J+5~&ImFNVy#YaH zAHK2m(@nu+`osFUsaz4s6-gWsO*yHh)fs!I;OA9)8TLqu>3R*3P6wZinyd7WebVR0 zcS`!~CzsHF?VOJqwkVPA#b+wUDetDBi^|h;PZ*qV zkL=?SUwp`hR5OdJT_<>pHN(@2#@^bMi4L}6B&Rh!^wS#8Xuo=9QdyFOOs9|hq_H!@ zo@bUWLaH_p!CgGx$BK79otb!~TTgCR=V}PxB3fiPCr16Xp|FQDR>^5eT;8@ZcO#V$ z5IPNvWHn+@l2#>#k7_yPQ;tgolL2SQZ9>Yrd#Z;((c=B5meeIPr9gRxO@qqzx$D*k zH7k3sI-Gsn_^WFn3_G<$)RKktl|a8$u)H6Eqad%+spM_D8S$+&T`lny(3(Z)9E77t zwHy@=_M6joI(&}XXWFSg>Ql&GLK!A){`6Q*>+X1asV>cMWPCthk(1>QwLC>O#-Q5@ zgpqyJbLLD(pXu}71pz(Mr}2Gq7=vmY;M9+UY( z;Qv3@CN@kp<4WdDJ4x{!4vsYgYJ+VUYgOa*vcBqNE^cqh-&NnOO;xmCEIQe4LBY~HO^Re`PpJ$t z+!=x~kyVFte-Z*0|3%M5UV82bR(_8ksB_c7zpf8^?hL*;lx|y}zdCM)FgY4p&9Jea zx4x;b(k}bTb^Csn^)|@a{%9kpFJ$vQ!eW&r7FzVM=a$v(5`6%bTY|5m`mhFQ7)g^Y zgZO6`@V$DpZ7HKqwcFY9$F5Yr9N)$N5N#nTjN&Z*U;F-y;yzlu%S`mp8sR!ODz~_c zHd`2x2Pr4Y(Qa!ObFA^F zTn8=Ji{pY>^Uc|wv$}eN6_P77fbK#{C-*?M@)>o5ibyZ$u3cYZgme>-Ie?4H;?gP- zV_k)1b(#}db}F;@({^N7Cd(ifuW0{}yCY~I(8VH?q`o+&s-8Z?;268rpQCObD`&AD zYV%r}>6PlX=N3rc9nvy%KM?;wEUk;`^;*Yb*2uv;6ODfz~uT!CV-0P4pngj_qkTe78la&JO`7^jojH1;OJ+cM1@%n(`jI48+Se-UNzQjJ@8%>rNC zvT+w1WEk+~Vq;@_8ARmMNk!;5EpvHLBxks*FI(xbQf}jQNY-EaBP?()NI4&zP!^b@ z4q2O89Q^hsxP$y(xOx$F_FOV&&HB(<{%gM@=>D3uF;Y+ukT~zaTK;m^WsJeyz9zD0 zQt7=%tZVm8+3xMZWqCVP*M-Al7H8<<`lUYbXY*+1G`l7Q`W1x~#>rlp3N`w*0-WEA8_#r9ToX&QPbbG8D`V zKQ=YXkA)75?1s}8WUe{syHZ@LhWn`sc}^)X|%DaCE5u`8<0A;kv~DA6M{^1%4a(4E^8*7y-cz zZ~6KV=p_zYt(&Po8&b<`*@w~YCMK7-zJXRr8F{^WG z6A?!nf*p6FcoO_iG_r4mQRLKz#p8&x1V;q}%k6^*A!T8~ zp3^rHx5E?7s~maz;886(X!DzwKYu$`+?VcSbun}vyD5E*o+Jc?=V%)z&W@UVVIp}A z^v99oga(85%U_<|L-+%QiS;J{GLM(Fq;PHVeSC|ep}CoG`n!DW$?~@~m%qWvBim4M z#WQnUOZsHVU5I6NxEs zY~xCIze|AH-ZjbN(HXC_HHM5Iv(ZHwv)1z@B6d2Wx^FLBXhU=#ws`J)W)D?79aWp z6At(^5${U9{=sNT1~B>?E%o_t)|t(0wA7w*Z)szp|2j&R5chDjbYT6p44L#dT9Vm; z`zD>f{(}8VoqXkEhWqGsAF^+N87o>L>HP|0gVwv!2cvK;U9p_ulTAt=Bv0o1=7mI_lhDJ)4s~Bzl%opdYB=h>CraB5% ze3>63rFKBcIl+Ga`YgVxL6^8qK}<_}6h`E0L*rG!VCae#3p8*1Xyr~S1L%Ln*Hi}yPmEB{h!X?R{z!w%K!#wlU> zMimIlzZC4OPB!|!dt`$Oqi^dCCx>QQ-3VoKEn}u}KFFKCrp-oifVy4Xtg=qhWUJ=* zajEDs2*I2}cll#FmP5oYo#H6k#B_16aG7vDH9|lTt3lv&eq?JDFzd*YSMOu;#-L&BlJItD4r{!}C5=|WYdXhrnuWJ5N?%MuWySJ#M*05K-hLTDH)@;{lT$hdt zx)Im}-Px`sG3y(2f2+&LW%u{GuApYn{o}5m*{5SXgYFxQm&=qdMP~a+BJncBuyXE> zG>1vg{qk|Wm&NOTAv5tf8)K$?TqgQtd-Nv@TUzYu1X23BpTmJnmp4|E!NKH)DM$}A zored`@DCl2qn?x_{DrXl(NKnCm-E_n-TF6~o_m&FX3}-}H)eXa2VeR>d}-RNBWloA z#D`zbq&Bio{T7v0cAa7{`>mQOpDMvSh^mpf+pK0$UgmGM!UpDqP#YLTfoWu8KBsaZ z*VZqh(|&pBTQf(W+qUfDf%3bMdKgTyDTmIP=v);3V?jZgN2D|kR!`|LlUd6?u-p#h z1aj8TV^b=4+z>yfNx}GGUQ?V74cG}y5Ju#_*l3X-6wSWSfdljESFy;cLn3Apl5iM^ z-X#bOMCZ0u-$v)+BOByYmXjvIplE;8t-hKml*5*YkkS&`dw5EI<b8TEVs*w$Uo1p~!}H2EsJaDMaCovYP}Huxz05VLLfAscD1Sb{W$ z=57tHc;*ZW0^1m?$eec2doC#t4L<0|nIMxjA-NVk|sS$mpUNhvfsiyn+58 zO{+8OXzXVRd5y%B)rUE6#6NQvWfo_~1n$FOv_Tu_IhonO_14(k*Mtl}5pe}NK*q0m z!}8fc>_3x}R_wm#`1ipJvMu?E@c-#kZGBx1l-Sk6w5g7>-{m69Xw8p5D9y7)9;u&L z+n`jhWTuV8r+~Zlzs^P0+H-6Wi5s!|Khw`{V4hrcIdq)r(pjKdlIYD)!_B;oNDXLZ z_occ!Q_bF@2CnMgu!(B-oou;t?As20ZvD<}UcXoVU#{O&+p{~bpU30cxW-mA+;79t z6LbWCQ>Z4s$x`S5+a{jmZqJiMzvjL&E0#8wQDivb0@cGjRj-E^7zhd|UYMg)~v)_P1SI1J=eTxlT zPVa34c;657Y+kyMEJ2!a;f*W@I^LKvqWf-Gngst}lh;ae%Vv%t9Zj$P8(ZFw&jbbR zw}i4l;*LgY+b8f3Rb>+y-!JTFKFWZ)7v+Ji$VX6g$_UHc5R^V7;1Ny1SZ7VHLu^va zKO48?7|{B8lsuW2aS%IR!&oyjX{;J@p$X! zs~6%Lco7U#7z|f(Nr=ACLEx{yIPhkd9B*a)Tb7;Zp`HbFf^o7S3mIHDA&|}Z6 zqe(fxO_)=A1j{%%TRyR4fCNwnfXfS={v{zVAn{&14h?~`j#HkU+$X~F7u&pv^1hxP zM&v<6tV4%JrfuXQ{%&YS+;=SKdq;%}kSp zbc}gOF_fqxn@yR~YB~mwtXN2#$@nB5a)Y0q^7mZmSx6)n0;FQ*S2r7K7HN`3qr1jR zoYx77TC-iU-FK`>nSNByWK|nbq?gNjZ(bkNziP+oOso2^k?>? zHTxK^wlZl+VRVWVDB|0lVfzY%gu&JQ`-;Ok|%i&+wR* zmO*?aFVdsJ?5-eK@n80~MpmF3m_|`+qW}OkLq;$c?ijw_D9VdLX`yO(mjpFeJK{x9 zaZ8-rHXBsBiE%Qb(qk}NFz=blCnpc2UP3w&6qN*zTkFj=dJ$Z`zwD*LXk%gXrMS2h zh9`xSM~a(*=$-T>iOPLC>N{x?jDpeW=eoz(I_9`#GOKtb z!(j0tx7ZM@KWoG`$@f7CHPUGnt)&lF4uo4;7ZjK4T{Jp??#W&2{Q628ICh}$Z`b?j zAI{NUdVoAC_(rv5qq*C&J@@BtwrbO$m%FPMM9YDV?ZZB?Mz;hj|HK5c-FL9c@e(#) zDQOR*b)nKfvn08H%964f@3qMrsu!^;8MNNgQz`*&Xc`CafT-tz5#cyDKQZtCfO<9qqx2gY<29>qHO|H#ZDGY(mk#zj znWMF^7B+ru{xKCPY<>l8-UiJ)Ox=-9J&LF&w|7`Zi@8rG^{kES0u9iQ>wiV*<8ifz z@0s5wf$&=KhBK~dqZJbk4@nt3oEaW#4Z4e6gFMdm+!w6;iY8d;=P3BFHskO^t)_w& zn$HR=S6M+g@%M^Z?2YkW+T31Y{H&lj6{tYur&pJPBa9xu$CXO-l!?|2bib%RR{Vh? znc+XT;_LYKu#86SV{O<41;t+ppxs)Y@X2EGvp^|tVi ztqS1b=soc368yxP06)A+^2Ax#78V|P1;q-~naT#guxDEhezm&j3g<_5#;WH{9#wE%RY>VTTOfICK#d$F_>KI=vrmf9Hn@WPM#n}JO?WMKxQhU@C7Z^ zF9}{yClc5BBchoi4LHAl|F)SUOt1^T7cdiNOB0j|HWqhs^qN!N05KusQv;EQFkFDS zQ-HZ&z;q_Lk}h@Dju0o9)wB6F8v~K;EiLW9c#{uT910qpl7LD z6c|`?vyY-J)nCw#G2Or4-Ew+(am2=rxx?C>v@~}b7$Fi6RpTa_`F1Y)tHpuih~tYS zmtAiYtb5&_!+PfQt*!-526D&uocU}M-=n)wvPEzId=i$-e*^C@#PNAL1hx~Sif}S4 z#t@Q>J|z2<6F_AYKI`z9aOgU$xOMOa&1Hi zQd09ANNy|*(u|l%p1Em_>0y$x zHMdXfu(o$1ddPbvldYQ?+o;DnJ)a`{4sF%B>QS(Uz6s3}Y9~|+b&e42*J`!z<{t}4 zlMK6@a*LW$3pUcI=}+=^_ritqIfURiTN1a?^5Ck}6<8WxdZIPh(5eEBm9La`x%7B` z(ctwW2QB$|zE9HXvT$7D_bwOOSYLOCwsniagirJ(S6aBTMc1gC@bf#iKy@7u{@KS% zGp8Om-kOKW%%K};(HC4%n~znj9;>6l^*TFo7ffH?52vBmgV)s13mIPBR*N6jwgz+18khiw zf)q)7w-N?c`z9}$36})X*23dXtx|Y-LjEb8WE>Qvesq4t^$wHpJJ|&KCjl;#V0m#4 zvm{&mkW!nm@B@H@cuGlX!8&);DnJj!CW9q1g0jKu zn?hsR4|+I&Sj&tX?4XupVs4)~tW4hkD(tYX?o(GykiR*hKLHiorlPykJh_QJG&)!A zrW|cZU`FS*35l`tadMUh{r@7CCtLZM(NS)o4nw8?hpFH=*yhGw7mLM_z2blk{=IVG zAsUO2l^vtDmQBknCkO+*uJ{gpn{7a*a?xHg5a{+QtkF3gvI@vVe~GH~OP%gtu{h40 z%Hkh0pNr0M z6tPq&mUbm1+$A&wiI7B{CM2A|DnQqgm|}e=ORIYOr{ID#F$+xz+r9gc}t?J+bdw)0L}gV!Fj&gqjakQs&& zJ{56IR27S?P-*&2-E&{=&9dK#xcAhKlH*5O-{B5Y+jrhYA~(tJL*KriRIM9ZIu}B1 zrw(fpWA#O!`|rL(_#YP^(}~gRN1_Le^c8Q<6dvQ6r~#v|A_(JVAZPvC(BrJd9*+`D zH~>fi-F?sL@wsJ6IXitxU=3%DiR)w2gR3#a&V7Q+;$wf~+qtaYB2|aPl}E1H+Qs|X z*`CLPg8cVqADX|Pr+r<12Q7#KI$pRC<2Ro-O9=1f;s~TjBGwCt88`$47Z`MrzbvPlN`bbl$nKzF; zP}`4%huiY0bzHGtU{5z5B(}y0`!3EL@l7+I)8REMB&d#+U}fIMW=Ac#xq%2e_@&F2 zv`SQ%zM*!UO1+aBC|^SM-+st0gtvT2N2X`T(*3g03ufk$nRtmis|F(8EEl5>{r-Da zFH>IHrY8HM7p!yWo{8))1Xw1I^g{|tKcK%%`S02WDkmQVH+ScG`&X|JAXv&nGClVO zD`dnH{EC3(STK^k99b~DD|mGS-5?H}`=-K{8M7xZgRvQXldg+SgGfSV6fYN3tIyq2 z+qtI@SposgD^v`M~0Q$(eDbdC07G1&`2njDSuQL028>8+{?Hb6+WsJSH9*Q?M zcoF(9s7CJnVP#c|E`vRHE&Cvr6LxHt1P6i7)MV9ly6FKxkAH6XWB14OmOSxR7~k2Y zhh%$Rbb{i6@?vo+$e;*}6rY1?GZXz?hid|`jC~vX2#Xh+h_&b2$3=7`m0UX9

Rq1f+J3!oVVC&~c=5a>0t(;pM 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∾`Pdp&F>$>;@t?ny`{4n!dN-6hV5wmL!E6Ggf9cNDKw= znsT!8_)e$(fw%fMD@SY=c1M&F%;49gHc=c7d-aZ!eyWd zSKeo9eyH%kYx2p_qDjiyzH*qpg8ev=UjwU#{5-d{_r*% zAF0-jsgausE&#s|?|hhTqbN_o@%O^@^Rdx#SK9fX&*7aneTOg(wxe>^LD+0R8(-aY zN+BVYTlO5%^DIX9bWeUxCiO?|HQCH0Yt~X9#Q@{Ped2J--`J?g#t6%9QHwwLML{t52ldQZ$#E`-fWAZyH5nAQEkQ4lT_wpg#s@CU=Qag^vDi!E7UM2K>8Z?*N$sv_F~8cq#W#( z3BL3J`kq%g>LfS>SFe=MXZh5=wv{FTbNf7McY=mh-t*jYR@hw)zr{`}coiUO?lFU2ORhz1wdNe`tQ>P!3~PC+D(PgBP~8N!HTyAeD5!I^wW-H+ z-%m34L$iUr8s5%Y-r-wT44*+wTPImOSFSR({KHb|w7HSC$v@I9fd=HjuHM_Mcl#ZK zBkZ|n*>CN{X-L4s{XdRA!lh$BSH(rT4Ue9Xn{Wmer0ynnMj|3@5{DPa!)D|p^Ilq; zGEGwmQU=}VnQB-9BEt_#7ELx z;l;gk$GA2s#~dCr3`oM>ml!hq1+Hqn!l0I!JE+nde0>yBX7%j9G00W@7`I0ze?8R> z)|s1J7;8+*Od?V@TsqBl9j((HM1I6IzYfKS>cq)omaQi;g6aI2tskz6kM+mHURMHZ zf3cH_c3qT;W}tFaS4&H03wz0N)G>{<%~mtZ18$hR1;w}8Z4uxq5#_Kbdp%%mU42y# zFPphh-L?P{i_`jD(JGkp*lGdQAO0Xg>HqRP>+JcwPXmYi0D-s<^gtR^E6PyDbFAH3 z?J);Le#~z*HUP32Z($WKy2%0ym5ns&4r!Xsn*s9|IC63yz@~Q6pa}dhk}_+{>{QK^ zTJgURi%n0=j`tD3cbEoXC8M>c{Vl%E#kVu51UVtZr50w5V8S2jMWB?>FFF}6pw8SV zRg7sGonBP&X63-IXF)CUEIb0xAIVJH5l;I}K1&SQ+}wfG{pskAfytv!W`mz!)HNgj z2a6(mtfndL;zT_8j7W6 zy1?!ZUTX|^jkXT4j<$1GP!cx9nO%aCj3q7F?(=Fsb+5&Nn3SDt>Q68&ztPmOX4OGb z;x| zFKdrgDSd$(h~M)wpR0qeX`y2MEX-8hec-Z_yCzvX!PR`LmI3z6=UBz+7QQ(?AN`!; z<7|Bs8swn(S2_-_t0ADVyCp*0rzBHVs)gLpMnC~J9XOD)?-o*6`_SHb(aK_9y z2(cAwO*<_V?bo>$%b-K5bV&HxaI%G>HFC2=@3cP^iguBHs9nQjYq$C3JVUnPXe;?_vFon*9a~Km&AkPJmJPhS?E#!zSINMx)FhY*Nm*3_H z7ueOV<9^*hEt}xoF zb6)Ekt8Q}#V^PUsnMX`r(p*O=v43by&N+YBswYn@Vg@)VS`EtLEdOW|Op z=}Rl0Kn7mJ)tpU zX1}flZDeK%bpAsjoc_=*ZbxWn_s6M%XE_+U_5VMt7IWmkshJBjty2p~c?tM0}Rq!22#*9j47!Ffr*<}|;(Hl@#WwO`lLsW3?KEZA%_pR;WB){gyD z7!n*r*uE<3ovTDR7P>N(!{7gu&Y$a~w^LJ(aHn=xnev4%=>`Ij2oiv3L>0Jd`5jkr z^Ck`vhpi8?DLTB4Qhq(sH?Wi~PD61k-;%4G6(~mgI{^>HVGfu?;@)b5({l&-c!A>u zcdwVP*CyJvzl^b&3HxgD0Ei`uP0gxb;8%S=JKmodFV*$_IVvMGoN!>Adpo3N^i!;U zh;1bPsqt`_W>4W4{lM)mq4rwhb0E%#@CJqq|4MWR<6nI~grF$9Wwk52$C-8hbte)N z^J%-`2Oxch&(HLxwIqK6Fr}fw#%?`$E6vvPxio( z$NKzv<*yC7o;KyvvR0fq6k&+*K<63Zey)nyMu!-6rZPT1=ap~p zt?kIYC-~I{_!r_!gek|SVJ$?Kv*BuI^k}U~&v#X>X=A#C!ZHYfOJl=M-sCgXS!jWn z%YnW4WSd;d?ilk)3-N)>R+hA)B$-#9x{W@u;pYWS_y`6j%OF#8@K}X69 zEW(K)hoI4$>fT0$25E--num97V0c*qL&B?wk*)222fVt4r>#o*nh)AgYOYq_;b)Q( zaYvOE4`)k!>E)X*0E_-zW>l44ybizg0+xiOhZ9olhy~f8Z!@ecj6jamkuG(*?lQ9B zla|L}2brek5bb<0<=Dyq|Kt2Z{hc$Iu9 ztBeMkJE#wN-M_r%Nxn%gXT@wBvCxe*m1a&?Rih_0AN^6{^gY%#I(H+Ivg6#SE7ymd zZti>Z`{+kH>k1DXmp@`nFYWs>^Ls5uQy9%rL@eb)3id0^qNIAVWUhl0PRb|BpmTB& zk~cVK&t?Ipl+^qetEfuYOV^hp^@A6j*OHrFqx(PdMZ`3fuel&~1s{`k%moK}|AyVm@SUpAsT z(<+`TUTnPVGv)V6xyBaqyzeeJ-mq*5J^G?|kZnt;J?he44ww8p#hxZ)x%(q&Y1ApW z`?NccmoD4+EY2O_&tbx=)b4`~a-{b)t%Tv%jmj#LAkuD_p0{!5-lyvOGtNl#u7-2( zXbSlG>F7HwQQkFIeXBj{tz)Us#SppizUXvj=AZXo#hyQM<|dmrdA3^j=fCU$xPZ+% z_9hY!96)Y?Df?TLvgI$du-f^19mLkH(XYfV*TEkLQPqZz-aB@s_s0>%W+QN(9UF2G zDZnzQ^h9itOb(Krn`(`@1GNQ%6-LK4R7=bVea-*J?aLmN32@>Vyk<1QYu2#_Ci}0o z0akx{{jmCRVnT{1f|#|l)o%$HcYS9w)F_VIwizFP#Wl<7Zdz{W#jXx&L!h8f zw$7T4r$7_oYkdAlw&C3(S6U*GvvAuZOWv0ae)@=6Q@g!sp5VECv9+k%Z7@fQZ*iXf zehBz*DPg4@zD?(c=^L?26@|mV5K3{`?ViY4JaIC9q@&x21DQVgvRh|v8i;Py@~)Wy zeIQ$i#2eG4NVD+>VY^TbS>!*+h1$GnabI)+Ii4wR32=y#d*R!H{dzfq3_Lnqf^O7j zoWc$W<^K6TQz(p9{{1w{TRT&N{T7@SM*Z`-o96K8$hV&lbCDPR`p^cZjOV;uuuy>t z!su;bbjHH5Ta(n+=*6X{v3lFFZz+enmo9)d@sbEIg1(7dCS#;IGF2 z#{O=7JoH>wBb9gSDZcxeHSO#oAC)JJIz|WE_^m&dxK68#pK|f5Z1%!55*{*k&$UPQ zvNgf8nDnMcS`QTRm?YNm4bAeVnjrAa!gmhV1Z$%KB!?_5kpw=ciA;LEk2m@^!!;+5 z`j`<>FONE0)S@9cpbVWGd3XddO6FpxJ!1Q5-EwT##{|R1?99i)q~FuYnCS zD2(kVxC|cM;zRpZE=;XHif-atslj92K=(^0R;IiYE58XuI<M&28)iQ@Nqd^(NVw z=KCc4jW zV4x>6>gqe)yps54CE|&XRg6D#T&9K8BAuL*@+f{!^hJ<&4hHpedNpmsc;N*E2!Xd9 z0h~q0`qn7OJl;cy$Y@S`xu3&fL8n5d6K3R%VRTZj=%Vpz04+ZqD&+3iD%SA2*UA4x z*=TWYr|7rikR%sTx8+NTlK-se^1jx$_K&uxO@8O@;Fo zs^&f#mfzze#^2WB18}e*=QxS4sYmKf8l8GAK53xxdGtJ0)AMY2O+C++V8sq5XL=qy zrh*l+*)ctj)PMsLOgHLzzR6>uoE#QR&+}6ryqbOJ5l+p++?$2lbra|?dXK=PFi_Pe zK)-~prdhZ1DjUtC6dIq?ZIka--?I~H!wSYbZI?Qp+S{FVJT?BcM$d(Vvj#6c6EZk# zESbzSC66us7qEqh6oDA~T)~27PtHx6-I+gt^UZ|`686pR%stJECoBa{EZ>hw{yDZj zkL2D!`Pp5)gFD`lZ%+>%M`!(dQ~6wK?E3@J%kU$Fo!>!R+Xr79d|`5~m0l)ihypjz z^HBaTec0spmu|j6on%KCFCVC)lf zmXbD5`RuaM8bhb#F7%shFWY3lq0FmovXdZqN=PQ&7NhgM+*T-`4?Vpw2Hqmn$R~EP z$2zKyzWN@s+GZxLh(8Skr`Z9^RG_=v9*KS2taBaD9<=j@#ITL=GX4D+!zp*P6dns3 z93O+?9a@Z7O`&K>uNk(lrWt5rd}^WjzCtS!;%_zH$5WhGo0dD@ZviKfe>Y`)+S*x4 zSUbZ=Ac2-R;t8o>mBo_$kEjHa_~|jGnOd*Lg@g%QgiiQACsq$(ZNwMXnVZtZJPN%w z(wSm-?r#kpW*hVKWu^^#&nY(&&+}<-c_uIplP~uvaEIra<#=q1`}=}`8I5wMa?Fnk z)GAtt4GZ~ZW3`&rhIrP}%^FJdn>b3YcL?hR0`B4!J?c@Te&wlJL;^=vtV#PX=I@{f-n9p361!uFSL{`Z6ykH=G(H6i+k(ZbfQls%OCly_r2Ce!wb)q#yi`CjRd~ zZ4=RQ!{ps;Is3cmb_ChOH8vR8xX<0_2jG_WI(s4O&#eTu%0_ivDR=xh!e8}&BRIlEmv|ED+;uZQUK85p6xg?%qEeN|E}La`8Q` zZe(<%YA3M4->2-pFAj6f5*3JrjEP%V2Hm+t`ns5#gGBvC*I>U}3ndxHk%Y83XrR`E z%7QrD^u}fzKjy&%-i*#UOXKBuS*UYqdNk+EY|pbnaTO0y;bgrK7C=&)tuw=(dtJD6 z`+Aol75HX8#9p=B{jkwi-Q-3so6=*#lgtN31k+qTCS8H)1ZdWfRUzUBuxX8>a^M8 zDn~iayidSjob@a;jf;&g8ai-mKjaTG5IvF^-a0kC{1H)s;|FKYf`eP1EcKF5DXzbX z$)6BheIy}qScC@zRNU#^?uAgWS{j2v8`SMOx9siwd&QvM> zJV~4emc}7g)jSn9__L-4@z^$14SePO29au+b-d;xikY4`eXT5^IrDoh7YDL6qZ^_8 zIkq7u8@_I;T9k5c_>p}KOC<$+QUYxBVMn)xsr$nSW5U8KAN1+uwD!e+S1l4{Ed3?9 zo&z$};2u)IM;A$$`B~jz--4f#*klNA)tQ^NInQ!_m4?EgZ|!x*s)e47oJ>T6nF@eg zH?-R$C89nD!-*%uw{EflaSd2L+R~~HHK@65g$JkB##B1X2ugoj^)gm3rvJ>$9TcO5 zj^ENMf9PM@_$oB5D%MOA)Nj|qC+V@*9@X{3c8One1?}h(@6Wc;f*$CvNkB(0);$5{ zTL!POwA{pV@jS-p+)gQzXmNDzbX5+cxscdPMM%AP0QtpydsDtJY#>FMhl7?Av1Z? zf^hOilh$yhs2txKR=(QNa)l06;-9_{2L0T@rXnx0s~Fa;*`D78DIASN~hti#NHBh#JlnVy}gn5-IUspt| zOy%T#xo{Wv1(mS(h(^m3!os7i(Qq{4hA~{F(=Y#8on|XjuAWyp^21?e%2QEKWbKgl zB~MDfM|%g{G~?$Z1%X-(Y(#Zfe(5Tm6^JP72hcivY1=3%APBh~AP;qb zT)>-L$sL!~&)Yc@+uIyW>9BG=P70pJGwu9Y12k6tYAX+k`Bs_&5HgkQUi^2%UVgrJ zm-h<`)mD5HqK)a{>Xbu`pM{Lgo7np6Xhvj}!=C5!cX4bp$^N$Z;YdN9F+= zt29vjPts$ zh)5gQexb5n?%j7;wrf(KLX(tk&Mi)F8wL`+`7=mj6|Fr~J7D-xtTv_$E`Jbu3>c?y zGcMlg5b>~^26{f*lJC^MDNRZNLb$+2$4DD*y4-&llWzNOwVnInDq{Wa4MVY<*5N1m z6z%P^e79yk!xvaji^r-oT8?Zf!j;9TZO^)p;~9w)2W_v3DY`}L2S?}qHKJEkwY|T5 zmF;$TGnF*o*1qV;zUXOYqp2mg@|1t&;F<^2aarG(jWDKjcPqL0x2b>PM?4K!`lErv zmaD(PCxf3aKnI3lio*R5~C*hS(P%OhA^Na6T+@}7YoFcTyg2hLqm6wMsE zRz(F6jKrCmVVVUqu$lT+anoyAD4hrSdQ>b{0dw1vttVn?^a4oDIMifgIfM8ny}{Q; zU_C(4-r(xzA}$qjp{Pt9lxbu1Od30yO6z2PmreyZm|@o!-6H=V_TD|d&Z^4)&uI%JP&}y?sEU$mloS|kM@AbiLqZe!96iAz zw>qMBL~9)#sFG7~xTTz&(#ONm>M+XBag@=Y4vzZ$qGGAsnzW^9t6*D%0u?9-r4IpG zKzmc^@BLYOKbMoHp!5CC>-W#(1wGGoKYOpe_PX!2g4%gGw$it#v#mqd-Xzgf7=X6j z<|v}ZGCc_IcuANVg#Rp9nMG|lP`v>IJhj5$3qKQTbcX%^BEH~pKB%48XLvtueo(!| zu$^wNt~R*Fp;fuwaVVopM-W)$@{}EAzxi89?~2u$K9x}Zn&mJ5~ z|MRl+U!|C!|4~OVv~P@{|AD9f*U~-kHJU(FA(0-@@thO#8+CI&V!;W1&2H7X1s7e( z!-gi&yTJCJYi?lws@MhEDTc{z+CQBd1G+l=HNo8&~FhH zo*rwD2i2e11M+lcJnDDaMWiTaf-Ka=9j*F&I6~2ch`2Lpl5F%7Dtb`CJ~902{X$Ors+ZTT7>}xwJ+&M9_Da$4>|oNKTvvovGQQ=L^98H{#?tsr|E&=X2IV?o9blJ!4gn<51^`0DdLO250p;yy1*T?XWM)n;ulG->2l~>3@smtU3>0%?FT4B9XIJUJVAqApdv;KveMA1*XBbfL zoS=G`9B#MG<7IQ#&1fbcNdZo>!Pnx&#b>dPe3F=!rvYP`ZbKk8{h zAJ@^i&ceUF&ivaeUe&)%1&4mR<=t*na2Vjs+-~2{0g;T}B;ZlyV6LJ!exRo|4$)F> zZY(M?wEq=13Q9utphp?)a2crcECkheNw`wFF_)W)XsL-E{J$iV2P)(AX6_M>&AzVC zfWwM}O+*8+Jn5&%;*Pb?;baq2IzZ|=+#UoZ>Zo;cF(;{y%l6>--X_yW?G%N9U={Zt z0OY_Ld!(IfH_N2xSiWU~ceWEIQ>!Pxp^M04Ap&>eVjtGR8l)J00;c)l#^`-OZ|)KYQ~Xxf z?>7?;KIc0^L%yOy__9+we{B>;l9+1eEPQscAs1v!+rr4dhmS&Z%%m}X+cYX&n5qL3 zz08gY%eh9y+%ng@^U!Sd;2b?@JOWyZd+O0}pC%w$!cy+3eHMcHf<-Z`ew8SO9d+BncjU{HY1+uC zeC<6*h7Rikl09mJ$Pc&*^l}K4S_zVHX*ND9*P!W(g7lkp58hNAd-!?%vK0n`%+o8DJ(JjXXKo zTv3nGx>gE?!EA-5B9$85rbyk>HosI~mD}~CBmkRJM84^9 zB6JH79+|iHH`cIcd|IX{<4ea{SCcW3=N#+XU!GH3X%f=lsJc=~StvtH?mPQVX>BO| zwUIXWNTj`T@HoJ!4?IY~Ul*V30dK)mu!1D%5($6{bAU!xr4ZeH4A# z?dtKpuXf^cMXOV66o~=H&&y-)l2{bv&v?LGs;94Tn*vU#a22`CaT>NyT9|scvUD*H zd#qs>t)$T2@j>pPLij`bpjpTUbHpFSsviBm4UrI|zl?JtCBdqL8tQl?M_$M=c|3`uQ%Bj)Q z{(R{R*6G!K>T?W-H|ZUhmczM8y*%opTOZr@fmN))^2rUQXQd%i0z>Tvf z_UA&>c$NU0r zOXAQ;nP2<&hA}r{@Ehz~cw@uxJ7YTiVML>!F5!~$oHz9ldR0+uEmdLribNFkOM~kP zf3I}M3dQQO0PF(xTTGlp@f}wZ zj2cU;sj;-Pw4s2o1LnpXS@@V%d=KJcGNyFsv|^xP zk~D|AqVqU*`dfaf)E4UYRLqgKoE!SvZcpMWvcF9Bk>GX%@?Tc$s$JPfP9*z?A#Ab9 z_o?)7hcb;EB3qjLh;P(Exo$%j^@vJu#fYm?M9)u@PnuFhIFKkS_ppjtE%oaVG3>eF z@4I@^(Pf}V#xUw+ywr{m)PCB>N`h+WC(TB9XN*2BN!D@$1jv(S2lM7_FrZl3maqIh zGbk9teHxR!tkiZRmCHC58+8J#^%ZK!TggGrB&SPD+FYS_tFW+8y;eU#h~ARSv-=e7 zNdb@&nZIq@DTT@Fcl6|cJT_nXj(|qB&Y=1QVQsOUT)}hcSfO@CuJ1MrSqZ{xbSq!! z=X$Yv%>ct*eT{DAI%^&Kx~1JM(JcsZb0_XqJbIIQ+S%1HovT6hnwxnch0}7w34m~B zwRKye+TVIJ7nBTAzv{PJgk(?4S6-vuWp?@kog?$tugotcliel^pFN(HT9LMyTo9pI zPdkP3@;*-4(C{xSO$mHsle(fh8f%fF))s4DUd8~Tf9DzD{mIVInD75S7mC#mek(so1e` z7K~l4XU1Vxj1ItbZ9vIib3fSOahc%Y ze5Hs6;4Qpe>b0A!Zj$EeT_xHpV4Ozgu)k=Gpq;s32>2X?BYK#BAkzKzT&7o*2lEwS zCg?2UGWg6y7Z{Q6KT|Uq4w8nu*z{1;p)+hs(F;-xbnvS`_yZ-3@fi{q6yhE2>5?d| z5ocb;Hw5?;^4Jv9Rh1N+)B5VaQ7y*v(c+U9<}07nx<#mTl=eu1EO;)N$)t(sOfCzb zHb!4y)N$87bY^W_i;)^nW#CII;Y*}Ozo4}_Uy&wSs4ZU%miUf3vSkV@J+;5bQaVRZ zM8x_}_HeNB7yo-4BlHxlX^kgl%{-A1!55>PUT_&D7n}*a=#)q;DS3>_TE);HRPkCB z?8EoI7(!)T^2A+HSgKN-K*;(LNV{fYj6xOYM?%EOY-24~jy46{7=#i%9?ogO2jB5K zNz)T82YAY-?L$PB4mzt;WwwJo2Mx&Hs$0S%LrZp$a!z{q zHK+>HdymmBe$_k18E51t{M-D5PGTSIwbJ@x?LVg@;uLG&7Bx~c#6MiQt#hbbERjXE zuQ#7a?atVW!qB}%|Lox7H|b+l<-NFQttk|1q)@2Z(5E1lZLGt-plsi=4PoE$kZ{nJ zi^Nw!Z1D(f#WwT($~l`ljTKkyGp4~gG9FPb-|lf~dsnu{5OpXq6H-jbeOI2TnvN#5lb@ zk-6q%dgSDWdWpz|M>3$amvL`iC{D%`Gzaily4mw}koE@pukPea>#aL~6ck0kZsnkG zr>2d+mOxcPYX9a0*t;b&c)zUbH}?1ONKfuwQqlG_JukocyGkEnKOTjNxM7l(m}F2M z?hD$7N%*&uZk`Ir~c>I|GxVgsWMucbI!=P?#&YNGDd@tU7^2sr6EVR;b65I&* zhy}NN|Ha%f2mGV>_@hjojcH_}H4_+iXvY9;8As>yf=tuyOe|9*Qc(us1Mb>0d)zgV zP2-&I@_k%Z+0D;`0jQA~YJG!9g{XBTYHf6n=ia&Bb5FoB;^#I*zZL^=2p0VV0FxOo zT5cDe02Gbc#q$nfqDOx3pE%yprR$(eafjc{C8+0hOj>;DdbQ&SYGw#msRNFtWv=eB ztH$xOfj3!R79F)a){kVK^jxtI044h|EH0rf@IqF;vJKuEXNL*@G;MQ|hI_lyS9+>% zPXxe}86`m?k9jl~k|I(FA*JH$*NE)f#({4cG0@lTec42icNeQ)lzeLS-@ijAaehu$ zG{GB#>e(Ge{iKM7V~9wY9+dx=Xkw0i6iZm4JUcdFG;=bQPK6FGJSAR=OeVqTtEqxZ zR_uI5`3r5eyq<$}HKU{iO?#I!kOr3xajmVKRxwoRC?|7Jpn`pMQI<4!2i3bAY5pjr zdEfNj6De3l#0y)`!?Wo6q1E?Il#$Oy5PsEOWf$CO`O0BxI9xAV`0aq*1Mj~!q`U~5 z2*AOjT~17gSd19bxecW?Hl_zPaE<9$&5kmDTWJY4&c-<{eO+;smN-t8OqLF^Mwifm z4pSrbGmHB36dma7yVGXK=e1;Kt)Daau4QxU7=!J@Sn1pLoyLNmF|j&h;@ne#N`FlY zqI{=m0Qt%d^p9KGbXo}iO&4qPa_+&eb4zK>qWsdcn`xmle{1)cxnx#5t#k3Yxw&s^ z7-(8Ew=?V><8mGe%?j<6#Wca@6Lr0Mc^mgXb1uyF?3T`IMM8p&QM`JEA@Lt4SRi8f+5HIeu&BvxF_E`a-Va9) zaMA14DHiGd&i&qhQ1a)<_g8W;*2_iL7p3hPo&QdHKNiFKA4SxYz0pg1pG4X-LC;YN zlk`gL=f>2?6sGB$k_Ch8+4#zY2|`p<#BMKNO6B{Qt$Ep*QdMh&+6c~`MxDar@mF|1 zIzg`|_H6BB2_)O@wlUHFm(8v-lm0i<=Z-AhC*GEJ-NL*qZ07O$HP!#a41Ci0voGy- zwQtf|(k!-K9;Y$lm!nVFn_b|Jhm_$u>n9|4};reTPXq{C#nuL&BCz;Bdkri8| zXVb1Y*N7&gJ8k+p90%4o(+8lIw)HbwL;K?8qulxtx6B?DRKMz^PHkbjNIQsJ$~6do z_<4YLQV<&9jW+TI!QEQPh1!)&7_D`pJ$_ zm59T$+ak->UcICxW9Wuf5JBY@n>^srhxk-oW3L|pu)3RX8gbLv->{FzNz~j_^AxcZ zu?(w7%R7;J^oJEQ&7meoinE?qza@$&1gLB&%^XRKOCNTO5}(AUCza+Hd4$|L>bX-C zaHNg44~WEgoL}^=aqQ_EB@gOLysGsIRt_)9tcPmFdNX7{*3!xICb8&frdTzpMTYWf zpD1zQDRKW&22iYicRoLfl#v?D5}~_A3*7!j$Qv>|#Re!dmo4LSSx6vJqXd76tA*-y zW?xdgZvI-abxix%KYLFSt_;vnu{LivX(k)<{kMt;<6_2nNjR#q9G?yfHcLHfl)NQt zfc^-wR@XBYlGJb-A7v^~1Veofx)(7pbsGbWqlDB44aSKoR+RnTeE&XyM}--_s`*kx zE9Qq-sO~*FrN62C<0$#uCDJ91EZuB|lye0X@%sxoz`Bhl2D0^3-;=;RLqOAh$AQ3) zc@=p)vkAik+#hv^{q zu(L&}>W2-Ww80>^Rd8p!*@QyvE>S;6ZI0<8Tq%`8mwVjYo)O-htfT?n!HAq9qKSDT7@54?D=lyLH6k;bv94JY!t zfKYa{by}GXNgL{zD0vLyr{QKaiGd~dumi9#mpJii@kU3-p$p0vd@!WpPr(_&5?L)iWPpUa`*w(MH5ZL=nxr9fv8Dq1z=Rq#qARl6tjg<0?-Y6pGm4rO4Gq;k|K`-uo(tnq= zRO+&U`n8>}%upvCDU)P(qE6kXGb4F}kj{f6`j(6h?v3am9$!+O$!4J5+)A-yFB!m6 z_JDQdoQplI(Oh`6?Wyfjc4|lHIVzotcrtWIQM%(2Q zqB@q`U9W8trmU6?wi$QV^QU0!5t)2fzS5>!u|N2$)*C{htIKZA-3UK@KM{ks2|9)L zJ-x39%FDL!g$DBb(T!r&h_p=j{ok_ln~Yf3dbY8#1xdMSGl@!*tSMmRX-FgHr&Aop*K_Lq;>6#1_Od-PiJwfh^f&@=aPb?`oUJprZZK*+nRm^@Fj8@n$2z(qo zgpNCTk)ffQ<@^6v_7atjUp5;?vFTBb>OH09rt*JD1D3N_S;72-`MF`61Jjeg_JihS zS@Iwq!|>R9n!IChP@NC|^%5Rg@D@|rLYvW`xhOVb2G;R)9m%{9>+oMnNEuwgnmiOXx3;alt@YoJoC(4o@W%fCQ0F?)I9EV|&LGM!1liqF@ zYd;;(J*qz`Os1Kn{yD;qbJt+LU>WLA9=djt00^EU|}+@KIZCe2u?Ov zM@y8>MQ*Nong(T+KD4yars*ufLrD2K4&r#yLiH+^)>myKVC~w0EntCiOq{+VXdk+C za&$d?(tc~gC;kO;h@dk-w~j1?XA;glwBWKrbpd??TxT}!8r;DIvwys5gsD*Fk@9VV zeuG>pUopUy_cr#vHCVV}_r4r$ewNj{CTM>#f9)@5JZRr=37+8`WCd|6<9z+G#KJn+ zK_YR$E7P7+n0rTT+6mgXE%=z@{}!J^$ndnyMq7wRn$@|ScBm@a`;NIw@=Lo~&*|c7 zK)fZvm7p}O>{0>EV9M&`6|0v?>&fO9zHsSx{DMw#8_n^+xSg^B(S1+v3$v0Z=8wy6%S(t1$_MQ<`=bOp4SY3Ft2t)We%}Y?5k0-tZ zi|Ch~dVi8IZ79Js?#O)}5)tcOgVPh0vago{=?e$cPL0$hRhhp$eroq8**3!Sc#HXT ze)o73DekApn`)7TpBq@DY}_d<;4edVQdAbrf$|8IUo0J|Es7I@7=?>XgGyBEat1q`q+7!Y8yGf`xl+ zRZQ@B4P9w2;L8jjC=4|S(F@@M;s-`7qI~5#I#ag>RDLtN1`I``PvHv@MAk;1G=J&xbW97*EY`-g2?$#G1OW^Y z1hB8vAAi!?h}Rt3zf!)LEV~vk&UB7jkd|%s6&3UW1}(zUw8L7?S85Wy6OnUWbfwPs zAK1@?LT+I8?U?%*wfK1=28jb| zS3^J9Jt}>2stmJjezb>Zqh8CXk~2JsKuSGdc~A^$I)o$Ne~TdCL{do_bVnY8%K|FS zI|A^7iB%06YQYJ4{uXWnV`7n)TP6#+2bL1Mq8KYnCn}dU#4Den6LlE|wOD6{H zE5!fD0LeI)AWL@r+l-E$8k14G9n?-||I5AN97Ea!%5(2;&TjCRHfPBLes^v$yqoBH zMbg7Q7% z7Cx>lm84WSA!ynbG_5H#tqPXeI-nujo%69Bg(kM@d~P?1wivRH$NfmmcP#eW!&}OA zT}RdvQg7K1tV7{L#qg7p_`bfa-qEwP59*uxK;P(xdQ{h!;$)mJAKMW$tqj7yv%W-% z1t6XuJSb3TCa8Vt5bW7cagRjck?Rr>xPM!yUEkWUgZW;zZ#xRCVA{Uo(qrFSyZ&vu zpp!S)rWvy3Jk4hDzIFSegFhSd4~yo{;6U}-sn8yz?t_gXwvPzHsjlsrjcI+XR~#=dr|;MR_k$;?z-mbKbZ~I%I6R&Q(;%PCcB)7!tnVfR zuJ06jeM{UaKG3XO0A7v;TeEmOvvK%7^G7I8)7H)lYRRC>ft;z#=ctqbfW;; z{2|r^a%{G1NJsvei}ef$;F?Y0OZ~`jh;Z}4?fLF-wW7|+B;ZmSka;P*kKuwC45~J( zan}l4-bEJ2K`a-xdr+b3HZ&Xla;ktet+V{((ZOVjjy*N8*!0_C)1Qh>F9jj)h;a6f zLfEbKo5>Za{u&76pGZGo7BF zLj~x3vrE;|+;RbW;&kfI+IaSZ) zZ{6q}{NcT8LZHnUd%xE?V#pI%RPigq4@B!z{c|yfYFc`BNWL|?e>Q}pE z&wITsYSa&xe@3WnC} zNzGGIM)-U-fp^*e`z?Njofck&7WsY|g(DJ(oxk6BP(7gkAe{McYlr`y(Te zzZ3gT2|qL@bH8najmWyC@(ke%(Jwhp<`XD4XJl}>AM{-GA3S98Ncdviemm`A(Kz{Q zksDZm3@V;lrrE&FXxYf=DE`ml{gR(THd? zk4p(Y*z+l#IUpK_;iX9?M3c~eIbT^4lu@MI80UJ2D8siUX+)2IKt_^K^cnLhkE$T~sPb$?`iM(6;AEf6L(E8Vr^ z8Rh|SH>1G(`H1>PA?lGJs)J#n>1EYccJqM_)H_4WAV%1`&7rJ~s)n>r>LBJRqav@z zyOCc1n^Oe-uE{;%rM54Opm#|eQU;e5MyhtY_ z)`JM%i1l!I-FgreiB9Crc%1e0@PF`4K?91JhJty*_&@lj?ZPia{~h?2Pr8lVlbhaH6UGWD|o$Bp#GWX`i_qKDdI%C}Ga)B#3Nn;f)^SB1m?e*CWJ->Fw zNfJfy=Sz%QIyibD&(lvYQ|p-upvdg8%6DZ$^`};-+vHSI*h!of=~l`Mr?JHJND_s~ zXDok;(t}$1iyQhYeLNElq*MM{QqELl;{iE^wQ;hi_FesGOGV`qf<`?JR`k!`>T>m` zvbgkJ)r$!F6s`H!GdB7pVkeatG66xcHLoLylF5b!@ln=>#dMcWSGK@Y6~z-vgI>0L zs9VD2EcHf_F`u;FxEJ;E6q~;55(;=aTFk*W z&TEvlpif;>#Q5-ch{vnGOU@mYdQ$&FU)|Qy$k=pRD0`7jgV8xK&Ly4ahdVI;k#7Cm zv$6IqeAZ&-T_TN+#l5YcC#b?~>;e*o&#(3^gk@@13Ci^ol-_pR_rGdXI_86TzSprW z56>#ev@uwW>mVpWwN`R32G!Tv&ChU?G-!tu!+V0<4&;IsHhK~#+r|&!N>gmMinY#t z!(=9et{2+Tn`OY6+kU~&_)FUYwj8yuDQ#2m^TJi?bXT}7V_1phh3fdB@}7OY50d%4 zm0o}niw2XunwCj*km`m>d{dlF!P+`;O>BYEyTl^bzNa6v zIGv@Ko&80M*KoN|zRNr}`Tpks17`!gL`c?SI;$>P!x;f~AUHV%Imh6`dPE94-$bYm zaJCDlmHXtVVn{p@*|_A`M)s;=NWP-2%@$PrJslhp+Ryu~4)GRhRWBsC}d@XzwMB zZ2#L2qMe1S&0$7<0nsNpx}6VEU7=A-M&WRN>DZeH9g$rrTru#>nDP^c^z9v+zxFvU z$Qaq#_Xh&^@-#QMbK%Pk9r^xua@;ljg4WL~+0NW9zV}a9VkX~z6P0`OAdk|d?plpN z!M0YL_Zt5C;N%Nh+dlUdMR>Jzg^vX7N_N|S*5P{mg4RGruAuhM1ALTVqI~~a-Kfpp zt$Y_PF64iyJ?nrS9i-MBeWC?xozwdH&hS1r+LIaW0_tOu9OZh7X7ud^I4^?S z4i2;#gQD_#ARztvrZH@j1HJ2@dolg&+sihGlL&+(Ag+Ir0GxLfbznwoz4;D>Ab9Kh z8jI}M9H5W+3D;Sk1Xq$+?l+AWJlm}i@YfSYUVhYqa@eANkZVe7PwxwV$*Js^@qR2XPbtV+$gYopJ)zN@A)E5^bfnK-H}Y8@cmDz6Ca0#p92a-Ll;C%*Aqj>q1|wc=ig_88 zgA!)QKl#B!yN;~AL&B*ACc zScbCxm(baf44?m~4yD)hPP+upuN=;B`gZMLi&DDkvXhihaTbc z@wAHocT&O==HuP~B?u?V8?vN0kzExEjVy%g)WU=GGbYCRN`t{J%yFS-Z7ky7LW% zoO!ylM8{dWb2S(8w;raTxJh#dBNR1Pwp(OpOK^iUG?4Au*?J6$gamw0LV0FzabVlQ zG3DuB1cQy`r!L&_9(v>w2e^mTGKJWbqYmkgKT7%E9 z0iwA`mA;PNgV{IRFnm{$5W4+2ViBQh|EsoXyG^2#v-lcEc#$fCT2zksAEkIfKM9BF zxQT5vM*P?0uh}b{)ePis?PWl@72KIUxaDww&kU@w8F+waGBbeC4ecM~BDDTWX#G+S z-DFHhSISqu$9c5R$a%lkRxE!;AAG@mY)+wReR<2#`CHFEc-q=i8Z88XoY?2I&dXmv zICsM{S}Lq{r#TI7$rH08LNPnH!XyD$nyA5STeEXS9p*uJ`KXN&nf`4Y3%Q$+-e0d{ zR2njHy+)6WU`MtpW1h5a?DGjbdi+HplkdOmDNa+1?f}!63aj}!q_^kENC6F_LrzYC zmBu-Kt%vhOwdO<@NFqdv6Ej4mD(}uMIJY(nEzw=F%FCy$cTHd#YY(d5aL=l2#rv9T zSM4i5PxR9rfB}#O*juWn>D(nf)f0bH42iAWRh+yH6&7>XV?HPh zO9H?rK^Tj5uMTlabEy3o)GLuiq(sSCPPMlrJWfJsWA6#Y@K3}4nc5@kp!!+ORtBns zd{5gve5lhmh}s+q*xFCCFOp%R*QIRob%mBg?p?Q5lVGtJ60cO38Ft!$kMnZDbKd#Z z5`<4B&hhF`&25IU&)fM5`kQW@GOSipjy}V_0qY0%O`P$=gBMP)A zznoj}o}fCewRRpD>(Nv<1fn;C9pETyj8X$-GBTr{R>!Xi!tv{|YjB64&ku?)g+p!@ zQ`dcqg_^qknii$iY4sQHSCR(enBU2UMG91(OLXEMqMdgKQ`oz8Z!q{Wvd9_8BCGS| zZ_sfHX0{Y-XEhe4tnXnP6(-lB>}x;c7IKK0Tql_vqM|$5l+neIG}1~N%@T%a+g7R3 zB@mut6=Qp)2@xN1>a6UcI@QPDUpwV>k~>zCh5xW(ZgV00aElpUhispHv&k7g0fq|B z@7i{zM8t6B?ykji6pz|gXF%+u&qy!OJDy?tf4FJ*PV&!{fBVWma{@cm-E| zTuGbMi^{uNr=27?Miq=5&-aA~nr;(|i zzDw_WAP%!e$@TPQ?)|yBo=8aV^#I2Q(p*m~OBd{y!u>O?vrN>t{OuS~NBTVK2jt{L z`7bsBALVa9r!^S&bIVj4Z(pO7loMCCpG4iG@~Y`|Xrz(HRpy(LIz$zk@gk9{-d8*2#Gc$1G7zaNMkNP~O3v40wHc|j#;8tQzH&a1 z(pOGZIg_?d$Q~ZV7Iss?WrXrxbP&GU6V>i3w3b_{-Ir;hwb6b<_0AjkSC?H-q26oL zQsJKtDm~)dsKS;O&lVZZ!rg@GPcg+1-ubC#3mTk!xO(OMg#6mTxf8vPSH#!xlR>;M zi{9?fv-n{}`xII3@nbglF(<~4cYqwkYZBw0;ziK@ca5dzRN%UQ3xcXqyT_76Kqz9M&@97V7%Jl0NSL|xWPZyV*{C@? z=BnwuUKPvk!etN|(Iz@OnOEq@8Dp!7QWG`nt%gD=&;(bN&Qc{>QC!{$VUZBaTw`y=v5x8zqSR9_QR7n=JM@V6-) zf5VN){za(w(4d~Sh~%A`J%A1QlIQdpa!;(&Zrh{sm5nyBD4o+bS}$W^ud_O?m4)%e z8L;z04e(-fTv9!IQcy(=QQ5D%5tdiB*odl^Y>8jvkgcO$u2UPG?RQ^+pR%iU`ssAJ zGH}%eRLyFgUJQRL!#7jZh+N%0ZQtqDD{gP8;HlZoW7eugA<4rKZl{!kt0G1o!u--D zeYqPOI%_lcwXe8(P27?0lTT>9;#Q3i2j%mr55t;@JLJ~<&m9=+YO^jAK>1_Oo;x@| zf}v`k129?MiJQ7dak5|B7{csA5XnATi@?s0@qVr55+$@h&k#gsh#|de$jo@Nay3xNvS7&i}7obiaRG55SaoX7?{BfKqTLco{>S@eb~SpoyMEl^|f;l?R^u_ ztXpV-mnYG4FZ*0K5$%&$T0v%MCGwhokj((7tn4$AyLGBI5wewt#o8u(Y>qMJrTkTW zDkE#cL`4CFL{PwH?7l=DN%2qkCSA;290m@lybQp3LbQKKV6(SHHGpMIB36LJKd`)~ zR$?!~hbP)@+c(Eri9(K4Cu3F4i}vBj?*vwdbUPU1;9EaK9)II~l?6)See=xPc)}|77Mk`9 zeq+pR=su74f+v#b%@U|Jy&E}Bcu(y7`D*m1; z{5^Dk{MA>5yXgYiA8|)aMOQ;Z7H_}j@D|hSp5d>@cnaP`yKK_?G_!F6uZ!#P_O*3* zi!D|a1E3?Q^#=SHdz+I40d?5Rvl3G#rNkx1;flw%QSg^(_=rbK;jeJ{)$#WP-yYLa zf!n`mCgT&c&Jt zLU3vXp+-eaRbQ7P_?@0EHm6-qyK0jX)P7>pK=m3Y6sYcurdN`geQA|<<{}4WzXlU~ zm^;NPd$D3ME%{n9x0Y|nM3p!losGeAxfN>PR4AN%xTCR z)%vg62jWj7QoGk&GAl|GB<#qLDz!5oQ35)oax^s|{d%jEQ4p+@eRZe0IOmhk3vrTZQd{ zLsMNQw!X^O?l2Uk=f201C!GAM9(buOzJMK3QY#)j%i!K2->oFN_sHLydxS3aG~KU^ zBFFhI-8;^A=_%pTazjO{ZFNYJzGF_3Y%P#X`+-?qLrYElJml z{&6<>Eai-Ybq`Q^Y#c3nYq96({5Uc_R9X5v+zZk0>Y_&;N*7k8#A$ zdOGgRpkpB+PM8R^6S(WEnVJ8T%{<|9b99i6X4E=W4zGcH<#+MqA1_EF0i$oWjz0Ox zr#*etc6R`@5_S~X_ zEPMc`~o(RZ2dbPs`w_l`$ z+Trvsb)<4DjobTm`1C1tLHK0ve~2@Sz|Fs~h3bO2IL2oTpfUO=aZ`Sr{yDMHq8MwNxNM7L1IJxr8X|Us zgiQn7mOZI0!{wdnK}b>A)tVBVWjBrDI)Gl9Z2*g$GHp`5^?&M*(V%4Y{y(#NJf7^ zL*J+7e8np981YO@7EwuK$?T`H1l0RY>2)!@fnT#njl@3VP~(q0g8$7Vfv7+3kG|%6 z8y%X$0mwvOCI}_Pw=AwjKQ;_PZ^+`Au_23=Nc(H=*V&2|@M?OW_mhO$(JI!>l8m(k ze2`k{6RZ55Jr)=}&Mu-JE_`;e;8%44$3oY}{L&3Y!UYBlt_&(%Gq~-|jC@P~+TJPC zcD|IqO)9Tx#G=>I$kTd8x%~P#CItSa{IV4oQCgOFaB4#`XJukG zQIR}=hA;Q?Q)O+LRj792(b`*>vVveE1(y{GE-NayYzSIYsD5@jnHvkFU_sIk3boHQ z76$(?RwtBLd@#T0I39XmZQ{RLlnefB;r(<)tx>IT>}~R!OHiDO<6;GyIEwkxsn&)M zb8rgLg3(3W;dFf6`s!FmcoW-gI(*%RFmrp|9bK16Z<|kF;@)#p|NZ6 z$BuAxWBOyl8z_hw14)_>K?6=fIG-zIdclf{gnUNm8yn;+>nDIWr@aXq08*_ZH9 z>Pyp&gJ@Aq^*9Ni09UJ@k8xBF@)ihD6t;3Zx=_3@p>KiXC0mGQKEE^E)OlWzTir>V zgk2s03w(+tb4~{2+GXYzK5J3A?W^sfAU|`PA0r_B8);w5kV!l9OE+Ozr4l43O5(~o zU)L4x;`+|P?QahEx~zDov|_Hp-_Jv!=SyArJGS;*_+)3_%L_^AE73Nl8s&A3I&N$P zTKT2;S5L&PXTA@%)b-sK=5EBOc|=e}18RDB=ZZ1CP30#V;fu5(cWiDO)qU90)lz8M z)D^zSUXbSe(wDnJ;)AYeojzAPLO5tEwr?S10JPq%2sYr=I2Xe4?m}(icrD~#$wCnL zXb-dUt|3kAZVB&9LPvfIejl3&iReF(2<+@~#VRiLrHjgR5*W?W-C^#Qf6L~D)6w4W zW+>XB1*rYYPdzbR7a!L*o1v_X72y){leT%(L7y4WKIP@*J>zbI=`fM@}*{FR! zcvN>Y8Ew)Y~i5eNoAw`j9Z&qmCs?@4md#wjLrU&9bwF3=sH?O8 zPrKT1z^+!l+o-N$oA`zfat|ZRLG!h$vsQqg3J27$@2FqPwL^xaXvc=9QtB zf~`ddhUQo>;1{d-(1_b$PC$WyyZ#ZL! z@a{`Umu~bWxDbZ1n|+Tjj}w!zF^~O8HQF?4P5s3RH_?>#U+HkaAQ>tfK!D zdZ~8TBu105>b;+rlhS{onEMYNwZE-Q~g+|6n1iDb9t@i4y2YY2|0CzK46pY zVRx!!v(8txN)~coMwsZSeo^zzJc#icPH(&dITX)#{ zKpgG6hS`93yqkXYAIaLp_22}GJ8Z3`&IHo3x`YWl;ab1LOF8|nIqnBkg5OQkMwc=f z**svEOBQLcp1D5rc%$oRQ2Uz0Ek!1HJX<(qR73ihMfO|-x{7p|8saT-FwXzfWjE8) zHW!n@VXL^NMd;doO&dR@lcP8A(G0!tt3fgClz;FKSHGf%gDERe&kqXP@5`5;97prv z!xF9spEwBBGM1Bj?-W^a194{5 z<2BTLKTpS~Ddrc=6|Hf2=EC*;e$;4tY_~xIPRLsHpJp`dV~QQ$AAKM2VJK>uQggBF z-(jWZUW}fV4b$=!_Ef(b2;6{WcF&ZD6`N8FiFQXGAR2F604ZNoG;ww!(Rk+|l@i5| z)q{<78LNj39)!gQ`5EjuQ_%JRHji=M<}uG;A%$qZ#3n={no;Qyl@aNc*dpnp2lEE1 zJUjXpsYAuwn&Mcfg(*sA@>nEt6?j44+gg5QO%swmyCGTzU}AcXJy{!byq&`2qkDwq zBjlre{{+n)NaXC`V>!c)WzYZfsL!9pgr?8WaO>aMiErThv8R1r#?ziLJXaLK=M5Y! zvcEV)Hrg$yP%}~U%3rfrno`v)k$5^3D5*S9v)L--UF`Wv)x^IQv5rI~BkuY}$zjk}HHO)KdLg0`jkD1Lj(=vx z5PL3@G4u+aX7g>aRXaThAC?b%K8-F zG>rL?lfd0s0QK+1ezAh~r|T{t_zXW28zG zdMbmx;|Y?UF1!D`3r%Fh^@QrM(u0bex=2jVkxSL-a6(8TYaxVqCh=IpeOm%k>l|O8 zF|?}qxGk&JA%{F|lQ$&J(1skcouJQ6n#PlnL#&EHzS3%I-N^N{&FrqCh*h;u45Dyy zpD~Dz=;X%Ce$be-!yoL~C3?ueqJ00d)V_dldQh?b7y0r_CJ2qjC2rl1OS~!N64$rh z$a*sz&M$Q*-YOw61j^Ky1f*rO4ljY=1ohlPBA7~kJwOQ>3ihfmPT3Tbk>7hv_L4TA z!|{XMqs1mREderN%ezWHH{s-P!AZpNL13zh`-yE}yxy53RHkN&fQ`5zO?BBg{vj}? zE8o2v(E~1NgF$sQDMDd`Py3UeT1^Fy^ueGDQC_dBnJxT=54m-WQ6YY%LnLr;TMKX7 zA>+f?aRU$QEqxxHY0}TkC3VPQ_ zeM&|YR8L&PzF-wfS~i6)6{xG@AYdHd<#F@YU* zE>j6pUY3P)Nwy!jgQ^PUD_;Q8#={qK5ab?W66FwDD>NV9>YeNVsCm{LeO(9QY$NsR zQM!;0D@CmO&Imp+LcxKu-D-)ub<`_#>jmim>ed_8t>u2Dd$sy6?@`hfr&edXqq6D- zrJqS`H~^GXL|EPF|4&tm0GotW+Dy8HU+qIq{HY-i#Qr`J%4N@aiaDKw{k6KUi|skW zp3(K*!2V;dN|-fliJG(_*)zF+z%`9^{Q^{z*c4=JPRwmq=?gZ8BZHOah|14O2zDA6 zmthyeA*M|msFkUv(RbW<#n&`d-U#L`Ajr|bc~-y>%1EKJx1%+>=6gCf?kQzBz0oS| zDFKcWW6{hP14FldXv?_YtM)YMQFctzUF=Cqf~^@v)wUN%JkTj#!qpOv*% z^ktTM=tQ5D`K9=^jx_a$6)8|I^z)!*=HZfgWk9A(*DuQ$q$dbAac9pJx{1>B@l*_I z@F1P%LCTk-XX$XEx>WL{ynxO#H(xTZ6IBb7WHZl|vhe`UVAod7Ech_T zuGRToPxiOwCAZ?CM~mqh=|c~d*f?SVWYGT$aRc(pChrz`*YIeImW|485q*-D-TJiJ zghot`icJqiALh&+zH`)v@2`7!D1P|sqdxo|>BvdTQ%qx4MuO}HgPC;BOPA>u=U5>oghe-=vGC z(d?#(;gIdj9o%w|ITKtq55KzHqcWAK9Wlpc{JMQcunT=MGzaAhZLJ;aq>G+#iTY@Y z%?fQpGZ84L{nHkB*ljH|V68J`6OQ9t_m>N3t{y_2_FbB)6ihe9uW9}31SM>lC-Td+ z%G#tgIK|d>Yy1^t)r+OkEli96x;FZ(#BrX6y!DB8Mep6_F5nb3h8W$<1z)u)zi6@b z=@cWLZLz#p>QD=fEOSZMHWrKBMC8m!n2G5N7sjdff>Il}4qADv|FD1tqhAeC5j2WZ zDviv}qm?(x@>(c#8hugz$={j>qsgwSGvim>b;fVKkM7}mv9g8Iq#CcI+Kt5diSNHI z-~VrrU8@nnWRuCF5SpAC9cR>dRI|XP;y(1PF}!!N;$)qf#Xct4y)8Nft)_GNIOZ{$ z!l6BD6vRKCK-N9}pkT#DfzOMULI2ufc1`vIYrt z?bE_zU6d1enV$7mulLyPGf_;D$|8*Nvlac&UucXkoWkd1*S6X-l$?1)8+}O{SUR|R z<~UA=kVP6ghR)FV8ivkjbU!#>@cix^Xe=Ft7o~0SBgkO2uK5svh<1qw)9Y+U?^4M2@$n@a65xH2zL49OjXYSOz(`Vr_9Y? zHK?8H*eOc~&&{87smYfptC>NJ7b2| zF>Lm+v99hq#umyEdNZ4op)Py|c%9oxaT^g3>Jk-ee}Blih4PcT?`!~0?0vdV%@x|8 zE#%L5HYooV$FVEC)k*Re?}=}g@^tZExzC(9mg-tTZYRahaBrS=^Fq4y7HTn9p3L{3 zPJia+FM1Jo=;payNs_^fPt~isfUR0j%-?Ef)^S=km-+DP<2e(svN`Aut4y!zh)=>%^YQ7PP%d`Lq|D{RDerntfr zgK&u&qdB}8!>9B7u5h47C8ww(H@M}^NyVvO5)pB~&lbd-ovk=XydY2QzVEkPr1s6- zUmnhtDcVLhDYA#$_uEbq4jHl|Ng<_->-|Km>vR&~1mch5`#qX_o2jOCO%DUr4Q__# zuja;r^$hJr@}FG7uqM?xs5%-3qe=a1FWYMA9@wYdxog1c1*s ztSxTnfW;r*GpV!u+Z-jfCKVR$QR2D$wciAQ@2ibJjgps}`F~?!@Nuek{dP?G@iB$L zCkVdU5tP^FIu|~^1p^DIc&XU+P_bzPx|{0Xg$MUguPcTgzqW$-eFy}860~JqZwE&= z-^c&k`2S5B6+rzp|33?)DY-SwJ)Lh_!RE<1ojZqG@|7<`2RjF!ezR8DU1G){^F>ed z{z2~j`M;)->8Alo))znfV$o7O;(@?EQ;NkTrJ`d zH)$oTg+jTxufzKd$x>Nczf?A)OJ!~SQrVC$l{NKCWxbY)ANgh=GZ!4&^b2+IH4IHN z-xETVFgI-1Y8mvoa(qz(GO1`{Y$hNXHa|}sQhvNevq1r8LR@~q)q{&og9ZFGP3wd3 zj2%vp2+!DE2usb;hiu>r`1Gbk?M(#RM%ZM^m8|w>TVeJ*^TvwL#Jof(diiZ0L)yLq(i>|0&y`U zpDn)VLV0aVF)Zv*ZO`ay4ucGF>qcEUR4A;{e-4HIpa++TUf&Z}2vlW0W5Jj$l&C3F zdNAMr6F@|{#(zWNN2WSd)dy)UF4xF?O+J5UOBn=0FJ3|Q5 z#YcALe{i38-%AiwNh23ScNRd>Hf>-nrS%gXU4`mvZN0Z~*Pz2Q#pfN6tbR1Xw3Mvo zjI6Q>-!Duv^2hH;vMQ!78VD_{W9mq)Mpo~Etcp%@z6pJx1XD9|YE;f#B{a$d(@$e0 z#=u3S#VXbl=#%e~QXvcH19U&Zu&!{@N>qYT$fht)a=Y$Pf=$h# z{@xFdLP4j!0tNN*e@s8GutB~G{rtvA`uQk>JOKUdORzenpI~){e*WLW>Pxd&y_|7K zwj33!omd*v&0SfnMk>8sR3h013%&d>7g9|36w?vQFL5iz?-=9J^b(9ub-lF-#%}=Q zGuKm$-yi`ZA(m@LV0=O>4~+5R^&aEn0YuM@pp*%fyvDjd3YFZ!jSQ81oYN&KT2d)A z+$S~gUUYn9it^T6=Q*8&PrX@nUeEto@xbh{an;vD=Y;?&7!Ua(OFzJ+5Zw$kWg~XPO8W-aD?57YM>>qVUUEI~3!> zpW=@uKgBnNgnaW{`E-8*nlE0~*_cry%gZ=6`8!oEvm1+qCisr*9@8Y}h9I z;)$(VBX{XLylv$F0BYNYeAfd6zl)A;M-&{~J4R{DYv=q+LpUaqnb6UVk#Kp3`_2oD zGMd|M5$ap{(hfdL*^sRV30B;Dl>h%^zymTId(b;zC9rf50-S;!t-#PX|4{%7Uk1w- z?AAZTjc=vYGuN^Z1Qd_a?5Q>-6t)gO2sUosmuK~H#Rjs-=Z7n?ozB5<=ZaC)=tPa#(6DobHy=4Y zI=z$Ix!RkYoF1Lt8Pm7bzq3wybjp-BW_d6DPxa`2x~@go6K*j*dY{vy!xbaS13LKB z_u4=v_Y9lMsF&6Vs}sO$>Nk3v5&E( zW*z&8h*^U|Vr2t#5WwBo$;i?6{Nd%NTNKYm{HKvtLVR=1$`+o|imrvFO@(t>dcx=L z`>m2sg`bhHF8flU5ath)9_dS6wxNBp6srDO=j|09ts|SaJ&U`lWFh1BB%G7!B z_}0#*K@Ki@+>_yby(a^{k+gCh;QN=sX*(4}cpM9gjK!tnL4a&Bsr)e=Ks+JT?v>$R zm>q&Ij@Rc1x?;po|M_>*21(6c2k|-J_xjhC{@ga79n}`$8zr5t9?Ydh3l} zD$L7A{#*-KzS1IZZ26Q{$mnr~8yBC`I#qO(MvR1}1_|*N)Py?wSH>XmSz1cuXC#fy z&;fGj!CB5sR0P$9gn2Ux7S#49-G;`&rw`&|&=1+}-0+YopA!y)6zs%<3CVi>t8wMW zJ9xqmeDi%l(;ku8Hu?mAi0v(#p~X)h!nJ1?KHVoXB2ST6-MG{6{hW!F_{a+Jqqh=N z9)xG2&e;4c_%-IO6YQlkp{twN3b>#d1gLzE{urdp!9%_nBVaMOmIFLi%z@d?j{F_> z=DU7H5E{huU4whZSTn(eYYVmU*L8(W(f6!9>G6zFuwJjP8|pYXwJ-xhFLYv_Yl&5#W)WNOb$VqQ`K$)hTA^u+39W!@wJMZ@N z@?O~;Gk3=HJr&bf(aYkQu@Py*{`9g7F4QeqW)<_EAn;&UxS>lXD#`_{3S@??H$jd> z8u_w8{h-Q5ezSpEbW8SEwu7SMAE6Q<;W}qi zO7@RtvpxS;o)^owKef*(6WOzk<;QcSg9z;}odrQ~>Ap-O3um{1M&4v*9bXdEzS5v@rDgj_VgHzxEj60{pH#}nD%1rBNtI8TKoT3?0d&uN zYpB|}1fg|-u<)Td2L^0fk zB59^Kc|C%#)0y6sqf+=UEsyN!>S97&1+|pHjU+deHd#1O!dUo5c6*?>( z)U-aF(N>*tG;!AK^QIdoS5!MY-~adg8;1v18~T=Ao4b)$UsIjY_I*YKu+|_obm#8v z3NLBxmX!J}UeG=}Ls_tv(B2u1Nu2YXbWd55el3&U=s^38UZRs0>iCQf$R_0MdhzBn zvI)W8&(pBAq45(oewSyUyZ^~v_Dq>1q{`v>ii#USaI)F{I*pZUn)_c5iWF*J+mHO@ zua&;TTy;@BDKW=_@YZsM6pi9f7(ifQ`S0iEV)Hz0dWv)-ha(MFnlfdt4@95=7iX`bxR#e2nKgZRTulzkbmp%WUH2G~C`r08Ar=DDfP%NMD(*GMpS2IVRekeXf>a zHs06a?{*=F5|wrK)HpMzvSYMZ7+NJsH`_+CQTH8v+7aw3j;vw~ZtA+aee;uTHhz0ANz9uj+bBYisl|gb8mqa(SednRFq! zl~pY|-vKS~Wd{2>)p{njCJqbxcP?aOYvj*zL8dj39s}j*M99rq7Y=dRDPkBBc_Q zmP1#LhHJd(j=QSkTcgJfnfmBC!@WG4@AXC-0r29w%RC>|xRmlAJs*UATb$895;SG@ zf0&CH+L(!9&V=4pb`V0C??1_QrMd6B(A&~X2Ia$pA?VFKpvHMR8pm<^{kr)Qu^KsF zycKOAPB_7Xfp~Ur8S!-IGS(18XzzZWxa|to3wOspE@QOiHFFYXdzC=q92YK%z+1E{ zzvD(KWkgRIG;N$QfvK}q8>(mJ42w%L?@YanF?b+b_27YQ)fSZWCdLP8ll?Arc2A&F zZs_zWb?p6tuubsT()!B8TqhQri3Hv74Wo&#`9+_EF*+c6G5LA6205PZ5H%4lBs@!s zu9}FIm7jf1OWU?KO7h-h>l*vpKrj70hO}XcsNIe*vCkSPqkO54GP5JZ1hQ@I;3_0f z^U+oPbSn&>y4OJi^X^^O| zW3&<#(2VQF@Z&xojwq#;d9#tRc&(FaE3?imL3ehMPiISrtCHS0e9V&0@^j=}QfH3^ zTjD-VTkDF|9!M0?*a`o)RGy_1(_J748oh5zPWL4nMOsw;)@34XdU*IK(X)6zM+-mYKzQGdG`|XtFCEapcO&=a!l&*iTAH9;8Ql~LlFwTLclrx}&UP_VWcck9*AB^dM zdecoB@cw$!f0L9_=4&w#`7cN*N<*2|pL&c{b|eC@xQbaV!QGfo`JJUg;6D?0VKdUh zVg}_6>EgdJW<(De?}2PzGAmGxlvrKxs9mg%YfYEj7qv2Hv?9_}Ch%U=m+zRK$4uHX8BHV(on-8FNKYz(bEENUiBU49nNCN$kyM*McTb$XA}@3RLz0+Hd*t zqxbc)9sCfl*g*nIwjAIh2aLv&>@#>|yOsO5qdkj9QA;M}>>>o$+}`}#`S zer@ir-%Zk{p+EviHh%Fmc6cYjF^@1f1cx-(m;~Sdf9<``IWr?!=8=@9nFMR*oc&yT z?e*GgtqnI77$ha_0kmDk7Vt<9iMq<&e2tGK=?-w&!oArU;n7#1kK!S-)}M>)CEyt! z=dd-0K-RSq<@Hb5S+Vj8KICfSqixtqJ}F*}esme0((XaISJ4w_4FYk7TU8b4h0XV? z^0NZM;KDOb6nf?1R*o5KLU-wRil6Mp9?|@Sie4!{Ifgk-%1@3H0K!j>{tC3-gXqm{ z=C{C4Hln(ppFE)X35}Po>cjMa)!TmH>X_SJ1H>)rbx_%Mlg&_8YNFI+sa=9sDgnSL zbWGKXC`Z{vlF=23W3jQ6im9|ErDpQ75H^RbUPiw}`Bs|H&=G_vQ7ol~QZ7+JvJ@gc zB34h~l?ds=)SxA+@fNAZMS5JhY*(tl`T1iRx&x0*tk&lMs^ZKE=c=^DnFTT~UYGN- zk8c#~abGa}i8F;|4sk;MToKsFP`15@)4L@)NI(UZ%cDD_HY0yZhGXod4E%x=nN|Er zk}QDybfbvT*FM4GuKh#!(+WH?{0XT%2?8H~`cvUg&FIhg*NO%G$+ZD2XE&U_aWC^^s_gmoXy2f4c`rH zX1myMv>+$~=}fJrUBXI5YFh40m*u%8T+i}ZuAHfyjG~-vgmQKq*DnhjD6-+MgR*b{ zj}4myhjO#BkyICn4^43&9ZJ*NLTR*7U@Uxs1<$K zv(IV|-HIn+k2vyMT8?DUspyL|K!_%^E|9%VQZ3Z7bE-m@;ftgkO_GvpDEo$sELvJ2 z@=g`aJuDudVk53x5wcovc+IuL_iJv!r~ zJ+6jDY6D6$@EFT%TVVzjy}F zdK>&=6RP|9#ruR@Hvvaz^f3~43LZu0n176Nrw}}n zY-W3|t&&IUzd#EO`>;U@hlN+Tcvy^&BZF-7G+5hPHd&S+`*wAXxRX3d_@04uVTl^2 zSq_XmgeTiwzIYHbnuss{k&iF_m5)DZxz5p6$sGJYC2F$pFba7j)#aaDVBv|9L8|aE z8BUY7UlzTx)Zj-jAS}~l=XXMM%(ZQDC~WMN!cCzE9tYpsu2SWUY5mXTqX+R$m^1k3 z9(;H4L-^@8@x<_9ZTFR-3o!LGUz9S%=dmN`+JC-hbjWg^d>^>fscf7l2*im_>;?fG zpN%snU~KWW_Q$n*=Ag>hLd#EF?L9o6Z@>!-XX7h^d{ap|3;Ql%qel0`vkhkHP5Dz zJlAaD&#VwUI1$=T`qo?n5601(@HMpUxd8qIM|uC4-s8%xg$FGdI1v3SH&uKIyy~S) z4K>B!$dELx{dGor)i1+iWxu+1)+TdnhoI@*g6_phf|U&rsPE~CE@y>juy>*s9K97o zB;_0VKm0O@)6Oh1exV<8=K65{^Yh9aa5gRX?2oXHFs#?}|0{O7nalxjq)k9? z9E0H0MZY52myGWf@&e(BFR!@rN5ldk;|1LEz;(s01aq%^l>A|&4!?8Lw?#HXekJdm z&J{Os8-tJ;G-2-UlN+aJLx0Y^AGfB9+S)c_*O7Wf2O*Q=oREac*$w&3I}d!Xx{9oA z#`k0$X+~a{{U^DcI)HT+zy|q+b1d`I_2^HrMR~jQ_cg+%j9)cT@VLWFPW# zRBytxG#$fL;05t(qJDEysK!>#yqGy%#`|t8bDn0|Ir!CJ12idR1~yKJQ6BR>lP0>^ zJ`GGC3u`|R7$=*!e{(2AGmg(O#43DOhR_s{n={RBrg(519J7T7P~iB8+Qmr*R`z1W zItovb2mAH8p&s8^n(=WNWk9E591|*HN>X>vC{F46@jYRAO;|R$mst6OVsm-EAOC_9 z+@tjU_y-}|)Hf9${wvHUm6pMs1*H3G44SRmy*D_b&jT;kWePz@ExKmvuU3CHb9f5lB?NZml+@Y%T)^spP9 z2hzhJBL;*yzpzctgy6_Z65{;X-^6>+nDR6ZG#J?q&)8vfKpKbK$L=_ZqLJLjDnA#X zGbYnGsBrj$hvDLf)FAL0!nGbAcw{&dn+LwSnlveS zOFVop!!A^Y6=r$gLCkTF`~3F_IQJA?`2Mse^5~=u&H+g4jy#W_mU$s-zn8XmX>jy< zK!b5VayBQZ)OPbipN?y6vp)WE)E+*29xT>e1bilRp$)4ObstL}c?P2q;{K!zq*xir z%q}79Cyc$6hM@DZ|0){s?W{?LeUCJuz-MSFQ)5J&jn%%TUc+MLDKh-2kzh}fYYpt1 zr>S|thpZYb%U?#(BYI5$mWng*T6=m!77iG?rpeI-zJp6UW zn9sVjsK}G{Lq(pnr;OSHT|sbbQFa3aG)e79Yx@G|ieyOW)DZ!#n&d9+oM{ZL|9K96hj62~@g506h$HI98<;o4^ z(yYQF@j8Xnb9!8CFA{JgI1VFICt<*RNmPQQc`9EXke-?GrEMnbei}c-m(X{*bCy6yY;%RjtF%&~3mJ&~`XH z$`M=@eyPIy6?r$|I_{E;4hX)vCQIJCuKG30Z1f{9dz9awQIbcAKjXfl*n5>bO1&tG zy;rHDtzuncPR#~^xt=!p1+4gpqQQ$li* ziRt)n{c`B|%jnH)aKCTJY0_~r9X}mkCX-kDPtluSH+tSA`%{Nvr4*4=^ZixQ^UA5| zIj^zuME1hf??QS${H~+t@4S5eE~e)&w2V(7p}%R_oc@#|n}1)JWr=J)t6Vl$_Y9s# z2Mc(XkFyr#^82OwlydpUS?ttuxhoH7`5bBH$EQson{WTs((_-ET>h)3=hYx9Me;eb z)BLBE&))()UkVyFg?xT7iumO7`7YIaQ}X$5==oIkmjCMV`O((@eDu6TE`O8s9P;^5 zQ1f!xT+TOsBcG4FY5Dv=Jw1QB^7%VM&wnGId-n56$Y=;LEw`WND7>A*e$GI)B6~|G zOr;<6l6~c}c>TEZggtynQWe7+YpO=JyFsr!GMgS*?9 z1dT}vrZ?Mpg4r>Y1IomPbX;{V0X#mx#Jgx%$LDDtiRPNB^l2%C;PHBpd7r?|40P!2W7bBg1FB({*3L#wRaSl1QbI3AN zZWZ5(7N|C4SC*U&2S<7Ufv|H=c+Pj*W_-7BEq)pM-X!umoutJ6BImd@QbF3ENVl{rgc^%zZB;>zR51i@EQGBt4TC55r>arTyCH&w0iS0Ak&z zvmH;yU5mM#p=qbj!daY@cNp&a@0Oo`zEkwOB{wzwrak@FgMPRC+R<-CzRRe$YhU?w zr{A!^|Au}Cm_w+@T@=9=Z;yT}iTxd?-<}BmUzC2=X#bV_DXUE6zjDzO{woJ5$oS7Y zKiZb7*Ag)#WVoUt5?-!5%z5r5VP}tco9+N557R}6ABYA@f(+xDlLi>Wu7T6(ZpyZ8 z`Dko860KYLO8cc#AHw0z_8db-Q^@)NY3|vUk9s0 z9?;1)!Ja+QSpwMiF?M}~c_ofUg8%%!?2EKP|2uot<1LLD7X?E*>wu}NfZ>YWrA|BN znOr2ymd31UMHd4FNB$r5sJ%>(V{2K}|5jI5&?{mBLE4{YUE;kekTD7tYzRR`DcFtN zGkPL8vH-9}AiT<|)iz^C;e&Xf?UWPSMcyaUOADky-d7a7 z#Abw%EL@!7kXZ7=;TgLlPQyEWiOU@rhJn6c~zsO~?sq}7*j1vIhl zUbLMG&vpGVlz#9kL`7rog?!vW5fU>tA753l9t9vfGa z;T|6st3N*;ymepp>k*^}rdMc$VziBj4wWxLVKzKIT(8T!BZBD4Idr$TdnCcg{YB%0 znuio^xQQFrPOBaCcX-bxalvij&sf%-UpW66zr6gKE?D?Od@=6$CZyXFjxPZKpkS1y z;KYU2fU58OkzU6NZf50-KZ)GsAUnw~)BY;*W8EgwF{mK13DU8mQ98Grj%V}a;VJ3q z2dAK?_W?1A>1pe)mY&{GMo%|SNKY}Ww?j{N7Sq#bPeo5js^306{S(q2c(^Y_uLOFz%~Rnt#;*L(E6oPK^olSR_c ze`MLo=;sX141~6@Z36n~38zfgIU)U|CBsKQKld)ApJNl#&lDy+i9Mku7puaptqX7# zp9`OjM7~EM)`grst&Kkne!jWXFsRmHLff&#gPg*4Oaompt-V9}>V4{Lzwb3O0=;$L z>;G3eQCtJYV)4EH$tg|76Zl?xu}H>b43y`m$oKks<$AqDXlaq_^~Zvv7lZK-maV~m zUK(-!+dKeN5=S)Nqw>SzD%CZz`yx4nGTbe#BOpr5Y7@9+yMaAL$uokZX>=}5xqm>e zF;UpD1PQ)ByH|WUm{Ctm$p4Hlt&Kkqj->cRb6JvWpXhrQUzL#R!t>l4?*2keMz+aB zurVO+Up%icTWHQ!&`j;$N-`fPCIZg5PS zS5pi@R%Kx3_zMezqqKvzIX?`Kzih3{wfq7yF2a~c@X-5Jc_zz0V~-y}5a*NI4l{Ub z>*dvf%8}vZ-x;W`3P@^>o6dqsbo5?KBAole{&TAEXLRp5l}Ka~$ye@|S$`7~ zQ}Ro$I^6i3)cYgO4;g(``;cAxsNHxBm(JbGP|!%@SoXWT*kNRtpvYB(8}|lp4x;JE z^iUOl+_a4SG~OTl>^6L9163bpK2>x%hAxo}_M|;}Z*X)cUWRs$a*VkB8#(Jf<^%0W zLTY?L)wt?pc=Z0@=vsCH*w^ldZ%VZ^avdI_vVH7Hd(M8l@db<$H;L}Nod|C`$iDF^ zZpP9pNyB~y{tHh^P}v@Nitu4y8M#i5S)It%5enzoQg?Q5SAY~lAA!lsG<3rXMZQDH zn<#R=e;(avt$Zb(RkNFTB`!ikkVouOuS3{fhu6`CS%;fZ*IftN%VZs1!xveH{Txln zIuPtd>+lV>r%`<5AJ|5&cpZ4IQL+v)`I2=ABd>e@Ls*D_w;WJ`)Gh4loF((#h@)(> z?sA}jS+d;%>_CC8!`<7}QrV6wNy+a7E_CzwZP`W~MKy0DcF3&CH)3#vclWN$cW^T< zQ=9QUP!QZ7hcR1kGvXq6Y9glO5TtMSM=v0`_43();7AmYBe_%+uJ{a&9P?M0gEGNe zDU&EP} zx|MH@wsIjoAd+|JHMMh#8pdSB_3Xo0#iFiL)&x>XWd3=V^s#$i7k|q5=p!@-fiMhh*-0MbT=OAA%b9+c~rcCqOk5@zO_FSGMkRoKqTMRw!( z(7BO(6E1(n!^R!KQOYwEY)1c@Xq0QO3Emo+SJ~$L1SzNGHc;?Lea{KKGkI?#KTR-s zp~dDJHALh}@|-+92Tw1}x@%=C%C>_XPH^VDPng?A+(J<4+_%%s(WnH-ch@al1iqgmMACy%8Mg#kb~s<+CmMRVQ2XvqoB- zgROJ!YjJP|G|;dDa>Hd2DDI=bk8(vD_n+8>Z{L&uGA}3d#WlQ&qC8-~9!sh<@e+{5==)>0xbFfmMSB{Kf(j&P0M05g+h-mT6$%@s`DU2{hjA%K%r;B@oHVFY_ZFN0}-=rT&H zW6|7XiHqj873~235ZyNBH%ZOL+``VzwmC=IW;|1viC^OPYVxQ0^Ta8HRryngwB3v6 zA-sV?pBJ||u%WpU>ff+O-yq1(-Ire~c`1B{gVS{T%M-mvz8uT*p#Zugclv4PTm1~E ziaFO-ew(--hVWLtn|eR4A?;zqaNcZ@8ZAK5e0xRP=)p`&IC$rdyRO90Zg1lFhL2uZ zJ6^k6#Kf>O7Cv~Wt#N6M5IM&>^ zWNSi$`X@kAZOwnf3$-;Lz&CEq;TJ1H`HM$#!+(wka~{R{#aIPAVX-@3gAm)+cnBBr z0Sb=1C;kop(_f+_NY|VeXG>LKHHg3TZ;<2v!&^UQx$*}VuJFg;H)fslpVGOc{S2=_A# ztpZCaj8w!e+c~T7RV)`!q{Vq~!lfGRLpwz?Wx_Z=ETpn=j4oN}%&r!?a$rgIY~~!m zWN)e=He4wqnG4`<0TnSeiGoF)T~=Iuegi#q0Ui6~Z!}#$DGyO8B(Ecg4-BY&eu?UykC zfh^ph-gqMtY#DFOUt7^y@o=kiZ)nbeA|OT@pAU|_2m;jVJW=>I+Cv}NDs;zs`&#p# zs0dZO(&9YI?Nq#%M*dZ5Jz4mD!qx+>*t<>q$K80xkIAWt>EJ4wyMVMr%IeU%2qYOv z*0|33nRnfmmTf?GDci_(FNaXxFW2bY)jz>wu)B{tg-GLgaQGFL$~D_|ZoyvBm@Cj@ zt`+hN@Zq<(Lc_-^gCiI5Tdoa45WL!!vxrCn5hq>~$>&IG?410eH1JitS0v{VRi@=qSLy_icTx$!s4n+z%)l%q{y}nUevGYxwas|NHemxy%t4HR{xjE{eK=f-kkH+Q1jaP2z<=ckNEa$qMAu|Pr+ z#Y16Do~{IJL(V}8G0t&vo$R;JNK3ww z9B03x(eOtNpAXxtMVK7_x{QE;7M;W~TCb&dybI-3K`O;doxjs(&EXRLGK z8-mhJa;|xi2$9eFg-Bis!PTGhVr0gXg#dnO{HGZGY~f|p*7G!SMKKh_Yfz9NIPShdpwMsv%AH41sF+uv@1^7xy3@c znF_jy{bf_a`u-ZQ2!bg>OZURazbpEG`88A~84*$qTv|9Fe zfDDj8{gzkLzwNvp0{d|u5eeJQf97mu)n0&o5xlke94y1-6~UW6&CazBjletMDWsOj z8>pW$*QmPB_+>)~VS+KnT-Yo@+_nZnTYrHhkyoN7zD)~`&gMqUH_ec|xOh(^GDN&Z z1Pv0QCdMQi>K z5I@DRzyMh2hf-hH09=)Y9W|z*JXUpg^VxyIV&JRV$7^P^<&jJnRbh*RoMiUXzP22E zC-&O4d!2D-_wWxsV~-y{D|>;a7sJmtWj->zZ>!z-Sf=)tnb2y6cT~8=GKWZ#vQM+r zlPq%PEi+jlj3Wx@UD+=ezKZ^3oMERGChYSH-Qq!UF7iZoTu(-M+VQTq| zHE!XSD|%Wu;XRVZ<)0$zv5K%SV$CC5QHWHL{J&Mhyi1!AZoCII#JLl0_{&GD1y0V> zII(DfgU0YqrOkya?uj)1H2eH|7~8K8T^G7O^vRtbJ@n;=!^xG5Lw9S_6YC82ncI34 z|2n&meLrX)RYf3i{#G%?#r5Oj&*<#LkRod2ty;Asf>x=vjx5mSE~7 zoV{SIVYs7&aX0r?+)dxKGBQx=SlBiN3)xjK!ABuX{!Tkmn|r0pLy?*g&H4UpbNO6As{%2GRPj0LfHjqzp7zu z{q?vb2|QCkZ${%96^|G=Px9Vv12?U3J%AjKx+1m{H0@EX}SkCWV$Hvq2c2dnKjx9|H5BlhaCB;hi~e6MMTvi zJNYD2v*xeZ3ApIxQZq+W7w?g;*a`u$9k?_?9tR5TTuI+1DGcI)sslP3C@_Ducf2_w z^Y!#Ujjy=c#dhA%&B#LfILvkpJLqmJU{ZfI^WW{po14&hW)*n%Wu)dNHVBvM)E)=z zneOaX^BCS(#o(0c^=duumeTy~mQ%gyab(E_kg=(xx8JL}pdAMYZv zi)zdSj)E=oX7daFTKsE|p3JNPEojO8TLc4>L15!qIo^AjS#Eej9`(byPlMYXgx@C_ zkmA33(Dy7dXpLbv1wwZLh9{5g@c5@9(-Ag9e;c>}({iK|x#~X1D9BNATeolf5+HZR3{x%*^ww!0T^|NQPT44T{Lr`$eL{tiAO%f+FAIk3A3&S&5qlB>DlfEhGwnJ+i& zTkq_?zTp6AoZgU427k9+7RXd`9YQdupF?Ox@`A9Tj!1q!e=91Ao_7ZjStM9u_MoFD zr#Y6L`;au?yo~e&G5|;j@>h)}HyuD_+JyXVTPwb#*1>xn$w_yitvAl&mC^qbO{r@1 zsZ*2m3d^@JYzj5rGqWQ>%d&r{!O-w(gW5dcZ`5i$&N*a` zMqp(-|NQWbdl*!Bez((nW+-Yu9dwA$ zZHU_n!1EcNA6T?2I26x*s2dRrV#5K*jTOF^%B~2%M_4eO2ZNsi`jJb7 zf40MDoq`~pu5wyFSMBVWPeauBi)YhZ6Q17kNFZlgv4;y48PLe=y*vd61Tbr4#s7%m zNQDRR?RHKY!YX}FWXiH2@{bQew`)~|By6h`3uL-LlW`FtfRSWB!aX3D zDC^r@v}~q$f_wg`;U9*83;QD!Gmr^ipy`p@wOmmoJRSgq{G;>@P(%}6XXf!dh0+)e z&hZIb`Bdq@JM~}l=a>Ck_^h)?@RfbhESTHMJ+Lzn%Vv^+`anzTau^dk0_j+yGdUFK zjmHM94gJZ^jaIB5e`1+rDv;ii==A+uz6Qd3BoYWMTiX$6Z(VV9VA;C%K*!q9n!vhM zD_5<)W|h?*Ua=|^2`n5;B|8@e7Iwvl7G_hiL|1Y^KTF5^yBDT2vCKeVemYQ7lZbDM zcE$!{oqd@twYAn#tEOgAZEYZ&UX$DuPp$6m*p#f0CtNN7>M;Hte#{lna%Vi;!9=*-0#->F8uUbXbrVQ zRyVI?{h5LD=lAz#(QM0-C2iSEd~-O_m#LXQ2v~4REP+{Bt!vk=Ub{qo*4HmgW%?Ip zu&_~lsqY*d1dKAhsk)_oJ&9y09_6z7U|mzQ8NcRSLC~)Q_-bnA=n{Oks5Vg2Viauw zF1le|^a@r_Wc&LEGbw39IwTr2pz)Hor46!}ZjN8;mZEZbEj@{%Hu*!kE2}3>U@qzG z;9x4APWL4f(awySY00d7h0ZLIa6tHwvYJ$b!@x+hUtp3#IUKLo6LP4L7Kk zJFz=3KD~fa3NPd*W?56y9qae%bYWnfz+owt@!%nwuBOJcWp)#a%}>|!|2Jgi8~$ii zYmOx@$XLn2c*5%L>yIz70#*&sBArYC4ZCUsvHnf5E$ILU%;j%bWZih9<^H;KX33j5 ziFi*e(>D~K8HjC2C;Nfw(VHqL6kmjl>@1F`;SB0CW6k0*LEy?_#76p1Hh210`v zPuHsKz=n9r+K}z;#-HR+Jk{Nw+!R=}IdC~KbZJ09GBYrzH#QVk&^A9*lQRR|$<#nB zgF&JV)6Y_Ck$PZVeuXq1MPD-kVbUG07T2(0T_j>%4)|S+MG)|Jsg>#Oie_r-uo?VI zqiYJ5)nvJKSb~eD-xzx6b%H(yV?Ef!=+wFpaFy~67o%O-WkSKC@l-02ls6!hy33;N z>26guI<=)qJb`0%OPh&PH5{uMz}j?r3EmCFHb=YSgPC5w;(QlNmBCmlldfCZjxk9s z1qyj(P*ZR*){hm|^g}S*G+$GrsqDlr2SB@kvudmxS0%$l;LuR4uRpe-KW@o}v9M+! zfS{yS2O0wh1F6=?x*R3rT~;P(4FDcMv3_B3@j%FY=}UC>XS?D7{Wsdz9gT19OJ~x7 z_~t<{8q~hviVM6S={V+0CTZdS@nnC1d(^_SG+2ezE&bI80L6F;D9f=}=}d}jB%a`y zqp?IH2{s6_lnxm36OI327Pt-e*txOnX{@V@bS$0@q~e3gR3^G1+mi}OY^KNj^QM?M9J|1C*9-#IgDypKS_gUU`W|SI@TRG#W3%IzRqYW z)``&o?43Zz_#Z|)LHX1x^K=6y(gTi{0P+jd2=vDKGf|LYASie@;DUih)BW-IV00iI z02L=O0sS0ErnUsS`?Kj@{e!R7@AQ^|4at6>T8ht9(P)3)02&(D5J+c|gX{o6Ol1u3 z<^xcZ9xOmtpcl)E)@26;`jWy916_Ssl5VV46!X~_X!p2ATIidVhz-Q+-IbDM)9kd5 zi`SlRbL4zM<~ui*KJ1QVV*RBLK~FIj zEKQ;duv2*&tE<3jXy<}T)ow}58OhmMz(M*3j z+7riq1j5vVs%aE0dJeG{FF-pK1;t9FJAqU}lj@-n^bZE4Z+CA2rMsf3blSJulHHl& zC*%;Cyi(*M;&5A1zW|_Rdj~opni2*S+PFSxZUblpP(

FgN#0w5u=0AJNM;V0Vjj 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

=6pzK4Z$qQuaC&6A$!_=Ti5?ivY}4tQ%bthr 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

a_vcO5(=B$rKOUoMSB* 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 G_5TCt2LYY{ From 123a6328b7bd31ed6725d9412913fed6a4436aad Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Mon, 11 Jul 2022 15:34:26 -0400 Subject: [PATCH 41/78] internal/trace: don't report regions on system goroutines If a goroutine is started within a user region, internal/trace assigns the child goroutine a nameless region for its entire lifetime which is assosciated the same task as the parent's region. This is not strictly necessary: a child goroutine is not necessarily related to the task unless it performs some task operation (in which case it will be associated with the task through the standard means). However, it can be quite handy to see child goroutines within a region, which may be child worker goroutines that you simply didn't perform task operations on. If the first GC occurs during a region, the GC worker goroutines will also inherit a child region. We know for sure that these aren't related to the task, so filter them out from the region list. Note that we can't exclude system goroutines from setting activeRegions in EvGoCreate handling, because we don't know the goroutine start function name until the first EvGoStart. Fixes #53784. Change-Id: Ic83d84e23858a8400a76d1ae2f1418ef49951178 Reviewed-on: https://go-review.googlesource.com/c/go/+/416858 Run-TryBot: Michael Pratt TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek --- src/cmd/trace/trace.go | 8 +------ src/internal/trace/goroutines.go | 37 ++++++++++++++++++++++++-------- src/runtime/traceback.go | 2 +- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go index 1cabc25ced..e6c4cca72e 100644 --- a/src/cmd/trace/trace.go +++ b/src/cmd/trace/trace.go @@ -571,7 +571,7 @@ func generateTrace(params *traceParams, consumer traceConsumer) error { fname := stk[0].Fn info.name = fmt.Sprintf("G%v %s", newG, fname) - info.isSystemG = isSystemGoroutine(fname) + info.isSystemG = trace.IsSystemGoroutine(fname) ctx.gcount++ setGState(ev, newG, gDead, gRunnable) @@ -1129,12 +1129,6 @@ func (ctx *traceContext) buildBranch(parent frameNode, stk []*trace.Frame) int { return ctx.buildBranch(node, stk) } -func isSystemGoroutine(entryFn string) bool { - // This mimics runtime.isSystemGoroutine as closely as - // possible. - return entryFn != "runtime.main" && strings.HasPrefix(entryFn, "runtime.") -} - // firstTimestamp returns the timestamp of the first event record. func firstTimestamp() int64 { res, _ := parseTrace() diff --git a/src/internal/trace/goroutines.go b/src/internal/trace/goroutines.go index a5fda489be..5da90e0b6d 100644 --- a/src/internal/trace/goroutines.go +++ b/src/internal/trace/goroutines.go @@ -4,7 +4,10 @@ package trace -import "sort" +import ( + "sort" + "strings" +) // GDesc contains statistics and execution details of a single goroutine. type GDesc struct { @@ -126,10 +129,17 @@ func (g *GDesc) finalize(lastTs, activeGCStartTime int64, trigger *Event) { finalStat := g.snapshotStat(lastTs, activeGCStartTime) g.GExecutionStat = finalStat - for _, s := range g.activeRegions { - s.End = trigger - s.GExecutionStat = finalStat.sub(s.GExecutionStat) - g.Regions = append(g.Regions, s) + + // System goroutines are never part of regions, even though they + // "inherit" a task due to creation (EvGoCreate) from within a region. + // This may happen e.g. if the first GC is triggered within a region, + // starting the GC worker goroutines. + if !IsSystemGoroutine(g.Name) { + for _, s := range g.activeRegions { + s.End = trigger + s.GExecutionStat = finalStat.sub(s.GExecutionStat) + g.Regions = append(g.Regions, s) + } } *(g.gdesc) = gdesc{} } @@ -158,10 +168,13 @@ func GoroutineStats(events []*Event) map[uint64]*GDesc { case EvGoCreate: g := &GDesc{ID: ev.Args[0], CreationTime: ev.Ts, gdesc: new(gdesc)} g.blockSchedTime = ev.Ts - // When a goroutine is newly created, inherit the - // task of the active region. For ease handling of - // this case, we create a fake region description with - // the task id. + // When a goroutine is newly created, inherit the task + // of the active region. For ease handling of this + // case, we create a fake region description with the + // task id. This isn't strictly necessary as this + // goroutine may not be assosciated with the task, but + // it can be convenient to see all children created + // during a region. if creatorG := gs[ev.G]; creatorG != nil && len(creatorG.gdesc.activeRegions) > 0 { regions := creatorG.gdesc.activeRegions s := regions[len(regions)-1] @@ -336,3 +349,9 @@ func RelatedGoroutines(events []*Event, goid uint64) map[uint64]bool { gmap[0] = true // for GC events return gmap } + +func IsSystemGoroutine(entryFn string) bool { + // This mimics runtime.isSystemGoroutine as closely as + // possible. + return entryFn != "runtime.main" && strings.HasPrefix(entryFn, "runtime.") +} diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 197683bc69..49147ff838 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -1120,7 +1120,7 @@ func tracebackHexdump(stk stack, frame *stkframe, bad uintptr) { // system (that is, the finalizer goroutine) is considered a user // goroutine. func isSystemGoroutine(gp *g, fixed bool) bool { - // Keep this in sync with cmd/trace/trace.go:isSystemGoroutine. + // Keep this in sync with internal/trace.IsSystemGoroutine. f := findfunc(gp.startpc) if !f.valid() { return false From 126c22a09824a7b52c019ed9a1d198b4e7781676 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 11 Jul 2022 19:10:00 +0200 Subject: [PATCH 42/78] syscall: gofmt after CL 412114 Change-Id: Ie51545eaebd22a31379bf8814a2c62b91d1d105b Reviewed-on: https://go-review.googlesource.com/c/go/+/416934 Reviewed-by: Michael Knyszek Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Auto-Submit: Tobias Klauser Run-TryBot: Tobias Klauser Auto-Submit: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/syscall/exec_linux.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index ede8247da9..554aad412d 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -43,8 +43,8 @@ type SysProcAttr struct { // the descriptor of the controlling TTY. // Unlike Setctty, in this case Ctty must be a descriptor // number in the parent process. - Foreground bool - Pgid int // Child's process group ID if Setpgid. + Foreground bool + Pgid int // Child's process group ID if Setpgid. // Pdeathsig, if non-zero, is a signal that the kernel will send to // the child process when the creating thread dies. Note that the signal // is sent on thread termination, which may happen before process termination. From d3d7998756c33f69706488cade1cd2b9b10a4c7f Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Mon, 11 Jul 2022 09:49:14 -0700 Subject: [PATCH 43/78] net/http: clarify that MaxBytesReader returns *MaxBytesError A MaxBytesReader returns a *MaxBytesError when reading beyond its limit, not a MaxBytesError. Fixes #53764. Change-Id: Icac3aeac96fd8b172f951241f8f111cda633752c Reviewed-on: https://go-review.googlesource.com/c/go/+/416914 Reviewed-by: Ian Lance Taylor Run-TryBot: Damien Neil TryBot-Result: Gopher Robot --- src/net/http/request.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/net/http/request.go b/src/net/http/request.go index d091f3c056..cead91d3d4 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -1126,8 +1126,8 @@ func readRequest(b *bufio.Reader) (req *Request, err error) { // MaxBytesReader is similar to io.LimitReader but is intended for // limiting the size of incoming request bodies. In contrast to // io.LimitReader, MaxBytesReader's result is a ReadCloser, returns a -// MaxBytesError for a Read beyond the limit, and closes the -// underlying reader when its Close method is called. +// non-nil error of type *MaxBytesError for a Read beyond the limit, +// and closes the underlying reader when its Close method is called. // // MaxBytesReader prevents clients from accidentally or maliciously // sending a large request and wasting server resources. If possible, From 913d05133c7fb3adfd2b1a34a47d635d8e072fa2 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 6 Jul 2022 13:21:34 -0400 Subject: [PATCH 44/78] cmd/go: avoid spurious readdir during fsys.Walk fsys.Walk is cloned from filepath.Walk, which has always handled a walk of a directory by reading the full directory before calling the callback on the directory itself. So if the callback returns fs.SkipDir, those entries are thrown away, but the expense of reading them was still incurred. (Worse, this is the expensive directory read that also calls Stat on every entry.) On machines with slow file system I/O, these reads are particularly annoying. For example, if I do go list m... there is a call to filepath.Walk that is told about $GOROOT/src/archive and responds by returning filepath.SkipDir because archive does not start with m, but it only gets the chance to do that after the archive directory has been read. (Same for all the other top-level directories.) Even something like go list github.com/foo/bar/... reads every top-level $GOPATH/src directory. When we designed filepath.WalkDir, one of the changes we made was to allow calling the callback twice for a directory: once before reading it, and then possibly again if the read produces an error (uncommon). This CL changes fsys.Walk to use that same model. None of the callbacks need changing, but now the $GOROOT/src/archive and other top-level directories won't be read when evaluating a pattern like 'm...'. For #53577. Fixes #53765. Change-Id: Idfa3b9e2cc335417bfd9d66dd584cb16f92bd12e Reviewed-on: https://go-review.googlesource.com/c/go/+/416179 Run-TryBot: Russ Cox Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot --- src/cmd/go/internal/fsys/fsys.go | 24 +++++++------------ src/cmd/go/testdata/script/fsys_walk.txt | 6 +++++ .../{list_permissions.txt => list_perm.txt} | 3 +-- src/cmd/go/testdata/script/mod_perm.txt | 23 ++++++++++++++++++ 4 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 src/cmd/go/testdata/script/fsys_walk.txt rename src/cmd/go/testdata/script/{list_permissions.txt => list_perm.txt} (99%) create mode 100644 src/cmd/go/testdata/script/mod_perm.txt diff --git a/src/cmd/go/internal/fsys/fsys.go b/src/cmd/go/internal/fsys/fsys.go index d96a290de5..0d7bef9112 100644 --- a/src/cmd/go/internal/fsys/fsys.go +++ b/src/cmd/go/internal/fsys/fsys.go @@ -464,28 +464,20 @@ func IsDirWithGoFiles(dir string) (bool, error) { // walk recursively descends path, calling walkFn. Copied, with some // modifications from path/filepath.walk. func walk(path string, info fs.FileInfo, walkFn filepath.WalkFunc) error { - if !info.IsDir() { - return walkFn(path, info, nil) + if err := walkFn(path, info, nil); err != nil || !info.IsDir() { + return err } - fis, readErr := ReadDir(path) - walkErr := walkFn(path, info, readErr) - // If readErr != nil, walk can't walk into this directory. - // walkErr != nil means walkFn want walk to skip this directory or stop walking. - // Therefore, if one of readErr and walkErr isn't nil, walk will return. - if readErr != nil || walkErr != nil { - // The caller's behavior is controlled by the return value, which is decided - // by walkFn. walkFn may ignore readErr and return nil. - // If walkFn returns SkipDir, it will be handled by the caller. - // So walk should return whatever walkFn returns. - return walkErr + fis, err := ReadDir(path) + if err != nil { + return walkFn(path, info, err) } for _, fi := range fis { filename := filepath.Join(path, fi.Name()) - if walkErr = walk(filename, fi, walkFn); walkErr != nil { - if !fi.IsDir() || walkErr != filepath.SkipDir { - return walkErr + if err := walk(filename, fi, walkFn); err != nil { + if !fi.IsDir() || err != filepath.SkipDir { + return err } } } diff --git a/src/cmd/go/testdata/script/fsys_walk.txt b/src/cmd/go/testdata/script/fsys_walk.txt new file mode 100644 index 0000000000..9d1a9451ff --- /dev/null +++ b/src/cmd/go/testdata/script/fsys_walk.txt @@ -0,0 +1,6 @@ +# Test that go list prefix... does not read directories not beginning with prefix. +env GODEBUG=gofsystrace=1 +go list m... +stderr mime +stderr mime[\\/]multipart +! stderr archive diff --git a/src/cmd/go/testdata/script/list_permissions.txt b/src/cmd/go/testdata/script/list_perm.txt similarity index 99% rename from src/cmd/go/testdata/script/list_permissions.txt rename to src/cmd/go/testdata/script/list_perm.txt index f65896ca14..3b850ef3cc 100644 --- a/src/cmd/go/testdata/script/list_permissions.txt +++ b/src/cmd/go/testdata/script/list_perm.txt @@ -11,12 +11,11 @@ stdout '^example.com/noread$' go list ./empty/... stderr 'matched no packages' -[root] stop # Root typically ignores file permissions. - # Make the directory ./noread unreadable, and verify that 'go list' reports an # explicit error for a pattern that should match it (rather than treating it as # equivalent to an empty directory). +[root] stop # Root typically ignores file permissions. [windows] skip # Does not have Unix-style directory permissions. [plan9] skip # Might not have Unix-style directory permissions. diff --git a/src/cmd/go/testdata/script/mod_perm.txt b/src/cmd/go/testdata/script/mod_perm.txt new file mode 100644 index 0000000000..f5382eceaf --- /dev/null +++ b/src/cmd/go/testdata/script/mod_perm.txt @@ -0,0 +1,23 @@ +# go list should work in ordinary conditions. +go list ./... +! stdout _data + +# skip in conditions where chmod 0 may not work. +# plan9 should be fine, but copied from list_perm.txt unchanged. +[root] skip +[windows] skip +[plan9] skip + +# go list should work with unreadable _data directory. +chmod 0 _data +go list ./... +! stdout _data + +-- go.mod -- +module m + +-- x.go -- +package m + +-- _data/x.go -- +package p From c4c1993fd2a5b26fe45c09592af6d3388a3b2e08 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 29 Mar 2022 15:52:09 -0700 Subject: [PATCH 45/78] encoding/xml: limit depth of nesting in unmarshal Prevent exhausting the stack limit when unmarshalling extremely deeply nested structures into nested types. Fixes #53611 Fixes CVE-2022-30633 Change-Id: Ic6c5d41674c93cfc9a316135a408db9156d39c59 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1421319 Reviewed-by: Damien Neil Reviewed-by: Julie Qiu Reviewed-on: https://go-review.googlesource.com/c/go/+/417061 Run-TryBot: Michael Knyszek Reviewed-by: Heschi Kreinick TryBot-Result: Gopher Robot --- src/encoding/xml/read.go | 27 +++++++++++++++++++-------- src/encoding/xml/read_test.go | 15 +++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/encoding/xml/read.go b/src/encoding/xml/read.go index 257591262f..01613065e3 100644 --- a/src/encoding/xml/read.go +++ b/src/encoding/xml/read.go @@ -152,7 +152,7 @@ func (d *Decoder) DecodeElement(v any, start *StartElement) error { if val.IsNil() { return errors.New("nil pointer passed to Unmarshal") } - return d.unmarshal(val.Elem(), start) + return d.unmarshal(val.Elem(), start, 0) } // An UnmarshalError represents an error in the unmarshaling process. @@ -308,8 +308,15 @@ var ( textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() ) +const maxUnmarshalDepth = 10000 + +var errExeceededMaxUnmarshalDepth = errors.New("exceeded max depth") + // Unmarshal a single XML element into val. -func (d *Decoder) unmarshal(val reflect.Value, start *StartElement) error { +func (d *Decoder) unmarshal(val reflect.Value, start *StartElement, depth int) error { + if depth >= maxUnmarshalDepth { + return errExeceededMaxUnmarshalDepth + } // Find start element if we need it. if start == nil { for { @@ -402,7 +409,7 @@ func (d *Decoder) unmarshal(val reflect.Value, start *StartElement) error { v.Set(reflect.Append(val, reflect.Zero(v.Type().Elem()))) // Recur to read element into slice. - if err := d.unmarshal(v.Index(n), start); err != nil { + if err := d.unmarshal(v.Index(n), start, depth+1); err != nil { v.SetLen(n) return err } @@ -525,13 +532,15 @@ Loop: case StartElement: consumed := false if sv.IsValid() { - consumed, err = d.unmarshalPath(tinfo, sv, nil, &t) + // unmarshalPath can call unmarshal, so we need to pass the depth through so that + // we can continue to enforce the maximum recusion limit. + consumed, err = d.unmarshalPath(tinfo, sv, nil, &t, depth) if err != nil { return err } if !consumed && saveAny.IsValid() { consumed = true - if err := d.unmarshal(saveAny, &t); err != nil { + if err := d.unmarshal(saveAny, &t, depth+1); err != nil { return err } } @@ -676,7 +685,7 @@ func copyValue(dst reflect.Value, src []byte) (err error) { // The consumed result tells whether XML elements have been consumed // from the Decoder until start's matching end element, or if it's // still untouched because start is uninteresting for sv's fields. -func (d *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) { +func (d *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement, depth int) (consumed bool, err error) { recurse := false Loop: for i := range tinfo.fields { @@ -691,7 +700,7 @@ Loop: } if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local { // It's a perfect match, unmarshal the field. - return true, d.unmarshal(finfo.value(sv, initNilPointers), start) + return true, d.unmarshal(finfo.value(sv, initNilPointers), start, depth+1) } if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local { // It's a prefix for the field. Break and recurse @@ -720,7 +729,9 @@ Loop: } switch t := tok.(type) { case StartElement: - consumed2, err := d.unmarshalPath(tinfo, sv, parents, &t) + // the recursion depth of unmarshalPath is limited to the path length specified + // by the struct field tag, so we don't increment the depth here. + consumed2, err := d.unmarshalPath(tinfo, sv, parents, &t, depth) if err != nil { return true, err } diff --git a/src/encoding/xml/read_test.go b/src/encoding/xml/read_test.go index 6ef55de77b..42059db3ae 100644 --- a/src/encoding/xml/read_test.go +++ b/src/encoding/xml/read_test.go @@ -5,6 +5,8 @@ package xml import ( + "bytes" + "errors" "io" "reflect" "strings" @@ -1094,3 +1096,16 @@ func TestUnmarshalIntoNil(t *testing.T) { } } + +func TestCVE202228131(t *testing.T) { + type nested struct { + Parent *nested `xml:",any"` + } + var n nested + err := Unmarshal(bytes.Repeat([]byte(""), maxUnmarshalDepth+1), &n) + if err == nil { + t.Fatal("Unmarshal did not fail") + } else if !errors.Is(err, errExeceededMaxUnmarshalDepth) { + t.Fatalf("Unmarshal unexpected error: got %q, want %q", err, errExeceededMaxUnmarshalDepth) + } +} From 08c46ed43d80bbb67cb904944ea3417989be4af3 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Mon, 28 Mar 2022 18:41:26 -0700 Subject: [PATCH 46/78] encoding/xml: use iterative Skip, rather than recursive Prevents exhausting the stack limit in _incredibly_ deeply nested structures. Fixes #53614 Fixes CVE-2022-28131 Change-Id: I47db4595ce10cecc29fbd06afce7b299868599e6 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1419912 Reviewed-by: Julie Qiu Reviewed-by: Damien Neil Reviewed-on: https://go-review.googlesource.com/c/go/+/417062 Run-TryBot: Michael Knyszek Reviewed-by: Heschi Kreinick TryBot-Result: Gopher Robot --- src/encoding/xml/read.go | 15 ++++++++------- src/encoding/xml/read_test.go | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/encoding/xml/read.go b/src/encoding/xml/read.go index 01613065e3..a6fb665458 100644 --- a/src/encoding/xml/read.go +++ b/src/encoding/xml/read.go @@ -747,12 +747,12 @@ Loop: } // Skip reads tokens until it has consumed the end element -// matching the most recent start element already consumed. -// It recurs if it encounters a start element, so it can be used to -// skip nested structures. +// matching the most recent start element already consumed, +// skipping nested structures. // It returns nil if it finds an end element matching the start // element; otherwise it returns an error describing the problem. func (d *Decoder) Skip() error { + var depth int64 for { tok, err := d.Token() if err != nil { @@ -760,11 +760,12 @@ func (d *Decoder) Skip() error { } switch tok.(type) { case StartElement: - if err := d.Skip(); err != nil { - return err - } + depth++ case EndElement: - return nil + if depth == 0 { + return nil + } + depth-- } } } diff --git a/src/encoding/xml/read_test.go b/src/encoding/xml/read_test.go index 42059db3ae..58d1eddb61 100644 --- a/src/encoding/xml/read_test.go +++ b/src/encoding/xml/read_test.go @@ -9,6 +9,7 @@ import ( "errors" "io" "reflect" + "runtime" "strings" "testing" "time" @@ -1109,3 +1110,19 @@ func TestCVE202228131(t *testing.T) { t.Fatalf("Unmarshal unexpected error: got %q, want %q", err, errExeceededMaxUnmarshalDepth) } } + +func TestCVE202230633(t *testing.T) { + if runtime.GOARCH == "wasm" { + t.Skip("causes memory exhaustion on js/wasm") + } + defer func() { + p := recover() + if p != nil { + t.Fatal("Unmarshal panicked") + } + }() + var example struct { + Things []string + } + Unmarshal(bytes.Repeat([]byte(""), 17_000_000), &example) +} From 695be961d57508da5a82217f7415200a11845879 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Wed, 15 Jun 2022 10:43:05 -0700 Subject: [PATCH 47/78] go/parser: limit recursion depth Limit nested parsing to 100,000, which prevents stack exhaustion when parsing deeply nested statements, types, and expressions. Also limit the scope depth to 1,000 during object resolution. Thanks to Juho Nurminen of Mattermost for reporting this issue. Fixes #53616 Fixes CVE-2022-1962 Change-Id: I4d7b86c1d75d0bf3c7af1fdea91582aa74272c64 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1491025 Reviewed-by: Russ Cox Reviewed-by: Damien Neil Reviewed-on: https://go-review.googlesource.com/c/go/+/417063 Run-TryBot: Michael Knyszek Reviewed-by: Heschi Kreinick TryBot-Result: Gopher Robot --- src/go/parser/interface.go | 10 ++- src/go/parser/parser.go | 54 ++++++++++- src/go/parser/parser_test.go | 169 +++++++++++++++++++++++++++++++++++ src/go/parser/resolver.go | 9 +- 4 files changed, 234 insertions(+), 8 deletions(-) diff --git a/src/go/parser/interface.go b/src/go/parser/interface.go index e3468f481f..d911c8e1d0 100644 --- a/src/go/parser/interface.go +++ b/src/go/parser/interface.go @@ -94,8 +94,11 @@ func ParseFile(fset *token.FileSet, filename string, src any, mode Mode) (f *ast defer func() { if e := recover(); e != nil { // resume same panic if it's not a bailout - if _, ok := e.(bailout); !ok { + bail, ok := e.(bailout) + if !ok { panic(e) + } else if bail.msg != "" { + p.errors.Add(p.file.Position(bail.pos), bail.msg) } } @@ -198,8 +201,11 @@ func ParseExprFrom(fset *token.FileSet, filename string, src any, mode Mode) (ex defer func() { if e := recover(); e != nil { // resume same panic if it's not a bailout - if _, ok := e.(bailout); !ok { + bail, ok := e.(bailout) + if !ok { panic(e) + } else if bail.msg != "" { + p.errors.Add(p.file.Position(bail.pos), bail.msg) } } p.errors.Sort() diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index ca2f24c8b8..d4ad36dc67 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -59,6 +59,10 @@ type parser struct { inRhs bool // if set, the parser is parsing a rhs expression imports []*ast.ImportSpec // list of imports + + // nestLev is used to track and limit the recursion depth + // during parsing. + nestLev int } func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode Mode) { @@ -108,6 +112,24 @@ func un(p *parser) { p.printTrace(")") } +// maxNestLev is the deepest we're willing to recurse during parsing +const maxNestLev int = 1e5 + +func incNestLev(p *parser) *parser { + p.nestLev++ + if p.nestLev > maxNestLev { + p.error(p.pos, "exceeded max nesting depth") + panic(bailout{}) + } + return p +} + +// decNestLev is used to track nesting depth during parsing to prevent stack exhaustion. +// It is used along with incNestLev in a similar fashion to how un and trace are used. +func decNestLev(p *parser) { + p.nestLev-- +} + // Advance to the next token. func (p *parser) next0() { // Because of one-token look-ahead, print the previous token @@ -218,8 +240,12 @@ func (p *parser) next() { } } -// A bailout panic is raised to indicate early termination. -type bailout struct{} +// A bailout panic is raised to indicate early termination. pos and msg are +// only populated when bailing out of object resolution. +type bailout struct { + pos token.Pos + msg string +} func (p *parser) error(pos token.Pos, msg string) { if p.trace { @@ -1247,6 +1273,8 @@ func (p *parser) parseTypeInstance(typ ast.Expr) ast.Expr { } func (p *parser) tryIdentOrType() ast.Expr { + defer decNestLev(incNestLev(p)) + switch p.tok { case token.IDENT: typ := p.parseTypeName(nil) @@ -1657,7 +1685,13 @@ func (p *parser) parsePrimaryExpr(x ast.Expr) ast.Expr { if x == nil { x = p.parseOperand() } - for { + // We track the nesting here rather than at the entry for the function, + // since it can iteratively produce a nested output, and we want to + // limit how deep a structure we generate. + var n int + defer func() { p.nestLev -= n }() + for n = 1; ; n++ { + incNestLev(p) switch p.tok { case token.PERIOD: p.next() @@ -1717,6 +1751,8 @@ func (p *parser) parsePrimaryExpr(x ast.Expr) ast.Expr { } func (p *parser) parseUnaryExpr() ast.Expr { + defer decNestLev(incNestLev(p)) + if p.trace { defer un(trace(p, "UnaryExpr")) } @@ -1806,7 +1842,13 @@ func (p *parser) parseBinaryExpr(x ast.Expr, prec1 int, check bool) ast.Expr { if x == nil { x = p.parseUnaryExpr() } - for { + // We track the nesting here rather than at the entry for the function, + // since it can iteratively produce a nested output, and we want to + // limit how deep a structure we generate. + var n int + defer func() { p.nestLev -= n }() + for n = 1; ; n++ { + incNestLev(p) op, oprec := p.tokPrec() if oprec < prec1 { return x @@ -2099,6 +2141,8 @@ func (p *parser) parseIfHeader() (init ast.Stmt, cond ast.Expr) { } func (p *parser) parseIfStmt() *ast.IfStmt { + defer decNestLev(incNestLev(p)) + if p.trace { defer un(trace(p, "IfStmt")) } @@ -2402,6 +2446,8 @@ func (p *parser) parseForStmt() ast.Stmt { } func (p *parser) parseStmt() (s ast.Stmt) { + defer decNestLev(incNestLev(p)) + if p.trace { defer un(trace(p, "Statement")) } diff --git a/src/go/parser/parser_test.go b/src/go/parser/parser_test.go index a4f882d368..1a46c87866 100644 --- a/src/go/parser/parser_test.go +++ b/src/go/parser/parser_test.go @@ -10,6 +10,7 @@ import ( "go/ast" "go/token" "io/fs" + "runtime" "strings" "testing" ) @@ -577,3 +578,171 @@ type x int // comment t.Errorf("got %q, want %q", comment, "// comment") } } + +var parseDepthTests = []struct { + name string + format string + // multipler is used when a single statement may result in more than one + // change in the depth level, for instance "1+(..." produces a BinaryExpr + // followed by a UnaryExpr, which increments the depth twice. The test + // case comment explains which nodes are triggering the multiple depth + // changes. + parseMultiplier int + // scope is true if we should also test the statement for the resolver scope + // depth limit. + scope bool + // scopeMultiplier does the same as parseMultiplier, but for the scope + // depths. + scopeMultiplier int +}{ + // The format expands the part inside « » many times. + // A second set of brackets nested inside the first stops the repetition, + // so that for example «(«1»)» expands to (((...((((1))))...))). + {name: "array", format: "package main; var x «[1]»int"}, + {name: "slice", format: "package main; var x «[]»int"}, + {name: "struct", format: "package main; var x «struct { X «int» }»", scope: true}, + {name: "pointer", format: "package main; var x «*»int"}, + {name: "func", format: "package main; var x «func()»int", scope: true}, + {name: "chan", format: "package main; var x «chan »int"}, + {name: "chan2", format: "package main; var x «<-chan »int"}, + {name: "interface", format: "package main; var x «interface { M() «int» }»", scope: true, scopeMultiplier: 2}, // Scopes: InterfaceType, FuncType + {name: "map", format: "package main; var x «map[int]»int"}, + {name: "slicelit", format: "package main; var x = «[]any{«»}»", parseMultiplier: 2}, // Parser nodes: UnaryExpr, CompositeLit + {name: "arraylit", format: "package main; var x = «[1]any{«nil»}»", parseMultiplier: 2}, // Parser nodes: UnaryExpr, CompositeLit + {name: "structlit", format: "package main; var x = «struct{x any}{«nil»}»", parseMultiplier: 2}, // Parser nodes: UnaryExpr, CompositeLit + {name: "maplit", format: "package main; var x = «map[int]any{1:«nil»}»", parseMultiplier: 2}, // Parser nodes: CompositeLit, KeyValueExpr + {name: "dot", format: "package main; var x = «x.»x"}, + {name: "index", format: "package main; var x = x«[1]»"}, + {name: "slice", format: "package main; var x = x«[1:2]»"}, + {name: "slice3", format: "package main; var x = x«[1:2:3]»"}, + {name: "dottype", format: "package main; var x = x«.(any)»"}, + {name: "callseq", format: "package main; var x = x«()»"}, + {name: "methseq", format: "package main; var x = x«.m()»", parseMultiplier: 2}, // Parser nodes: SelectorExpr, CallExpr + {name: "binary", format: "package main; var x = «1+»1"}, + {name: "binaryparen", format: "package main; var x = «1+(«1»)»", parseMultiplier: 2}, // Parser nodes: BinaryExpr, ParenExpr + {name: "unary", format: "package main; var x = «^»1"}, + {name: "addr", format: "package main; var x = «& »x"}, + {name: "star", format: "package main; var x = «*»x"}, + {name: "recv", format: "package main; var x = «<-»x"}, + {name: "call", format: "package main; var x = «f(«1»)»", parseMultiplier: 2}, // Parser nodes: Ident, CallExpr + {name: "conv", format: "package main; var x = «(*T)(«1»)»", parseMultiplier: 2}, // Parser nodes: ParenExpr, CallExpr + {name: "label", format: "package main; func main() { «Label:» }"}, + {name: "if", format: "package main; func main() { «if true { «» }»}", parseMultiplier: 2, scope: true, scopeMultiplier: 2}, // Parser nodes: IfStmt, BlockStmt. Scopes: IfStmt, BlockStmt + {name: "ifelse", format: "package main; func main() { «if true {} else » {} }", scope: true}, + {name: "switch", format: "package main; func main() { «switch { default: «» }»}", scope: true, scopeMultiplier: 2}, // Scopes: TypeSwitchStmt, CaseClause + {name: "typeswitch", format: "package main; func main() { «switch x.(type) { default: «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: TypeSwitchStmt, CaseClause + {name: "for0", format: "package main; func main() { «for { «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: ForStmt, BlockStmt + {name: "for1", format: "package main; func main() { «for x { «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: ForStmt, BlockStmt + {name: "for3", format: "package main; func main() { «for f(); g(); h() { «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: ForStmt, BlockStmt + {name: "forrange0", format: "package main; func main() { «for range x { «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: RangeStmt, BlockStmt + {name: "forrange1", format: "package main; func main() { «for x = range z { «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: RangeStmt, BlockStmt + {name: "forrange2", format: "package main; func main() { «for x, y = range z { «» }» }", scope: true, scopeMultiplier: 2}, // Scopes: RangeStmt, BlockStmt + {name: "go", format: "package main; func main() { «go func() { «» }()» }", parseMultiplier: 2, scope: true}, // Parser nodes: GoStmt, FuncLit + {name: "defer", format: "package main; func main() { «defer func() { «» }()» }", parseMultiplier: 2, scope: true}, // Parser nodes: DeferStmt, FuncLit + {name: "select", format: "package main; func main() { «select { default: «» }» }", scope: true}, +} + +// split splits pre«mid»post into pre, mid, post. +// If the string does not have that form, split returns x, "", "". +func split(x string) (pre, mid, post string) { + start, end := strings.Index(x, "«"), strings.LastIndex(x, "»") + if start < 0 || end < 0 { + return x, "", "" + } + return x[:start], x[start+len("«") : end], x[end+len("»"):] +} + +func TestParseDepthLimit(t *testing.T) { + if runtime.GOARCH == "wasm" { + t.Skip("causes call stack exhaustion on js/wasm") + } + for _, tt := range parseDepthTests { + for _, size := range []string{"small", "big"} { + t.Run(tt.name+"/"+size, func(t *testing.T) { + n := maxNestLev + 1 + if tt.parseMultiplier > 0 { + n /= tt.parseMultiplier + } + if size == "small" { + // Decrease the number of statements by 10, in order to check + // that we do not fail when under the limit. 10 is used to + // provide some wiggle room for cases where the surrounding + // scaffolding syntax adds some noise to the depth that changes + // on a per testcase basis. + n -= 10 + } + + pre, mid, post := split(tt.format) + if strings.Contains(mid, "«") { + left, base, right := split(mid) + mid = strings.Repeat(left, n) + base + strings.Repeat(right, n) + } else { + mid = strings.Repeat(mid, n) + } + input := pre + mid + post + + fset := token.NewFileSet() + _, err := ParseFile(fset, "", input, ParseComments|SkipObjectResolution) + if size == "small" { + if err != nil { + t.Errorf("ParseFile(...): %v (want success)", err) + } + } else { + expected := "exceeded max nesting depth" + if err == nil || !strings.HasSuffix(err.Error(), expected) { + t.Errorf("ParseFile(...) = _, %v, want %q", err, expected) + } + } + }) + } + } +} + +func TestScopeDepthLimit(t *testing.T) { + if runtime.GOARCH == "wasm" { + t.Skip("causes call stack exhaustion on js/wasm") + } + for _, tt := range parseDepthTests { + if !tt.scope { + continue + } + for _, size := range []string{"small", "big"} { + t.Run(tt.name+"/"+size, func(t *testing.T) { + n := maxScopeDepth + 1 + if tt.scopeMultiplier > 0 { + n /= tt.scopeMultiplier + } + if size == "small" { + // Decrease the number of statements by 10, in order to check + // that we do not fail when under the limit. 10 is used to + // provide some wiggle room for cases where the surrounding + // scaffolding syntax adds some noise to the depth that changes + // on a per testcase basis. + n -= 10 + } + + pre, mid, post := split(tt.format) + if strings.Contains(mid, "«") { + left, base, right := split(mid) + mid = strings.Repeat(left, n) + base + strings.Repeat(right, n) + } else { + mid = strings.Repeat(mid, n) + } + input := pre + mid + post + + fset := token.NewFileSet() + _, err := ParseFile(fset, "", input, DeclarationErrors) + if size == "small" { + if err != nil { + t.Errorf("ParseFile(...): %v (want success)", err) + } + } else { + expected := "exceeded max scope depth during object resolution" + if err == nil || !strings.HasSuffix(err.Error(), expected) { + t.Errorf("ParseFile(...) = _, %v, want %q", err, expected) + } + } + }) + } + } +} diff --git a/src/go/parser/resolver.go b/src/go/parser/resolver.go index 767a5e20ad..f8ff618eba 100644 --- a/src/go/parser/resolver.go +++ b/src/go/parser/resolver.go @@ -54,6 +54,8 @@ func resolveFile(file *ast.File, handle *token.File, declErr func(token.Pos, str file.Unresolved = r.unresolved[0:i] } +const maxScopeDepth int = 1e3 + type resolver struct { handle *token.File declErr func(token.Pos, string) @@ -85,16 +87,19 @@ func (r *resolver) sprintf(format string, args ...any) string { } func (r *resolver) openScope(pos token.Pos) { + r.depth++ + if r.depth > maxScopeDepth { + panic(bailout{pos: pos, msg: "exceeded max scope depth during object resolution"}) + } if debugResolve { r.trace("opening scope @%v", pos) - r.depth++ } r.topScope = ast.NewScope(r.topScope) } func (r *resolver) closeScope() { + r.depth-- if debugResolve { - r.depth-- r.trace("closing scope") } r.topScope = r.topScope.Outer From 6fa37e98ea4382bf881428ee0c150ce591500eb7 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 7 Jun 2022 13:00:43 -0700 Subject: [PATCH 48/78] encoding/gob: add a depth limit for ignored fields Enforce a nesting limit of 10,000 for ignored fields during decoding of messages. This prevents the possibility of triggering stack exhaustion. Fixes #53615 Fixes CVE-2022-30635 Change-Id: I05103d06dd5ca3945fcba3c1f5d3b5a645e8fb0f Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1484771 Reviewed-by: Damien Neil Reviewed-by: Tatiana Bradley Reviewed-on: https://go-review.googlesource.com/c/go/+/417064 Reviewed-by: Heschi Kreinick TryBot-Result: Gopher Robot Reviewed-by: Tatiana Bradley Run-TryBot: Michael Knyszek --- src/encoding/gob/decode.go | 19 ++++++++++++------- src/encoding/gob/gobencdec_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/encoding/gob/decode.go b/src/encoding/gob/decode.go index 34f302a5cf..eea2924f1a 100644 --- a/src/encoding/gob/decode.go +++ b/src/encoding/gob/decode.go @@ -871,8 +871,13 @@ func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProg return &op } +var maxIgnoreNestingDepth = 10000 + // decIgnoreOpFor returns the decoding op for a field that has no destination. -func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp { +func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp, depth int) *decOp { + if depth > maxIgnoreNestingDepth { + error_(errors.New("invalid nesting depth")) + } // If this type is already in progress, it's a recursive type (e.g. map[string]*T). // Return the pointer to the op we're already building. if opPtr := inProgress[wireId]; opPtr != nil { @@ -896,7 +901,7 @@ func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) errorf("bad data: undefined type %s", wireId.string()) case wire.ArrayT != nil: elemId := wire.ArrayT.Elem - elemOp := dec.decIgnoreOpFor(elemId, inProgress) + elemOp := dec.decIgnoreOpFor(elemId, inProgress, depth+1) op = func(i *decInstr, state *decoderState, value reflect.Value) { state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len) } @@ -904,15 +909,15 @@ func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) case wire.MapT != nil: keyId := dec.wireType[wireId].MapT.Key elemId := dec.wireType[wireId].MapT.Elem - keyOp := dec.decIgnoreOpFor(keyId, inProgress) - elemOp := dec.decIgnoreOpFor(elemId, inProgress) + keyOp := dec.decIgnoreOpFor(keyId, inProgress, depth+1) + elemOp := dec.decIgnoreOpFor(elemId, inProgress, depth+1) op = func(i *decInstr, state *decoderState, value reflect.Value) { state.dec.ignoreMap(state, *keyOp, *elemOp) } case wire.SliceT != nil: elemId := wire.SliceT.Elem - elemOp := dec.decIgnoreOpFor(elemId, inProgress) + elemOp := dec.decIgnoreOpFor(elemId, inProgress, depth+1) op = func(i *decInstr, state *decoderState, value reflect.Value) { state.dec.ignoreSlice(state, *elemOp) } @@ -1073,7 +1078,7 @@ func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *de func (dec *Decoder) compileIgnoreSingle(remoteId typeId) *decEngine { engine := new(decEngine) engine.instr = make([]decInstr, 1) // one item - op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp)) + op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp), 0) ovfl := overflow(dec.typeString(remoteId)) engine.instr[0] = decInstr{*op, 0, nil, ovfl} engine.numInstr = 1 @@ -1118,7 +1123,7 @@ func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEn localField, present := srt.FieldByName(wireField.Name) // TODO(r): anonymous names if !present || !isExported(wireField.Name) { - op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp)) + op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp), 0) engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl} continue } diff --git a/src/encoding/gob/gobencdec_test.go b/src/encoding/gob/gobencdec_test.go index 1d5dde22a4..3d49887c01 100644 --- a/src/encoding/gob/gobencdec_test.go +++ b/src/encoding/gob/gobencdec_test.go @@ -12,6 +12,7 @@ import ( "fmt" "io" "net" + "reflect" "strings" "testing" "time" @@ -796,3 +797,26 @@ func TestNetIP(t *testing.T) { t.Errorf("decoded to %v, want 1.2.3.4", ip.String()) } } + +func TestIngoreDepthLimit(t *testing.T) { + // We don't test the actual depth limit because it requires building an + // extremely large message, which takes quite a while. + oldNestingDepth := maxIgnoreNestingDepth + maxIgnoreNestingDepth = 100 + defer func() { maxIgnoreNestingDepth = oldNestingDepth }() + b := new(bytes.Buffer) + enc := NewEncoder(b) + typ := reflect.TypeOf(int(0)) + nested := reflect.ArrayOf(1, typ) + for i := 0; i < 100; i++ { + nested = reflect.ArrayOf(1, nested) + } + badStruct := reflect.New(reflect.StructOf([]reflect.StructField{{Name: "F", Type: nested}})) + enc.Encode(badStruct.Interface()) + dec := NewDecoder(b) + var output struct{ Hello int } + expectedErr := "invalid nesting depth" + if err := dec.Decode(&output); err == nil || err.Error() != expectedErr { + t.Errorf("Decode didn't fail with depth limit of 100: want %q, got %q", expectedErr, err) + } +} From fa2d41d0ca736f3ad6b200b2a4e134364e9acc59 Mon Sep 17 00:00:00 2001 From: Julie Qiu Date: Thu, 23 Jun 2022 23:17:53 +0000 Subject: [PATCH 49/78] io/fs: fix stack exhaustion in Glob A limit is added to the number of path separators allowed by an input to Glob, to prevent stack exhaustion issues. Thanks to Juho Nurminen of Mattermost who reported a similar issue in path/filepath. Fixes CVE-2022-30630 Fixes golang/go#53415 Change-Id: I5a9d02591fed90cd3d52627f5945f1301e53465d Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1497588 Reviewed-by: Roland Shoemaker Reviewed-on: https://go-review.googlesource.com/c/go/+/417065 Run-TryBot: Michael Knyszek TryBot-Result: Gopher Robot Reviewed-by: Heschi Kreinick --- src/io/fs/glob.go | 14 ++++++++++++-- src/io/fs/glob_test.go | 10 ++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/io/fs/glob.go b/src/io/fs/glob.go index 45d9cb61b9..0e529cd05d 100644 --- a/src/io/fs/glob.go +++ b/src/io/fs/glob.go @@ -31,6 +31,16 @@ type GlobFS interface { // Otherwise, Glob uses ReadDir to traverse the directory tree // and look for matches for the pattern. func Glob(fsys FS, pattern string) (matches []string, err error) { + return globWithLimit(fsys, pattern, 0) +} + +func globWithLimit(fsys FS, pattern string, depth int) (matches []string, err error) { + // This limit is added to prevent stack exhaustion issues. See + // CVE-2022-30630. + const pathSeparatorsLimit = 10000 + if depth > pathSeparatorsLimit { + return nil, path.ErrBadPattern + } if fsys, ok := fsys.(GlobFS); ok { return fsys.Glob(pattern) } @@ -59,9 +69,9 @@ func Glob(fsys FS, pattern string) (matches []string, err error) { } var m []string - m, err = Glob(fsys, dir) + m, err = globWithLimit(fsys, dir, depth+1) if err != nil { - return + return nil, err } for _, d := range m { matches, err = glob(fsys, d, file, matches) diff --git a/src/io/fs/glob_test.go b/src/io/fs/glob_test.go index f19bebed77..d052eab371 100644 --- a/src/io/fs/glob_test.go +++ b/src/io/fs/glob_test.go @@ -8,6 +8,7 @@ import ( . "io/fs" "os" "path" + "strings" "testing" ) @@ -55,6 +56,15 @@ func TestGlobError(t *testing.T) { } } +func TestCVE202230630(t *testing.T) { + // Prior to CVE-2022-30630, a stack exhaustion would occur given a large + // number of separators. There is now a limit of 10,000. + _, err := Glob(os.DirFS("."), "/*"+strings.Repeat("/", 10001)) + if err != path.ErrBadPattern { + t.Fatalf("Glob returned err=%v, want %v", err, path.ErrBadPattern) + } +} + // contains reports whether vector contains the string s. func contains(vector []string, s string) bool { for _, elem := range vector { From ac68c6c683409f98250d34ad282b9e1b0c9095ef Mon Sep 17 00:00:00 2001 From: Julie Qiu Date: Thu, 23 Jun 2022 23:18:56 +0000 Subject: [PATCH 50/78] path/filepath: fix stack exhaustion in Glob A limit is added to the number of path separators allowed by an input to Glob, to prevent stack exhaustion issues. Thanks to Juho Nurminen of Mattermost who reported the issue. Fixes CVE-2022-30632 Fixes #53416 Change-Id: I1b9fd4faa85411a05dbc91dceae1c0c8eb021f07 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1498176 Reviewed-by: Roland Shoemaker Reviewed-on: https://go-review.googlesource.com/c/go/+/417066 Reviewed-by: Heschi Kreinick TryBot-Result: Gopher Robot Run-TryBot: Michael Knyszek --- src/path/filepath/match.go | 12 +++++++++++- src/path/filepath/match_test.go | 10 ++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/path/filepath/match.go b/src/path/filepath/match.go index 847a78133d..b5cc4b8cf3 100644 --- a/src/path/filepath/match.go +++ b/src/path/filepath/match.go @@ -240,6 +240,16 @@ func getEsc(chunk string) (r rune, nchunk string, err error) { // The only possible returned error is ErrBadPattern, when pattern // is malformed. func Glob(pattern string) (matches []string, err error) { + return globWithLimit(pattern, 0) +} + +func globWithLimit(pattern string, depth int) (matches []string, err error) { + // This limit is used prevent stack exhaustion issues. See CVE-2022-30632. + const pathSeparatorsLimit = 10000 + if depth == pathSeparatorsLimit { + return nil, ErrBadPattern + } + // Check pattern is well-formed. if _, err := Match(pattern, ""); err != nil { return nil, err @@ -269,7 +279,7 @@ func Glob(pattern string) (matches []string, err error) { } var m []string - m, err = Glob(dir) + m, err = globWithLimit(dir, depth+1) if err != nil { return } diff --git a/src/path/filepath/match_test.go b/src/path/filepath/match_test.go index 375c41a7e9..d6282596fe 100644 --- a/src/path/filepath/match_test.go +++ b/src/path/filepath/match_test.go @@ -155,6 +155,16 @@ func TestGlob(t *testing.T) { } } +func TestCVE202230632(t *testing.T) { + // Prior to CVE-2022-30632, this would cause a stack exhaustion given a + // large number of separators (more than 4,000,000). There is now a limit + // of 10,000. + _, err := Glob("/*" + strings.Repeat("/", 10001)) + if err != ErrBadPattern { + t.Fatalf("Glob returned err=%v, want ErrBadPattern", err) + } +} + func TestGlobError(t *testing.T) { bad := []string{`[]`, `nonexist/[]`} for _, pattern := range bad { From b2b8872c876201eac2d0707276c6999ff3eb185e Mon Sep 17 00:00:00 2001 From: Tatiana Bradley Date: Fri, 6 May 2022 11:25:06 -0400 Subject: [PATCH 51/78] compress/gzip: fix stack exhaustion bug in Reader.Read Replace recursion with iteration in Reader.Read to avoid stack exhaustion when there are a large number of files. Fixes CVE-2022-30631 Fixes #53168 Change-Id: I47d8afe3f2d40b0213ab61431df9b221794dbfe0 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1455673 Reviewed-by: Roland Shoemaker Reviewed-by: Julie Qiu Reviewed-on: https://go-review.googlesource.com/c/go/+/417067 Reviewed-by: Heschi Kreinick Run-TryBot: Michael Knyszek TryBot-Result: Gopher Robot --- src/compress/gzip/gunzip.go | 66 ++++++++++++++++---------------- src/compress/gzip/gunzip_test.go | 16 ++++++++ 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/src/compress/gzip/gunzip.go b/src/compress/gzip/gunzip.go index aa6780f847..ba8de97e6a 100644 --- a/src/compress/gzip/gunzip.go +++ b/src/compress/gzip/gunzip.go @@ -248,42 +248,40 @@ func (z *Reader) Read(p []byte) (n int, err error) { return 0, z.err } - n, z.err = z.decompressor.Read(p) - z.digest = crc32.Update(z.digest, crc32.IEEETable, p[:n]) - z.size += uint32(n) - if z.err != io.EOF { - // In the normal case we return here. - return n, z.err + for n == 0 { + n, z.err = z.decompressor.Read(p) + z.digest = crc32.Update(z.digest, crc32.IEEETable, p[:n]) + z.size += uint32(n) + if z.err != io.EOF { + // In the normal case we return here. + return n, z.err + } + + // Finished file; check checksum and size. + if _, err := io.ReadFull(z.r, z.buf[:8]); err != nil { + z.err = noEOF(err) + return n, z.err + } + digest := le.Uint32(z.buf[:4]) + size := le.Uint32(z.buf[4:8]) + if digest != z.digest || size != z.size { + z.err = ErrChecksum + return n, z.err + } + z.digest, z.size = 0, 0 + + // File is ok; check if there is another. + if !z.multistream { + return n, io.EOF + } + z.err = nil // Remove io.EOF + + if _, z.err = z.readHeader(); z.err != nil { + return n, z.err + } } - // Finished file; check checksum and size. - if _, err := io.ReadFull(z.r, z.buf[:8]); err != nil { - z.err = noEOF(err) - return n, z.err - } - digest := le.Uint32(z.buf[:4]) - size := le.Uint32(z.buf[4:8]) - if digest != z.digest || size != z.size { - z.err = ErrChecksum - return n, z.err - } - z.digest, z.size = 0, 0 - - // File is ok; check if there is another. - if !z.multistream { - return n, io.EOF - } - z.err = nil // Remove io.EOF - - if _, z.err = z.readHeader(); z.err != nil { - return n, z.err - } - - // Read from next file, if necessary. - if n > 0 { - return n, nil - } - return z.Read(p) + return n, nil } // Close closes the Reader. It does not close the underlying io.Reader. diff --git a/src/compress/gzip/gunzip_test.go b/src/compress/gzip/gunzip_test.go index be69185463..3309ff6195 100644 --- a/src/compress/gzip/gunzip_test.go +++ b/src/compress/gzip/gunzip_test.go @@ -569,3 +569,19 @@ func TestTruncatedStreams(t *testing.T) { } } } + +func TestCVE202230631(t *testing.T) { + var empty = []byte{0x1f, 0x8b, 0x08, 0x00, 0xa7, 0x8f, 0x43, 0x62, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + r := bytes.NewReader(bytes.Repeat(empty, 4e6)) + z, err := NewReader(r) + if err != nil { + t.Fatalf("NewReader: got %v, want nil", err) + } + // Prior to CVE-2022-30631 fix, this would cause an unrecoverable panic due + // to stack exhaustion. + _, err = z.Read(make([]byte, 10)) + if err != io.EOF { + t.Errorf("Reader.Read: got %v, want %v", err, io.EOF) + } +} From 27794c4d4a18c61d8c158d253421d72b5a6a8673 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 28 Jun 2022 18:15:32 -0700 Subject: [PATCH 52/78] cmd/go/internal/modload: ignore disallowed errors when checking for updates addUpdate calls Query with the query "upgrade". Normally, this returns the highest release version (or prerelease, etc.) that is higher than the current version and is not retracted or excluded. If there is no such version, Query should return the current version. If the current version is retracted or excluded, then Query currently returns an error. addUpdate should ignore this error, as it ignores ErrNotExist and NoMatchingVersionError. For 'go list -m -u', addRetraction is also called, and that will detect the retraction. Fixes #53594 Change-Id: I90a2872cdeabf03894acad9e0cbdd7db4a4e269e Reviewed-on: https://go-review.googlesource.com/c/go/+/414825 Run-TryBot: Bryan Mills Reviewed-by: Bryan Mills Auto-Submit: Bryan Mills TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek --- src/cmd/go/internal/modload/build.go | 7 ++++++- .../mod/example.com_retract_noupgrade_v1.0.0.txt | 9 +++++++++ src/cmd/go/testdata/script/mod_retract_noupgrade.txt | 11 +++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/mod/example.com_retract_noupgrade_v1.0.0.txt create mode 100644 src/cmd/go/testdata/script/mod_retract_noupgrade.txt diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index e983e0ae0c..555d4b3c63 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -131,10 +131,15 @@ func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { info, err := Query(ctx, m.Path, "upgrade", m.Version, CheckAllowed) var noVersionErr *NoMatchingVersionError - if errors.Is(err, fs.ErrNotExist) || errors.As(err, &noVersionErr) { + if errors.Is(err, ErrDisallowed) || + errors.Is(err, fs.ErrNotExist) || + errors.As(err, &noVersionErr) { // Ignore "not found" and "no matching version" errors. // This means the proxy has no matching version or no versions at all. // + // Ignore "disallowed" errors. This means the current version is + // excluded or retracted and there are no higher allowed versions. + // // We should report other errors though. An attacker that controls the // network shouldn't be able to hide versions by interfering with // the HTTPS connection. An attacker that controls the proxy may still diff --git a/src/cmd/go/testdata/mod/example.com_retract_noupgrade_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_retract_noupgrade_v1.0.0.txt new file mode 100644 index 0000000000..466afc5765 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_noupgrade_v1.0.0.txt @@ -0,0 +1,9 @@ +-- .mod -- +module example.com/retract/noupgrade + +go 1.19 + +retract v1.0.0 // bad + +-- .info -- +{"Version":"v1.0.0"} diff --git a/src/cmd/go/testdata/script/mod_retract_noupgrade.txt b/src/cmd/go/testdata/script/mod_retract_noupgrade.txt new file mode 100644 index 0000000000..67de79f42d --- /dev/null +++ b/src/cmd/go/testdata/script/mod_retract_noupgrade.txt @@ -0,0 +1,11 @@ +go list -m -u example.com/retract/noupgrade +stdout '^example.com/retract/noupgrade v1.0.0 \(retracted\)$' + +-- go.mod -- +module use + +go 1.19 + +require example.com/retract/noupgrade v1.0.0 +-- go.sum -- +example.com/retract/noupgrade v1.0.0/go.mod h1:q2/HnBejUQ83RcUo4stf2U++/Zr9R/Ky3BsodjKBkQ4= From 85486bcccb506514d67034e39f3ed588b5900f1c Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 25 May 2022 11:09:56 -0400 Subject: [PATCH 53/78] image/jpeg: increase TestLargeImageWithShortData timeout by an order of magnitude MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also dump goroutines on failure. The original bug report in #10413 reported a hang of “several minutes”. An apparently-spurious failure was observed in https://build.golang.org/log/e5ac3ce3fb7d04ec13e5bbfadea8bb5869a4dd1e, with a delay of only 3.64s. Moreover, if the test does fail due to a regression, we will want a goroutine dump to diagnose where it got stuck. The current call to t.Fatalf does not produce such a dump, so is not nearly as useful if the failure only occasionally reproduces. Updates #10413. Change-Id: I6ab9d112f14f438a0c54e02ec95934627acdc64b Reviewed-on: https://go-review.googlesource.com/c/go/+/408355 Run-TryBot: Bryan Mills Reviewed-by: Yuval Pavel Zholkover Reviewed-by: Robert Findley Auto-Submit: Bryan Mills TryBot-Result: Gopher Robot --- src/image/jpeg/reader_test.go | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/image/jpeg/reader_test.go b/src/image/jpeg/reader_test.go index bf07fadede..6fdb6c4449 100644 --- a/src/image/jpeg/reader_test.go +++ b/src/image/jpeg/reader_test.go @@ -13,6 +13,7 @@ import ( "io" "math/rand" "os" + "runtime/debug" "strings" "testing" "time" @@ -247,18 +248,16 @@ func TestLargeImageWithShortData(t *testing.T) { "\x20\x36\x9f\x78\x64\x75\xe6\xab\x7d\xb2\xde\x29\x70\xd3\x20\x27" + "\xde\xaf\xa4\xf0\xca\x9f\x24\xa8\xdf\x46\xa8\x24\x84\x96\xe3\x77" + "\xf9\x2e\xe0\x0a\x62\x7f\xdf\xd9" - c := make(chan error, 1) - go func() { - _, err := Decode(strings.NewReader(input)) - c <- err - }() - select { - case err := <-c: - if err == nil { - t.Fatalf("got nil error, want non-nil") - } - case <-time.After(3 * time.Second): - t.Fatalf("timed out") + + timer := time.AfterFunc(30*time.Second, func() { + debug.SetTraceback("all") + panic("TestLargeImageWithShortData stuck in Decode") + }) + defer timer.Stop() + + _, err := Decode(strings.NewReader(input)) + if err == nil { + t.Fatalf("got nil error, want non-nil") } } From 9c2526e6373e8cde99e62f8f6dfc73d6f79c5fad Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 4 May 2022 11:11:20 -0400 Subject: [PATCH 54/78] cmd/go/internal/modfetch/codehost: add missing newline in '# lock' log message Change-Id: Ib92e983b6cdeed2b275a028c85b2bba583def059 Reviewed-on: https://go-review.googlesource.com/c/go/+/403850 TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills Run-TryBot: Bryan Mills Reviewed-by: Hyang-Ah Hana Kim --- src/cmd/go/internal/modfetch/codehost/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/internal/modfetch/codehost/codehost.go b/src/cmd/go/internal/modfetch/codehost/codehost.go index 8eaf254b44..747022759e 100644 --- a/src/cmd/go/internal/modfetch/codehost/codehost.go +++ b/src/cmd/go/internal/modfetch/codehost/codehost.go @@ -247,7 +247,7 @@ func WorkDir(typ, name string) (dir, lockfile string, err error) { lockfile = dir + ".lock" if cfg.BuildX { - fmt.Fprintf(os.Stderr, "# lock %s", lockfile) + fmt.Fprintf(os.Stderr, "# lock %s\n", lockfile) } unlock, err := lockedfile.MutexAt(lockfile).Lock() From c2edb2c841149f2e56963071065d52247e24092a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 7 Jan 2022 14:17:51 -0500 Subject: [PATCH 55/78] cmd/go: port TestIssue16471 to a script test and add verbose logging For #50471 Change-Id: I082c1f96113a3228f2ef423a04eaa9fbaa6c7522 Reviewed-on: https://go-review.googlesource.com/c/go/+/376359 Reviewed-by: Robert Findley Auto-Submit: Bryan Mills Run-TryBot: Bryan Mills TryBot-Result: Gopher Robot --- src/cmd/go/go_test.go | 15 ------------- src/cmd/go/testdata/script/get_issue16471.txt | 22 +++++++++++++++++++ 2 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 src/cmd/go/testdata/script/get_issue16471.txt diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index c100316f47..a0082a3164 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -991,21 +991,6 @@ func TestIssue10952(t *testing.T) { tg.run("get", "-d", "-u", importPath) } -func TestIssue16471(t *testing.T) { - testenv.MustHaveExternalNetwork(t) - testenv.MustHaveExecPath(t, "git") - - tg := testgo(t) - defer tg.cleanup() - tg.parallel() - tg.tempDir("src") - tg.setenv("GOPATH", tg.path(".")) - tg.must(os.MkdirAll(tg.path("src/rsc.io/go-get-issue-10952"), 0755)) - tg.runGit(tg.path("src/rsc.io"), "clone", "https://github.com/zombiezen/go-get-issue-10952") - tg.runFail("get", "-u", "rsc.io/go-get-issue-10952") - tg.grepStderr("rsc.io/go-get-issue-10952 is a custom import path for https://github.com/rsc/go-get-issue-10952, but .* is checked out from https://github.com/zombiezen/go-get-issue-10952", "did not detect updated import path") -} - // Test git clone URL that uses SCP-like syntax and custom import path checking. func TestIssue11457(t *testing.T) { testenv.MustHaveExternalNetwork(t) diff --git a/src/cmd/go/testdata/script/get_issue16471.txt b/src/cmd/go/testdata/script/get_issue16471.txt new file mode 100644 index 0000000000..2a2225a444 --- /dev/null +++ b/src/cmd/go/testdata/script/get_issue16471.txt @@ -0,0 +1,22 @@ +[!net] skip +[!exec:git] skip + +env GO111MODULE=off + +cd rsc.io/go-get-issue-10952 + +exec git init +exec git add foo.go +exec git config user.name Gopher +exec git config user.email gopher@golang.org +exec git commit -a -m 'initial commit' +exec git remote add origin https://github.com/golang/go-get-issue-10952 + +exec git status + +! go get -x -u rsc.io/go-get-issue-10952 +stderr '^package rsc.io/go-get-issue-10952: rsc\.io/go-get-issue-10952 is a custom import path for https://github.com/rsc/go-get-issue-10952, but .* is checked out from https://github.com/golang/go-get-issue-10952$' + +-- rsc.io/go-get-issue-10952/foo.go -- +// Junk package to test go get. +package foo From 5f5cae7200b544bfc250ad0676a98db1f7e7df31 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Jul 2022 10:48:47 -0400 Subject: [PATCH 56/78] cmd/go: avoid indexing GOROOT packages when the compiler is 'gccgo' The gccgo compiler does not load standard-library packages from GOROOT/src, so we cannot load those packages from the GOROOT/src index when using that compiler. This fixes TestScript/gccgo_link_c (and perhaps other gccgo tests) when a 'gccgo' executable is present. Unfortunately, only a few builders caught the broken test because 'gccgo' is not installed on most Go project builders (see #35786). For #53577. Fixes #53815. Change-Id: I11a5cf6dbf4ac9893c4d02bd6ab7ef60f67b1e87 Reviewed-on: https://go-review.googlesource.com/c/go/+/417094 TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills Reviewed-by: Russ Cox --- src/cmd/go/internal/modindex/read.go | 3 +++ src/go/build/build.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/cmd/go/internal/modindex/read.go b/src/cmd/go/internal/modindex/read.go index 38ddfec70f..707f17e1ab 100644 --- a/src/cmd/go/internal/modindex/read.go +++ b/src/cmd/go/internal/modindex/read.go @@ -139,6 +139,9 @@ func GetPackage(modroot, pkgdir string) (*IndexPackage, error) { if !errors.Is(err, errNotFromModuleCache) { return nil, err } + if cfg.BuildContext.Compiler == "gccgo" && str.HasPathPrefix(modroot, cfg.GOROOTsrc) { + return nil, err // gccgo has no sources for GOROOT packages. + } return openIndexPackage(modroot, pkgdir) } diff --git a/src/go/build/build.go b/src/go/build/build.go index bfe3f444ca..dfb37b8f34 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -715,6 +715,9 @@ func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Packa tried.goroot = dir } if ctxt.Compiler == "gccgo" && goroot.IsStandardPackage(ctxt.GOROOT, ctxt.Compiler, path) { + // TODO(bcmills): Setting p.Dir here is misleading, because gccgo + // doesn't actually load its standard-library packages from this + // directory. See if we can leave it unset. p.Dir = ctxt.joinPath(ctxt.GOROOT, "src", path) p.Goroot = true p.Root = ctxt.GOROOT From bf2ef26be3593d24487311576d85ec601185fbf4 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 11 Jul 2022 15:12:06 -0400 Subject: [PATCH 57/78] cmd/go: in script tests, avoid checking non-main packages for staleness Non-main packages in module mode should not be installed to GOPATH/pkg, but due to #37015 they were installed there anyway. Lacking a proper install location, 'go install' becomes a no-op for non-main packages in module mode. This change switches the 'go install' commands in the test_fuzz_cache and build_overlay tests to instead use 'go build', using the '-x' flag to check for compile commands instead of querying 'go list' about staleness. For #37015. Change-Id: I56d80cf2a43efb6163c62082c86cd3e4f0ff73c1 Reviewed-on: https://go-review.googlesource.com/c/go/+/417095 Run-TryBot: Bryan Mills TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills Reviewed-by: Russ Cox --- src/cmd/go/testdata/script/build_overlay.txt | 20 +++++++++++-------- .../go/testdata/script/test_fuzz_cache.txt | 11 ++++------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/cmd/go/testdata/script/build_overlay.txt b/src/cmd/go/testdata/script/build_overlay.txt index 56e812f44b..70cd7f8c7a 100644 --- a/src/cmd/go/testdata/script/build_overlay.txt +++ b/src/cmd/go/testdata/script/build_overlay.txt @@ -47,20 +47,24 @@ go build -overlay overlay.json -o main_call_asm$GOEXE ./call_asm exec ./main_call_asm$GOEXE ! stdout . -# Change the contents of a file in the overlay and ensure that makes the target stale -go install -overlay overlay.json ./test_cache -go list -overlay overlay.json -f '{{.Stale}}' ./test_cache -stdout '^false$' -cp overlay/test_cache_different.go overlay/test_cache.go -go list -overlay overlay.json -f '{{.Stale}}' ./test_cache -stdout '^true$' - [cgo] go list -compiled -overlay overlay.json -f '{{range .CompiledGoFiles}}{{. | printf "%s\n"}}{{end}}' ./cgo_hello_replace [cgo] cp stdout compiled_cgo_sources.txt [cgo] go run ../print_line_comments.go compiled_cgo_sources.txt [cgo] stdout $GOPATH[/\\]src[/\\]m[/\\]cgo_hello_replace[/\\]cgo_hello_replace.go [cgo] ! stdout $GOPATH[/\\]src[/\\]m[/\\]overlay[/\\]hello.c +# Change the contents of a file in the overlay and ensure that makes the target stale +env OLD_GOCACHE=$GOCACHE +env GOCACHE=$WORK/cache # use a fresh cache so that multiple runs of the test don't interfere +go build -x -overlay overlay.json ./test_cache +stderr '(compile|gccgo)( |\.exe).*test_cache.go' +go build -x -overlay overlay.json ./test_cache +! stderr '(compile|gccgo)( |\.exe).*test_cache.go' # cached +cp overlay/test_cache_different.go overlay/test_cache.go +go build -x -overlay overlay.json ./test_cache +stderr '(compile|gccgo)( |\.exe).*test_cache.go' # not cached +env CACHE=$OLD_GOCACHE + # Run same tests but with gccgo. env GO111MODULE=off [!exec:gccgo] stop diff --git a/src/cmd/go/testdata/script/test_fuzz_cache.txt b/src/cmd/go/testdata/script/test_fuzz_cache.txt index 552966b06b..19fb764add 100644 --- a/src/cmd/go/testdata/script/test_fuzz_cache.txt +++ b/src/cmd/go/testdata/script/test_fuzz_cache.txt @@ -17,15 +17,12 @@ go clean -cache exists $GOCACHE/fuzz # 'go clean -fuzzcache' should delete the fuzz cache but not the build cache. -go list -f {{.Stale}} ./empty -stdout true -go install ./empty -go list -f {{.Stale}} ./empty -stdout false +go build -x ./empty +stderr '(compile|gccgo)( |\.exe).*empty.go' go clean -fuzzcache ! exists $GOCACHE/fuzz -go list -f {{.Stale}} ./empty -stdout false +go build -x ./empty +! stderr '(compile|gccgo)( |\.exe).*empty.go' # Fuzzing indicates that one new interesting value was found with an empty # corpus, and the total size of the cache is now 1. From 923740a8cc82e0bd3cd6098f94130b1967c4b361 Mon Sep 17 00:00:00 2001 From: Wayne Zuo Date: Sun, 10 Jul 2022 11:11:05 +0800 Subject: [PATCH 58/78] cmd/compile: fix type assert in dict pass For type assertions, if src type is empty interface, we should use normal type assertions rather than dynamic type assertions. Fixes #53762 Change-Id: I596b2e4ad647fe5e42ad884f7273c78f8f50dac2 Reviewed-on: https://go-review.googlesource.com/c/go/+/416736 Run-TryBot: Wayne Zuo TryBot-Result: Gopher Robot Reviewed-by: Matthew Dempsky Reviewed-by: Michael Knyszek --- src/cmd/compile/internal/noder/stencil.go | 2 +- test/typeparam/issue53762.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/typeparam/issue53762.go diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go index 1534a1fa49..1ba561b8b9 100644 --- a/src/cmd/compile/internal/noder/stencil.go +++ b/src/cmd/compile/internal/noder/stencil.go @@ -1357,7 +1357,7 @@ func (g *genInst) dictPass(info *instInfo) { } case ir.ODOTTYPE, ir.ODOTTYPE2: dt := m.(*ir.TypeAssertExpr) - if !dt.Type().HasShape() && !dt.X.Type().HasShape() { + if !dt.Type().HasShape() && !(dt.X.Type().HasShape() && !dt.X.Type().IsEmptyInterface()) { break } var rtype, itab ir.Node diff --git a/test/typeparam/issue53762.go b/test/typeparam/issue53762.go new file mode 100644 index 0000000000..4d95988854 --- /dev/null +++ b/test/typeparam/issue53762.go @@ -0,0 +1,18 @@ +// compile + +// Copyright 2022 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 main + +type Value[T any] interface { +} + +func use[T any](v Value[T]) { + _, _ = v.(int) +} + +func main() { + use(Value[int](1)) +} From c006b7ac2765252f397dec40fef610a3c17d956d Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Wed, 13 Jul 2022 11:48:04 -0400 Subject: [PATCH 59/78] runtime: clear timerModifiedEarliest when last timer is deleted timerModifiedEarliest contains the lowest possible expiration for a modified earlier timer, which may be earlier than timer0When because we haven't yet updated the heap. Note "may", as the modified earlier timer that set timerModifiedEarliest may have since been modified later or deleted. We can clear timerModifiedEarliest when the last timer is deleted because by definition there must not be any modified earlier timers. Why does this matter? checkTimersNoP claims that there is work to do if timerModifiedEarliest has passed, causing findRunnable to loop back around to checkTimers. But the code to clean up timerModifiedEarliest in checkTimers (i.e., the call to adjusttimers) is conditional behind a check that len(pp.timers) > 0. Without clearing timerModifiedEarliest, a spinning M that would otherwise go to sleep will busy loop in findRunnable until some other work is available. Note that changing the condition on the call to adjusttimers would also be a valid fix. I took this approach because it feels a bit cleaner to clean up timerModifiedEarliest as soon as it is known to be irrelevant. Fixes #51654. Change-Id: I3f3787c67781cac7ce87939c5706cef8db927dd5 Reviewed-on: https://go-review.googlesource.com/c/go/+/417434 Auto-Submit: Michael Pratt TryBot-Result: Gopher Robot Run-TryBot: Michael Pratt Reviewed-by: Michael Knyszek Reviewed-by: Ian Lance Taylor --- src/runtime/time.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/runtime/time.go b/src/runtime/time.go index aec39083b4..80b0bfb72c 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -397,7 +397,11 @@ func dodeltimer(pp *p, i int) int { if i == 0 { updateTimer0When(pp) } - atomic.Xadd(&pp.numTimers, -1) + n := atomic.Xadd(&pp.numTimers, -1) + if n == 0 { + // If there are no timers, then clearly none are modified. + atomic.Store64(&pp.timerModifiedEarliest, 0) + } return smallestChanged } @@ -421,7 +425,11 @@ func dodeltimer0(pp *p) { siftdownTimer(pp.timers, 0) } updateTimer0When(pp) - atomic.Xadd(&pp.numTimers, -1) + n := atomic.Xadd(&pp.numTimers, -1) + if n == 0 { + // If there are no timers, then clearly none are modified. + atomic.Store64(&pp.timerModifiedEarliest, 0) + } } // modtimer modifies an existing timer. From feada5366134772c4c6462e4a12150410741a00f Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Jul 2022 13:43:02 -0400 Subject: [PATCH 60/78] misc/cgo/testcshared: don't rely on an erroneous install target in tests Non-main packages in module mode should not be installed to GOPATH/pkg, but due to #37015 they were installed there anyway. This change switches the 'go install' command in createHeaders to instead use 'go build' (with an extension determined by the install target for 'runtime/cgo', which is well-defined at least for the moment), and switches TestCachedInstall (which appears to be explicitly testing 'go install') to explicitly request GOPATH mode (which provides a well-defined install target for the library). This change follows a similar structure to CL 416954. For #37015. Change-Id: I22ae4af0f0d4c50adc9e0f0dc279859d1f258cc8 Reviewed-on: https://go-review.googlesource.com/c/go/+/417096 Run-TryBot: Bryan Mills TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills Reviewed-by: Ian Lance Taylor --- misc/cgo/testcshared/cshared_test.go | 35 ++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go index e4898778be..7fbcff24dd 100644 --- a/misc/cgo/testcshared/cshared_test.go +++ b/misc/cgo/testcshared/cshared_test.go @@ -151,16 +151,22 @@ func testMain(m *testing.M) int { // The installation directory format varies depending on the platform. output, err := exec.Command("go", "list", "-buildmode=c-shared", - "-installsuffix", "testcshared", "-f", "{{.Target}}", - "./libgo").CombinedOutput() + "runtime/cgo").CombinedOutput() if err != nil { log.Panicf("go list failed: %v\n%s", err, output) } - target := string(bytes.TrimSpace(output)) - libgoname = filepath.Base(target) - installdir = filepath.Dir(target) - libSuffix = strings.TrimPrefix(filepath.Ext(target), ".") + runtimeCgoTarget := string(bytes.TrimSpace(output)) + libSuffix = strings.TrimPrefix(filepath.Ext(runtimeCgoTarget), ".") + + defer func() { + if installdir != "" { + err := os.RemoveAll(installdir) + if err != nil { + log.Panic(err) + } + } + }() return m.Run() } @@ -284,8 +290,13 @@ func createHeaders() error { } // Generate a C header file for libgo itself. - args = []string{"go", "install", "-buildmode=c-shared", - "-installsuffix", "testcshared", "./libgo"} + installdir, err = os.MkdirTemp("", "testcshared") + if err != nil { + return err + } + libgoname = "libgo." + libSuffix + + args = []string{"go", "build", "-buildmode=c-shared", "-o", filepath.Join(installdir, libgoname), "./libgo"} cmd = exec.Command(args[0], args[1:]...) out, err = cmd.CombinedOutput() if err != nil { @@ -373,6 +384,7 @@ func createHeadersOnce(t *testing.T) { headersErr = createHeaders() }) if headersErr != nil { + t.Helper() t.Fatal(headersErr) } } @@ -705,12 +717,15 @@ func TestCachedInstall(t *testing.T) { copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go")) copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go")) - env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin")) - buildcmd := []string{"go", "install", "-x", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"} cmd := exec.Command(buildcmd[0], buildcmd[1:]...) cmd.Dir = filepath.Join(tmpdir, "src", "testcshared") + env := append(cmd.Environ(), + "GOPATH="+tmpdir, + "GOBIN="+filepath.Join(tmpdir, "bin"), + "GO111MODULE=off", // 'go install' only works in GOPATH mode + ) cmd.Env = env t.Log(buildcmd) out, err := cmd.CombinedOutput() From f71f3d1b861de2fcc907221931cf13679c0092dd Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Jul 2022 14:41:33 -0400 Subject: [PATCH 61/78] misc/cgo/testshared: run tests only in GOPATH mode -buildmode=shared installs shared libraries into GOROOT and expects to reuse them across builds. Builds in module mode, however, each have their own set of dependencies (determined by the module's requirements), so in general cannot share dependencies with a single GOROOT. Ideally in the long term we would like to eliminate -buildmode=shared entirely (see #47788), but first we need a replacement for the subset of use-cases where it still works today. In the meantime, we should run these tests only in GOPATH mode. Non-main packages in module mode should not be installed to GOPATH/pkg, but due to #37015 they were installed there anyway, and this test heavily relies on installing non-main packages. For #37015. Change-Id: I7c5d90b4075d6f33e3505d6a8f12752309ae5c03 Reviewed-on: https://go-review.googlesource.com/c/go/+/417194 Run-TryBot: Bryan Mills Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills --- misc/cgo/testshared/shared_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go index 024f084da5..756c4baa6b 100644 --- a/misc/cgo/testshared/shared_test.go +++ b/misc/cgo/testshared/shared_test.go @@ -108,6 +108,15 @@ func testMain(m *testing.M) (int, error) { defer os.RemoveAll(workDir) } + // -buildmode=shared fundamentally does not work in module mode. + // (It tries to share package dependencies across builds, but in module mode + // each module has its own distinct set of dependency versions.) + // We would like to eliminate it (see https://go.dev/issue/47788), + // but first need to figure out a replacement that covers the small subset + // of use-cases where -buildmode=shared still works today. + // For now, run the tests in GOPATH mode only. + os.Setenv("GO111MODULE", "off") + // Some tests need to edit the source in GOPATH, so copy this directory to a // temporary directory and chdir to that. gopath := filepath.Join(workDir, "gopath") From 1355ea3045cd1327740ecfb7387918db45bf4f89 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 29 Jun 2022 13:03:51 -0700 Subject: [PATCH 62/78] cmd/compile: remove -importmap flag Obsoleted by -importcfg, and no longer used by anything. Updates #51225. Change-Id: I49e646d2728347f862f90805051bb03dd4f4bed2 Reviewed-on: https://go-review.googlesource.com/c/go/+/415235 Reviewed-by: Russ Cox Run-TryBot: Matthew Dempsky TryBot-Result: Gopher Robot Reviewed-by: David Chase --- src/cmd/compile/doc.go | 3 --- src/cmd/compile/internal/base/flag.go | 19 +------------------ 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go index b8862f62cf..60e12630c5 100644 --- a/src/cmd/compile/doc.go +++ b/src/cmd/compile/doc.go @@ -68,9 +68,6 @@ Flags: -importcfg file Read import configuration from file. In the file, set importmap, packagefile to specify import resolution. - -importmap old=new - Interpret import "old" as import "new" during compilation. - The option may be repeated to add multiple mappings. -installsuffix suffix Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix instead of $GOROOT/pkg/$GOOS_$GOARCH. diff --git a/src/cmd/compile/internal/base/flag.go b/src/cmd/compile/internal/base/flag.go index 4de0df21cb..a363b83984 100644 --- a/src/cmd/compile/internal/base/flag.go +++ b/src/cmd/compile/internal/base/flag.go @@ -100,7 +100,6 @@ type CmdFlags struct { GenDwarfInl int "help:\"generate DWARF inline info records\"" // 0=disabled, 1=funcs, 2=funcs+formals/locals GoVersion string "help:\"required version of the runtime\"" ImportCfg func(string) "help:\"read import configuration from `file`\"" - ImportMap func(string) "help:\"add `definition` of the form source=actual to import map\"" InstallSuffix string "help:\"set pkg directory `suffix`\"" JSON string "help:\"version,file for JSON compiler/optimizer detail output\"" Lang string "help:\"Go language version source code expects\"" @@ -130,7 +129,7 @@ type CmdFlags struct { Files map[string]string } ImportDirs []string // appended to by -I - ImportMap map[string]string // set by -importmap OR -importcfg + ImportMap map[string]string // set by -importcfg PackageFile map[string]string // set by -importcfg; nil means not in use SpectreIndex bool // set by -spectre=index or -spectre=all // Whether we are adding any sort of code instrumentation, such as @@ -156,7 +155,6 @@ func ParseFlags() { Flag.EmbedCfg = readEmbedCfg Flag.GenDwarfInl = 2 Flag.ImportCfg = readImportCfg - Flag.ImportMap = addImportMap Flag.LinkShared = &Ctxt.Flag_linkshared Flag.Shared = &Ctxt.Flag_shared Flag.WB = true @@ -388,21 +386,6 @@ func addImportDir(dir string) { } } -func addImportMap(s string) { - if Flag.Cfg.ImportMap == nil { - Flag.Cfg.ImportMap = make(map[string]string) - } - if strings.Count(s, "=") != 1 { - log.Fatal("-importmap argument must be of the form source=actual") - } - i := strings.Index(s, "=") - source, actual := s[:i], s[i+1:] - if source == "" || actual == "" { - log.Fatal("-importmap argument must be of the form source=actual; source and actual must be non-empty") - } - Flag.Cfg.ImportMap[source] = actual -} - func readImportCfg(file string) { if Flag.Cfg.ImportMap == nil { Flag.Cfg.ImportMap = make(map[string]string) From 558785a0a9df5fbb7e9617c05059cf2892884620 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 29 Jun 2022 13:20:36 -0700 Subject: [PATCH 63/78] cmd/compile: remove -installsuffix flag Obsoleted by -importcfg. cmd/link has a similar flag, but it seems to still be needed at least for misc/cgo/testshared.TestGopathShlib. I can't immediately tell why (has something to do with finding .so files), but it doesn't appear to possibly affect cmd/compile. Updates #51225. Change-Id: I80c6aef860bd162c010ad4a1a4f532b400cf901c Reviewed-on: https://go-review.googlesource.com/c/go/+/415236 Reviewed-by: David Chase Run-TryBot: Matthew Dempsky Reviewed-by: Russ Cox TryBot-Result: Gopher Robot --- src/cmd/compile/doc.go | 3 --- src/cmd/compile/internal/base/flag.go | 1 - src/cmd/compile/internal/noder/import.go | 4 +--- src/cmd/go/internal/work/gc.go | 3 --- 4 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go index 60e12630c5..f4cfcda807 100644 --- a/src/cmd/compile/doc.go +++ b/src/cmd/compile/doc.go @@ -68,9 +68,6 @@ Flags: -importcfg file Read import configuration from file. In the file, set importmap, packagefile to specify import resolution. - -installsuffix suffix - Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix - instead of $GOROOT/pkg/$GOOS_$GOARCH. -l Disable inlining. -lang version diff --git a/src/cmd/compile/internal/base/flag.go b/src/cmd/compile/internal/base/flag.go index a363b83984..e8b3f55ba4 100644 --- a/src/cmd/compile/internal/base/flag.go +++ b/src/cmd/compile/internal/base/flag.go @@ -100,7 +100,6 @@ type CmdFlags struct { GenDwarfInl int "help:\"generate DWARF inline info records\"" // 0=disabled, 1=funcs, 2=funcs+formals/locals GoVersion string "help:\"required version of the runtime\"" ImportCfg func(string) "help:\"read import configuration from `file`\"" - InstallSuffix string "help:\"set pkg directory `suffix`\"" JSON string "help:\"version,file for JSON compiler/optimizer detail output\"" Lang string "help:\"Go language version source code expects\"" LinkObj string "help:\"write linker-specific object to `file`\"" diff --git a/src/cmd/compile/internal/noder/import.go b/src/cmd/compile/internal/noder/import.go index 2cef9f75e8..f718c8db5d 100644 --- a/src/cmd/compile/internal/noder/import.go +++ b/src/cmd/compile/internal/noder/import.go @@ -102,9 +102,7 @@ func openPackage(path string) (*os.File, error) { if buildcfg.GOROOT != "" { suffix := "" - if base.Flag.InstallSuffix != "" { - suffix = "_" + base.Flag.InstallSuffix - } else if base.Flag.Race { + if base.Flag.Race { suffix = "_race" } else if base.Flag.MSan { suffix = "_msan" diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index 8429529115..4fa1126ade 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -128,9 +128,6 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg if extFiles == 0 { defaultGcFlags = append(defaultGcFlags, "-complete") } - if cfg.BuildContext.InstallSuffix != "" { - defaultGcFlags = append(defaultGcFlags, "-installsuffix", cfg.BuildContext.InstallSuffix) - } if a.buildID != "" { defaultGcFlags = append(defaultGcFlags, "-buildid", a.buildID) } From 266c70c26306e98d32d95dc62463c829f39bcce8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 14 Jul 2022 11:37:17 -0400 Subject: [PATCH 64/78] doc/go1.19: add a release note for 'go list -json=SomeField' For #29666. Change-Id: I575375fb039e5809b0ed2ce985f6352a61142d63 Reviewed-on: https://go-review.googlesource.com/c/go/+/417595 TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills Reviewed-by: Hyang-Ah Hana Kim Run-TryBot: Bryan Mills --- doc/go1.19.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/go1.19.html b/doc/go1.19.html index 53c11bd26e..41ffe8ebfd 100644 --- a/doc/go1.19.html +++ b/doc/go1.19.html @@ -118,6 +118,15 @@ as well as support for rendering them to HTML, Markdown, and text. and GOGCCFLAGS variables it reports.

+

+ go list -json now accepts a + comma-separated list of JSON fields to populate. If a list is specified, + the JSON output will include only those fields, and + go list may avoid work to compute fields that are + not included. In some cases, this may suppress errors that would otherwise + be reported. +

+

The go command now caches information necessary to load some modules, which should result in a speed-up of some go list invocations. From a906d3dd099424ff17d7e46c4ecf793012d50197 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 14 Jul 2022 10:51:56 -0400 Subject: [PATCH 65/78] cmd/go: avoid re-enqueuing workspace dependencies with errors Fixes #53874. Change-Id: I41ab15cb9b86b807a9d9ad21fe21fb7aa5fbb46f Reviewed-on: https://go-review.googlesource.com/c/go/+/417594 Run-TryBot: Bryan Mills Auto-Submit: Bryan Mills Reviewed-by: Hyang-Ah Hana Kim TryBot-Result: Gopher Robot --- src/cmd/go/internal/modload/buildlist.go | 5 +- .../go/testdata/script/work_goproxy_off.txt | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/work_goproxy_off.txt diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go index 5b8d6051f3..cde4953afa 100644 --- a/src/cmd/go/internal/modload/buildlist.go +++ b/src/cmd/go/internal/modload/buildlist.go @@ -397,7 +397,6 @@ func readModGraph(ctx context.Context, pruning modPruning, roots []module.Versio seen := map[module.Version]bool{} for _, m := range roots { hasDepsInAll[m.Path] = true - seen[m] = true } // This loop will terminate because it will call enqueue on each version of // each dependency of the modules in hasDepsInAll at most once (and only @@ -406,11 +405,11 @@ func readModGraph(ctx context.Context, pruning modPruning, roots []module.Versio needsEnqueueing := map[module.Version]bool{} for p := range hasDepsInAll { m := module.Version{Path: p, Version: mg.g.Selected(p)} - reqs, ok := mg.g.RequiredBy(m) - if !ok { + if !seen[m] { needsEnqueueing[m] = true continue } + reqs, _ := mg.g.RequiredBy(m) for _, r := range reqs { s := module.Version{Path: r.Path, Version: mg.g.Selected(r.Path)} if cmpVersion(s.Version, r.Version) > 0 && !seen[s] { diff --git a/src/cmd/go/testdata/script/work_goproxy_off.txt b/src/cmd/go/testdata/script/work_goproxy_off.txt new file mode 100644 index 0000000000..0a602e3d7b --- /dev/null +++ b/src/cmd/go/testdata/script/work_goproxy_off.txt @@ -0,0 +1,59 @@ +go work init +go work use . ./sub + +# Verify that the go.mod files for both modules in the workspace are tidy, +# and add missing go.sum entries as needed. + +cp go.mod go.mod.orig +go mod tidy +cmp go.mod go.mod.orig + +cd sub +cp go.mod go.mod.orig +go mod tidy +cmp go.mod go.mod.orig +cd .. + +go list -m all +stdout '^rsc\.io/quote v1\.5\.1$' +stdout '^rsc\.io/sampler v1\.3\.1$' + +# Now remove the module dependencies from the module cache. +# Because one module upgrades a transitive dependency needed by another, +# listing the modules in the workspace should error out. + +go clean -modcache +env GOPROXY=off +! go list -m all +stderr '^go: rsc.io/sampler@v1.3.0: module lookup disabled by GOPROXY=off$' + +-- example.go -- +package example + +import _ "rsc.io/sampler" +-- go.mod -- +module example + +go 1.19 + +require rsc.io/sampler v1.3.0 + +require ( + golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect + rsc.io/testonly v1.0.0 // indirect +) +-- sub/go.mod -- +module example/sub + +go 1.19 + +require rsc.io/quote v1.5.1 + +require ( + golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect + rsc.io/sampler v1.3.1 // indirect +) +-- sub/sub.go -- +package example + +import _ "rsc.io/quote" From b9d5a25442ff4df9080250dd4b0d62c565466cec Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 14 Jul 2022 14:44:21 -0400 Subject: [PATCH 66/78] cmd/go: save zip sums for downloaded modules in 'go mod download' in a workspace Within a single module we expect all needed checksums to have already been recorded by a previous call to 'go get' or 'go mod tidy' in that module. However, when we combine multiple modules in a workspace, they may upgrade each other's dependencies, so a given module might be upgraded above the highest version recorded in the individual go.sum files for the workspace modules. Since the checksums might not be present in individual go.sum files, record them in go.work.sum. Fixes #51946. Change-Id: Icb4ea874b9e5c5b1950d42650974a24b5d6543d4 Reviewed-on: https://go-review.googlesource.com/c/go/+/417654 Auto-Submit: Bryan Mills Reviewed-by: Hyang-Ah Hana Kim TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills --- src/cmd/go/internal/modcmd/download.go | 26 ++++++++++++++----- .../script/work_why_download_graph.txt | 10 +++++-- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index a5fc63ed26..0b50afb668 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -206,12 +206,13 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { type token struct{} sem := make(chan token, runtime.GOMAXPROCS(0)) infos, infosErr := modload.ListModules(ctx, args, 0, *downloadReuse) - if !haveExplicitArgs { + if !haveExplicitArgs && modload.WorkFilePath() == "" { // 'go mod download' is sometimes run without arguments to pre-populate the - // module cache. It may fetch modules that aren't needed to build packages - // in the main module. This is usually not intended, so don't save sums for - // downloaded modules (golang.org/issue/45332). We do still fix - // inconsistencies in go.mod though. + // module cache. In modules that aren't at go 1.17 or higher, it may fetch + // modules that aren't needed to build packages in the main module. This is + // usually not intended, so don't save sums for downloaded modules + // (golang.org/issue/45332). We do still fix inconsistencies in go.mod + // though. // // TODO(#45551): In the future, report an error if go.mod or go.sum need to // be updated after loading the build list. This may require setting @@ -282,8 +283,19 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { // 'go get mod@version', which may have other side effects. We print this in // some error message hints. // - // Don't save sums for 'go mod download' without arguments; see comment above. - if haveExplicitArgs { + // If we're in workspace mode, update go.work.sum with checksums for all of + // the modules we downloaded that aren't already recorded. Since a requirement + // in one module may upgrade a dependency of another, we can't be sure that + // the import graph matches the import graph of any given module in isolation, + // so we may end up needing to load packages from modules that wouldn't + // otherwise be relevant. + // + // TODO(#44435): If we adjust the set of modules downloaded in workspace mode, + // we may also need to adjust the logic for saving checksums here. + // + // Don't save sums for 'go mod download' without arguments unless we're in + // workspace mode; see comment above. + if haveExplicitArgs || modload.WorkFilePath() != "" { if err := modload.WriteGoMod(ctx); err != nil { base.Errorf("go: %v", err) } diff --git a/src/cmd/go/testdata/script/work_why_download_graph.txt b/src/cmd/go/testdata/script/work_why_download_graph.txt index 7964c914a2..8f1aeddf47 100644 --- a/src/cmd/go/testdata/script/work_why_download_graph.txt +++ b/src/cmd/go/testdata/script/work_why_download_graph.txt @@ -7,13 +7,19 @@ exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.info ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod +grep '^rsc\.io/quote v1\.5\.2/go\.mod h1:' go.work.sum +grep '^rsc\.io/quote v1\.5\.2 h1:' go.work.sum +go clean -modcache +rm go.work.sum go mod download exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.info ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod +grep '^rsc\.io/quote v1\.5\.2/go\.mod h1:' go.work.sum +grep '^rsc\.io/quote v1\.5\.2 h1:' go.work.sum go mod why rsc.io/quote stdout '# rsc.io/quote\nexample.com/a\nrsc.io/quote' @@ -25,8 +31,8 @@ stdout 'example.com/a rsc.io/quote@v1.5.2\nexample.com/b example.com/c@v1.0.0\nr go 1.18 use ( - ./a - ./b + ./a + ./b ) -- a/go.mod -- go 1.18 From aa802285265ac370f7ce62299e54ec84635b794e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 16 Feb 2022 14:07:06 -0500 Subject: [PATCH 67/78] cmd/go/internal/modfetch: avoid duplicating path components in Git fetch errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #51114 Change-Id: Iebfe65f826b7b583ff2b48b8bc9d2eb23f2726af Reviewed-on: https://go-review.googlesource.com/c/go/+/386234 Reviewed-by: Valentin Deleplace Reviewed-by: Nooras Saba‎ TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills --- src/cmd/go/internal/modfetch/coderepo.go | 8 +++---- .../script/mod_download_issue51114.txt | 21 +++++++++++++++++++ .../script/mod_download_private_vcs.txt | 10 +++------ 3 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_download_issue51114.txt diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index b934e362a4..8fb0035f8c 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -792,7 +792,7 @@ func (r *codeRepo) findDir(version string) (rev, dir string, gomod []byte, err e file1 := path.Join(r.codeDir, "go.mod") gomod1, err1 := r.code.ReadFile(rev, file1, codehost.MaxGoMod) if err1 != nil && !os.IsNotExist(err1) { - return "", "", nil, fmt.Errorf("reading %s/%s at revision %s: %v", r.pathPrefix, file1, rev, err1) + return "", "", nil, fmt.Errorf("reading %s/%s at revision %s: %v", r.codeRoot, file1, rev, err1) } mpath1 := modfile.ModulePath(gomod1) found1 := err1 == nil && (isMajor(mpath1, r.pathMajor) || r.canReplaceMismatchedVersionDueToBug(mpath1)) @@ -810,7 +810,7 @@ func (r *codeRepo) findDir(version string) (rev, dir string, gomod []byte, err e file2 = path.Join(dir2, "go.mod") gomod2, err2 := r.code.ReadFile(rev, file2, codehost.MaxGoMod) if err2 != nil && !os.IsNotExist(err2) { - return "", "", nil, fmt.Errorf("reading %s/%s at revision %s: %v", r.pathPrefix, file2, rev, err2) + return "", "", nil, fmt.Errorf("reading %s/%s at revision %s: %v", r.codeRoot, file2, rev, err2) } mpath2 := modfile.ModulePath(gomod2) found2 := err2 == nil && isMajor(mpath2, r.pathMajor) @@ -823,9 +823,9 @@ func (r *codeRepo) findDir(version string) (rev, dir string, gomod []byte, err e } if err2 == nil { if mpath2 == "" { - return "", "", nil, fmt.Errorf("%s/%s is missing module path at revision %s", r.pathPrefix, file2, rev) + return "", "", nil, fmt.Errorf("%s/%s is missing module path at revision %s", r.codeRoot, file2, rev) } - return "", "", nil, fmt.Errorf("%s/%s has non-...%s module path %q at revision %s", r.pathPrefix, file2, r.pathMajor, mpath2, rev) + return "", "", nil, fmt.Errorf("%s/%s has non-...%s module path %q at revision %s", r.codeRoot, file2, r.pathMajor, mpath2, rev) } } diff --git a/src/cmd/go/testdata/script/mod_download_issue51114.txt b/src/cmd/go/testdata/script/mod_download_issue51114.txt new file mode 100644 index 0000000000..92479c6dd3 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_download_issue51114.txt @@ -0,0 +1,21 @@ +[short] skip +[!exec:git] skip +[!net] skip +[!linux] skip # Uses XDG_CONFIG_HOME + +env GIT_CONFIG_GLOBAL=$WORK/.gitconfig +env GOPROXY=direct + +! go mod download +stderr '^go: github\.com/golang/notexist/subdir@v0.1.0: reading github\.com/golang/notexist/subdir/go\.mod at revision subdir/v0\.1\.0: ' + +-- go.mod -- +module test + +go 1.18 + +require github.com/golang/notexist/subdir v0.1.0 + +-- $WORK/.gitconfig -- +[url "git@github.com:"] + insteadOf = https://github.com/ diff --git a/src/cmd/go/testdata/script/mod_download_private_vcs.txt b/src/cmd/go/testdata/script/mod_download_private_vcs.txt index e126793907..da9fe0290b 100644 --- a/src/cmd/go/testdata/script/mod_download_private_vcs.txt +++ b/src/cmd/go/testdata/script/mod_download_private_vcs.txt @@ -22,22 +22,18 @@ stderr '^If this is a private repository, see https://golang.org/doc/faq#git_htt ! stderr 'unknown revision' ! stdout . -[!linux] stop # Needs XDG_CONFIG_HOME. [!exec:false] stop # Test that Git clone errors will be shown to the user instead of a generic # "unknown revision" error. To do this we want to force git ls-remote to return # an error we don't already have special handling for. See golang/go#42751. -# -# Set XDG_CONFIG_HOME to tell Git where to look for the git config file listed -# below, which turns on ssh. -env XDG_CONFIG_HOME=$TMPDIR +env HOME=$WORK${/}home${/}gopher env GIT_SSH_COMMAND=false ! go install github.com/golang/nonexist@master stderr 'fatal: Could not read from remote repository.' ! stderr 'unknown revision' ! stdout . --- $TMPDIR/git/config -- +-- $WORK/home/gopher/.gitconfig -- [url "git@github.com:"] - insteadOf = https://github.com/ + insteadOf = https://github.com/ From 783ff7dfc49d207114bb80e565e50ea6ff079326 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Thu, 14 Jul 2022 12:09:19 -0700 Subject: [PATCH 68/78] encoding/xml: skip TestCVE202230633 for short tests TestCVE202230633 uses a bunch of memory, and the input cannot be feasibly reduced while maintaining the behavior hasn't regressed. This test could be reasonably removed, but I'd rather keep it around if we can. Fixes #53814 Change-Id: Ie8b3f306efd20b2d9c0fb73122c26351a55694c4 Reviewed-on: https://go-review.googlesource.com/c/go/+/417655 Run-TryBot: Roland Shoemaker TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills --- src/encoding/xml/read_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/encoding/xml/read_test.go b/src/encoding/xml/read_test.go index 58d1eddb61..35385c6490 100644 --- a/src/encoding/xml/read_test.go +++ b/src/encoding/xml/read_test.go @@ -9,7 +9,6 @@ import ( "errors" "io" "reflect" - "runtime" "strings" "testing" "time" @@ -1112,8 +1111,8 @@ func TestCVE202228131(t *testing.T) { } func TestCVE202230633(t *testing.T) { - if runtime.GOARCH == "wasm" { - t.Skip("causes memory exhaustion on js/wasm") + if testing.Short() { + t.Skip("test requires significant memory") } defer func() { p := recover() From dc00aed6de101700fd02b30f93789b9e9e1fe9a1 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Thu, 14 Jul 2022 13:00:05 -0700 Subject: [PATCH 69/78] go/parser: skip TestParseDepthLimit for short tests Because it requires a not insignificant amount of memory to run. Also remove the WASM-only skip from TestScopeDepthLimit, which is less intensive. Fixes #53816 Change-Id: I8463046510ce4dd3d8f6d66938828d5e6963c3be Reviewed-on: https://go-review.googlesource.com/c/go/+/417657 Auto-Submit: Roland Shoemaker Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot Run-TryBot: Roland Shoemaker --- src/go/parser/parser_test.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/go/parser/parser_test.go b/src/go/parser/parser_test.go index 1a46c87866..0c278924c9 100644 --- a/src/go/parser/parser_test.go +++ b/src/go/parser/parser_test.go @@ -10,7 +10,6 @@ import ( "go/ast" "go/token" "io/fs" - "runtime" "strings" "testing" ) @@ -653,8 +652,8 @@ func split(x string) (pre, mid, post string) { } func TestParseDepthLimit(t *testing.T) { - if runtime.GOARCH == "wasm" { - t.Skip("causes call stack exhaustion on js/wasm") + if testing.Short() { + t.Skip("test requires significant memory") } for _, tt := range parseDepthTests { for _, size := range []string{"small", "big"} { @@ -699,9 +698,6 @@ func TestParseDepthLimit(t *testing.T) { } func TestScopeDepthLimit(t *testing.T) { - if runtime.GOARCH == "wasm" { - t.Skip("causes call stack exhaustion on js/wasm") - } for _, tt := range parseDepthTests { if !tt.scope { continue From 4651ebf96191ffa3c0bc4c0b479bc97fbdd97b67 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 14 Jul 2022 19:47:59 -0700 Subject: [PATCH 70/78] encoding/gob: s/TestIngoreDepthLimit/TestIgnoreDepthLimit/ For #53615 Change-Id: Ib85004d400931094fc1ea933cf73f4a5157aece1 Reviewed-on: https://go-review.googlesource.com/c/go/+/417559 TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov Run-TryBot: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- src/encoding/gob/gobencdec_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoding/gob/gobencdec_test.go b/src/encoding/gob/gobencdec_test.go index 3d49887c01..6fefd36756 100644 --- a/src/encoding/gob/gobencdec_test.go +++ b/src/encoding/gob/gobencdec_test.go @@ -798,7 +798,7 @@ func TestNetIP(t *testing.T) { } } -func TestIngoreDepthLimit(t *testing.T) { +func TestIgnoreDepthLimit(t *testing.T) { // We don't test the actual depth limit because it requires building an // extremely large message, which takes quite a while. oldNestingDepth := maxIgnoreNestingDepth From 2aa473cc54128c1498f80263763a2a876308e565 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 13 Jul 2022 15:18:41 -0400 Subject: [PATCH 71/78] go/types, types2: correct alignment of atomic.Int64 atomic.Int64 has special logic in the compiler to ensure it's 8-byte aligned on 32-bit architectures. The equivalent logic is missing in go/types, which means the compiler and go/types can come to different conclusions about the layout of types. Fix this by mirroring the compiler's logic into go/types. Fixes #53884. Change-Id: I3f58a56babb76634839a161ca174c8f085fe3ba4 Reviewed-on: https://go-review.googlesource.com/c/go/+/417555 Reviewed-by: Robert Findley --- src/cmd/compile/internal/types/size.go | 2 + src/cmd/compile/internal/types2/sizes.go | 23 +++++++++++ src/cmd/compile/internal/types2/sizes_test.go | 41 ++++++++++++++++++- src/go/types/sizes.go | 23 +++++++++++ src/go/types/sizes_test.go | 41 ++++++++++++++++++- 5 files changed, 128 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/types/size.go b/src/cmd/compile/internal/types/size.go index 68b9ac3ff3..d034808132 100644 --- a/src/cmd/compile/internal/types/size.go +++ b/src/cmd/compile/internal/types/size.go @@ -169,6 +169,8 @@ func calcStructOffset(errtype *Type, t *Type, o int64, flag int) int64 { } // Special case: sync/atomic.align64 is an empty struct we recognize // as a signal that the struct it contains must be 64-bit-aligned. + // + // This logic is duplicated in go/types and cmd/compile/internal/types2. if isStruct && t.NumFields() == 0 && t.Sym() != nil && t.Sym().Name == "align64" && isAtomicStdPkg(t.Sym().Pkg) { maxalign = 8 } diff --git a/src/cmd/compile/internal/types2/sizes.go b/src/cmd/compile/internal/types2/sizes.go index 6133e15924..4da309461f 100644 --- a/src/cmd/compile/internal/types2/sizes.go +++ b/src/cmd/compile/internal/types2/sizes.go @@ -53,6 +53,17 @@ func (s *StdSizes) Alignof(T Type) int64 { // is the same as unsafe.Alignof(x[0]), but at least 1." return s.Alignof(t.elem) case *Struct: + if len(t.fields) == 0 && isSyncAtomicAlign64(T) { + // Special case: sync/atomic.align64 is an + // empty struct we recognize as a signal that + // the struct it contains must be + // 64-bit-aligned. + // + // This logic is equivalent to the logic in + // cmd/compile/internal/types/size.go:calcStructOffset + return 8 + } + // spec: "For a variable x of struct type: unsafe.Alignof(x) // is the largest of the values unsafe.Alignof(x.f) for each // field f of x, but at least 1." @@ -93,6 +104,18 @@ func (s *StdSizes) Alignof(T Type) int64 { return a } +func isSyncAtomicAlign64(T Type) bool { + named, ok := T.(*Named) + if !ok { + return false + } + obj := named.Obj() + return obj.Name() == "align64" && + obj.Pkg() != nil && + (obj.Pkg().Path() == "sync/atomic" || + obj.Pkg().Path() == "runtime/internal/atomic") +} + func (s *StdSizes) Offsetsof(fields []*Var) []int64 { offsets := make([]int64, len(fields)) var o int64 diff --git a/src/cmd/compile/internal/types2/sizes_test.go b/src/cmd/compile/internal/types2/sizes_test.go index c9a4942bed..824ec838e2 100644 --- a/src/cmd/compile/internal/types2/sizes_test.go +++ b/src/cmd/compile/internal/types2/sizes_test.go @@ -14,12 +14,15 @@ import ( // findStructType typechecks src and returns the first struct type encountered. func findStructType(t *testing.T, src string) *types2.Struct { + return findStructTypeConfig(t, src, &types2.Config{}) +} + +func findStructTypeConfig(t *testing.T, src string, conf *types2.Config) *types2.Struct { f, err := parseSrc("x.go", src) if err != nil { t.Fatal(err) } info := types2.Info{Types: make(map[syntax.Expr]types2.TypeAndValue)} - var conf types2.Config _, err = conf.Check("x", []*syntax.File{f}, &info) if err != nil { t.Fatal(err) @@ -105,3 +108,39 @@ const _ = unsafe.Offsetof(struct{ x int64 }{}.x) _ = conf.Sizes.Alignof(tv.Type) } } + +// Issue #53884. +func TestAtomicAlign(t *testing.T) { + const src = ` +package main + +import "sync/atomic" + +var s struct { + x int32 + y atomic.Int64 + z int64 +} +` + + want := []int64{0, 8, 16} + for _, arch := range []string{"386", "amd64"} { + t.Run(arch, func(t *testing.T) { + conf := types2.Config{ + Importer: defaultImporter(), + Sizes: types2.SizesFor("gc", arch), + } + ts := findStructTypeConfig(t, src, &conf) + var fields []*types2.Var + // Make a copy manually :( + for i := 0; i < ts.NumFields(); i++ { + fields = append(fields, ts.Field(i)) + } + + offsets := conf.Sizes.Offsetsof(fields) + if offsets[0] != want[0] || offsets[1] != want[1] || offsets[2] != want[2] { + t.Errorf("OffsetsOf(%v) = %v want %v", ts, offsets, want) + } + }) + } +} diff --git a/src/go/types/sizes.go b/src/go/types/sizes.go index 7b67dca2b8..cb5253b453 100644 --- a/src/go/types/sizes.go +++ b/src/go/types/sizes.go @@ -53,6 +53,17 @@ func (s *StdSizes) Alignof(T Type) int64 { // is the same as unsafe.Alignof(x[0]), but at least 1." return s.Alignof(t.elem) case *Struct: + if len(t.fields) == 0 && isSyncAtomicAlign64(T) { + // Special case: sync/atomic.align64 is an + // empty struct we recognize as a signal that + // the struct it contains must be + // 64-bit-aligned. + // + // This logic is equivalent to the logic in + // cmd/compile/internal/types/size.go:calcStructOffset + return 8 + } + // spec: "For a variable x of struct type: unsafe.Alignof(x) // is the largest of the values unsafe.Alignof(x.f) for each // field f of x, but at least 1." @@ -93,6 +104,18 @@ func (s *StdSizes) Alignof(T Type) int64 { return a } +func isSyncAtomicAlign64(T Type) bool { + named, ok := T.(*Named) + if !ok { + return false + } + obj := named.Obj() + return obj.Name() == "align64" && + obj.Pkg() != nil && + (obj.Pkg().Path() == "sync/atomic" || + obj.Pkg().Path() == "runtime/internal/atomic") +} + func (s *StdSizes) Offsetsof(fields []*Var) []int64 { offsets := make([]int64, len(fields)) var o int64 diff --git a/src/go/types/sizes_test.go b/src/go/types/sizes_test.go index 539b4e37c1..740072f1dc 100644 --- a/src/go/types/sizes_test.go +++ b/src/go/types/sizes_test.go @@ -17,13 +17,16 @@ import ( // findStructType typechecks src and returns the first struct type encountered. func findStructType(t *testing.T, src string) *types.Struct { + return findStructTypeConfig(t, src, &types.Config{}) +} + +func findStructTypeConfig(t *testing.T, src string, conf *types.Config) *types.Struct { fset := token.NewFileSet() f, err := parser.ParseFile(fset, "x.go", src, 0) if err != nil { t.Fatal(err) } info := types.Info{Types: make(map[ast.Expr]types.TypeAndValue)} - var conf types.Config _, err = conf.Check("x", fset, []*ast.File{f}, &info) if err != nil { t.Fatal(err) @@ -110,3 +113,39 @@ const _ = unsafe.Offsetof(struct{ x int64 }{}.x) _ = conf.Sizes.Alignof(tv.Type) } } + +// Issue #53884. +func TestAtomicAlign(t *testing.T) { + const src = ` +package main + +import "sync/atomic" + +var s struct { + x int32 + y atomic.Int64 + z int64 +} +` + + want := []int64{0, 8, 16} + for _, arch := range []string{"386", "amd64"} { + t.Run(arch, func(t *testing.T) { + conf := types.Config{ + Importer: importer.Default(), + Sizes: types.SizesFor("gc", arch), + } + ts := findStructTypeConfig(t, src, &conf) + var fields []*types.Var + // Make a copy manually :( + for i := 0; i < ts.NumFields(); i++ { + fields = append(fields, ts.Field(i)) + } + + offsets := conf.Sizes.Offsetsof(fields) + if offsets[0] != want[0] || offsets[1] != want[1] || offsets[2] != want[2] { + t.Errorf("OffsetsOf(%v) = %v want %v", ts, offsets, want) + } + }) + } +} From c0c1bbde172c33e6e4ea994b413f23ca42c50c06 Mon Sep 17 00:00:00 2001 From: minherz Date: Sun, 12 Jun 2022 22:26:02 -0700 Subject: [PATCH 72/78] http: improve Get documentation The existing documentation is unclear about header keys formatting. The clarifying sentence is added to Get function to emphasis that keys have to be stored in canonical format to have Get returining non empty value. Fixes #53140 Change-Id: Icd0955bcbb6676cec028fe37042aed5846e13ed1 Reviewed-on: https://go-review.googlesource.com/c/go/+/417975 Run-TryBot: Damien Neil Auto-Submit: Damien Neil TryBot-Result: Gopher Robot Reviewed-by: Damien Neil --- src/net/http/header.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/net/http/header.go b/src/net/http/header.go index 6437f2d2c0..e0b342c63c 100644 --- a/src/net/http/header.go +++ b/src/net/http/header.go @@ -43,7 +43,8 @@ func (h Header) Set(key, value string) { // Get gets the first value associated with the given key. If // there are no values associated with the key, Get returns "". // It is case insensitive; textproto.CanonicalMIMEHeaderKey is -// used to canonicalize the provided key. To use non-canonical keys, +// used to canonicalize the provided key. Get assumes that all +// keys are stored in canonical form. To use non-canonical keys, // access the map directly. func (h Header) Get(key string) string { return textproto.MIMEHeader(h).Get(key) From 967a3d985d9252368b236411d2f0658fd636b1d4 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 18 Jul 2022 17:03:30 +0000 Subject: [PATCH 73/78] cmd/compile: revert "remove -installsuffix flag" This reverts CL 415236 (commit 558785a0a9df5fbb7e9617c05059cf2892884620). Reason for revert: Google's internal build system uses -installsuffix. Restoring -installsuffix for Go 1.19, and will try again for Go 1.20. Change-Id: Id6571f34f99f01bcf55e8e949e6fe7b6c1896134 Reviewed-on: https://go-review.googlesource.com/c/go/+/418036 TryBot-Result: Gopher Robot Auto-Submit: Matthew Dempsky Run-TryBot: Matthew Dempsky Reviewed-by: David Chase --- src/cmd/compile/doc.go | 3 +++ src/cmd/compile/internal/base/flag.go | 1 + src/cmd/compile/internal/noder/import.go | 4 +++- src/cmd/go/internal/work/gc.go | 3 +++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go index f4cfcda807..60e12630c5 100644 --- a/src/cmd/compile/doc.go +++ b/src/cmd/compile/doc.go @@ -68,6 +68,9 @@ Flags: -importcfg file Read import configuration from file. In the file, set importmap, packagefile to specify import resolution. + -installsuffix suffix + Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix + instead of $GOROOT/pkg/$GOOS_$GOARCH. -l Disable inlining. -lang version diff --git a/src/cmd/compile/internal/base/flag.go b/src/cmd/compile/internal/base/flag.go index e8b3f55ba4..a363b83984 100644 --- a/src/cmd/compile/internal/base/flag.go +++ b/src/cmd/compile/internal/base/flag.go @@ -100,6 +100,7 @@ type CmdFlags struct { GenDwarfInl int "help:\"generate DWARF inline info records\"" // 0=disabled, 1=funcs, 2=funcs+formals/locals GoVersion string "help:\"required version of the runtime\"" ImportCfg func(string) "help:\"read import configuration from `file`\"" + InstallSuffix string "help:\"set pkg directory `suffix`\"" JSON string "help:\"version,file for JSON compiler/optimizer detail output\"" Lang string "help:\"Go language version source code expects\"" LinkObj string "help:\"write linker-specific object to `file`\"" diff --git a/src/cmd/compile/internal/noder/import.go b/src/cmd/compile/internal/noder/import.go index f718c8db5d..2cef9f75e8 100644 --- a/src/cmd/compile/internal/noder/import.go +++ b/src/cmd/compile/internal/noder/import.go @@ -102,7 +102,9 @@ func openPackage(path string) (*os.File, error) { if buildcfg.GOROOT != "" { suffix := "" - if base.Flag.Race { + if base.Flag.InstallSuffix != "" { + suffix = "_" + base.Flag.InstallSuffix + } else if base.Flag.Race { suffix = "_race" } else if base.Flag.MSan { suffix = "_msan" diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index 4fa1126ade..8429529115 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -128,6 +128,9 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg if extFiles == 0 { defaultGcFlags = append(defaultGcFlags, "-complete") } + if cfg.BuildContext.InstallSuffix != "" { + defaultGcFlags = append(defaultGcFlags, "-installsuffix", cfg.BuildContext.InstallSuffix) + } if a.buildID != "" { defaultGcFlags = append(defaultGcFlags, "-buildid", a.buildID) } From de8101d21bcf5f1097bcfaf3a1b55820ba70dce9 Mon Sep 17 00:00:00 2001 From: Jun10ng Date: Sat, 16 Jul 2022 14:31:14 +0000 Subject: [PATCH 74/78] runtime: fix typos "finializer" => "finalizer" Change-Id: Ia3c12bff8556b6a8d33b700c59357f47502757b1 GitHub-Last-Rev: c64cf47974020c8480039ba61d0890bdc07a3b0f GitHub-Pull-Request: golang/go#53917 Reviewed-on: https://go-review.googlesource.com/c/go/+/417915 Reviewed-by: Keith Randall TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Reviewed-by: Keith Randall --- src/runtime/mprof.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/mprof.go b/src/runtime/mprof.go index 6bf3ddda8c..99a67b9a3a 100644 --- a/src/runtime/mprof.go +++ b/src/runtime/mprof.go @@ -947,7 +947,7 @@ func goroutineProfileWithLabelsConcurrent(p []StackRecord, labels []unsafe.Point goroutineProfile.active = true goroutineProfile.records = p goroutineProfile.labels = labels - // The finializer goroutine needs special handling because it can vary over + // The finalizer goroutine needs special handling because it can vary over // time between being a user goroutine (eligible for this profile) and a // system goroutine (to be excluded). Pick one before restarting the world. if fing != nil { From ae7340ab68bf57c5d1485bee2c6725a780212a9a Mon Sep 17 00:00:00 2001 From: Carlos Amedee Date: Mon, 18 Jul 2022 12:42:25 -0400 Subject: [PATCH 75/78] CONTRIBUTORS: update for the Go 1.19 release This update was created using the updatecontrib command: go install golang.org/x/build/cmd/updatecontrib@latest cd gotip updatecontrib With manual changes based on publicly available information to canonicalize letter case and formatting for a few names. For #12042. Change-Id: I5e648b99004026513c5772b579a72b7add970db4 Reviewed-on: https://go-review.googlesource.com/c/go/+/418016 Reviewed-by: Dmitri Shuralyov Reviewed-by: Dmitri Shuralyov Reviewed-by: Carlos Amedee Run-TryBot: Carlos Amedee TryBot-Result: Gopher Robot --- CONTRIBUTORS | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index b0314a0ffb..d344b208c8 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -25,10 +25,12 @@ # Please keep the list sorted. Aamir Khan +Aaqa Ishtyaq Aaron Beitch Aaron Bieber Aaron Cannon Aaron France +Aaron Gable Aaron Jacobs Aaron Jensen Aaron Kemp @@ -38,6 +40,7 @@ Aaron Stein Aaron Torres Aaron Zinman Aarti Parikh +Aayush Agrawal Abdullah Al Maruf Abe Haskins Abhinav Gupta @@ -49,6 +52,7 @@ Adam Kisala Adam Langley Adam Medzinski Adam Mitha +Adam Pritchard Adam Shannon Adam Shelton Adam Sindelar @@ -98,8 +102,10 @@ Alberto Donizetti Alberto García Hierro Alec Benzer Alejandro García Montoro +Alejandro Sáez Aleksa Sarai Aleksandar Dezelin +Aleksandr Dobkin Aleksandr Lukinykh Aleksandr Razumov Alekseev Artem @@ -107,6 +113,7 @@ Aleksei Tirman Alessandro Arzilli Alessandro Baffa Alex A Skinner +Alex Brachet Alex Brainman Alex Bramley Alex Browne @@ -165,6 +172,7 @@ Alexey Borzenkov Alexey Naidonov Alexey Neganov Alexey Palazhchenko +Alexey Perevalov Alexey Semenyuk Alexey Vilenskiy Alexis Hildebrandt @@ -275,6 +283,7 @@ Anthony Alves Anthony Canino Anthony Eufemio Anthony Fok +Anthony Hamon Anthony Martin Anthony Sottile Anthony Starks @@ -335,6 +344,7 @@ Avi Flax Aviv Klasquin Komissar awaw fumin Awn Umar +Axel Busch <94176305+abuschIBM@users.noreply.github.com> Axel Wagner Ayan George Ayanamist Yang @@ -364,6 +374,7 @@ Ben Laurie Ben Lubar Ben Lynn Ben Olive +Ben Sarah Golightly Ben Schwartz Ben Shi Ben Toews @@ -379,6 +390,7 @@ Benny Siegert Benoit Sigoure Berengar Lehr Berkant Ipek <41230766+0xbkt@users.noreply.github.com> +Bernhard Valenti Beth Brown Bharath Kumar Uppala Bharath Thiruveedula @@ -429,6 +441,7 @@ Brave Cow Brayden Cloud Brendan Daniel Tracey Brendan O'Dea +Breno Andrade Brett Cannon Brett Merrill Brian Dellisanti @@ -498,6 +511,7 @@ Charles Lee Charles Weill Charlie Getzen Charlie Moog +Charlie Vieth Charlotte Brandhorst-Satzkorn Chauncy Cullitan Chen Zhidong @@ -540,6 +554,7 @@ Christian Himpel Christian Muehlhaeuser Christian Pellegrin Christian R. Petrin +Christian Stewart Christian Svensson Christine Hansmann Christoffer Buchholz @@ -580,7 +595,9 @@ Corne van der Plas Cosmos Nicolaou Costin Chirvasuta Craig Citro +Cristian Greco Cristian Staretu +Cristiano Vitorino <57003922+cristianovitorino@users.noreply.github.com> Cristo García cui fliter Cuihtlauac ALVARADO @@ -613,6 +630,7 @@ Daniel Cormier Daniël de Kok Daniel Fleischman Daniel Ingram +Daniel Jakots Daniel Johansson Daniel Kerwin Daniel Kessler @@ -688,6 +706,7 @@ David R. Jenni David Sansome David Stainton David Symonds +David Taylor David Thomas David Timm David Titarenco @@ -695,6 +714,7 @@ David Tolpin David Url David Volquartz Lebech David Wimmer +Davide Masserut Davies Liu Davor Kapsa Dean Eigenmann <7621705+decanus@users.noreply.github.com> @@ -762,6 +782,7 @@ Donovan Hide Doug Anderson Doug Fawley Douglas Danger Manley +Dragan Mladjenovic Drew Flower Drew Hintz Drew Richardson @@ -774,6 +795,7 @@ Dustin Sallings Dustin Shields-Cloues Dustin Spicuzza Dvir Volk +Dylan Le Dylan Waits Ed Schouten Edan Bedrik <3d4nb3@gmail.com> @@ -785,6 +807,7 @@ Eduardo Villaseñor Edward Muller Egon Elbre Ehren Kret +Eisuke Takahashi Eitan Adler Eivind Uggedal El Mostafa Idrassi @@ -882,6 +905,7 @@ Fernandez Ludovic Filip Gruszczyński Filip Haglund Filip Stanis +Filippo Rossi Filippo Valsorda Firmansyah Adiputra Florian Forster @@ -965,19 +989,24 @@ GitHub User @ajnirp (1688456) GitHub User @ajz01 (4744634) GitHub User @alkesh26 (1019076) GitHub User @andig (184815) +GitHub User @AndreasHGK (36563463) GitHub User @andrius4669 (4699695) +GitHub User @ardnew (3837367) +GitHub User @ariathaker (51683211) GitHub User @as (8127015) GitHub User @bakape (7851952) GitHub User @bgadrian (830001) GitHub User @bontequero (2674999) GitHub User @cch123 (384546) GitHub User @chainhelen (7046329) +GitHub User @champly (15027259) GitHub User @chanxuehong (3416908) GitHub User @Cluas (10056928) GitHub User @cncal (23520240) GitHub User @DQNEO (188741) GitHub User @Dreamacro (8615343) GitHub User @dupoxy (1143957) +GitHub User @eh-steve (16373174) GitHub User @EndlessCheng (7086966) GitHub User @erifan (31343225) GitHub User @esell (9735165) @@ -987,6 +1016,7 @@ GitHub User @geedchin (11672310) GitHub User @GrigoriyMikhalkin (3637857) GitHub User @Gusted (25481501) GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com> +GitHub User @hidu (613972) GitHub User @hitzhangjie (3725760) GitHub User @hkhere (33268704) <33268704+hkhere@users.noreply.github.com> GitHub User @hqpko (13887251) @@ -994,8 +1024,10 @@ GitHub User @Illirgway (5428603) GitHub User @itchyny (375258) GitHub User @jinmiaoluo (39730824) GitHub User @jopbrown (6345470) +GitHub User @Jorropo (24391983) GitHub User @kazyshr (30496953) GitHub User @kc1212 (1093806) +GitHub User @kkHAIKE (64772) GitHub User @komisan19 (18901496) GitHub User @korzhao (64203902) GitHub User @Kropekk (13366453) @@ -1012,8 +1044,11 @@ GitHub User @markruler (38225900) GitHub User @Matts966 (28551465) GitHub User @micnncim (21333876) GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com> +GitHub User @mkontani (19817636) +GitHub User @mstmdev (5756338) GitHub User @nu50218 (40682920) GitHub User @OlgaVlPetrova (44112727) +GitHub User @penglei (1140325) GitHub User @pierwill (19642016) GitHub User @pityonline (438222) GitHub User @po3rin (29445112) @@ -1027,6 +1062,7 @@ GitHub User @roudkerk (52280478) GitHub User @saitarunreddy (21041941) GitHub User @SataQiu (9354727) GitHub User @seifchen (23326132) +GitHub User @sethbattin (1627760) GitHub User @shogo-ma (9860598) GitHub User @sivchari (55221074) GitHub User @skanehira (7888591) @@ -1037,6 +1073,7 @@ GitHub User @tangxi666 (48145175) GitHub User @tatsumack (4510569) GitHub User @tell-k (26263) GitHub User @tennashi (10219626) +GitHub User @thepudds (20628140) GitHub User @uhei (2116845) GitHub User @uji (49834542) GitHub User @unbyte (5772358) @@ -1048,6 +1085,7 @@ GitHub User @wolf1996 (5901874) GitHub User @yah01 (12216890) GitHub User @yuanhh (1298735) GitHub User @zikaeroh (48577114) +GitHub User @zlasd (9432027) GitHub User @ZZMarquis (7624583) Giulio Iotti Giulio Micheloni @@ -1067,6 +1105,7 @@ Greg Steuck Greg Thelen Greg Ward Grégoire Delattre +Grégoire Détrez Gregory Man Gregory Petrosyan Guilherme Caruso @@ -1078,6 +1117,7 @@ Guillaume Blaquiere Guillaume J. Charmes Guillaume Sottas Günther Noack +Guo Hui Guobiao Mei Guodong Li Guoliang Wang @@ -1128,6 +1168,7 @@ Herbert Georg Fischer Herbie Ong Heschi Kreinick Hidetatsu Yaginuma +Hilário Coelho Hilko Bengen Himanshu Kishna Srivastava <28himanshu@gmail.com> Hiroaki Nakamura @@ -1173,8 +1214,10 @@ Igor Dolzhikov Igor Vashyst Igor Zhilianin Ikko Ashimine +Ilia Choly Illya Yalovyy Ilya Chukov <56119080+Elias506@users.noreply.github.com> +Ilya Leoshkevich Ilya Mateyko Ilya Sinelnikov Ilya Tocar @@ -1274,6 +1317,7 @@ Jani Monoses Jannis Andrija Schnitzer Jared Allard Jared Culp +Jared Horvat Jaroslavas Počepko Jason A. Donenfeld Jason Baker @@ -1309,6 +1353,7 @@ Jeevanandam M Jeff (Zhefu) Jiang Jeff Craig Jeff Dupont +Jeff Grafton Jeff Hodges Jeff Johnson Jeff R. Allen @@ -1322,6 +1367,7 @@ Jens Frederich Jeremiah Harmsen Jeremy Banks <_@jeremy.ca> Jeremy Canady +Jeremy Chase Jeremy Faller Jeremy Jackins Jeremy Jay @@ -1352,14 +1398,16 @@ Jimmy Zelinskie Jin-wook Jeong Jingcheng Zhang Jingguo Yao -Jinzhu Zhang Jingnan Si Jinkun Zhang Jinwen Wo +Jinwook Jeong +Jinzhu Zhang Jiong Du Jirka Daněk Jiulong Wang Joakim Sernbrant +João Penteado <4219131+joaopenteado@users.noreply.github.com> Jochen Weber Joe Bowbeer Joe Cortopassi @@ -1383,8 +1431,10 @@ Johan Euphrosine Johan Jansson Johan Knutzen Johan Sageryd +Johan Van de Wauw Johannes Altmanninger Johannes Huning +John Anthony John Asmuth John Bampton John Beisley @@ -1458,6 +1508,8 @@ Josh Deprez Josh Goebel Josh Hoak Josh Holland +Josh Humphries +Josh Powers Josh Rickmar Josh Roppo Josh Varga @@ -1564,11 +1616,13 @@ Kevin Klues Kevin Malachowski Kevin Parsons Kevin Ruffin +Kevin Smith Kevin Vu Kevin Zita Keyan Pishdadian Keyuan Li Kezhu Wang +Khaled Yakdan Khosrow Moossavi Kieran Colford Kieran Gorman @@ -1590,6 +1644,7 @@ Koki Tomoshige Komu Wairagu Konstantin Konstantin Shaposhnikov +Koumei Mikuni Koya IWAMURA Kris Kwiatkowski Kris Nova @@ -1625,6 +1680,7 @@ Lars Jeppesen Lars Lehtonen Lars Wiegman Larz Conwell +Lasse Folger Laurent Voisin Laurie Clark-Michalek LE Manh Cuong @@ -1656,6 +1712,7 @@ Lorenz Nickel Lorenzo Masini Lorenzo Stoakes Louis Kruger +Louis Portay Luan Santos Lubomir I. Ivanov Luca Bruno @@ -1670,6 +1727,7 @@ Luigi Riefolo Luit van Drongelen Luka Zakrajšek Luka Zitnik +Lukas Joisten Lukasz Milewski Luke Champine Luke Curley @@ -1688,6 +1746,7 @@ Magnus Hiie Mahdi Hosseini Moghaddam Maia Lee Maicon Costa +Maisem Ali Mak Kolybabi Maksym Trykur Mal Curtis @@ -1779,6 +1838,7 @@ Matheus Alcantara Mathias Beke Mathias Hall-Andersen Mathias Leppich +Mathieu Aubin Mathieu Lonjaret Mats Lidell Matt Aimonetti @@ -1795,6 +1855,7 @@ Matt Juran Matt Layher Matt Masurka Matt Pearring +Matt Prahl Matt Reiferson Matt Robenolt Matt Strong @@ -1826,11 +1887,14 @@ Maxim Pimenov Maxim Pugachev Maxim Ushakov Maxime de Roucy +Maxime Soulé +Maxime Veber Máximo Cuadros Ortiz Maxwell Krohn Maya Rashish Mayank Kumar Mehrad Sadeghi <2012.linkinpark@gmail.com> +Meidan Li Meir Fischer Meng Zhuo Mhd Sulhan @@ -1848,6 +1912,7 @@ Michael Ellis Michael Fraenkel Michael Fromberger Michael Gehring +Michael Gross Michael Henderson Michael Hendricks Michael Hoisie @@ -1909,6 +1974,7 @@ Mike Houston Mike Kabischev Mike Rosset Mike Samuel +Mike Seplowitz Mike Solomon Mike Strosaker Mike Tsao @@ -1939,9 +2005,11 @@ Monty Taylor Moritz Fain Moriyoshi Koizumi Morten Siebuhr +Moshe Good Môshe van der Sterre Mostafa Solati Mostyn Bramley-Moore +Motiejus Jakštys Mrunal Patel Muhammad Falak R Wani Muhammad Hamza Farrukh @@ -2001,6 +2069,7 @@ Nick Robinson Nick Sherron Nick Smolin Nicolas BRULEZ +Nicolas Hillegeer Nicolas Kaiser Nicolas Owens Nicolas S. Dade @@ -2049,6 +2118,7 @@ Olivier Duperray Olivier Mengué Olivier Poitrey Olivier Saingre +Olivier Szika Olivier Wulveryck Omar Jarjur Onkar Jadhav @@ -2069,6 +2139,7 @@ Panos Georgiadis Pantelis Sampaziotis Paolo Giarrusso Paolo Martini +Park Zhou Parker Moore Parminder Singh Pascal Dierich @@ -2086,6 +2157,7 @@ Patrick Lee Patrick Mézard Patrick Mylund Nielsen Patrick Pelletier +Patrick Pokatilo Patrick Riley Patrick Smith Patrik Lundin @@ -2118,6 +2190,7 @@ Paul Wankadia Paulo Casaretto Paulo Flabiano Smorigo Paulo Gomes +Pavel Gryaznov Pavel Kositsyn Pavel Paulau Pavel Watson @@ -2154,6 +2227,7 @@ Péter Szabó Péter Szilágyi Peter Teichman Peter Tseng +Peter Verraedt Peter Waldschmidt Peter Waller Peter Weinberger @@ -2162,6 +2236,8 @@ Peter Wu Peter Zhang Petr Jediný Petrica Voicu +Phil Bracikowski +Phil Kulin Phil Pearl Phil Pennock Philip Børgesen @@ -2171,6 +2247,7 @@ Philip K. Warren Philip Nelson Philipp Sauter Philipp Stephani +Philippe Antoine Phillip Campbell <15082+phillc@users.noreply.github.com> Pierre Carru Pierre Durand @@ -2184,6 +2261,7 @@ Plekhanov Maxim Poh Zi How Polina Osadcha Pontus Leitzler +Pooja Shyamsundar Povilas Versockas Prajwal Koirala <16564273+Prajwal-Koirala@users.noreply.github.com> Prasanga Siripala @@ -2235,7 +2313,9 @@ Rebecca Stambler Reilly Watson Reinaldo de Souza Jr Remi Gillig +Remy Chantenay Rémy Oudompheng +Ren Kanai Ren Ogaki Rens Rikkerink Rhys Hiltner @@ -2301,8 +2381,10 @@ Romain Baugue Roman Budnikov Roman Kollár Roman Shchekin +Romanos Skiadas Ron Hashimoto Ron Minnich +Ronaldo Lanhellas Ronnie Ebrin Ross Chater Ross Kinsey @@ -2341,6 +2423,7 @@ Sabin Mihai Rapan Sad Pencil Sai Cheemalapati Sai Kiran Dasika +Sai Sunder Sakeven Jiang Salaheddin M. Mahmud Salmān Aljammāz @@ -2392,6 +2475,7 @@ Sean Liao Sean Rees Sebastiaan van Stijn Sebastian Chlopecki +Sebastian Gassner Sebastian Kinne Sebastian Schmidt Sebastien Binet @@ -2428,6 +2512,7 @@ Shamim Akhtar Shane Hansen Shang Jian Ding Shaozhen Ding +Shapor Naghibzadeh Shaquille Que Shaquille Wyan Que Shaun Dunning @@ -2441,6 +2526,7 @@ Shengyu Zhang Shi Han Ng ShihCheng Tu Shijie Hao +Shiming Zhang Shin Fan Shinji Tanaka Shinnosuke Sawada <6warashi9@gmail.com> @@ -2455,6 +2541,7 @@ Shuai Tan Shubham Sharma Shuhei Takahashi Shun Fan +Silke Hofstra Silvan Jegen Simão Gomes Viana Simarpreet Singh @@ -2470,6 +2557,7 @@ Simon Thulbourn Simon Whitehead Sina Siadat Sjoerd Siebinga +Sofía Celi Sokolov Yura Song Gao Song Lim @@ -2498,6 +2586,7 @@ Stephan Klatt Stephan Renatus Stephan Zuercher Stéphane Travostino +Stephen Eckels Stephen Lewis Stephen Lu Stephen Ma @@ -2517,6 +2606,7 @@ Steven Buss Steven Elliot Harris Steven Erenst Steven Hartland +Steven Johnstone Steven Littiebrant Steven Maude Steven Wilkin @@ -2561,6 +2651,7 @@ Tao Wang Tarmigan Casebolt Taro Aoki Taru Karttunen +Tatiana Bradley Tatsuhiro Tsujikawa Tatsuya Kaneko Taufiq Rahman @@ -2686,6 +2777,7 @@ Uriel Mangado Urvil Patel Utkarsh Dixit <53217283+utkarsh-extc@users.noreply.github.com> Uttam C Pawar +Uzondu Enudeme Vadim Grek Vadim Vygonets Val Polouchkine @@ -2723,7 +2815,7 @@ Vladimir Mihailenco Vladimir Nikishenko Vladimir Stefanovic Vladimir Varankin -Vojtech Bocek +Vojtěch Boček Volker Dobler Volodymyr Paprotski Vyacheslav Pachkov @@ -2733,8 +2825,10 @@ Wagner Riffel Walt Della Walter Poupore Wander Lairson Costa +Wang Deyu Wang Xuerui Warren Fernandes +Watson Ladd Wayne Ashley Berry Wayne Zuo Wedson Almeida Filho @@ -2756,6 +2850,7 @@ Wilfried Teiken Will Beason Will Chan Will Faught +Will Hawkins Will Morrow Will Norris Will Storey @@ -2801,6 +2896,7 @@ Yestin Sun Yesudeep Mangalapilly Yissakhar Z. Beck Yo-An Lin +Yogesh Mangaj Yohei Takeda Yongjian Xu Yorman Arias @@ -2829,6 +2925,7 @@ Yuval Pavel Zholkover Yves Junqueira Zac Bergquist Zach Bintliff +Zach Collier Zach Gershman Zach Hoffman Zach Jones @@ -2838,6 +2935,7 @@ Zachary Gershman Zaiyang Li Zak Zakatell Kanda +Zeke Lu Zellyn Hunter Zev Goldstein Zhang Boyang @@ -2858,6 +2956,7 @@ Zvonimir Pavlinovic Zyad A. Ali Максадбек Ахмедов Максим Федосеев +Михаил Патин Роман Хавроненко Тарас Буник Фахриддин Балтаев From 85a482fc244f6f118b1d063063a51eb8b0feadd8 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 14 Jul 2022 21:19:37 +0000 Subject: [PATCH 76/78] runtime: revert to using the precomputed trigger for pacer calculations Issue #53738 describes in detail how switching to using the actual trigger point over the precomputed trigger causes a memory regression, that arises from the fact that the PI controller in front of the cons/mark ratio has a long time constant (for overdamping), so it retains a long history of inputs. This change, for the Go 1.19 cycle, just reverts to using the precomputed trigger because it's safer, but in the future we should consider moving away from such a history-sensitive smoothing function. See the big comment in the diff and #53738 for more details. Performance difference vs. 1.18 after this change: https://perf.golang.org/search?q=upload:20220714.15 Fixes #53738. Change-Id: I636993a730a3eaed25da2a2719860431b296c6f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/417557 TryBot-Result: Gopher Robot Reviewed-by: Michael Pratt Run-TryBot: Michael Knyszek --- src/runtime/mgcpacer.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/runtime/mgcpacer.go b/src/runtime/mgcpacer.go index ac3446db36..2d9fd27748 100644 --- a/src/runtime/mgcpacer.go +++ b/src/runtime/mgcpacer.go @@ -439,7 +439,26 @@ func (c *gcControllerState) startCycle(markStartTime int64, procs int, trigger g c.fractionalMarkTime = 0 c.idleMarkTime = 0 c.markStartTime = markStartTime - c.triggered = c.heapLive + + // TODO(mknyszek): This is supposed to be the actual trigger point for the heap, but + // causes regressions in memory use. The cause is that the PI controller used to smooth + // the cons/mark ratio measurements tends to flail when using the less accurate precomputed + // trigger for the cons/mark calculation, and this results in the controller being more + // conservative about steady-states it tries to find in the future. + // + // This conservatism is transient, but these transient states tend to matter for short-lived + // programs, especially because the PI controller is overdamped, partially because it is + // configured with a relatively large time constant. + // + // Ultimately, I think this is just two mistakes piled on one another: the choice of a swingy + // smoothing function that recalls a fairly long history (due to its overdamped time constant) + // coupled with an inaccurate cons/mark calculation. It just so happens this works better + // today, and it makes it harder to change things in the future. + // + // This is described in #53738. Fix this for #53892 by changing back to the actual trigger + // point and simplifying the smoothing function. + heapTrigger, heapGoal := c.trigger() + c.triggered = heapTrigger // Compute the background mark utilization goal. In general, // this may not come out exactly. We round the number of @@ -501,7 +520,6 @@ func (c *gcControllerState) startCycle(markStartTime int64, procs int, trigger g c.revise() if debug.gcpacertrace > 0 { - heapGoal := c.heapGoal() assistRatio := c.assistWorkPerByte.Load() print("pacer: assist ratio=", assistRatio, " (scan ", gcController.heapScan>>20, " MB in ", From 28be440d3434a440d0c144ba2128b30ce9771ecf Mon Sep 17 00:00:00 2001 From: yanweizhi Date: Tue, 19 Jul 2022 18:56:23 +0800 Subject: [PATCH 77/78] A+C: add Weizhi Yan Change-Id: I2cef8fa2a61fc69b9b21ff75428af428d99ae2f2 Reviewed-on: https://go-review.googlesource.com/c/go/+/418174 Reviewed-by: Dmitri Shuralyov Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Run-TryBot: Dmitri Shuralyov Reviewed-by: Dmitri Shuralyov Auto-Submit: Dmitri Shuralyov --- AUTHORS | 1 + CONTRIBUTORS | 1 + 2 files changed, 2 insertions(+) diff --git a/AUTHORS b/AUTHORS index bb07bd52e8..0507e04838 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1438,6 +1438,7 @@ Wei Fu Wei Guangjing Weichao Tang Weixie Cui <523516579@qq.com> +Weizhi Yan Wembley G. Leach, Jr Wen Yang Will Faught diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d344b208c8..45020d6c45 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2841,6 +2841,7 @@ Wei Xikai Weichao Tang Weilu Jia Weixie Cui <523516579@qq.com> +Weizhi Yan Wembley G. Leach, Jr Wen Yang Wenlei (Frank) He From 8e1e64c16a4d53c06ed4f2287fc11eeb5029ca1a Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 19 Jul 2022 09:07:38 -0700 Subject: [PATCH 78/78] cmd/compile: fix mknode script It's not currently working. Somehow a field of type []constant.Value causes it to barf. (That field was added with jump table statements.) Also added some instructions about how to run it correctly (which took me a suprisingly long time to figure out). Larger improvements coming, but this gets us to a working state and is safe for 1.19. Change-Id: I3027356fde1294942e87d075ca28bb40d2c0d6c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/418234 Reviewed-by: Keith Randall TryBot-Result: Gopher Robot Reviewed-by: Matthew Dempsky Run-TryBot: Keith Randall --- src/cmd/compile/internal/ir/mini.go | 1 + src/cmd/compile/internal/ir/mknode.go | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/cmd/compile/internal/ir/mini.go b/src/cmd/compile/internal/ir/mini.go index 98c0ffa5b0..48f5eccf34 100644 --- a/src/cmd/compile/internal/ir/mini.go +++ b/src/cmd/compile/internal/ir/mini.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. //go:generate go run -mod=mod mknode.go +// Note: see comment at top of mknode.go package ir diff --git a/src/cmd/compile/internal/ir/mknode.go b/src/cmd/compile/internal/ir/mknode.go index 5a0aaadf16..af8869d122 100644 --- a/src/cmd/compile/internal/ir/mknode.go +++ b/src/cmd/compile/internal/ir/mknode.go @@ -5,6 +5,12 @@ //go:build ignore // +build ignore +// Note: this program must be run with the GOROOT +// environment variable set to the root of this tree. +// GOROOT=... +// cd $GOROOT/src/cmd/compile/internal/ir +// ../../../../../bin/go run -mod=mod mknode.go + package main import ( @@ -154,6 +160,9 @@ func forNodeFields(named *types.Named, prologue, singleTmpl, sliceTmpl, epilogue } tmpl, what := singleTmpl, types.TypeString(typ, types.RelativeTo(irPkg)) + if what == "go/constant.Value" { + return false + } if implementsNode(typ) { if slice != nil { helper := strings.TrimPrefix(what, "*") + "s"