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 clientView on GitHub (pinned to 7d214f8b09)
Solutions
- Treat occurrences as a code-integrity signal: inspect local modifications to writePaddingTurnWithBuffer or the Varint type
- 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
- Do not replace bytes.Buffer in the header path with error-returning writers
- Keep Varint bounded inputs unchanged
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
- Cannot start all fake dns pools
- not a Service.
- Dispatcher: Invalid destination.
- FakeDNSEngine is not initialized, but such a sniffer is used
- Failed to convert address to Net IP.
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/a3045f78abbd5dec.
Report an issue: GitHub.