{"record":{"id":"24c56fd66f31b0d0","repo":"hashicorp/nomad","slug":"invalid-range-ending-value-v-less-than-startin","errorCode":null,"errorMessage":"invalid range: ending value (%v) less than starting (%v) value","messagePattern":"invalid range: ending value \\((.+?)\\) less than starting \\((.+?)\\) value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/structs/funcs.go","lineNumber":539,"sourceCode":"\t\t\t\tif count > MaxValidPort {\n\t\t\t\t\treturn nil, fmt.Errorf(\"maximum of %d ports can be reserved\", MaxValidPort)\n\t\t\t\t}\n\t\t\t\tports = append(ports, port)\n\t\t\t}\n\t\tcase 2:\n\t\t\t// We are parsing a range\n\t\t\tstart, err := strconv.ParseUint(rangeParts[0], 10, 0)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tend, err := strconv.ParseUint(rangeParts[1], 10, 0)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif end < start {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid range: ending value (%v) less than starting (%v) value\", end, start)\n\t\t\t}\n\n\t\t\t// Full range validation is below but prevent creating\n\t\t\t// arbitrarily large arrays here\n\t\t\tif start == 0 {\n\t\t\t\treturn nil, fmt.Errorf(\"port must be > 0\")\n\t\t\t}\n\t\t\tif end > MaxValidPort {\n\t\t\t\treturn nil, fmt.Errorf(\"port must be < %d but found %d\", MaxValidPort, end)\n\t\t\t}\n\t\t\tcount += int(end - start)\n\t\t\tif count > MaxValidPort {\n\t\t\t\treturn nil, fmt.Errorf(\"maximum of %d ports can be reserved\", MaxValidPort)\n\t\t\t}\n\t\t\tports = slices.Grow(ports, int(end-start))\n\t\t\tfor i := start; i <= end; i++ {\n\t\t\t\tports = append(ports, i)\n\t\t\t}","sourceCodeStart":521,"sourceCodeEnd":557,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/structs/funcs.go#L521-L557","documentation":"ParsePortRanges rejected a port range whose ending port is numerically smaller than its start; ranges like \"200-100\" cannot produce a valid port set.","triggerScenarios":"Passing a port range string with start > end, e.g. \"500-400\", to ParsePortRanges via a Nomad job's network port block.","commonSituations":"Typo swapping range endpoints when hand-writing HCL/JSON job files, or template variables interpolating in the wrong order.","solutions":["Fix the range so the start is less than or equal to the end (e.g. \"100-200\")"],"exampleFix":"// before\nports = \"500-400\"\n// after\nports = \"400-500\"","handlingStrategy":"validation","validationCode":"func checkRange(part string) error {\n  r := strings.Split(part, \"-\")\n  if len(r) != 2 { return nil }\n  s, _ := strconv.Atoi(r[0]); e, _ := strconv.Atoi(r[1])\n  if e < s { return fmt.Errorf(\"range %q: end < start\", part) }\n  return nil\n}","typeGuard":null,"tryCatchPattern":"ports, err := structs.ParsePortRanges(spec)\nif err != nil && strings.Contains(err.Error(), \"less than starting\") {\n  return fmt.Errorf(\"fix range order in %q: %w\", spec, err)\n}","preventionTips":["Always write ranges as low-high","Template-expand ranges and assert start <= end","Run nomad job validate before submitting"],"tags":["nomad","ports","validation"],"backgroundTag":"invalid-port-range","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}