{"record":{"id":"ed8dae6e025889bd","repo":"lima-vm/lima","slug":"field-s-guestportrange-1-must-be-greater-than","errorCode":null,"errorMessage":"field `%s.guestPortRange[1]` must be greater than or equal to field `%s.guestPortRange[0]`","messagePattern":"field `(.+?)\\.guestPortRange\\[1\\]` must be greater than or equal to field `(.+?)\\.guestPortRange\\[0\\]`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/limayaml/validate.go","lineNumber":347,"sourceCode":"\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `%s.hostPort` must match field `%s.hostPortRange[0]`\", field, field))\n\t\t\t}\n\t\t\t// redundant validation to make sure the error contains the correct field name\n\t\t\tif err := validatePort(field+\".hostPort\", rule.HostPort); err != nil {\n\t\t\t\terrs = errors.Join(errs, err)\n\t\t\t}\n\t\t}\n\t\tfor j := range 2 {\n\t\t\tif err := validatePort(fmt.Sprintf(\"%s.guestPortRange[%d]\", field, j), rule.GuestPortRange[j]); err != nil {\n\t\t\t\terrs = errors.Join(errs, err)\n\t\t\t}\n\t\t\tif rule.HostSocket == \"\" {\n\t\t\t\tif err := validatePort(fmt.Sprintf(\"%s.hostPortRange[%d]\", field, j), rule.HostPortRange[j]); err != nil {\n\t\t\t\t\terrs = errors.Join(errs, err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif rule.GuestPortRange[0] > rule.GuestPortRange[1] {\n\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `%s.guestPortRange[1]` must be greater than or equal to field `%s.guestPortRange[0]`\", field, field))\n\t\t}\n\t\tif rule.HostPortRange[0] > rule.HostPortRange[1] {\n\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `%s.hostPortRange[1]` must be greater than or equal to field `%s.hostPortRange[0]`\", field, field))\n\t\t}\n\t\tif rule.GuestSocket != \"\" {\n\t\t\tif !path.IsAbs(rule.GuestSocket) {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `%s.guestSocket` must be an absolute path, but is %#q\", field, rule.GuestSocket))\n\t\t\t}\n\t\t\tif rule.HostSocket == \"\" && rule.HostPortRange[1]-rule.HostPortRange[0] > 0 {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `%s.guestSocket` can only be mapped to a single port or socket. not a range\", field))\n\t\t\t}\n\t\t}\n\t\tif rule.HostSocket != \"\" {\n\t\t\tif !filepath.IsAbs(rule.HostSocket) {\n\t\t\t\t// should be unreachable because FillDefault() will prepend the instance directory to relative names\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `%s.hostSocket` must be an absolute path, but is %#q\", field, rule.HostSocket))\n\t\t\t}\n\t\t\tif rule.GuestSocket == \"\" && rule.GuestPortRange[1]-rule.GuestPortRange[0] > 0 {","sourceCodeStart":329,"sourceCodeEnd":365,"githubUrl":"https://github.com/lima-vm/lima/blob/dd909d0973cd84fa35f9e1693181b4585ea616c1/pkg/limayaml/validate.go#L329-L365","documentation":"The guest port range is inverted: guestPortRange[1] (end) is smaller than guestPortRange[0] (start), so no valid port interval can be forwarded.","triggerScenarios":"Validate on a LimaYAML where portForwards[i].GuestPortRange[0] > GuestPortRange[1], e.g. guestPortRange: [9090, 8080].","commonSituations":"Typo when typing the range by hand; assuming the range syntax is [end, start]; scripted edits that swap the array elements.","solutions":["Swap the two values so guestPortRange[0] <= guestPortRange[1]","If a single port was intended, set the range to [n, n]"],"exampleFix":"// before\nportForwards:\n  - guestPortRange: [9090, 8080]\n    hostPortRange: [9090, 8080]\n// after\nportForwards:\n  - guestPortRange: [8080, 9090]\n    hostPortRange: [8080, 9090]","handlingStrategy":"validation","validationCode":"for i, rule := range y.PortForwards {\n  if rule.GuestPortRange[0] > rule.GuestPortRange[1] {\n    return fmt.Errorf(\"portForwards[%d]: guestPortRange is inverted\", i)\n  }\n}","typeGuard":"func rangeOrdered(r [2]int) bool { return r[0] <= r[1] }","tryCatchPattern":"if err := limayaml.Validate(y, false); err != nil {\n  if strings.Contains(err.Error(), \"guestPortRange[1]` must be greater\") {\n    // swap guestPortRange elements\n  }\n}","preventionTips":["Always write ranges as [low, high]","Use single-port [n, n] ranges when no range is intended","Lint the config with `limactl template validate` in CI"],"tags":["lima","port-forwarding","config-validation"],"backgroundTag":"port-forward-range-inverted","analyzedSha":"dd909d0973cd84fa35f9e1693181b4585ea616c1","analyzedAt":"2026-09-01T14:24:59.842Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}