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.
This commit is contained in:
parent
1add32b4d9
commit
8337b5a8a9
@ -3,11 +3,15 @@ package debugger
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"debug/dwarf"
|
"debug/dwarf"
|
||||||
|
"debug/elf"
|
||||||
|
"debug/macho"
|
||||||
|
"debug/pe"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -2304,3 +2308,55 @@ func noDebugErrorWarning(err error) error {
|
|||||||
}
|
}
|
||||||
return err
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
@ -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)
|
|
||||||
}
|
|
||||||
@ -7,9 +7,13 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
attachErrorMessage = attachErrorMessageLinux
|
||||||
|
}
|
||||||
|
|
||||||
//lint:file-ignore ST1005 errors here can be capitalized
|
//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)
|
fallbackerr := fmt.Errorf("could not attach to pid %d: %s", pid, err)
|
||||||
if serr, ok := err.(syscall.Errno); ok {
|
if serr, ok := err.(syscall.Errno); ok {
|
||||||
switch serr {
|
switch serr {
|
||||||
|
|||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user