aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-12-12 09:13:58 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-12-13 18:56:36 +0100
commit922cca0f7b14bb80909ffeedbd1d1cdee10610ca (patch)
tree345663d8630f1e3d6472325a1c8d7be6cb3cf427
parent3fc0a844bfb8efd6f8fe32585e4fd5d9f2af3fc3 (diff)
syz-manager: use ReportGenerator.RestorePC in RPCServer.NewInput
This will allow to support gvisor coverage where PCs don't need to be rewound to the previous instruction.
-rw-r--r--pkg/cover/report.go5
-rw-r--r--pkg/cover/report_test.go3
-rw-r--r--syz-manager/covfilter.go15
-rw-r--r--syz-manager/rpc.go10
4 files changed, 17 insertions, 16 deletions
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index e50e11d13..234c30823 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -26,10 +26,7 @@ type Prog struct {
PCs []uint64
}
-var (
- RestorePC = backend.RestorePC
- PreviousInstructionPC = backend.PreviousInstructionPC
-)
+var RestorePC = backend.RestorePC
func MakeReportGenerator(target *targets.Target, vm, objDir, srcDir, buildDir string) (*ReportGenerator, error) {
if objDir == "" {
diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go
index afda03203..63f1ff50a 100644
--- a/pkg/cover/report_test.go
+++ b/pkg/cover/report_test.go
@@ -21,6 +21,7 @@ import (
"testing"
"time"
+ "github.com/google/syzkaller/pkg/cover/backend"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/pkg/symbolizer"
_ "github.com/google/syzkaller/sys"
@@ -190,7 +191,7 @@ func generateReport(t *testing.T, target *targets.Target, test Test) ([]byte, []
if err != nil {
t.Fatal(err)
}
- pcs = append(pcs, PreviousInstructionPC(target, pc))
+ pcs = append(pcs, backend.PreviousInstructionPC(target, pc))
t.Logf("using exact coverage PC 0x%x", pcs[0])
} else if target.OS == runtime.GOOS && (target.Arch == runtime.GOARCH || target.VMArch == runtime.GOARCH) {
t.Fatal(err)
diff --git a/syz-manager/covfilter.go b/syz-manager/covfilter.go
index db4c5a64f..fc3c674f8 100644
--- a/syz-manager/covfilter.go
+++ b/syz-manager/covfilter.go
@@ -23,14 +23,13 @@ import (
func createCoverageFilter(cfg *mgrconfig.Config) (string, map[uint32]uint32, error) {
pcs := make(map[uint32]uint32)
filter := &cfg.CovFilter
- if len(filter.Files) != 0 || len(filter.Functions) != 0 {
- rg, err := getReportGenerator(cfg)
- if err != nil {
- return "", nil, err
- }
- if err := initFilesFuncs(pcs, filter.Files, filter.Functions, rg); err != nil {
- return "", nil, err
- }
+ // Always initialize ReportGenerator because RPCServer.NewInput will need it to filter coverage.
+ rg, err := getReportGenerator(cfg)
+ if err != nil {
+ return "", nil, err
+ }
+ if err := initFilesFuncs(pcs, filter.Files, filter.Functions, rg); err != nil {
+ return "", nil, err
}
if err := initWeightedPCs(pcs, filter.RawPCs); err != nil {
return "", nil, err
diff --git a/syz-manager/rpc.go b/syz-manager/rpc.go
index e17489994..7ea1c5a23 100644
--- a/syz-manager/rpc.go
+++ b/syz-manager/rpc.go
@@ -250,11 +250,15 @@ func (serv *RPCServer) NewInput(a *rpctype.NewInputArgs, r *int) error {
}
diff := serv.corpusCover.MergeDiff(a.Cover)
serv.stats.corpusCover.set(len(serv.corpusCover))
- if serv.coverFilter != nil {
+ if len(diff) != 0 && serv.coverFilter != nil {
+ // Note: ReportGenerator is already initialized if coverFilter is enabled.
+ rg, err := getReportGenerator(serv.cfg)
+ if err != nil {
+ return err
+ }
filtered := 0
for _, pc := range diff {
- prevPC := uint32(cover.PreviousInstructionPC(serv.cfg.SysTarget, uint64(pc)))
- if serv.coverFilter[prevPC] != 0 {
+ if serv.coverFilter[uint32(rg.RestorePC(pc))] != 0 {
filtered++
}
}