From a7206b24cac96c08aecf2f3b4cc3c2e555eec708 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 28 Aug 2017 15:59:22 +0200 Subject: pkg/compiler: check and generate types Move most of the logic from sysgen to pkg/compiler. Update #217 --- prog/encodingexec_test.go | 14 +++++++------- prog/rand.go | 16 ++++++++-------- prog/validation.go | 3 ++- 3 files changed, 17 insertions(+), 16 deletions(-) (limited to 'prog') diff --git a/prog/encodingexec_test.go b/prog/encodingexec_test.go index 2d96a47e0..6ee9a37af 100644 --- a/prog/encodingexec_test.go +++ b/prog/encodingexec_test.go @@ -203,13 +203,12 @@ func TestSerializeForExec(t *testing.T) { }, }, { - "syz_test$end0(&(0x7f0000000000)={0x42, 0x42, 0x42, 0x42, 0x42})", + "syz_test$end0(&(0x7f0000000000)={0x42, 0x42, 0x42, 0x42})", []uint64{ instrCopyin, dataOffset + 0, argConst, 1, 0x42, 0, 0, instrCopyin, dataOffset + 1, argConst, 2, 0x4200, 0, 0, instrCopyin, dataOffset + 3, argConst, 4, 0x42000000, 0, 0, instrCopyin, dataOffset + 7, argConst, 8, 0x4200000000000000, 0, 0, - instrCopyin, dataOffset + 15, argConst, 8, 0x4200000000000000, 0, 0, callID("syz_test$end0"), 1, argConst, ptrSize, dataOffset, 0, 0, instrEOF, }, @@ -261,11 +260,12 @@ func TestSerializeForExec(t *testing.T) { buf := make([]byte, ExecBufferSize) for i, test := range tests { - p, err := Deserialize([]byte(test.prog)) - if err != nil { - t.Fatalf("failed to deserialize prog %v: %v", i, err) - } - t.Run(fmt.Sprintf("%v:%v", i, p.String()), func(t *testing.T) { + i, test := i, test + t.Run(fmt.Sprintf("%v:%v", i, test.prog), func(t *testing.T) { + p, err := Deserialize([]byte(test.prog)) + if err != nil { + t.Fatalf("failed to deserialize prog %v: %v", i, err) + } if err := p.SerializeForExec(buf, i%16); err != nil { t.Fatalf("failed to serialize: %v", err) } diff --git a/prog/rand.go b/prog/rand.go index a3cd57039..e962f80c9 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -20,11 +20,11 @@ var pageStartPool = sync.Pool{New: func() interface{} { return new([]uint64) }} type randGen struct { *rand.Rand inCreateResource bool - recDepth map[sys.Type]int + recDepth map[string]int } func newRand(rs rand.Source) *randGen { - return &randGen{rand.New(rs), false, make(map[sys.Type]int)} + return &randGen{rand.New(rs), false, make(map[string]int)} } func (r *randGen) rand(n int) uint64 { @@ -620,15 +620,15 @@ func (r *randGen) generateArg(s *state, typ sys.Type) (arg Arg, calls []*Call) { // Allow infinite recursion for optional pointers. if pt, ok := typ.(*sys.PtrType); ok && typ.Optional() { - if _, ok := pt.Type.(*sys.StructType); ok { - r.recDepth[pt.Type] += 1 + if str, ok := pt.Type.(*sys.StructType); ok { + r.recDepth[str.Name()] += 1 defer func() { - r.recDepth[pt.Type] -= 1 - if r.recDepth[pt.Type] == 0 { - delete(r.recDepth, pt.Type) + r.recDepth[str.Name()] -= 1 + if r.recDepth[str.Name()] == 0 { + delete(r.recDepth, str.Name()) } }() - if r.recDepth[pt.Type] >= 3 { + if r.recDepth[str.Name()] >= 3 { return pointerArg(typ, 0, 0, 0, nil), nil } } diff --git a/prog/validation.go b/prog/validation.go index b2d7d209f..b3c4ad3e6 100644 --- a/prog/validation.go +++ b/prog/validation.go @@ -102,7 +102,8 @@ func (c *Call) validate(ctx *validCtx) error { switch arg.(type) { case *GroupArg: default: - return fmt.Errorf("syscall %v: struct/array arg '%v' has bad kind %v", c.Meta.Name, arg.Type().Name(), arg) + return fmt.Errorf("syscall %v: struct/array arg '%v' has bad kind %#v", + c.Meta.Name, arg.Type().Name(), arg) } case *sys.UnionType: switch arg.(type) { -- cgit mrf-deployment