aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2021-08-31 17:21:33 +0000
committerAleksandr Nogikh <wp32pw@gmail.com>2021-09-22 15:40:02 +0200
commit9e4e4272d3f686e750a13d2111b0fb7041db2f4a (patch)
tree288c3421a8da52fcb7e460247f9678fece2ed1c9
parent169724fe58e8d7d0b4be6f59ca7c1e0f300399e1 (diff)
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.
-rw-r--r--prog/encoding.go7
-rw-r--r--prog/prog.go8
-rw-r--r--prog/rand.go5
-rw-r--r--sys/linux/init.go12
-rw-r--r--sys/targets/common.go28
-rw-r--r--sys/windows/init.go16
-rw-r--r--tools/syz-trace2syz/proggen/proggen.go9
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