aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@freebsd.org>2018-12-31 19:07:41 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-12-31 19:36:13 +0100
commit3d85f48c1449a8fe6db5cef827592f56ee6dcf26 (patch)
treeb1e8ffdfa82f11b70bfb15f91f2c799b50392d1d
parentd580c113aaba02633be947c4c1617cfaadb09d99 (diff)
syz-manager: Improve the computation of getVMOffset() on FreeBSD
On FreeBSD getVMOffset() always returned 0 instead of 0xffffffff. This breaks the usage of addr2line. For now, just return always 0xffffffff on FreeBSD, since a more sophisticated logic doesn't seem to be required by now. Thanks to Dmitry for pointing out that this functions provides the prefix address.
-rw-r--r--syz-manager/cover.go13
-rw-r--r--syz-manager/html.go4
2 files changed, 10 insertions, 7 deletions
diff --git a/syz-manager/cover.go b/syz-manager/cover.go
index 6c05df174..deaac9064 100644
--- a/syz-manager/cover.go
+++ b/syz-manager/cover.go
@@ -25,7 +25,7 @@ var (
reportGenerator *cover.ReportGenerator
)
-func initCover(kernelObj, kernelObjName, kernelSrc, arch string) error {
+func initCover(kernelObj, kernelObjName, kernelSrc, arch, OS string) error {
if kernelObj == "" {
return fmt.Errorf("kernel_obj is not specified")
}
@@ -35,15 +35,15 @@ func initCover(kernelObj, kernelObjName, kernelSrc, arch string) error {
if err != nil {
return err
}
- initCoverVMOffset, err = getVMOffset(vmlinux)
+ initCoverVMOffset, err = getVMOffset(vmlinux, OS)
return err
}
-func generateCoverHTML(w io.Writer, kernelObj, kernelObjName, kernelSrc, arch string, cov cover.Cover) error {
+func generateCoverHTML(w io.Writer, kernelObj, kernelObjName, kernelSrc, arch, OS string, cov cover.Cover) error {
if len(cov) == 0 {
return fmt.Errorf("no coverage data available")
}
- initCoverOnce.Do(func() { initCoverError = initCover(kernelObj, kernelObjName, kernelSrc, arch) })
+ initCoverOnce.Do(func() { initCoverError = initCover(kernelObj, kernelObjName, kernelSrc, arch, OS) })
if initCoverError != nil {
return initCoverError
}
@@ -54,7 +54,10 @@ func generateCoverHTML(w io.Writer, kernelObj, kernelObjName, kernelSrc, arch st
return reportGenerator.Do(w, pcs)
}
-func getVMOffset(vmlinux string) (uint32, error) {
+func getVMOffset(vmlinux, OS string) (uint32, error) {
+ if OS == "freebsd" {
+ return 0xffffffff, nil
+ }
out, err := osutil.RunCmd(time.Hour, "", "readelf", "-SW", vmlinux)
if err != nil {
return 0, err
diff --git a/syz-manager/html.go b/syz-manager/html.go
index 2a05748f7..3f549b4d7 100644
--- a/syz-manager/html.go
+++ b/syz-manager/html.go
@@ -248,7 +248,7 @@ func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request) {
}
if err := generateCoverHTML(w, mgr.cfg.KernelObj, mgr.sysTarget.KernelObject,
- mgr.cfg.KernelSrc, mgr.cfg.TargetVMArch, cov); err != nil {
+ mgr.cfg.KernelSrc, mgr.cfg.TargetVMArch, mgr.cfg.TargetOS, cov); err != nil {
http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError)
return
}
@@ -400,7 +400,7 @@ func (mgr *Manager) httpRawCover(w http.ResponseWriter, r *http.Request) {
initCoverOnce.Do(func() {
initCoverError = initCover(mgr.cfg.KernelObj, mgr.sysTarget.KernelObject,
- mgr.cfg.KernelSrc, mgr.cfg.TargetArch)
+ mgr.cfg.KernelSrc, mgr.cfg.TargetArch, mgr.cfg.TargetOS)
})
if initCoverError != nil {
http.Error(w, initCoverError.Error(), http.StatusInternalServerError)