cilium/cilium · error

writing header: %w

Error message

writing header: %w

What it means

Failed while rendering the Go file header (package clause and license comment) into the output buffer via writeHeader. This is part of assembling the generated *_config.go file and indicates an internal template/formatting failure, not a user input problem in most cases.

Source

Thrown at tools/dpgen/config.go:61

	spec, err := ebpf.LoadCollectionSpec(args[0])
	if err != nil {
		return fmt.Errorf("loading spec: %w", err)
	}

	s, err := varsToStruct(spec, configOpts.outName, configOpts.kind, configOpts.typesPkg, configOpts.embeds)
	if err != nil {
		return fmt.Errorf("generating config struct: %w", err)
	}

	if needUtils {
		if err := writeUtilFile("util_generated.go", configOpts.goPkg); err != nil {
			return fmt.Errorf("writing util file: %w", err)
		}
	}

	var b bytes.Buffer
	if err := writeHeader(&b, configOpts.goPkg, nil); err != nil {
		return fmt.Errorf("writing header: %w", err)
	}

	if needExternalTypes {
		if configOpts.typesPkg == "" {
			return fmt.Errorf("external types needed but types package is empty")
		}
		if err := writeImports(&b, []string{configOpts.typesPkg}); err != nil {
			return fmt.Errorf("writing imports: %w", err)
		}
	}
	if _, err := b.WriteString(s); err != nil {
		return fmt.Errorf("writing struct: %w", err)
	}
	if err := os.WriteFile(configOpts.outFile, b.Bytes(), 0644); err != nil {
		return fmt.Errorf("writing output file: %w", err)
	}

	return nil

View on GitHub (pinned to ac7b90affa)

Solutions

  1. Check the --go-pkg flag value is a valid Go package name (letters/digits/underscore)
  2. Inspect the header template used by writeHeader in tools/dpgen for template syntax errors
  3. Rebuild dpgen (`go build ./tools/dpgen`) after any edits and re-run
  4. If caused by a recent dpgen change, git diff tools/dpgen to find the template regression and fix it

Example fix

// before
writeHeader(&b, "my-pkg", nil) // invalid package name
// after
writeHeader(&b, "mypkg", nil)
Defensive patterns

Strategy: try-catch

Try / catch

if err := runConfig(cmd, args); err != nil {
	if strings.Contains(err.Error(), "writing header") {
		fmt.Fprintf(os.Stderr, "dpgen internal header/template failure, check go-pkg flag and rebuild dpgen: %v\n", err)
		os.Exit(1)
	}
	fmt.Fprintf(os.Stderr, "%v\n", err)
	os.Exit(1)
}

Prevention

When it happens

Trigger: writeHeader's internal template parsing or execution fails (malformed header template, invalid package name formatting); the bytes.Buffer accepts virtually all writes so real failures are almost always template errors introduced by code changes, or a nil/template misuse regression in tools/dpgen.

Common situations: Developers editing the header template in tools/dpgen introduce a template syntax error or pass an invalid goPkg value; rarely hit by end users of the generator.

Related errors


AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31). Data as JSON: /api/errors/084180228e452a0e. Report an issue: GitHub.