diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-08-05 14:48:58 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-08-06 08:24:55 +0000 |
| commit | 02d235671dbf89097f52a94a165703fa274079a2 (patch) | |
| tree | 3530bdce9402487cd1bed5b7c2557b66d08f3217 | |
| parent | d09987bf4245ee5e985530f65901855f39f273a3 (diff) | |
syz-manager: move prog helpers to the prog package
Reduce the size of syz-manager.
| -rw-r--r-- | prog/prog.go | 22 | ||||
| -rw-r--r-- | syz-manager/hub.go | 2 | ||||
| -rw-r--r-- | syz-manager/manager.go | 24 |
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) |
