{"record":{"id":"f0ed5cd6d566271c","repo":"slackhq/nebula","slug":"bad-cpulist-range-q","errorCode":null,"errorMessage":"bad cpulist range %q","messagePattern":"bad cpulist range %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cpupick/perf_linux.go","lineNumber":139,"sourceCode":"\t\tpart = strings.TrimSpace(part)\n\t\tif part == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tlo, hi, isRange := strings.Cut(part, \"-\")\n\t\ta, err := strconv.Atoi(lo)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"bad cpulist entry %q: %w\", part, err)\n\t\t}\n\t\tif !isRange {\n\t\t\tout = append(out, a)\n\t\t\tcontinue\n\t\t}\n\t\tb, err := strconv.Atoi(hi)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"bad cpulist entry %q: %w\", part, err)\n\t\t}\n\t\tif b < a || b-a > 8192 {\n\t\t\treturn nil, fmt.Errorf(\"bad cpulist range %q\", part)\n\t\t}\n\t\tfor v := a; v <= b; v++ {\n\t\t\tout = append(out, v)\n\t\t}\n\t}\n\treturn out, nil\n}\n\nfunc readIntFile(path string) (int, error) {\n\tb, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn strconv.Atoi(strings.TrimSpace(string(b)))\n}\n","sourceCodeStart":121,"sourceCodeEnd":155,"githubUrl":"https://github.com/slackhq/nebula/blob/dd8f660c0ac37903ec4080ca4d3c861ba9342ceb/cpupick/perf_linux.go#L121-L155","documentation":"parseCPUList parses CPU list strings like \"0-3,8\" into individual CPU IDs. This error is returned when a range's end is less than its start (e.g. \"5-2\") or the range spans more than 8192 CPUs, which would produce an absurdly large allocation. It guards against malformed or pathological cpulist input.","triggerScenarios":"Calling parseCPUList (directly, or via byIntelCoreMask or numaNodes) with a range token where b < a, e.g. \"10-4\", or a span b-a > 8192, e.g. \"0-99999\".","commonSituations":"Hand-edited CPU affinity settings in config (cpuset, taskset-style strings), environment-specific NUMA parsing on unusual hardware, typos reversing range endpoints, or hostile/garbage input to configuration parsers.","solutions":["Fix the CPU list so each range's start is <= its end (e.g. change \"10-4\" to \"4-10\").","Split very large ranges into explicit lists or smaller ranges within the 8192-CPU span limit.","Validate the cpulist string before passing it in (check each range start <= end and span <= 8192)."],"exampleFix":"// before\nparseCPUList(\"10-4\") // error: bad cpulist range \"10-4\"\n// after\nparseCPUList(\"4-10\") // [4,5,6,7,8,9,10]","handlingStrategy":"validation","validationCode":"func validateCPUList(s string) error {\n    for _, part := range strings.Split(s, \",\") {\n        r := strings.SplitN(part, \"-\", 2)\n        if len(r) == 2 {\n            a, err1 := strconv.Atoi(strings.TrimSpace(r[0]))\n            b, err2 := strconv.Atoi(strings.TrimSpace(r[1]))\n            if err1 != nil || err2 != nil { return fmt.Errorf(\"bad entry %q\", part) }\n            if b < a { return fmt.Errorf(\"range start > end in %q\", part) }\n            if b-a > 8192 { return fmt.Errorf(\"range too large in %q\", part) }\n        }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"cpus, err := parseCPUList(flagValue)\nif err != nil {\n    return fmt.Errorf(\"invalid -cpulist %q: %w\", flagValue, err)\n}","preventionTips":["Generate CPU lists programmatically rather than hand-editing them.","Always write ranges ascending (small-low).","Sanity-check range spans against the machine's actual CPU count."],"tags":["cpu","configuration","parsing"],"backgroundTag":"invalid-cpulist-range","analyzedSha":"dd8f660c0ac37903ec4080ca4d3c861ba9342ceb","analyzedAt":"2026-09-03T11:13:55.444Z","contentChangedAt":"2026-09-03T11:13:55.444Z","schemaVersion":2},"datasetVersion":"2026-09-10T17:17:09.494Z"}