From 94b38efc1d80ae2854d29af44c6d5918a2cb40cd Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 5 Jan 2017 14:16:07 +0100 Subject: 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. --- prog/prog_test.go | 37 +++++++++++++++++++++++++++++++++++++ prog/rand.go | 3 +++ 2 files changed, 40 insertions(+) (limited to 'prog') 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: -- cgit mrf-deployment