all: replace all usages of os/exec with golang.org/x/sys/execabs

This change ensures that packages using exec.LookPath or
exec.Command to find or run binaries do not accidentally run
programs from the current directory when they mean to run programs
from the system PATH instead.

Change-Id: I5907aa630ff64012395a7eb472967a477d90f12e
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/949438
Reviewed-by: Katie Hockman <katiehockman@google.com>
Reviewed-by: Russ Cox <rsc@google.com>
Reviewed-on: https://go-review.googlesource.com/c/tools/+/284773
Run-TryBot: Roland Shoemaker <roland@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Roland Shoemaker <roland@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/cmd/auth/authtest/authtest.go b/cmd/auth/authtest/authtest.go
index 263eed8..0489b93 100644
--- a/cmd/auth/authtest/authtest.go
+++ b/cmd/auth/authtest/authtest.go
@@ -18,13 +18,13 @@
 	"bytes"
 	"flag"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"log"
 	"net/http"
 	"net/textproto"
 	"net/url"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"strings"
 )
diff --git a/cmd/auth/gitauth/gitauth.go b/cmd/auth/gitauth/gitauth.go
index b481fe6..7bfca6e 100644
--- a/cmd/auth/gitauth/gitauth.go
+++ b/cmd/auth/gitauth/gitauth.go
@@ -16,11 +16,11 @@
 import (
 	"bytes"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"log"
 	"net/http"
 	"net/url"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"strings"
 )
diff --git a/cmd/compilebench/main.go b/cmd/compilebench/main.go
index afce218..d7da6d5 100644
--- a/cmd/compilebench/main.go
+++ b/cmd/compilebench/main.go
@@ -82,10 +82,10 @@
 	"encoding/json"
 	"flag"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"regexp"
 	"strconv"
diff --git a/cmd/cover/html.go b/cmd/cover/html.go
index ef50e2b..0f8c725 100644
--- a/cmd/cover/html.go
+++ b/cmd/cover/html.go
@@ -8,12 +8,12 @@
 	"bufio"
 	"bytes"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"html/template"
 	"io"
 	"io/ioutil"
 	"math"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"runtime"
 
diff --git a/cmd/eg/eg.go b/cmd/eg/eg.go
index 9199f42..a5473ad 100644
--- a/cmd/eg/eg.go
+++ b/cmd/eg/eg.go
@@ -14,8 +14,8 @@
 	"go/format"
 	"go/parser"
 	"go/token"
+	exec "golang.org/x/sys/execabs"
 	"os"
-	"os/exec"
 	"strings"
 
 	"golang.org/x/tools/go/buildutil"
diff --git a/cmd/fiximports/main.go b/cmd/fiximports/main.go
index 53a9944..f572a15 100644
--- a/cmd/fiximports/main.go
+++ b/cmd/fiximports/main.go
@@ -79,11 +79,11 @@
 	"go/format"
 	"go/parser"
 	"go/token"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path"
 	"path/filepath"
 	"sort"
diff --git a/cmd/getgo/main.go b/cmd/getgo/main.go
index 792ea05..417e860 100644
--- a/cmd/getgo/main.go
+++ b/cmd/getgo/main.go
@@ -13,8 +13,8 @@
 	"errors"
 	"flag"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"os"
-	"os/exec"
 	"strings"
 )
 
diff --git a/cmd/getgo/system.go b/cmd/getgo/system.go
index 07d6f85..232ca36 100644
--- a/cmd/getgo/system.go
+++ b/cmd/getgo/system.go
@@ -9,7 +9,7 @@
 import (
 	"bytes"
 	"context"
-	"os/exec"
+	exec "golang.org/x/sys/execabs"
 	"runtime"
 	"strings"
 )
diff --git a/cmd/go-contrib-init/contrib.go b/cmd/go-contrib-init/contrib.go
index 7c65746..e2bb507 100644
--- a/cmd/go-contrib-init/contrib.go
+++ b/cmd/go-contrib-init/contrib.go
@@ -13,10 +13,10 @@
 	"flag"
 	"fmt"
 	"go/build"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"regexp"
 	"runtime"
diff --git a/cmd/godoc/goroot.go b/cmd/godoc/goroot.go
index 755069d..c284ca8 100644
--- a/cmd/godoc/goroot.go
+++ b/cmd/godoc/goroot.go
@@ -5,8 +5,8 @@
 package main
 
 import (
+	exec "golang.org/x/sys/execabs"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"runtime"
 	"strings"
diff --git a/cmd/godoc/main.go b/cmd/godoc/main.go
index 7dba4d2..02f0eb6 100644
--- a/cmd/godoc/main.go
+++ b/cmd/godoc/main.go
@@ -25,13 +25,13 @@
 	"flag"
 	"fmt"
 	"go/build"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"log"
 	"net/http"
 	_ "net/http/pprof" // to serve /debug/pprof/*
 	"net/url"
 	"os"
-	"os/exec"
 	"path"
 	"path/filepath"
 	"regexp"
diff --git a/cmd/goimports/goimports.go b/cmd/goimports/goimports.go
index 2770897..b354c9e 100644
--- a/cmd/goimports/goimports.go
+++ b/cmd/goimports/goimports.go
@@ -11,11 +11,11 @@
 	"flag"
 	"fmt"
 	"go/scanner"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"runtime"
 	"runtime/pprof"
diff --git a/cmd/stress/stress.go b/cmd/stress/stress.go
index e127735..4ff6cf3 100644
--- a/cmd/stress/stress.go
+++ b/cmd/stress/stress.go
@@ -17,9 +17,9 @@
 import (
 	"flag"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"regexp"
 	"runtime"
diff --git a/cmd/toolstash/main.go b/cmd/toolstash/main.go
index b462b50..4c34942 100644
--- a/cmd/toolstash/main.go
+++ b/cmd/toolstash/main.go
@@ -127,11 +127,11 @@
 	"bufio"
 	"flag"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"runtime"
 	"strings"
diff --git a/go.mod b/go.mod
index 57607cb..aaefd1f 100644
--- a/go.mod
+++ b/go.mod
@@ -7,5 +7,6 @@
 	golang.org/x/mod v0.3.0
 	golang.org/x/net v0.0.0-20201021035429-f5854403a974
 	golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
+	golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
 )
diff --git a/go.sum b/go.sum
index 1608006..12a6e94 100644
--- a/go.sum
+++ b/go.sum
@@ -15,6 +15,8 @@
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/go/internal/cgo/cgo.go b/go/internal/cgo/cgo.go
index 5db8b30..9772504 100644
--- a/go/internal/cgo/cgo.go
+++ b/go/internal/cgo/cgo.go
@@ -57,10 +57,10 @@
 	"go/build"
 	"go/parser"
 	"go/token"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"regexp"
 	"strings"
diff --git a/go/internal/cgo/cgo_pkgconfig.go b/go/internal/cgo/cgo_pkgconfig.go
index b5bb95a..7d94bbc 100644
--- a/go/internal/cgo/cgo_pkgconfig.go
+++ b/go/internal/cgo/cgo_pkgconfig.go
@@ -8,7 +8,7 @@
 	"errors"
 	"fmt"
 	"go/build"
-	"os/exec"
+	exec "golang.org/x/sys/execabs"
 	"strings"
 )
 
diff --git a/go/internal/gccgoimporter/gccgoinstallation.go b/go/internal/gccgoimporter/gccgoinstallation.go
index fac4100..365521e 100644
--- a/go/internal/gccgoimporter/gccgoinstallation.go
+++ b/go/internal/gccgoimporter/gccgoinstallation.go
@@ -10,8 +10,8 @@
 import (
 	"bufio"
 	"go/types"
+	exec "golang.org/x/sys/execabs"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"strings"
 )
diff --git a/go/packages/external.go b/go/packages/external.go
index 7db1d12..7242a0a 100644
--- a/go/packages/external.go
+++ b/go/packages/external.go
@@ -12,8 +12,8 @@
 	"bytes"
 	"encoding/json"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"os"
-	"os/exec"
 	"strings"
 )
 
diff --git a/go/packages/golist.go b/go/packages/golist.go
index c83ca09..ec417ba 100644
--- a/go/packages/golist.go
+++ b/go/packages/golist.go
@@ -10,10 +10,10 @@
 	"encoding/json"
 	"fmt"
 	"go/types"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path"
 	"path/filepath"
 	"reflect"
diff --git a/go/pointer/util.go b/go/pointer/util.go
index 986dd09..5bdd623 100644
--- a/go/pointer/util.go
+++ b/go/pointer/util.go
@@ -8,9 +8,9 @@
 	"bytes"
 	"fmt"
 	"go/types"
+	exec "golang.org/x/sys/execabs"
 	"log"
 	"os"
-	"os/exec"
 	"runtime"
 	"time"
 
diff --git a/go/vcs/vcs.go b/go/vcs/vcs.go
index 1deb813..f2aac1c 100644
--- a/go/vcs/vcs.go
+++ b/go/vcs/vcs.go
@@ -19,10 +19,10 @@
 	"encoding/json"
 	"errors"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"log"
 	"net/url"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"regexp"
 	"strconv"
diff --git a/gopls/go.mod b/gopls/go.mod
index 390d162..7812cbc 100644
--- a/gopls/go.mod
+++ b/gopls/go.mod
@@ -7,6 +7,7 @@
 	github.com/sanity-io/litter v1.3.0
 	github.com/sergi/go-diff v1.1.0
 	golang.org/x/mod v0.4.0
+	golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4
 	golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
 	honnef.co/go/tools v0.0.1-2020.1.6
diff --git a/gopls/go.sum b/gopls/go.sum
index c3f96cb..5c8cfb0 100644
--- a/gopls/go.sum
+++ b/gopls/go.sum
@@ -46,6 +46,8 @@
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
diff --git a/gopls/integration/replay/main.go b/gopls/integration/replay/main.go
index 683ef81..35cd1d5 100644
--- a/gopls/integration/replay/main.go
+++ b/gopls/integration/replay/main.go
@@ -10,9 +10,9 @@
 	"context"
 	"flag"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"log"
 	"os"
-	"os/exec"
 	"sort"
 	"strconv"
 	"strings"
diff --git a/gopls/internal/hooks/licenses.go b/gopls/internal/hooks/licenses.go
index 58dea04..028c90e 100644
--- a/gopls/internal/hooks/licenses.go
+++ b/gopls/internal/hooks/licenses.go
@@ -168,4 +168,4 @@
 
 `
 
-const licensesGeneratedFrom = "3fbcbd4a23419568c3f6609cc89f2918537c4ea023dc11a5bb55e3d3e5a67368"
+const licensesGeneratedFrom = "029a0f934a7bad22a7d47185055bc554b1ea23ce427351caa87d9a088fcfba4e"
diff --git a/gopls/internal/regtest/runner.go b/gopls/internal/regtest/runner.go
index d168d18..1e77cb8 100644
--- a/gopls/internal/regtest/runner.go
+++ b/gopls/internal/regtest/runner.go
@@ -8,11 +8,11 @@
 	"bytes"
 	"context"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"net"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"runtime/pprof"
 	"strings"
diff --git a/gopls/release/release.go b/gopls/release/release.go
index 62455fe..1739091 100644
--- a/gopls/release/release.go
+++ b/gopls/release/release.go
@@ -15,10 +15,10 @@
 	"flag"
 	"fmt"
 	"go/types"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"os/user"
 	"path/filepath"
 	"strconv"
diff --git a/internal/gocommand/invoke.go b/internal/gocommand/invoke.go
index f65aad4..8659a0c 100644
--- a/internal/gocommand/invoke.go
+++ b/internal/gocommand/invoke.go
@@ -9,9 +9,9 @@
 	"bytes"
 	"context"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"os"
-	"os/exec"
 	"regexp"
 	"strconv"
 	"strings"
diff --git a/internal/imports/mkstdlib.go b/internal/imports/mkstdlib.go
index 82d8f51..cf0fc49 100644
--- a/internal/imports/mkstdlib.go
+++ b/internal/imports/mkstdlib.go
@@ -14,11 +14,11 @@
 	"bytes"
 	"fmt"
 	"go/format"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"regexp"
 	"runtime"
diff --git a/internal/lsp/browser/browser.go b/internal/lsp/browser/browser.go
index 6867c85..0ac4f20 100644
--- a/internal/lsp/browser/browser.go
+++ b/internal/lsp/browser/browser.go
@@ -6,8 +6,8 @@
 package browser
 
 import (
+	exec "golang.org/x/sys/execabs"
 	"os"
-	"os/exec"
 	"runtime"
 	"time"
 )
diff --git a/internal/lsp/cache/view.go b/internal/lsp/cache/view.go
index 16bef0b..ec35561 100644
--- a/internal/lsp/cache/view.go
+++ b/internal/lsp/cache/view.go
@@ -9,10 +9,10 @@
 	"context"
 	"encoding/json"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"os"
-	"os/exec"
 	"path"
 	"path/filepath"
 	"reflect"
diff --git a/internal/lsp/cmd/test/format.go b/internal/lsp/cmd/test/format.go
index f5b4631..77eedd4 100644
--- a/internal/lsp/cmd/test/format.go
+++ b/internal/lsp/cmd/test/format.go
@@ -6,9 +6,9 @@
 
 import (
 	"bytes"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"os"
-	"os/exec"
 	"regexp"
 	"strings"
 	"testing"
diff --git a/internal/lsp/lsprpc/autostart_default.go b/internal/lsp/lsprpc/autostart_default.go
index 2ddc5b6..dc04f66 100644
--- a/internal/lsp/lsprpc/autostart_default.go
+++ b/internal/lsp/lsprpc/autostart_default.go
@@ -5,7 +5,7 @@
 package lsprpc
 
 import (
-	"os/exec"
+	exec "golang.org/x/sys/execabs"
 
 	errors "golang.org/x/xerrors"
 )
diff --git a/internal/lsp/lsprpc/autostart_posix.go b/internal/lsp/lsprpc/autostart_posix.go
index d6c832b..9ad3f1d 100644
--- a/internal/lsp/lsprpc/autostart_posix.go
+++ b/internal/lsp/lsprpc/autostart_posix.go
@@ -10,9 +10,9 @@
 	"crypto/sha256"
 	"errors"
 	"fmt"
+	exec "golang.org/x/sys/execabs"
 	"log"
 	"os"
-	"os/exec"
 	"os/user"
 	"path/filepath"
 	"strconv"
diff --git a/internal/testenv/testenv.go b/internal/testenv/testenv.go
index f725b95..65b7953 100644
--- a/internal/testenv/testenv.go
+++ b/internal/testenv/testenv.go
@@ -10,9 +10,9 @@
 	"bytes"
 	"fmt"
 	"go/build"
+	exec "golang.org/x/sys/execabs"
 	"io/ioutil"
 	"os"
-	"os/exec"
 	"runtime"
 	"strings"
 	"sync"
diff --git a/playground/socket/socket.go b/playground/socket/socket.go
index 17b6de3..5e385eb 100644
--- a/playground/socket/socket.go
+++ b/playground/socket/socket.go
@@ -19,6 +19,7 @@
 	"errors"
 	"go/parser"
 	"go/token"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"log"
@@ -26,7 +27,6 @@
 	"net/http"
 	"net/url"
 	"os"
-	"os/exec"
 	"path/filepath"
 	"runtime"
 	"strings"
diff --git a/refactor/rename/mvpkg.go b/refactor/rename/mvpkg.go
index 7889711..58fad6b 100644
--- a/refactor/rename/mvpkg.go
+++ b/refactor/rename/mvpkg.go
@@ -18,9 +18,9 @@
 	"go/build"
 	"go/format"
 	"go/token"
+	exec "golang.org/x/sys/execabs"
 	"log"
 	"os"
-	"os/exec"
 	"path"
 	"path/filepath"
 	"regexp"
diff --git a/refactor/rename/rename.go b/refactor/rename/rename.go
index 3651c62..e74e0a6 100644
--- a/refactor/rename/rename.go
+++ b/refactor/rename/rename.go
@@ -17,11 +17,11 @@
 	"go/parser"
 	"go/token"
 	"go/types"
+	exec "golang.org/x/sys/execabs"
 	"io"
 	"io/ioutil"
 	"log"
 	"os"
-	"os/exec"
 	"path"
 	"regexp"
 	"sort"