config: detect unknown fields in configs

This commit is contained in:
Dmitry Vyukov 2016-07-01 12:33:31 +02:00
parent 32061a606f
commit e4f88bd25b
2 changed files with 75 additions and 0 deletions

View File

@ -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
}

16
config/config_test.go Normal file
View File

@ -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)
}
}