XTLS/Xray-core · warning

no QueryStrategy available for

Error message

no QueryStrategy available for 

What it means

While serializing a padding turn, the record length varint is written into an in-memory bytes.Buffer and this error wraps that write failing. bytes.Buffer.Write can never return a non-nil error (it only panics on too-large buffers), and Varint record lengths are bounded by maxPaddingTurnLength (8 MiB), so in practice this error is unreachable defensive code.

Source

Thrown at app/dns/dns.go:149

		serveStale := config.ServeStale
		if ns.ServeStale != nil {
			serveStale = *ns.ServeStale
		}

		serveExpiredTTL := config.ServeExpiredTTL
		if ns.ServeExpiredTTL != nil {
			serveExpiredTTL = *ns.ServeExpiredTTL
		}

		tag := defaultTag
		if len(ns.Tag) > 0 {
			tag = ns.Tag
		}

		clientIPOption := ResolveIpOptionOverride(ns.QueryStrategy, ipOption)
		if !clientIPOption.IPv4Enable && !clientIPOption.IPv6Enable {
			return nil, errors.New("no QueryStrategy available for ", ns.Address)
		}

		client, err := NewClient(ctx, ns, myClientIP, disableCache, serveStale, serveExpiredTTL, tag, clientIPOption, updateRules)
		if err != nil {
			return nil, errors.New("failed to create client").Base(err)
		}
		clients = append(clients, client)
	}

	var domainMatcher geodata.DomainMatcher
	if len(effectiveRules) > 0 {
		domainMatcher, err = geodata.DomainReg.BuildDomainMatcher(effectiveRules)
		if err != nil {
			return nil, err
		}
	}

	// If there is no DNS client in config, add a `localhost` DNS client

View on GitHub (pinned to 7d214f8b09)

Solutions

  1. Treat occurrences as a code-integrity signal: inspect local modifications to writePaddingTurnWithBuffer or the Varint type
  2. Revert experimental changes to the header serialization path
Defensive patterns

Strategy: try-catch

Try / catch

if err := writePaddingTurn(w, turn, prefix); err != nil && strings.Contains(err.Error(), "write padding header") {
    // unreachable in stock code; treat as local fork integrity issue
    log.Fatal("padding header serialization failed - inspect local modifications")
}

Prevention

When it happens

Trigger: No realistic trigger in the shipped code paths; would require a bytes.Buffer implementation whose Write returns an error or a corrupted Varint type.

Common situations: Custom forks that replace bytes.Buffer with a different io.Writer in the header path; none in the upstream layout.

Related errors


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