aboutsummaryrefslogtreecommitdiffstats
path: root/syz-hub
diff options
context:
space:
mode:
Diffstat (limited to 'syz-hub')
-rw-r--r--syz-hub/hub.go64
1 files changed, 33 insertions, 31 deletions
diff --git a/syz-hub/hub.go b/syz-hub/hub.go
index 410660f9f..6e44c51cd 100644
--- a/syz-hub/hub.go
+++ b/syz-hub/hub.go
@@ -4,12 +4,12 @@
package main
import (
- "encoding/json"
"flag"
"fmt"
- "io/ioutil"
+ "strings"
"sync"
+ "github.com/google/syzkaller/pkg/config"
. "github.com/google/syzkaller/pkg/log"
. "github.com/google/syzkaller/pkg/rpctype"
"github.com/google/syzkaller/syz-hub/state"
@@ -17,15 +17,13 @@ import (
var (
flagConfig = flag.String("config", "", "config file")
-
- cfg *Config
)
type Config struct {
- Http string
- Rpc string
- Workdir string
- Managers []struct {
+ Http string
+ Rpc string
+ Workdir string
+ Clients []struct {
Name string
Key string
}
@@ -39,7 +37,10 @@ type Hub struct {
func main() {
flag.Parse()
- cfg = readConfig(*flagConfig)
+ cfg := new(Config)
+ if err := config.LoadFile(*flagConfig, cfg); err != nil {
+ Fatal(err)
+ }
EnableLogCaching(1000, 1<<20)
st, err := state.Make(cfg.Workdir)
@@ -50,7 +51,7 @@ func main() {
st: st,
keys: make(map[string]string),
}
- for _, mgr := range cfg.Managers {
+ for _, mgr := range cfg.Clients {
hub.keys[mgr.Name] = mgr.Key
}
@@ -65,15 +66,16 @@ func main() {
}
func (hub *Hub) Connect(a *HubConnectArgs, r *int) error {
- if key, ok := hub.keys[a.Name]; !ok || key != a.Key {
- Logf(0, "connect from unauthorized manager %v", a.Name)
- return fmt.Errorf("unauthorized manager")
+ name, err := hub.auth(a.Client, a.Key, a.Manager)
+ if err != nil {
+ return err
}
hub.mu.Lock()
defer hub.mu.Unlock()
- Logf(0, "connect from %v: fresh=%v calls=%v corpus=%v", a.Name, a.Fresh, len(a.Calls), len(a.Corpus))
- if err := hub.st.Connect(a.Name, a.Fresh, a.Calls, a.Corpus); err != nil {
+ Logf(0, "connect from %v: fresh=%v calls=%v corpus=%v",
+ name, a.Fresh, len(a.Calls), len(a.Corpus))
+ if err := hub.st.Connect(name, a.Fresh, a.Calls, a.Corpus); err != nil {
Logf(0, "connect error: %v", err)
return err
}
@@ -81,35 +83,35 @@ func (hub *Hub) Connect(a *HubConnectArgs, r *int) error {
}
func (hub *Hub) Sync(a *HubSyncArgs, r *HubSyncRes) error {
- if key, ok := hub.keys[a.Name]; !ok || key != a.Key {
- Logf(0, "sync from unauthorized manager %v", a.Name)
- return fmt.Errorf("unauthorized manager")
+ name, err := hub.auth(a.Client, a.Key, a.Manager)
+ if err != nil {
+ return err
}
hub.mu.Lock()
defer hub.mu.Unlock()
- inputs, more, err := hub.st.Sync(a.Name, a.Add, a.Del)
+ inputs, more, err := hub.st.Sync(name, a.Add, a.Del)
if err != nil {
Logf(0, "sync error: %v", err)
return err
}
r.Inputs = inputs
r.More = more
- Logf(0, "sync from %v: add=%v del=%v new=%v pending=%v", a.Name, len(a.Add), len(a.Del), len(inputs), more)
+ Logf(0, "sync from %v: add=%v del=%v new=%v pending=%v",
+ name, len(a.Add), len(a.Del), len(inputs), more)
return nil
}
-func readConfig(filename string) *Config {
- if filename == "" {
- Fatalf("supply config in -config flag")
+func (hub *Hub) auth(client, key, manager string) (string, error) {
+ if key, ok := hub.keys[client]; !ok || key != key {
+ Logf(0, "connect from unauthorized client %v", client)
+ return "", fmt.Errorf("unauthorized manager")
}
- data, err := ioutil.ReadFile(filename)
- if err != nil {
- Fatalf("failed to read config file: %v", err)
- }
- cfg := new(Config)
- if err := json.Unmarshal(data, cfg); err != nil {
- Fatalf("failed to parse config file: %v", err)
+ if manager == "" {
+ manager = client
+ } else if !strings.HasPrefix(manager, client) {
+ Logf(0, "manager %v does not have client prefix %v", manager, client)
+ return "", fmt.Errorf("unauthorized manager")
}
- return cfg
+ return manager, nil
}