aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/mgrconfig/config.go21
-rw-r--r--pkg/mgrconfig/load.go5
-rw-r--r--pkg/rpctype/rpctype.go12
3 files changed, 37 insertions, 1 deletions
diff --git a/pkg/mgrconfig/config.go b/pkg/mgrconfig/config.go
index 3de0814d5..b03d16d67 100644
--- a/pkg/mgrconfig/config.go
+++ b/pkg/mgrconfig/config.go
@@ -54,6 +54,27 @@ type Config struct {
HubClient string `json:"hub_client,omitempty"`
HubAddr string `json:"hub_addr,omitempty"`
HubKey string `json:"hub_key,omitempty"`
+ // Hub input domain identifier (optional).
+ // The domain is used to avoid duplicate work (input minimization, smashing)
+ // across multiple managers testing similar kernels and connected to the same hub.
+ // If two managers are in the same domain, they will not do input minimization after each other.
+ // If additionally they are in the same smashing sub-domain, they will also not do smashing
+ // after each other.
+ // By default (empty domain) all managers testing the same OS are placed into the same domain,
+ // this is a reasonable setting if managers test roughly the same kernel. In this case they
+ // will not do minimization nor smashing after each other.
+ // The setting can be either a single identifier (e.g. "foo") which will affect both minimization
+ // and smashing; or two identifiers separated with '/' (e.g. "foo/bar"), in this case the first
+ // identifier affects minimization and both affect smashing.
+ // For example, if managers test different Linux kernel versions with different tools,
+ // a reasonable use of domains on these managers can be:
+ // - "upstream/kasan"
+ // - "upstream/kmsan"
+ // - "upstream/kcsan"
+ // - "5.4/kasan"
+ // - "5.4/kcsan"
+ // - "4.19/kasan"
+ HubDomain string `json:"hub_domain,omitempty"`
// List of email addresses to receive notifications when bugs are encountered for the first time (optional).
// Mailx is the only supported mailer. Please set it up prior to using this function.
diff --git a/pkg/mgrconfig/load.go b/pkg/mgrconfig/load.go
index 14b98eb01..a11de44be 100644
--- a/pkg/mgrconfig/load.go
+++ b/pkg/mgrconfig/load.go
@@ -8,6 +8,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
+ "regexp"
"strings"
"github.com/google/syzkaller/pkg/config"
@@ -152,6 +153,10 @@ func Complete(cfg *Config) error {
return err
}
}
+ if cfg.HubDomain != "" &&
+ !regexp.MustCompile(`^[a-zA-Z0-9-_.]{2,50}(/[a-zA-Z0-9-_.]{2,50})?$`).MatchString(cfg.HubDomain) {
+ return fmt.Errorf("bad value for hub_domain")
+ }
if cfg.DashboardClient != "" {
if err := checkNonEmpty(
cfg.Name, "name",
diff --git a/pkg/rpctype/rpctype.go b/pkg/rpctype/rpctype.go
index c370b0a0e..5dc85e0e2 100644
--- a/pkg/rpctype/rpctype.go
+++ b/pkg/rpctype/rpctype.go
@@ -76,6 +76,8 @@ type HubConnectArgs struct {
Key string
// Manager name, must start with Client.
Manager string
+ // See pkg/mgrconfig.Config.HubDomain.
+ Domain string
// Manager has started with an empty corpus and requests whole hub corpus.
Fresh bool
// Set of system call names supported by this manager.
@@ -100,7 +102,9 @@ type HubSyncArgs struct {
}
type HubSyncRes struct {
- // Set of programs from other managers.
+ // Set of inputs from other managers.
+ Inputs []HubInput
+ // Same as Inputs but for legacy managers that don't understand new format (remove later).
Progs [][]byte
// Set of repros from other managers.
Repros [][]byte
@@ -109,6 +113,12 @@ type HubSyncRes struct {
More int
}
+type HubInput struct {
+ // Domain of the source manager.
+ Domain string
+ Prog []byte
+}
+
type RunTestPollReq struct {
Name string
}