diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2025-09-18 17:36:53 +0200 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2025-10-07 15:25:13 +0000 |
| commit | 99ed12e158687b7aba55eac142d6bad3f147d029 (patch) | |
| tree | a9809d7c5d60f45b805e0346a9a543ba0651a9e1 /pkg | |
| parent | 790f0ffe2224829b20e4dc6556c090c503e1d161 (diff) | |
syz-cluster: rewrite fuzz config generation
Instead of a predefined set of manually written syz-manager configs,
construct it dynamically from different bits.
During triage, select not just one, but all matching fuzzer
configurations and then merge them together.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/db/db.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/pkg/db/db.go b/pkg/db/db.go index 034d1bf67..3007a8774 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -346,3 +346,42 @@ func ReadCorpus(filename string, target *prog.Target) (progs []*prog.Prog, err e } return progs, nil } + +type DeserializeFailure struct { + File string + Err error +} + +func Merge(into string, other []string, target *prog.Target) ([]DeserializeFailure, error) { + dstDB, err := Open(into, false) + if err != nil { + return nil, fmt.Errorf("failed to open database: %w", err) + } + var failed []DeserializeFailure + for _, add := range other { + addDB, err := Open(add, false) + if err == nil { + // It's a DB file. + for key, rec := range addDB.Records { + dstDB.Save(key, rec.Val, rec.Seq) + } + continue + } + if target == nil { + // We were not given a target, so we cannot parse it as a seed file. + return nil, fmt.Errorf("failed to open db %v: %w", add, err) + } + data, err := os.ReadFile(add) + if err != nil { + return nil, err + } + if _, err := target.Deserialize(data, prog.NonStrict); err != nil { + failed = append(failed, DeserializeFailure{add, err}) + } + dstDB.Save(hash.String(data), data, 0) + } + if err := dstDB.Flush(); err != nil { + return nil, fmt.Errorf("failed to save db: %w", err) + } + return failed, nil +} |
