func()

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
}