cloudflare/cloudflared · error
expected system information to have %d fields got %d: %w
Error message
expected system information to have %d fields got %d: %w
What it means
ParseUnameOutput parses `uname -a` output and requires at least `osInformationFieldsMinimum` whitespace-separated fields to derive system, hostname, and architecture. If the uname output is too short, it returns ErrInsuficientFields wrapped in this message. On darwin an architectureOffset of 1 shifts the architecture field index because macOS uname output has a different shape.
Source
Thrown at diagnostic/system_collector_utils.go:142
func ParseUnameOutput(output string, system string) (*OsInfo, error) {
const (
osystemField = 0
nameField = 1
osVersionField = 2
osReleaseStartField = 3
osInformationFieldsMinimum = 6
darwin = "darwin"
)
architectureOffset := 2
if system == darwin {
architectureOffset = 1
}
fields := strings.Fields(output)
if len(fields) < osInformationFieldsMinimum {
return nil, fmt.Errorf("expected system information to have %d fields got %d: %w",
osInformationFieldsMinimum, len(fields), ErrInsuficientFields,
)
}
architectureField := len(fields) - architectureOffset
osystem := fields[osystemField]
name := fields[nameField]
osVersion := fields[osVersionField]
osRelease := strings.Join(fields[osReleaseStartField:architectureField], " ")
architecture := fields[architectureField]
return &OsInfo{
osystem,
name,
osVersion,
osRelease,
architecture,
}, nilView on GitHub (pinned to 2253eeeb25)
Solutions
- Ensure the collector invokes `uname -a` (all fields) and capture stderr to confirm the command succeeded before parsing.
- Verify `uname -a` output manually on the affected host; if it is truncated, fix the host environment or uname binary.
- Guard the caller against empty output (skip parsing when strings.TrimSpace(output) is empty).
- On darwin hosts confirm the darwin-specific architectureOffset path matches the actual uname format for the OS version.
Example fix
// before
out, _ := exec.Command("uname").Output()
info, err := diagnostic.ParseUnameOutput(string(out))
// after
out, err := exec.Command("uname", "-a").Output()
if err != nil {
return err
}
if len(strings.Fields(string(out))) < 3 {
return fmt.Errorf("uname output too short: %q", string(out))
}
info, err := diagnostic.ParseUnameOutput(string(out)) Defensive patterns
Strategy: validation
Validate before calling
func validateUnameOutput(output string) error {
fields := strings.Fields(output)
if len(fields) < 3 {
return fmt.Errorf("uname output too short (%d fields): %q", len(fields), output)
}
return nil
} Try / catch
info, err := diagnostic.ParseUnameOutput(unameOut)
var target error = diagnostic.ErrInsuficientFields
if errors.Is(err, target) {
log.Warn().Str("output", unameOut).Msg("uname output malformed; skipping OS info")
} else if err != nil {
return fmt.Errorf("uname parse failed: %w", err)
} Prevention
- Run `uname -a` (not plain `uname`) and check its exit code before parsing.
- Reject empty or whitespace-only output before calling the parser.
- Account for the darwin-specific field offset when testing on macOS.
- Capture stderr from uname to detect partial failures early.
When it happens
Trigger: Calling ParseUnameOutput (directly or via collectOSInformationUnix during Collect) with empty, truncated, or stubbed `uname -a` output — e.g. uname failing partially, a mock/minimal environment printing nothing, or capturing only part of the output.
Common situations: Minimal containers with a stub uname, calling uname without the -a flag so output lacks fields, trailing-newline-only output on broken hosts, or feeding output from a different command (e.g. plain `uname`) into the parser.
Related errors
- parsing os information: %w, key=%s
- ErrInsufficientLines
- ErrInsuficientFields
- ErrKeyNotFound
- ErrEmptyDomain
AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06).
Data as JSON: /api/errors/cf8732afc8ea9db7.
Report an issue: GitHub.