XTLS/Xray-core · error

PacketsFrom can't be 0

Error message

PacketsFrom can't be 0

What it means

Thrown when the freedom outbound's fragment packets range parses successfully but its lower bound is 0. A zero starting packet is meaningless for TCP segmentation (packet numbering starts at 1), so Build() rejects PacketsFrom == 0 after converting the parsed range. Only reachable on the numeric-range branch, not for "tlshello" or "".

Source

Thrown at infra/conf/freedom.go:114

		switch strings.ToLower(c.Fragment.Packets) {
		case "tlshello":
			// TLS Hello Fragmentation (into multiple handshake messages)
			config.Fragment.PacketsFrom = 0
			config.Fragment.PacketsTo = 1
		case "":
			// TCP Segmentation (all packets)
			config.Fragment.PacketsFrom = 0
			config.Fragment.PacketsTo = 0
		default:
			// TCP Segmentation (range)
			from, to, err := ParseRangeString(c.Fragment.Packets)
			if err != nil {
				return nil, errors.New("Invalid PacketsFrom").Base(err)
			}
			config.Fragment.PacketsFrom = uint64(from)
			config.Fragment.PacketsTo = uint64(to)
			if config.Fragment.PacketsFrom == 0 {
				return nil, errors.New("PacketsFrom can't be 0")
			}
		}

		{
			if c.Fragment.Length == nil {
				return nil, errors.New("Length can't be empty")
			}
			config.Fragment.LengthMin = uint64(c.Fragment.Length.From)
			config.Fragment.LengthMax = uint64(c.Fragment.Length.To)
			if config.Fragment.LengthMin == 0 {
				return nil, errors.New("LengthMin can't be 0")
			}
		}

		{
			if c.Fragment.Interval == nil {
				return nil, errors.New("Interval can't be empty")
			}

View on GitHub (pinned to 7d214f8b09)

Solutions

  1. Start the range at 1: use "1-5" instead of "0-5".
  2. To fragment all packets, omit "packets" or set it to "" rather than "0-0".
  3. For TLS ClientHello splitting use "tlshello".

Example fix

// before
"packets": "0-3"

// after
"packets": "1-3"
Defensive patterns

Strategy: validation

Validate before calling

if from, _, err := ParseRangeString(fragment.Packets); err == nil && from < 1 {
    return errors.New("fragment.packets range must start at 1")
}

Prevention

When it happens

Trigger: "fragment": {"packets": "0-5"} or "0-0" — any range whose from value is 0. ParseRangeString succeeds, then the explicit zero check fires.

Common situations: Assuming packet indices are zero-based; auto-generated ranges starting at 0.

Related errors


AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15). Data as JSON: /api/errors/144bea39e7f1a767. Report an issue: GitHub.