blob: 51e417ff748a2551231ec68c5ee8ff86301a8e1a [file] [log] [blame]
// Copyright 2018 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package proggen
import (
"github.com/google/syzkaller/pkg/log"
"github.com/google/syzkaller/prog"
"github.com/google/syzkaller/tools/syz-trace2syz/parser"
)
func (ctx *context) genSockaddrStorage(syzType *prog.UnionType, straceType parser.IrType) prog.Arg {
field2Opt := make(map[string]int)
for i, field := range syzType.Fields {
field2Opt[field.FieldName()] = i
}
idx := 0
switch strType := straceType.(type) {
case *parser.GroupType:
socketFamily, ok := strType.Elems[0].(parser.Constant)
if !ok {
log.Fatalf("failed to identify socket family when generating sockaddr stroage union. "+
"expected constant got: %#v", strType.Elems[0])
}
switch socketFamily.Val() {
case ctx.target.ConstMap["AF_INET6"]:
idx = field2Opt["in6"]
case ctx.target.ConstMap["AF_INET"]:
idx = field2Opt["in"]
case ctx.target.ConstMap["AF_UNIX"]:
idx = field2Opt["un"]
case ctx.target.ConstMap["AF_UNSPEC"]:
idx = field2Opt["nl"]
case ctx.target.ConstMap["AF_NETLINK"]:
idx = field2Opt["nl"]
case ctx.target.ConstMap["AF_NFC"]:
idx = field2Opt["nfc"]
case ctx.target.ConstMap["AF_PACKET"]:
idx = field2Opt["ll"]
}
default:
log.Fatalf("unable to parse sockaddr_storage. Unsupported type: %#v", strType)
}
return prog.MakeUnionArg(syzType, ctx.genArgs(syzType.Fields[idx], straceType))
}
func (ctx *context) genSockaddrNetlink(syzType *prog.UnionType, straceType parser.IrType) prog.Arg {
var idx = 2
field2Opt := make(map[string]int)
for i, field := range syzType.Fields {
field2Opt[field.FieldName()] = i
}
switch a := straceType.(type) {
case *parser.GroupType:
if len(a.Elems) > 2 {
switch b := a.Elems[1].(type) {
case parser.Constant:
pid := b.Val()
if pid > 0 {
// User
idx = field2Opt["proc"]
} else if pid == 0 {
// Kernel
idx = field2Opt["kern"]
} else {
// Unspec
idx = field2Opt["unspec"]
}
default:
log.Fatalf("unable to parse netlink addr struct. Unsupported type: %#v", a)
}
}
}
return prog.MakeUnionArg(syzType, ctx.genArgs(syzType.Fields[idx], straceType))
}
func (ctx *context) genIfrIfru(syzType *prog.UnionType, straceType parser.IrType) prog.Arg {
idx := 0
switch straceType.(type) {
case parser.Constant:
idx = 2
}
return prog.MakeUnionArg(syzType, ctx.genArgs(syzType.Fields[idx], straceType))
}