diff options
| author | Andrey Konovalov <andreyknvl@google.com> | 2017-05-17 17:31:07 +0200 |
|---|---|---|
| committer | Andrey Konovalov <andreyknvl@google.com> | 2017-05-26 16:24:13 +0200 |
| commit | 209dba01113133ca87a36e9d0b3a52a6cdec67c3 (patch) | |
| tree | df2acdadd632a7fc1ac0ae4d93d3741f43dff66d | |
| parent | 8320ea0056ddf1f35ea1daf9584f9f9aa6ae4491 (diff) | |
prog: better validate int and buffer types
| -rw-r--r-- | prog/validation.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/prog/validation.go b/prog/validation.go index 61a12eaab..067b6c209 100644 --- a/prog/validation.go +++ b/prog/validation.go @@ -69,6 +69,17 @@ func (c *Call) validate(ctx *validCtx) error { } } switch typ1 := arg.Type.(type) { + case *sys.IntType: + switch arg.Kind { + case ArgConst: + case ArgResult: + case ArgReturn: + if arg.Type.Dir() == sys.DirOut && (arg.Val != 0 && arg.Val != arg.Type.Default()) { + return fmt.Errorf("syscall %v: out int arg '%v' has bad const value %v", c.Meta.Name, arg.Type.Name(), arg.Val) + } + default: + return fmt.Errorf("syscall %v: int arg '%v' has bad kind %v", c.Meta.Name, arg.Type.Name(), arg.Kind) + } case *sys.ResourceType: switch arg.Kind { case ArgResult: @@ -97,6 +108,11 @@ func (c *Call) validate(ctx *validCtx) error { return fmt.Errorf("syscall %v: per proc arg '%v' has bad value '%v'", c.Meta.Name, arg.Type.Name(), arg.Val) } case *sys.BufferType: + switch arg.Kind { + case ArgData: + default: + return fmt.Errorf("syscall %v: buffer arg '%v' has bad kind %v", c.Meta.Name, arg.Type.Name(), arg.Kind) + } switch typ1.Kind { case sys.BufferString: if typ1.Length != 0 && len(arg.Data) != int(typ1.Length) { |
