aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-09-18 17:36:53 +0200
committerTaras Madan <tarasmadan@google.com>2025-10-07 15:25:13 +0000
commit99ed12e158687b7aba55eac142d6bad3f147d029 (patch)
treea9809d7c5d60f45b805e0346a9a543ba0651a9e1 /pkg
parent790f0ffe2224829b20e4dc6556c090c503e1d161 (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.go39
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
+}