From 8337b5a8a99e64e122d2965906f1eee58734d5ac Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Wed, 21 Sep 2022 18:48:35 +0200 Subject: [PATCH] service/debugger: merge attachErrorMessage, verifyBinaryFormat (#3142) These functions don't need to be conditionally compiled and they share substanatial amounts of code in all their OS-specific versions. --- service/debugger/debugger.go | 56 ++++++++++++++++++++++++++++ service/debugger/debugger_darwin.go | 10 ----- service/debugger/debugger_freebsd.go | 9 ----- service/debugger/debugger_linux.go | 6 ++- service/debugger/debugger_unix.go | 45 ---------------------- service/debugger/debugger_windows.go | 37 ------------------ 6 files changed, 61 insertions(+), 102 deletions(-) delete mode 100644 service/debugger/debugger_darwin.go delete mode 100644 service/debugger/debugger_freebsd.go delete mode 100644 service/debugger/debugger_unix.go delete mode 100644 service/debugger/debugger_windows.go diff --git a/service/debugger/debugger.go b/service/debugger/debugger.go index 869bdd95..f9b83fb3 100644 --- a/service/debugger/debugger.go +++ b/service/debugger/debugger.go @@ -3,11 +3,15 @@ package debugger import ( "bytes" "debug/dwarf" + "debug/elf" + "debug/macho" + "debug/pe" "errors" "fmt" "go/parser" "go/token" "os" + "os/exec" "path/filepath" "regexp" "runtime" @@ -2304,3 +2308,55 @@ func noDebugErrorWarning(err error) error { } return err } + +func verifyBinaryFormat(exePath string) error { + f, err := os.Open(exePath) + if err != nil { + return err + } + defer f.Close() + + switch runtime.GOOS { + case "windows": + // Make sure the binary exists and is an executable file + if filepath.Base(exePath) == exePath { + if _, err := exec.LookPath(exePath); err != nil { + return err + } + } + default: + fi, err := f.Stat() + if err != nil { + return err + } + if (fi.Mode() & 0111) == 0 { + return api.ErrNotExecutable + } + } + + // check that the binary format is what we expect for the host system + var exe interface{ Close() error } + + switch runtime.GOOS { + case "darwin": + exe, err = macho.NewFile(f) + case "linux", "freebsd": + exe, err = elf.NewFile(f) + case "windows": + exe, err = pe.NewFile(f) + default: + panic("attempting to open file Delve cannot parse") + } + + if err != nil { + return api.ErrNotExecutable + } + exe.Close() + return nil +} + +var attachErrorMessage = attachErrorMessageDefault + +func attachErrorMessageDefault(pid int, err error) error { + return fmt.Errorf("could not attach to pid %d: %s", pid, err) +} diff --git a/service/debugger/debugger_darwin.go b/service/debugger/debugger_darwin.go deleted file mode 100644 index 9edeca65..00000000 --- a/service/debugger/debugger_darwin.go +++ /dev/null @@ -1,10 +0,0 @@ -package debugger - -import ( - "fmt" -) - -func attachErrorMessage(pid int, err error) error { - //TODO: mention certificates? - return fmt.Errorf("could not attach to pid %d: %s", pid, err) -} diff --git a/service/debugger/debugger_freebsd.go b/service/debugger/debugger_freebsd.go deleted file mode 100644 index 06c7f14d..00000000 --- a/service/debugger/debugger_freebsd.go +++ /dev/null @@ -1,9 +0,0 @@ -package debugger - -import ( - "fmt" -) - -func attachErrorMessage(pid int, err error) error { - return fmt.Errorf("could not attach to pid %d: %s", pid, err) -} diff --git a/service/debugger/debugger_linux.go b/service/debugger/debugger_linux.go index ab19c848..d4058cda 100644 --- a/service/debugger/debugger_linux.go +++ b/service/debugger/debugger_linux.go @@ -7,9 +7,13 @@ import ( "syscall" ) +func init() { + attachErrorMessage = attachErrorMessageLinux +} + //lint:file-ignore ST1005 errors here can be capitalized -func attachErrorMessage(pid int, err error) error { +func attachErrorMessageLinux(pid int, err error) error { fallbackerr := fmt.Errorf("could not attach to pid %d: %s", pid, err) if serr, ok := err.(syscall.Errno); ok { switch serr { diff --git a/service/debugger/debugger_unix.go b/service/debugger/debugger_unix.go deleted file mode 100644 index 2978ce16..00000000 --- a/service/debugger/debugger_unix.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build !windows -// +build !windows - -package debugger - -import ( - "debug/elf" - "debug/macho" - "os" - "runtime" - - "github.com/go-delve/delve/service/api" -) - -func verifyBinaryFormat(exePath string) error { - f, err := os.Open(exePath) - if err != nil { - return err - } - defer f.Close() - - fi, err := f.Stat() - if err != nil { - return err - } - if (fi.Mode() & 0111) == 0 { - return api.ErrNotExecutable - } - - // check that the binary format is what we expect for the host system - var exe interface{ Close() error } - switch runtime.GOOS { - case "darwin": - exe, err = macho.NewFile(f) - case "linux", "freebsd": - exe, err = elf.NewFile(f) - default: - panic("attempting to open file Delve cannot parse") - } - if err != nil { - return api.ErrNotExecutable - } - exe.Close() - return nil -} diff --git a/service/debugger/debugger_windows.go b/service/debugger/debugger_windows.go deleted file mode 100644 index 0fa24930..00000000 --- a/service/debugger/debugger_windows.go +++ /dev/null @@ -1,37 +0,0 @@ -package debugger - -import ( - "debug/pe" - "fmt" - "os" - "os/exec" - "path/filepath" - - "github.com/go-delve/delve/service/api" -) - -func attachErrorMessage(pid int, err error) error { - return fmt.Errorf("could not attach to pid %d: %s", pid, err) -} - -func verifyBinaryFormat(exePath string) error { - f, err := os.Open(exePath) - if err != nil { - return err - } - defer f.Close() - - // Make sure the binary exists and is an executable file - if filepath.Base(exePath) == exePath { - if _, err := exec.LookPath(exePath); err != nil { - return err - } - } - - exe, err := pe.NewFile(f) - if err != nil { - return api.ErrNotExecutable - } - exe.Close() - return nil -}