diff options
author | Dan Willemsen <dwillemsen@google.com> | 2018-05-19 00:54:13 +0000 |
---|---|---|
committer | Dan Willemsen <dwillemsen@google.com> | 2018-05-19 00:54:13 +0000 |
commit | 96c957ae20d8418f85cf10b4ee06ce9781d86c47 (patch) | |
tree | 99bc385c7a7a4159ffa10ce1ac7003376563d21b /cmd | |
parent | a14704c12bbcc1eb207d1c0ff3df0140a4582fc5 (diff) | |
download | build_soong-96c957ae20d8418f85cf10b4ee06ce9781d86c47.tar.gz build_soong-96c957ae20d8418f85cf10b4ee06ce9781d86c47.tar.bz2 build_soong-96c957ae20d8418f85cf10b4ee06ce9781d86c47.zip |
Revert "Add path interposer"
This reverts commit a14704c12bbcc1eb207d1c0ff3df0140a4582fc5.
Reason for revert: breaking builds
Change-Id: I920b0ff41823428a0baf59b3fd82cbcc766babca
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/path_interposer/Android.bp | 20 | ||||
-rw-r--r-- | cmd/path_interposer/main.go | 229 | ||||
-rw-r--r-- | cmd/path_interposer/main_test.go | 196 |
3 files changed, 0 insertions, 445 deletions
diff --git a/cmd/path_interposer/Android.bp b/cmd/path_interposer/Android.bp deleted file mode 100644 index 41a219f9..00000000 --- a/cmd/path_interposer/Android.bp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2018 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -blueprint_go_binary { - name: "path_interposer", - deps: ["soong-ui-build-paths"], - srcs: ["main.go"], - testSrcs: ["main_test.go"], -} diff --git a/cmd/path_interposer/main.go b/cmd/path_interposer/main.go deleted file mode 100644 index 01fe5d4b..00000000 --- a/cmd/path_interposer/main.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2018 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strconv" - "syscall" - - "android/soong/ui/build/paths" -) - -func main() { - interposer, err := os.Executable() - if err != nil { - fmt.Fprintln(os.Stderr, "Unable to locate interposer executable:", err) - os.Exit(1) - } - - disableError := false - if e, ok := os.LookupEnv("TEMPORARY_DISABLE_PATH_RESTRICTIONS"); ok { - disableError = e == "1" || e == "y" || e == "yes" || e == "on" || e == "true" - } - - exitCode, err := Main(os.Stdout, os.Stderr, interposer, os.Args, mainOpts{ - disableError: disableError, - - sendLog: paths.SendLog, - config: paths.GetConfig, - lookupParents: lookupParents, - }) - if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - } - os.Exit(exitCode) -} - -var usage = fmt.Errorf(`To use the PATH interposer: - * Write the original PATH variable to <interposer>_origpath - * Set up a directory of symlinks to the PATH interposer, and use that in PATH - -If a tool isn't in the allowed list, a log will be posted to the unix domain -socket at <interposer>_log.`) - -type mainOpts struct { - disableError bool - - sendLog func(logSocket string, entry *paths.LogEntry, done chan interface{}) - config func(name string) paths.PathConfig - lookupParents func() []paths.LogProcess -} - -func Main(stdout, stderr io.Writer, interposer string, args []string, opts mainOpts) (int, error) { - base := filepath.Base(args[0]) - - origPathFile := interposer + "_origpath" - if base == filepath.Base(interposer) { - return 1, usage - } - - origPath, err := ioutil.ReadFile(origPathFile) - if err != nil { - if os.IsNotExist(err) { - return 1, usage - } else { - return 1, fmt.Errorf("Failed to read original PATH: %v", err) - } - } - - cmd := &exec.Cmd{ - Args: args, - Env: os.Environ(), - - Stdin: os.Stdin, - Stdout: stdout, - Stderr: stderr, - } - - if err := os.Setenv("PATH", string(origPath)); err != nil { - return 1, fmt.Errorf("Failed to set PATH env: %v", err) - } - - if config := opts.config(base); config.Log || config.Error { - var procs []paths.LogProcess - if opts.lookupParents != nil { - procs = opts.lookupParents() - } - - if opts.sendLog != nil { - waitForLog := make(chan interface{}) - opts.sendLog(interposer+"_log", &paths.LogEntry{ - Basename: base, - Args: args, - Parents: procs, - }, waitForLog) - defer func() { <-waitForLog }() - } - if config.Error && !opts.disableError { - return 1, fmt.Errorf("%q is not allowed to be used. See https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools for more information.", base) - } - } - - cmd.Path, err = exec.LookPath(base) - if err != nil { - return 1, err - } - - if err = cmd.Run(); err != nil { - if exitErr, ok := err.(*exec.ExitError); ok { - if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { - if status.Exited() { - return status.ExitStatus(), nil - } else if status.Signaled() { - exitCode := 128 + int(status.Signal()) - return exitCode, nil - } else { - return 1, exitErr - } - } else { - return 1, nil - } - } - } - - return 0, nil -} - -type procEntry struct { - Pid int - Ppid int - Command string -} - -func readProcs() map[int]procEntry { - cmd := exec.Command("ps", "-o", "pid,ppid,command") - data, err := cmd.Output() - if err != nil { - return nil - } - - return parseProcs(data) -} - -func parseProcs(data []byte) map[int]procEntry { - lines := bytes.Split(data, []byte("\n")) - if len(lines) < 2 { - return nil - } - // Remove the header - lines = lines[1:] - - ret := make(map[int]procEntry, len(lines)) - for _, line := range lines { - fields := bytes.SplitN(line, []byte(" "), 2) - if len(fields) != 2 { - continue - } - - pid, err := strconv.Atoi(string(fields[0])) - if err != nil { - continue - } - - line = bytes.TrimLeft(fields[1], " ") - - fields = bytes.SplitN(line, []byte(" "), 2) - if len(fields) != 2 { - continue - } - - ppid, err := strconv.Atoi(string(fields[0])) - if err != nil { - continue - } - - ret[pid] = procEntry{ - Pid: pid, - Ppid: ppid, - Command: string(bytes.TrimLeft(fields[1], " ")), - } - } - - return ret -} - -func lookupParents() []paths.LogProcess { - procs := readProcs() - if procs == nil { - return nil - } - - list := []paths.LogProcess{} - pid := os.Getpid() - for { - entry, ok := procs[pid] - if !ok { - break - } - - list = append([]paths.LogProcess{ - { - Pid: pid, - Command: entry.Command, - }, - }, list...) - - pid = entry.Ppid - } - - return list -} diff --git a/cmd/path_interposer/main_test.go b/cmd/path_interposer/main_test.go deleted file mode 100644 index 4b25c446..00000000 --- a/cmd/path_interposer/main_test.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2018 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "android/soong/ui/build/paths" -) - -var tmpDir string -var origPATH string - -func TestMain(m *testing.M) { - os.Exit(func() int { - var err error - tmpDir, err = ioutil.TempDir("", "interposer_test") - if err != nil { - panic(err) - } - defer os.RemoveAll(tmpDir) - - origPATH = os.Getenv("PATH") - err = os.Setenv("PATH", "") - if err != nil { - panic(err) - } - - return m.Run() - }()) -} - -func setup(t *testing.T) string { - f, err := ioutil.TempFile(tmpDir, "interposer") - if err != nil { - t.Fatal(err) - } - defer f.Close() - - err = ioutil.WriteFile(f.Name()+"_origpath", []byte(origPATH), 0666) - if err != nil { - t.Fatal(err) - } - return f.Name() -} - -func TestInterposer(t *testing.T) { - interposer := setup(t) - - logConfig := func(name string) paths.PathConfig { - if name == "true" { - return paths.PathConfig{ - Log: false, - Error: false, - } - } else if name == "path_interposer_test_not_allowed" { - return paths.PathConfig{ - Log: false, - Error: true, - } - } - return paths.PathConfig{ - Log: true, - Error: false, - } - } - - testCases := []struct { - name string - args []string - - exitCode int - err error - logEntry string - }{ - { - name: "direct call", - args: []string{interposer}, - - exitCode: 1, - err: usage, - }, - { - name: "relative call", - args: []string{filepath.Base(interposer)}, - - exitCode: 1, - err: usage, - }, - { - name: "true", - args: []string{"/my/path/true"}, - }, - { - name: "relative true", - args: []string{"true"}, - }, - { - name: "exit code", - args: []string{"bash", "-c", "exit 42"}, - - exitCode: 42, - logEntry: "bash", - }, - { - name: "signal", - args: []string{"bash", "-c", "kill -9 $$"}, - - exitCode: 137, - logEntry: "bash", - }, - { - name: "does not exist", - args: []string{"path_interposer_test_does_not_exist"}, - - exitCode: 1, - err: fmt.Errorf(`exec: "path_interposer_test_does_not_exist": executable file not found in $PATH`), - logEntry: "path_interposer_test_does_not_exist", - }, - { - name: "not allowed", - args: []string{"path_interposer_test_not_allowed"}, - - exitCode: 1, - err: fmt.Errorf(`"path_interposer_test_not_allowed" is not allowed to be used. See https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools for more information.`), - logEntry: "path_interposer_test_not_allowed", - }, - } - - for _, testCase := range testCases { - t.Run(testCase.name, func(t *testing.T) { - logged := false - logFunc := func(logSocket string, entry *paths.LogEntry, done chan interface{}) { - defer close(done) - - logged = true - if entry.Basename != testCase.logEntry { - t.Errorf("unexpected log entry:\nwant: %q\n got: %q", testCase.logEntry, entry.Basename) - } - } - - exitCode, err := Main(ioutil.Discard, ioutil.Discard, interposer, testCase.args, mainOpts{ - sendLog: logFunc, - config: logConfig, - }) - - errstr := func(err error) string { - if err == nil { - return "" - } - return err.Error() - } - if errstr(testCase.err) != errstr(err) { - t.Errorf("unexpected error:\nwant: %v\n got: %v", testCase.err, err) - } - if testCase.exitCode != exitCode { - t.Errorf("expected exit code %d, got %d", testCase.exitCode, exitCode) - } - if !logged && testCase.logEntry != "" { - t.Errorf("no log entry, but expected %q", testCase.logEntry) - } - }) - } -} - -func TestMissingPath(t *testing.T) { - interposer := setup(t) - err := os.Remove(interposer + "_origpath") - if err != nil { - t.Fatalf("Failed to remove:", err) - } - - exitCode, err := Main(ioutil.Discard, ioutil.Discard, interposer, []string{"true"}, mainOpts{}) - if err != usage { - t.Errorf("Unexpected error:\n got: %v\nwant: %v", err, usage) - } - if exitCode != 1 { - t.Errorf("expected exit code %d, got %d", 1, exitCode) - } -} |