aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2017-05-17 17:31:07 +0200
committerAndrey Konovalov <andreyknvl@google.com>2017-05-26 16:24:13 +0200
commit209dba01113133ca87a36e9d0b3a52a6cdec67c3 (patch)
treedf2acdadd632a7fc1ac0ae4d93d3741f43dff66d
parent8320ea0056ddf1f35ea1daf9584f9f9aa6ae4491 (diff)
prog: better validate int and buffer types
-rw-r--r--prog/validation.go16
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) {