aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-07-01 12:33:31 +0200
committerDmitry Vyukov <dvyukov@google.com>2016-07-01 12:33:31 +0200
commite4f88bd25b5d83b4b25ee63135b9618b238be837 (patch)
tree7ec7efa65b5d09cab26a293c64168c01f3d19378
parent32061a606fcf7c347cf591048b0b9e48741a635b (diff)
config: detect unknown fields in configs
-rw-r--r--config/config.go59
-rw-r--r--config/config_test.go16
2 files changed, 75 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go
index a22b6ccff..7142139d2 100644
--- a/config/config.go
+++ b/config/config.go
@@ -56,6 +56,17 @@ func Parse(filename string) (*Config, map[int]bool, []*regexp.Regexp, error) {
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to read config file: %v", err)
}
+ return parse(data)
+}
+
+func parse(data []byte) (*Config, map[int]bool, []*regexp.Regexp, error) {
+ unknown, err := checkUnknownFields(data)
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ if unknown != "" {
+ return nil, nil, nil, fmt.Errorf("unknown field '%v' in config", unknown)
+ }
cfg := new(Config)
cfg.Cover = true
cfg.DropPrivs = true
@@ -206,3 +217,51 @@ func CreateVMConfig(cfg *Config) (*vm.Config, error) {
}
return vmCfg, nil
}
+
+func checkUnknownFields(data []byte) (string, error) {
+ // While https://github.com/golang/go/issues/15314 is not resolved
+ // we don't have a better way than to enumerate all known fields.
+ var fields = []string{
+ "Http",
+ "Workdir",
+ "Vmlinux",
+ "Kernel",
+ "Cmdline",
+ "Image",
+ "Cpu",
+ "Mem",
+ "Sshkey",
+ "Port",
+ "Bin",
+ "Debug",
+ "Output",
+ "Syzkaller",
+ "Type",
+ "Count",
+ "Procs",
+ "Cover",
+ "DropPrivs",
+ "Leak",
+ "ConsoleDev",
+ "Enable_Syscalls",
+ "Disable_Syscalls",
+ "Suppressions",
+ }
+ f := make(map[string]interface{})
+ if err := json.Unmarshal(data, &f); err != nil {
+ return "", fmt.Errorf("failed to parse config file: %v", err)
+ }
+ for k := range f {
+ ok := false
+ for _, k1 := range fields {
+ if strings.ToLower(k) == strings.ToLower(k1) {
+ ok = true
+ break
+ }
+ }
+ if !ok {
+ return k, nil
+ }
+ }
+ return "", nil
+}
diff --git a/config/config_test.go b/config/config_test.go
new file mode 100644
index 000000000..2a465900d
--- /dev/null
+++ b/config/config_test.go
@@ -0,0 +1,16 @@
+// Copyright 2016 syzkaller project authors. All rights reserved.
+// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+package config
+
+import (
+ "testing"
+)
+
+func TestUnknown(t *testing.T) {
+ data := `{"foo": "bar"}`
+ _, _, _, err := parse([]byte(data))
+ if err == nil || err.Error() != "unknown field 'foo' in config" {
+ t.Fatalf("unknown field is not detected (%v)", err)
+ }
+}