From 9e4e4272d3f686e750a13d2111b0fb7041db2f4a Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Tue, 31 Aug 2021 17:21:33 +0000 Subject: all: introduce a prog.Call constructor Create a constructor for the prog.Call type. It allows to reduce the duplication of code now and during further changes. --- prog/encoding.go | 7 ++----- prog/prog.go | 8 ++++++++ prog/rand.go | 5 +---- sys/linux/init.go | 12 ++++-------- sys/targets/common.go | 28 ++++++++++------------------ sys/windows/init.go | 16 ++++++---------- tools/syz-trace2syz/proggen/proggen.go | 9 ++++----- 7 files changed, 35 insertions(+), 50 deletions(-) diff --git a/prog/encoding.go b/prog/encoding.go index b389fc10d..de0e324b1 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -263,11 +263,8 @@ func (p *parser) parseProg() (*Prog, error) { if meta == nil { return nil, fmt.Errorf("unknown syscall %v", name) } - c := &Call{ - Meta: meta, - Ret: MakeReturnArg(meta.Ret), - Comment: p.comment, - } + c := MakeCall(meta, nil) + c.Comment = p.comment prog.Calls = append(prog.Calls, c) p.Parse('(') for i := 0; p.Char() != ')'; i++ { diff --git a/prog/prog.go b/prog/prog.go index bcc86fb02..576348085 100644 --- a/prog/prog.go +++ b/prog/prog.go @@ -20,6 +20,14 @@ type Call struct { Comment string } +func MakeCall(meta *Syscall, args []Arg) *Call { + return &Call{ + Meta: meta, + Args: args, + Ret: MakeReturnArg(meta.Ret), + } +} + type Arg interface { Type() Type Dir() Dir diff --git a/prog/rand.go b/prog/rand.go index 7ab5068cb..f36cb0822 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -551,10 +551,7 @@ func (r *randGen) generateParticularCall(s *state, meta *Syscall) (calls []*Call if meta.Attrs.Disabled { panic(fmt.Sprintf("generating disabled call %v", meta.Name)) } - c := &Call{ - Meta: meta, - Ret: MakeReturnArg(meta.Ret), - } + c := MakeCall(meta, nil) c.Args, calls = r.generateArgs(s, meta.Args, DirIn) r.target.assignSizesCall(c) return append(calls, c) diff --git a/sys/linux/init.go b/sys/linux/init.go index 1f9dcc2a7..24d978381 100644 --- a/sys/linux/init.go +++ b/sys/linux/init.go @@ -340,14 +340,10 @@ func (arch *arch) generateTimespec(g *prog.Gen, typ0 prog.Type, dir prog.Dir, ol }) var tpaddr prog.Arg tpaddr, calls = g.Alloc(ptrArgType, prog.DirIn, tp) - gettime := &prog.Call{ - Meta: meta, - Args: []prog.Arg{ - prog.MakeConstArg(meta.Args[0].Type, prog.DirIn, arch.CLOCK_REALTIME), - tpaddr, - }, - Ret: prog.MakeReturnArg(meta.Ret), - } + gettime := prog.MakeCall(meta, []prog.Arg{ + prog.MakeConstArg(meta.Args[0].Type, prog.DirIn, arch.CLOCK_REALTIME), + tpaddr, + }) calls = append(calls, gettime) sec := prog.MakeResultArg(typ.Fields[0].Type, dir, tp.Inner[0].(*prog.ResultArg), 0) nsec := prog.MakeResultArg(typ.Fields[1].Type, dir, tp.Inner[1].(*prog.ResultArg), 0) diff --git a/sys/targets/common.go b/sys/targets/common.go index 193e9dca6..f55493256 100644 --- a/sys/targets/common.go +++ b/sys/targets/common.go @@ -21,25 +21,21 @@ func MakePosixMmap(target *prog.Target, exec, contain bool) func() []*prog.Call size := target.NumPages * target.PageSize const invalidFD = ^uint64(0) makeMmap := func(addr, size, prot uint64) *prog.Call { - args := []prog.Arg{ + call := prog.MakeCall(meta, []prog.Arg{ prog.MakeVmaPointerArg(meta.Args[0].Type, prog.DirIn, addr, size), prog.MakeConstArg(meta.Args[1].Type, prog.DirIn, size), prog.MakeConstArg(meta.Args[2].Type, prog.DirIn, prot), prog.MakeConstArg(meta.Args[3].Type, prog.DirIn, flags), prog.MakeResultArg(meta.Args[4].Type, prog.DirIn, nil, invalidFD), - } - i := len(args) + }) + i := len(call.Args) // Some targets have a padding argument between fd and offset. if len(meta.Args) > 6 { - args = append(args, prog.MakeConstArg(meta.Args[i].Type, prog.DirIn, 0)) + call.Args = append(call.Args, prog.MakeConstArg(meta.Args[i].Type, prog.DirIn, 0)) i++ } - args = append(args, prog.MakeConstArg(meta.Args[i].Type, prog.DirIn, 0)) - return &prog.Call{ - Meta: meta, - Args: args, - Ret: prog.MakeReturnArg(meta.Ret), - } + call.Args = append(call.Args, prog.MakeConstArg(meta.Args[i].Type, prog.DirIn, 0)) + return call } return func() []*prog.Call { if contain { @@ -58,14 +54,10 @@ func MakeSyzMmap(target *prog.Target) func() []*prog.Call { size := target.NumPages * target.PageSize return func() []*prog.Call { return []*prog.Call{ - { - Meta: meta, - Args: []prog.Arg{ - prog.MakeVmaPointerArg(meta.Args[0].Type, prog.DirIn, 0, size), - prog.MakeConstArg(meta.Args[1].Type, prog.DirIn, size), - }, - Ret: prog.MakeReturnArg(meta.Ret), - }, + prog.MakeCall(meta, []prog.Arg{ + prog.MakeVmaPointerArg(meta.Args[0].Type, prog.DirIn, 0, size), + prog.MakeConstArg(meta.Args[1].Type, prog.DirIn, size), + }), } } } diff --git a/sys/windows/init.go b/sys/windows/init.go index ef8ba4324..0480a6946 100644 --- a/sys/windows/init.go +++ b/sys/windows/init.go @@ -32,15 +32,11 @@ func (arch *arch) makeMmap() []*prog.Call { meta := arch.virtualAllocSyscall size := arch.target.NumPages * arch.target.PageSize return []*prog.Call{ - { - Meta: meta, - Args: []prog.Arg{ - prog.MakeVmaPointerArg(meta.Args[0].Type, prog.DirIn, 0, size), - prog.MakeConstArg(meta.Args[1].Type, prog.DirIn, size), - prog.MakeConstArg(meta.Args[2].Type, prog.DirIn, arch.MEM_COMMIT|arch.MEM_RESERVE), - prog.MakeConstArg(meta.Args[3].Type, prog.DirIn, arch.PAGE_EXECUTE_READWRITE), - }, - Ret: prog.MakeReturnArg(meta.Ret), - }, + prog.MakeCall(meta, []prog.Arg{ + prog.MakeVmaPointerArg(meta.Args[0].Type, prog.DirIn, 0, size), + prog.MakeConstArg(meta.Args[1].Type, prog.DirIn, size), + prog.MakeConstArg(meta.Args[2].Type, prog.DirIn, arch.MEM_COMMIT|arch.MEM_RESERVE), + prog.MakeConstArg(meta.Args[3].Type, prog.DirIn, arch.PAGE_EXECUTE_READWRITE), + }), } } diff --git a/tools/syz-trace2syz/proggen/proggen.go b/tools/syz-trace2syz/proggen/proggen.go index 866dfbba0..553274728 100644 --- a/tools/syz-trace2syz/proggen/proggen.go +++ b/tools/syz-trace2syz/proggen/proggen.go @@ -102,14 +102,13 @@ func genProg(trace *parser.Trace, target *prog.Target) *prog.Prog { func (ctx *context) genCall() *prog.Call { log.Logf(3, "parsing call: %s", ctx.currentStraceCall.CallName) straceCall := ctx.currentStraceCall - ctx.currentSyzCall = new(prog.Call) - ctx.currentSyzCall.Meta = ctx.Select(straceCall) - syzCall := ctx.currentSyzCall - if ctx.currentSyzCall.Meta == nil { + meta := ctx.Select(straceCall) + if meta == nil { log.Logf(2, "skipping call: %s which has no matching description", ctx.currentStraceCall.CallName) return nil } - syzCall.Ret = prog.MakeReturnArg(syzCall.Meta.Ret) + ctx.currentSyzCall = prog.MakeCall(meta, nil) + syzCall := ctx.currentSyzCall for i := range syzCall.Meta.Args { var strArg parser.IrType -- cgit mrf-deployment