diff --git a/pkg/seccomp/precompiledseccomp/precompile_gen.go b/pkg/seccomp/precompiledseccomp/precompile_gen.go index 55515bdc21e..e54ab46705b 100644 --- a/pkg/seccomp/precompiledseccomp/precompile_gen.go +++ b/pkg/seccomp/precompiledseccomp/precompile_gen.go @@ -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. @@ -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) diff --git a/pkg/seccomp/precompiledseccomp/precompiled_lib.tmpl.go b/pkg/seccomp/precompiledseccomp/precompiled_lib.tmpl.go index 132796fe709..86710392236 100644 --- a/pkg/seccomp/precompiledseccomp/precompiled_lib.tmpl.go +++ b/pkg/seccomp/precompiledseccomp/precompiled_lib.tmpl.go @@ -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 @@ -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...) } diff --git a/pkg/seccomp/precompiledseccomp/precompiledseccomp.go b/pkg/seccomp/precompiledseccomp/precompiledseccomp.go index 0e09ddfd1c7..afb3a6d9791 100644 --- a/pkg/seccomp/precompiledseccomp/precompiledseccomp.go +++ b/pkg/seccomp/precompiledseccomp/precompiledseccomp.go @@ -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() }