aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-11-12 12:00:38 -0800
committerDmitry Vyukov <dvyukov@google.com>2016-11-12 12:00:38 -0800
commit07cfd161679c3c82a0ecc6e5faaefd6be26e3ab0 (patch)
tree5325a02b30047cf1aa0c25b820b55bd7aebe4131
parentdf98287f937802e50c23b33fcdd2c18286412ba6 (diff)
prog: fix validation of len arguments
We generate output len arguments, so don't crash on that.
-rw-r--r--prog/validation.go7
1 files changed, 6 insertions, 1 deletions
diff --git a/prog/validation.go b/prog/validation.go
index 701d0ce3d..6d84073ba 100644
--- a/prog/validation.go
+++ b/prog/validation.go
@@ -56,7 +56,12 @@ func (c *Call) validate(ctx *validCtx) error {
}
if arg.Type.Dir() == sys.DirOut {
if arg.Val != 0 || arg.AddrPage != 0 || arg.AddrOffset != 0 {
- return fmt.Errorf("syscall %v: output arg '%v' has data", c.Meta.Name, typ.Name())
+ // We generate output len arguments, which makes sense
+ // since it can be a length of a variable-length array
+ // which is not known otherwise.
+ if _, ok := arg.Type.(*sys.LenType); !ok {
+ return fmt.Errorf("syscall %v: output arg '%v' has data", c.Meta.Name, typ.Name())
+ }
}
for _, v := range arg.Data {
if v != 0 {