From: Ian Lance Taylor Date: Wed, 14 Jun 2023 21:26:59 +0000 (-0700) Subject: cmd/go: check for errors reading gccgo package list X-Git-Tag: go1.21rc1~1^2~4 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=da94586aa3;p=gostls13.git cmd/go: check for errors reading gccgo package list Previously if there was something invalid about the package list cmd/go would crash rather than reporting a useful error. For #60798 Change-Id: I502facf41442ab49217405b5b1874fff52a6d416 Reviewed-on: https://go-review.googlesource.com/c/go/+/503496 TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan Mills Reviewed-by: Ian Lance Taylor --- diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 0fc85da006..d4d0a71e75 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -382,16 +382,23 @@ func (b *Builder) NewObjdir() string { func readpkglist(shlibpath string) (pkgs []*load.Package) { var stk load.ImportStack if cfg.BuildToolchainName == "gccgo" { - f, _ := elf.Open(shlibpath) + f, err := elf.Open(shlibpath) + if err != nil { + base.Fatal(fmt.Errorf("failed to open shared library: %v", err)) + } sect := f.Section(".go_export") - data, _ := sect.Data() - scanner := bufio.NewScanner(bytes.NewBuffer(data)) - for scanner.Scan() { - t := scanner.Text() - var found bool - if t, found = strings.CutPrefix(t, "pkgpath "); found { - t = strings.TrimSuffix(t, ";") - pkgs = append(pkgs, load.LoadPackageWithFlags(t, base.Cwd(), &stk, nil, 0)) + if sect == nil { + base.Fatal(fmt.Errorf("%s: missing .go_export section", shlibpath)) + } + data, err := sect.Data() + if err != nil { + base.Fatal(fmt.Errorf("%s: failed to read .go_export section: %v", shlibpath, err)) + } + pkgpath := []byte("pkgpath ") + for _, line := range bytes.Split(data, []byte{'\n'}) { + if path, found := bytes.CutPrefix(line, pkgpath); found { + path = bytes.TrimSuffix(path, []byte{';'}) + pkgs = append(pkgs, load.LoadPackageWithFlags(string(path), base.Cwd(), &stk, nil, 0)) } } } else {