aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-08-05 14:48:58 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-08-06 08:24:55 +0000
commit02d235671dbf89097f52a94a165703fa274079a2 (patch)
tree3530bdce9402487cd1bed5b7c2557b66d08f3217
parentd09987bf4245ee5e985530f65901855f39f273a3 (diff)
syz-manager: move prog helpers to the prog package
Reduce the size of syz-manager.
-rw-r--r--prog/prog.go22
-rw-r--r--syz-manager/hub.go2
-rw-r--r--syz-manager/manager.go24
3 files changed, 25 insertions, 23 deletions
diff --git a/prog/prog.go b/prog/prog.go
index 6fabaa680..de3d87778 100644
--- a/prog/prog.go
+++ b/prog/prog.go
@@ -27,6 +27,28 @@ func (p *Prog) CallName(call int) string {
return p.Calls[call].Meta.Name
}
+// OnlyContains determines whether the program only consists of the syscalls from the first argument.
+func (p *Prog) OnlyContains(syscalls map[*Syscall]bool) bool {
+ for _, c := range p.Calls {
+ if !syscalls[c.Meta] {
+ return false
+ }
+ }
+ return true
+}
+
+// FilterInplace only leaves the allowed system calls and deletes all remaining ones.
+func (p *Prog) FilterInplace(allowed map[*Syscall]bool) {
+ for i := 0; i < len(p.Calls); {
+ c := p.Calls[i]
+ if !allowed[c.Meta] {
+ p.RemoveCall(i)
+ continue
+ }
+ i++
+ }
+}
+
// These properties are parsed and serialized according to the tag and the type
// of the corresponding fields.
// IMPORTANT: keep the exact values of "key" tag for existing props unchanged,
diff --git a/syz-manager/hub.go b/syz-manager/hub.go
index 2b8d21be5..75ac8f6a0 100644
--- a/syz-manager/hub.go
+++ b/syz-manager/hub.go
@@ -320,7 +320,7 @@ func (hc *HubConnector) parseProgram(data []byte) (*prog.Prog, error) {
if err != nil {
return nil, err
}
- if containsDisabled(p, hc.enabledCalls) {
+ if !p.OnlyContains(hc.enabledCalls) {
return nil, fmt.Errorf("contains disabled calls")
}
return p, nil
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index 4f30742dc..7486b771f 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -638,7 +638,7 @@ func (mgr *Manager) loadCorpus() []fuzzer.Candidate {
seeds := 0
var candidates []fuzzer.Candidate
for _, item := range <-mgr.corpusPreload {
- if containsDisabled(item.Prog, mgr.targetEnabledSyscalls) {
+ if !item.Prog.OnlyContains(mgr.targetEnabledSyscalls) {
if mgr.cfg.PreserveCorpus {
// This program contains a disabled syscall.
// We won't execute it, but remember its hash so
@@ -649,7 +649,7 @@ func (mgr *Manager) loadCorpus() []fuzzer.Candidate {
// We cut out the disabled syscalls and retriage/minimize what remains from the prog.
// The original prog will be deleted from the corpus.
item.Flags &= ^fuzzer.ProgMinimized
- programLeftover(mgr.target, mgr.targetEnabledSyscalls, item.Prog)
+ item.Prog.FilterInplace(mgr.targetEnabledSyscalls)
if len(item.Prog.Calls) == 0 {
continue
}
@@ -663,17 +663,6 @@ func (mgr *Manager) loadCorpus() []fuzzer.Candidate {
return candidates
}
-func programLeftover(target *prog.Target, enabled map[*prog.Syscall]bool, p *prog.Prog) {
- for i := 0; i < len(p.Calls); {
- c := p.Calls[i]
- if !enabled[c.Meta] {
- p.RemoveCall(i)
- continue
- }
- i++
- }
-}
-
func loadProg(target *prog.Target, data []byte) (*prog.Prog, error) {
p, err := target.Deserialize(data, prog.NonStrict)
if err != nil {
@@ -691,15 +680,6 @@ func loadProg(target *prog.Target, data []byte) (*prog.Prog, error) {
return p, nil
}
-func containsDisabled(p *prog.Prog, enabled map[*prog.Syscall]bool) bool {
- for _, c := range p.Calls {
- if !enabled[c.Meta] {
- return true
- }
- }
- return false
-}
-
func (mgr *Manager) fuzzerInstance(ctx context.Context, inst *vm.Instance, updInfo dispatcher.UpdateInfo) {
injectExec := make(chan bool, 10)
mgr.serv.CreateInstance(inst.Index(), injectExec, updInfo)