diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-11-12 12:00:38 -0800 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2016-11-12 12:00:38 -0800 |
| commit | 07cfd161679c3c82a0ecc6e5faaefd6be26e3ab0 (patch) | |
| tree | 5325a02b30047cf1aa0c25b820b55bd7aebe4131 | |
| parent | df98287f937802e50c23b33fcdd2c18286412ba6 (diff) | |
prog: fix validation of len arguments
We generate output len arguments, so don't crash on that.
| -rw-r--r-- | prog/validation.go | 7 |
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 { |
