in filter.go [298:347]
func (g *SyscallGroup) toSyscallsWithConditions() ([]SyscallWithConditions, error) {
var (
syscalls []SyscallWithConditions
problems []string
)
for _, name := range g.Names {
if num, found := g.arch.SyscallNames[name]; found {
syscall := uint32(num | g.arch.SeccompMask)
if getSyscall(syscalls, syscall) == nil {
syscalls = append(syscalls, SyscallWithConditions{Num: syscall})
} else {
problems = append(problems, fmt.Sprintf("found duplicate syscall %v", name))
}
} else {
problems = append(problems, fmt.Sprintf("found unknown syscalls for arch %v: %v", g.arch.Name, name))
}
}
for _, nc := range g.NamesWithCondtions {
if num, found := g.arch.SyscallNames[nc.Name]; found {
syscall := uint32(num | g.arch.SeccompMask)
check := getSyscall(syscalls, syscall)
invalidArguments := nc.Conditions.Validate()
if len(invalidArguments) > 0 {
problems = append(problems, invalidArguments...)
continue
}
if check == nil {
conditions := []ArgumentConditions{nc.Conditions}
syscalls = append(syscalls, SyscallWithConditions{Num: syscall, Conditions: conditions})
} else {
if len(check.Conditions) == 0 {
// Unconditional check found.
problems = append(problems, fmt.Sprintf("found conditional and unconditional check: %v", nc.Name))
} else {
check.Conditions = append(check.Conditions, nc.Conditions)
}
}
} else {
problems = append(problems, fmt.Sprintf("found unknown syscalls for arch %v: %v", g.arch.Name, nc.Name))
}
}
if len(problems) > 0 {
return nil, fmt.Errorf(strings.Join(problems, "\n"))
}
return syscalls, nil
}