From 3a80fe350da4f5fc054c06fe279cc7ea734eb28b Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 29 Nov 2017 09:47:55 +0100 Subject: prog: support bytesizeN for vma I guess this is currently unused, but ignoring bytesizeN for vma looks wrong. If user asks for bytesizeN for vma, divide vma size by N. --- prog/mutation_test.go | 13 +++++++++---- prog/size.go | 22 +++++++++++----------- prog/size_test.go | 6 +++--- 3 files changed, 23 insertions(+), 18 deletions(-) (limited to 'prog') diff --git a/prog/mutation_test.go b/prog/mutation_test.go index 1fe2da9eb..418ca3659 100644 --- a/prog/mutation_test.go +++ b/prog/mutation_test.go @@ -23,7 +23,7 @@ func TestClone(t *testing.T) { } } -func TestMutate(t *testing.T) { +func TestMutateRandom(t *testing.T) { target, rs, iters := initTest(t) next: for i := 0; i < iters; i++ { @@ -36,12 +36,17 @@ next: p1.Mutate(rs, 10, nil, nil) data := p.Serialize() if !bytes.Equal(data0, data) { - t.Fatalf("program changed after clone/mutate\noriginal:\n%s\n\nnew:\n%s\n", data0, data) + t.Fatalf("program changed after clone/mutate\noriginal:\n%s\n\nnew:\n%s\n", + data0, data) } data1 := p1.Serialize() - if !bytes.Equal(data, data1) { - continue next + if bytes.Equal(data, data1) { + continue } + if _, err := target.Deserialize(data1); err != nil { + t.Fatalf("Deserialize failed after Mutate: %v\n%s", err, data1) + } + continue next } t.Fatalf("mutation does not change program:\n%s", data0) } diff --git a/prog/size.go b/prog/size.go index 538b60c5d..718e0c426 100644 --- a/prog/size.go +++ b/prog/size.go @@ -7,29 +7,29 @@ import ( "fmt" ) -func (target *Target) generateSize(arg Arg, lenType *LenType) Arg { +func (target *Target) generateSize(arg Arg, lenType *LenType) uint64 { if arg == nil { // Arg is an optional pointer, set size to 0. - return MakeConstArg(lenType, 0) + return 0 } + byteSize := lenType.ByteSize + if byteSize == 0 { + byteSize = 1 + } switch arg.Type().(type) { case *VmaType: a := arg.(*PointerArg) - return MakeConstArg(lenType, a.PagesNum*target.PageSize) + return a.PagesNum * target.PageSize / byteSize case *ArrayType: a := arg.(*GroupArg) if lenType.ByteSize != 0 { - return MakeConstArg(lenType, a.Size()/lenType.ByteSize) + return a.Size() / byteSize } else { - return MakeConstArg(lenType, uint64(len(a.Inner))) + return uint64(len(a.Inner)) } default: - if lenType.ByteSize != 0 { - return MakeConstArg(lenType, arg.Size()/lenType.ByteSize) - } else { - return MakeConstArg(lenType, arg.Size()) - } + return arg.Size() / byteSize } } @@ -53,7 +53,7 @@ func (target *Target) assignSizes(args []Arg, parentsMap map[Arg]Arg) { buf, ok := argsMap[typ.Buf] if ok { - *a = *target.generateSize(InnerArg(buf), typ).(*ConstArg) + a.Val = target.generateSize(InnerArg(buf), typ) continue } diff --git a/prog/size_test.go b/prog/size_test.go index f52a6ecce..24bc6f3ec 100644 --- a/prog/size_test.go +++ b/prog/size_test.go @@ -26,7 +26,7 @@ func TestAssignSizeRandom(t *testing.T) { target.assignSizesCall(call) } if data1 := p.Serialize(); !bytes.Equal(data0, data1) { - t.Fatalf("different lens assigned, initial: %v, new: %v", data0, data1) + t.Fatalf("different lens assigned, initial:\n%s\nnew:\n%s", data0, data1) } } } @@ -78,8 +78,8 @@ func TestAssignSize(t *testing.T) { "syz_test$length9(&(0x7f000001f000)={&(0x7f0000000000/0x5000)=nil, 0x5000})", }, { - "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x0000)", - "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x5000)", + "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x0000, 0x0000, 0x0000, 0x0000)", + "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x5000, 0x5000, 0x2800, 0x1400)", }, { "syz_test$length11(&(0x7f0000000000)={0xff, 0xff, [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]}, 0x00)", -- cgit mrf-deployment