diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-07-01 12:33:31 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2016-07-01 12:33:31 +0200 |
| commit | e4f88bd25b5d83b4b25ee63135b9618b238be837 (patch) | |
| tree | 7ec7efa65b5d09cab26a293c64168c01f3d19378 | |
| parent | 32061a606fcf7c347cf591048b0b9e48741a635b (diff) | |
config: detect unknown fields in configs
| -rw-r--r-- | config/config.go | 59 | ||||
| -rw-r--r-- | config/config_test.go | 16 |
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) + } +} |
