Skip to content

Commit

Permalink
Don't use exec syscall when starting the server
Browse files Browse the repository at this point in the history
  • Loading branch information
mtibben committed Jan 13, 2020
1 parent 1a76dc9 commit 7daf3aa
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 71 deletions.
63 changes: 62 additions & 1 deletion cli/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import (
"fmt"
"log"
"os"
"os/exec"
"os/signal"
"runtime"
"strings"
"syscall"
"time"

"github.com/99designs/aws-vault/server"
Expand Down Expand Up @@ -179,7 +183,12 @@ func ExecCommand(input ExecCommandInput) error {
}
}

err = exec(input.Command, input.Args, env)
if input.StartServer {
err = execCmd(input.Command, input.Args, env)
} else {
err = execSyscall(input.Command, input.Args, env)
}

if err != nil {
return fmt.Errorf("Error execing process: %w", err)
}
Expand Down Expand Up @@ -207,3 +216,55 @@ func (e *environ) Set(key, val string) {
e.Unset(key)
*e = append(*e, key+"="+val)
}

func execCmd(command string, args []string, env []string) error {
cmd := exec.Command(command, args...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = env

sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan)

if err := cmd.Start(); err != nil {
return fmt.Errorf("Failed to start command: %v", err)
}

go func() {
for {
sig := <-sigChan
cmd.Process.Signal(sig)
}
}()

if err := cmd.Wait(); err != nil {
cmd.Process.Signal(os.Kill)
return fmt.Errorf("Failed to wait for command termination: %v", err)
}

waitStatus := cmd.ProcessState.Sys().(syscall.WaitStatus)
os.Exit(waitStatus.ExitStatus())
return nil
}

func supportsExecSyscall() bool {
return runtime.GOOS == "linux" || runtime.GOOS == "darwin" || runtime.GOOS == "freebsd"
}

func execSyscall(command string, args []string, env []string) error {
if !supportsExecSyscall() {
return execCmd(command, args, env)
}

argv0, err := exec.LookPath(command)
if err != nil {
return err
}

argv := make([]string, 0, 1+len(args))
argv = append(argv, command)
argv = append(argv, args...)

return syscall.Exec(argv0, argv, env)
}
42 changes: 0 additions & 42 deletions cli/exec_default.go

This file was deleted.

21 changes: 0 additions & 21 deletions cli/exec_unix.go

This file was deleted.

11 changes: 4 additions & 7 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,10 @@ func StartCredentialsServer(creds *credentials.Credentials) error {
}
}

l, err := net.Listen("tcp", localServerBind)
if err != nil {
return err
}

log.Printf("Local instance role server running on %s", l.Addr())
go http.Serve(l, credsHandler(creds))
log.Printf("Starting local instance role server on %s", localServerBind)
go func() {
log.Fatalln(http.ListenAndServe(localServerBind, credsHandler(creds)))
}()

return nil
}
Expand Down

0 comments on commit 7daf3aa

Please sign in to comment.