mirror of
https://github.com/reactos/syzkaller.git
synced 2025-02-20 03:21:26 +00:00
config: detect unknown fields in configs
This commit is contained in:
parent
32061a606f
commit
e4f88bd25b
@ -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
16
config/config_test.go
Normal 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)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user