diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-01-05 14:16:07 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-01-09 20:20:48 +0100 |
| commit | 94b38efc1d80ae2854d29af44c6d5918a2cb40cd (patch) | |
| tree | 401943d29621eeb485b016e74e3062178091e12a /prog | |
| parent | b5aa8b45061e01c79cf78fe3a634abf5dc6d3f46 (diff) | |
sys: allow to specify number of pages for vma type
Allows to write vma[4] or vma[5-10] to specify desired number of pages.
Diffstat (limited to 'prog')
| -rw-r--r-- | prog/prog_test.go | 37 | ||||
| -rw-r--r-- | prog/rand.go | 3 |
2 files changed, 40 insertions, 0 deletions
diff --git a/prog/prog_test.go b/prog/prog_test.go index 72e8868e7..218a76821 100644 --- a/prog/prog_test.go +++ b/prog/prog_test.go @@ -8,9 +8,12 @@ import ( "math/rand" "testing" "time" + + "github.com/google/syzkaller/sys" ) func initTest(t *testing.T) (rand.Source, int) { + t.Parallel() iters := 10000 if testing.Short() { iters = 100 @@ -49,3 +52,37 @@ func TestSerialize(t *testing.T) { } } } + +func TestVmaType(t *testing.T) { + rs, iters := initTest(t) + meta := sys.CallMap["syz_test$vma0"] + r := newRand(rs) + for i := 0; i < iters; i++ { + s := newState(nil) + calls := r.generateParticularCall(s, meta) + c := calls[len(calls)-1] + if c.Meta.Name != "syz_test$vma0" { + t.Fatalf("generated wrong call %v", c.Meta.Name) + } + if len(c.Args) != 6 { + t.Fatalf("generated wrong number of args %v", len(c.Args)) + } + check := func(v, l *Arg, min, max uintptr) { + if v.Kind != ArgPointer { + t.Fatalf("vma has bad type: %v, want %v", v.Kind, ArgPointer) + } + if l.Kind != ArgPageSize { + t.Fatalf("len has bad type: %v, want %v", l.Kind, ArgPageSize) + } + if v.AddrPagesNum < min || v.AddrPagesNum > max { + t.Fatalf("vma has bad number of pages: %v, want [%v-%v]", v.AddrPagesNum, min, max) + } + if l.AddrPage < min || l.AddrPage > max { + t.Fatalf("len has bad number of pages: %v, want [%v-%v]", l.AddrPage, min, max) + } + } + check(c.Args[0], c.Args[1], 1, 1e5) + check(c.Args[2], c.Args[3], 5, 5) + check(c.Args[4], c.Args[5], 7, 9) + } +} diff --git a/prog/rand.go b/prog/rand.go index e56893b66..a8b33ea08 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -596,6 +596,9 @@ func (r *randGen) generateArg(s *state, typ sys.Type) (arg *Arg, calls []*Call) } case *sys.VmaType: npages := r.randPageCount() + if a.RangeBegin != 0 || a.RangeEnd != 0 { + npages = uintptr(int(a.RangeBegin) + r.Intn(int(a.RangeEnd-a.RangeBegin+1))) + } arg := r.randPageAddr(s, a, npages, nil, true) return arg, nil case *sys.FlagsType: |
