Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions pkg/seccomp/precompiledseccomp/precompile_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ const (
packageNameStandin = "precompiled"
precompiledseccompPackageName = "precompiledseccomp"
registrationComment = "PROGRAM_REGISTRATION_GOES_HERE_THIS_IS_A_LOAD_BEARING_COMMENT"
namesListComment = "PROGRAM_NAMES_LIST_GOES_HERE_THIS_IS_A_LOAD_BEARING_COMMENT"
disabledAtBuildtimeComment = "PRECOMPILATION_DISABLED_AT_BUILD_TIME_THIS_IS_A_LOAD_BEARING_COMMENT"
programsMapVarName = "programs"
)

// Flags.
Expand Down Expand Up @@ -105,16 +105,12 @@ func main() {
}
processedPackageComment = true
case strings.Contains(line, registrationComment):
var indent string
for {
var found bool
if line, found = strings.CutPrefix(line, "\t"); !found {
break
}
indent += "\t"
for _, program := range programs {
fmt.Fprint(outFile, program.SwitchCase(precompiledseccompPackageName))
}
case strings.Contains(line, namesListComment):
for _, program := range programs {
fmt.Fprint(outFile, program.Registration(indent, precompiledseccompPackageName, programsMapVarName))
fmt.Fprintf(outFile, "\t%q,\n", program.Name)
}
case strings.Contains(line, disabledAtBuildtimeComment):
fmt.Fprintf(outFile, "const PrecompilationDisabledAtBuildTime = %t\n", disabledAtBuildTime)
Expand Down
37 changes: 10 additions & 27 deletions pkg/seccomp/precompiledseccomp/precompiled_lib.tmpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,15 @@
package precompiled

import (
"sort"

"gvisor.dev/gvisor/pkg/seccomp/precompiledseccomp"
"gvisor.dev/gvisor/pkg/sync"
)

var (
// precompiledPrograms holds registered programs.
// It is populated in `registerPrograms`.
precompiledPrograms map[string]precompiledseccomp.Program = nil

// registerPrecompiledProgramsOnce ensures that program registration
// happens only once.
registerPrecompiledProgramsOnce sync.Once
// precompiledProgramNames is the sorted list of all precompiled program
// names. It is populated at generation time and used by `ListPrecompiled`.
precompiledProgramNames = []string{
// PROGRAM_NAMES_LIST_GOES_HERE_THIS_IS_A_LOAD_BEARING_COMMENT
}
)

// PrecompilationDisabledAtBuildTime is a constant that is used to
Expand All @@ -40,25 +35,13 @@ const PrecompilationDisabledAtBuildTime = false // PRECOMPILATION_DISABLED_AT_BU
// GetPrecompiled returns the precompiled program for the given name,
// and whether that program name exists.
func GetPrecompiled(programName string) (precompiledseccomp.Program, bool) {
registerPrecompiledProgramsOnce.Do(registerPrograms)
program, ok := precompiledPrograms[programName]
return program, ok
switch programName {
// PROGRAM_REGISTRATION_GOES_HERE_THIS_IS_A_LOAD_BEARING_COMMENT
}
return precompiledseccomp.Program{}, false
}

// ListPrecompiled returns a list of all registered program names.
func ListPrecompiled() []string {
registerPrecompiledProgramsOnce.Do(registerPrograms)
programNames := make([]string, 0, len(precompiledPrograms))
for name := range precompiledPrograms {
programNames = append(programNames, name)
}
sort.Strings(programNames)
return programNames
}

// registerPrograms registers available programs inside `precompiledPrograms`.
func registerPrograms() {
programs := make(map[string]precompiledseccomp.Program)
// PROGRAM_REGISTRATION_GOES_HERE_THIS_IS_A_LOAD_BEARING_COMMENT
precompiledPrograms = programs
return append([]string(nil), precompiledProgramNames...)
}
11 changes: 5 additions & 6 deletions pkg/seccomp/precompiledseccomp/precompiledseccomp.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,10 +360,9 @@ func uint32SliceToInstructions(bytecode32 []uint32) ([]bpf.Instruction, error) {
return bpf.ParseBytecode(bytecode)
}

// Registration outputs Go code that registers this programs in a
// `map[string]Program` variable named `programsMapVarName` which maps
// programs names to their `Program` struct.
// It is used when embedding precompiled programs into a Go library file.
func (program Program) Registration(indentPrefix, pkgName, programsMapVarName string) string {
return fmt.Sprintf("%s%s[%q] = %s\n", indentPrefix, programsMapVarName, program.Name, program.Expr(indentPrefix, pkgName))
func (program Program) SwitchCase(pkgName string) string {
var sb strings.Builder
fmt.Fprintf(&sb, "\tcase %q:\n", program.Name)
fmt.Fprintf(&sb, "\t\treturn %s, true\n", program.Expr("\t\t\t", pkgName))
return sb.String()
}
Loading