diff --git a/third_party/bitbucket.org/kardianos/osext/osext_sysctl.go b/third_party/bitbucket.org/kardianos/osext/osext_sysctl.go index d76464628..e4d228ed1 100644 --- a/third_party/bitbucket.org/kardianos/osext/osext_sysctl.go +++ b/third_party/bitbucket.org/kardianos/osext/osext_sysctl.go @@ -8,6 +8,7 @@ package osext import ( "os" + "path/filepath" "runtime" "syscall" "unsafe" @@ -47,18 +48,35 @@ func executable() (string, error) { break } } + var strpath string if buf[0] != '/' { - if getwdError != nil { - return string(buf), getwdError - } else { - if buf[0] == '.' { - buf = buf[1:] - } - if startUpcwd[len(startUpcwd)-1] != '/' { - return startUpcwd + "/" + string(buf), nil - } - return startUpcwd + string(buf), nil + var e error + if strpath, e = getAbs(buf); e != nil { + return strpath, e + } + } else { + strpath = string(buf) + } + // darwin KERN_PROCARGS may return the path to a symlink rather than the + // actual executable + if runtime.GOOS == "darwin" { + if strpath, err := filepath.EvalSymlinks(strpath); err != nil { + return strpath, err } } - return string(buf), nil + return strpath, nil +} + +func getAbs(buf []byte) (string, error) { + if getwdError != nil { + return string(buf), getwdError + } else { + if buf[0] == '.' { + buf = buf[1:] + } + if startUpcwd[len(startUpcwd)-1] != '/' && buf[0] != '/' { + return startUpcwd + "/" + string(buf), nil + } + return startUpcwd + string(buf), nil + } }