{"record":{"id":"7de2cf80113adf28","repo":"XTLS/Xray-core","slug":"invalid-range-d-d","errorCode":null,"errorMessage":"invalid range: %d-%d","messagePattern":"invalid range: (.+?)-(.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"transport/internet/finalmask/xmc/padding.go","lineNumber":324,"sourceCode":"\t\tcopy(delays, variant.delays[firstChunk:])\n\t}\n\treturn chunks, delays, nil\n}\n\nfunc defaultPaddingChunks(recordLength, writeChunkLength int) []int {\n\tchunks := make([]int, 0, (recordLength+writeChunkLength-1)/writeChunkLength)\n\tfor remaining := recordLength; remaining > 0; {\n\t\tchunkLength := min(remaining, writeChunkLength)\n\t\tchunks = append(chunks, chunkLength)\n\t\tremaining -= chunkLength\n\t}\n\treturn chunks\n}\n\nfunc paddingTurnBounds(turn paddingTurn) (int, int, error) {\n\tif len(turn.variants) == 0 {\n\t\tif turn.minLength < 1 || turn.maxLength < turn.minLength || turn.maxLength > maxPaddingTurnLength {\n\t\t\treturn 0, 0, fmt.Errorf(\"invalid range: %d-%d\", turn.minLength, turn.maxLength)\n\t\t}\n\t\treturn turn.minLength, turn.maxLength, nil\n\t}\n\tif turn.minLength != 0 || turn.maxLength != 0 {\n\t\treturn 0, 0, fmt.Errorf(\"variants cannot be combined with a length range\")\n\t}\n\n\tminLength := maxPaddingTurnLength + 1\n\tmaxLength := 0\n\tfor i, variant := range turn.variants {\n\t\tif len(variant.chunks) == 0 {\n\t\t\treturn 0, 0, fmt.Errorf(\"variant %d has no chunks\", i)\n\t\t}\n\t\tif len(variant.delays) != 0 && len(variant.delays) != len(variant.chunks) {\n\t\t\treturn 0, 0, fmt.Errorf(\"variant %d has %d chunks and %d delays\", i, len(variant.chunks), len(variant.delays))\n\t\t}\n\t\tfor j, chunkLength := range variant.chunks {\n\t\t\tif chunkLength < 1 || chunkLength > maxPaddingChunkLength {","sourceCodeStart":306,"sourceCodeEnd":342,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/transport/internet/finalmask/xmc/padding.go#L306-L342","documentation":"paddingTurnBounds validates a range-based (non-variant) padding turn: minLength must be >= 1, maxLength must be >= minLength, and maxLength must not exceed maxPaddingTurnLength (8 MiB, padding.go:20). A violation means the configured padding length range is empty, inverted, or oversized, and the scheduler cannot bound the record lengths it generates.","triggerScenarios":"Building a paddingTurn with MinLength/MaxLength such as {0, 0}, {500, 100}, or {1, 9000000}; happens in clientPlayPaddingTurn/serverPlayPaddingTurn or hand-rolled schedules passed to validatePaddingSchedule.","commonSituations":"Copying a config snippet and editing the padding range to 0 to 'disable' padding (should use a valid 1-byte minimum instead); unit confusion (bits vs bytes); trying a very large decoy length above the 8 MiB cap.","solutions":["Set minLength >= 1 and maxLength >= minLength, both <= 8388608.","To minimize padding, use a small valid range like 1-16 instead of 0-0.","If you need turns larger than 8 MiB, split them into multiple consecutive turns within the cap.","Check the exact values in the error text: it prints the offending minLength-maxLength pair."],"exampleFix":"// before\nturn := paddingTurn{minLength: 0, maxLength: 0}\n// after\nturn := paddingTurn{minLength: 1, maxLength: 16}","handlingStrategy":"validation","validationCode":"const maxPaddingTurnLength = 8 * 1024 * 1024\n\nfunc validRange(min, max int) bool {\n    return min >= 1 && max >= min && max <= maxPaddingTurnLength\n}\n// before config load:\nif !validRange(turn.MinLength, turn.MaxLength) { return fmt.Errorf(\"bad padding range %d-%d\", turn.MinLength, turn.MaxLength) }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Clamp user-supplied padding ranges to [1, 8388608] at config load.","Never use 0-0 to disable padding; use a 1-byte minimum turn instead.","Document the 8 MiB cap next to the config field."],"tags":["go","configuration","validation","padding"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}