{"record":{"id":"287c476739e69cab","repo":"XTLS/Xray-core","slug":"invalid-cidr-prefix-length","errorCode":null,"errorMessage":"invalid CIDR prefix length: ","messagePattern":"invalid CIDR prefix length: ","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/geodata/rule_parser.go","lineNumber":121,"sourceCode":"\tipStr, prefixStr, _ := strings.Cut(s, \"/\")\n\n\tipAddr := net.ParseAddress(ipStr)\n\n\tvar maxPrefix uint32\n\tswitch ipAddr.Family() {\n\tcase net.AddressFamilyIPv4:\n\t\tmaxPrefix = 32\n\tcase net.AddressFamilyIPv6:\n\t\tmaxPrefix = 128\n\tdefault:\n\t\treturn nil, errors.New(\"unsupported address family\")\n\t}\n\n\tprefixBits := maxPrefix\n\tif prefixStr != \"\" {\n\t\tparsedPrefix, err := strconv.ParseUint(prefixStr, 10, 32)\n\t\tif err != nil {\n\t\t\treturn nil, errors.New(\"invalid CIDR prefix length: \", prefixStr).Base(err)\n\t\t}\n\t\tprefixBits = uint32(parsedPrefix)\n\t}\n\tif prefixBits > maxPrefix {\n\t\treturn nil, errors.New(\"CIDR prefix length \", prefixBits, \" exceeds max \", maxPrefix)\n\t}\n\n\treturn &CIDR{\n\t\tIp:     []byte(ipAddr.IP()),\n\t\tPrefix: prefixBits,\n\t}, nil\n}\n\nfunc ParseDomainRule(r string, defaultType Domain_Type) (*DomainRule, error) {\n\tif strings.HasPrefix(r, \"geosite:\") {\n\t\tr = \"ext:\" + DefaultGeoSiteDat + \":\" + r[len(\"geosite:\"):]\n\t}\n","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/common/geodata/rule_parser.go#L103-L139","documentation":"The CIDR prefix-length suffix in a custom IP rule failed to parse as an unsigned 32-bit decimal integer. strconv.ParseUint rejects non-numeric strings, negatives written as '-1' (the '-' is treated as part of the number by this split path), or values exceeding uint32.","triggerScenarios":"IP rules like \"10.0.0.0/+8\", \"10.0.0.0/abc\", \"10.0.0.0/-8\", or \"2001:db8::/99999999999999999999\".","commonSituations":"Typos in prefix length; copying netmask notation (255.255.0.0) instead of prefix length (/16); negative prefix values.","solutions":["Use a decimal prefix length 0–32 for IPv4 and 0–128 for IPv6: \"10.0.0.0/8\".","Convert netmasks to CIDR notation (255.255.255.0 → /24)."],"exampleFix":"// before\n\"ip\": [\"10.0.0.0/255.0.0.0\"]\n\n// after\n\"ip\": [\"10.0.0.0/8\"]","handlingStrategy":"validation","validationCode":"if _, err := strconv.ParseUint(prefixStr, 10, 32); err != nil {\n    return fmt.Errorf(\"rule %q: prefix %q is not a decimal integer 0-128\", rule, prefixStr)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write prefix lengths as plain decimal (/24), never netmasks or signed numbers."],"tags":["geodata","cidr","parsing","xray"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}