XTLS/Xray-core · error

LengthMin can't be 0

Error message

LengthMin can't be 0

What it means

Thrown when the freedom fragment 'length' range has a lower bound of 0. After converting Length.From to LengthMin, Build() rejects zero-length segments because splitting TCP data into zero-byte pieces is invalid. Distinct from the missing-length error: here the range exists but starts at 0.

Source

Thrown at infra/conf/freedom.go:125

			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")
			}
			config.Fragment.IntervalMin = uint64(c.Fragment.Interval.From)
			config.Fragment.IntervalMax = uint64(c.Fragment.Interval.To)
		}

		{
			if c.Fragment.MaxSplit != nil {
				config.Fragment.MaxSplitMin = uint64(c.Fragment.MaxSplit.From)
				config.Fragment.MaxSplitMax = uint64(c.Fragment.MaxSplit.To)
			}
		}
	}

View on GitHub (pinned to 7d214f8b09)

Solutions

  1. Set the length lower bound to at least 1, e.g. "100-200".
  2. Pick realistic MTU-sized ranges (e.g. "100-200" bytes) rather than 0-based ones.
  3. Validate fragment ranges in your config generator.

Example fix

// before
"length": "0-200"

// after
"length": "100-200"
Defensive patterns

Strategy: validation

Validate before calling

if fragment.Length != nil && fragment.Length.From < 1 {
    return errors.New("fragment length range must start at >= 1 byte")
}

Prevention

When it happens

Trigger: "fragment": {"length": "0-200", ...} — ParseRangeString succeeds, LengthMin becomes 0, and the explicit check fires.

Common situations: Using "0-N" as a shorthand for 'any length'; generator defaults starting ranges at 0.

Related errors


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