XTLS/Xray-core · error
message size too large: {size}
Error message
message size too large: {size} What it means
Returned by the DNS TCP reader (RFC 1035 length-prefixed framing) when the 2-byte big-endian size prefix exceeds the internal buffer size (buf.Size, 2KB class default). A single DNS message larger than the buffer cannot be read safely, so the stream is rejected.
Source
Thrown at common/protocol/dns/io.go:100
type TCPReader struct {
reader *buf.BufferedReader
}
func NewTCPReader(reader buf.Reader) *TCPReader {
return &TCPReader{
reader: &buf.BufferedReader{
Reader: reader,
},
}
}
func (r *TCPReader) ReadMessage() (*buf.Buffer, error) {
size, err := serial.ReadUint16(r.reader)
if err != nil {
return nil, err
}
if size > buf.Size {
return nil, errors.New("message size too large: ", size)
}
b := buf.New()
if _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil {
return nil, err
}
return b, nil
}
func (r *TCPReader) Interrupt() {
common.Interrupt(r.reader)
}
func (r *TCPReader) Close() error {
return common.Close(r.reader)
}
type MessageWriter interface {
WriteMessage(msg *buf.Buffer) errorView on GitHub (pinned to 7d214f8b09)
Solutions
- Verify the endpoint is actually a DNS server speaking DNS-over-TCP on that port
- Check for middleboxes/health probes injecting bytes into the DNS connection
- If huge legitimate responses are expected, use a transport with a larger buffer or UDP with EDNS0
Defensive patterns
Strategy: try-catch
Try / catch
msg, err := reader.ReadMessage()
if err != nil {
reader.Interrupt() // framing broken; abort this DNS stream and reopen
return nil, err
} Prevention
- Confirm the remote speaks DNS-over-TCP
- Treat as fatal for the connection - the framing cannot recover
- Prefer UDP+EDNS for large responses
When it happens
Trigger: ReadMessage on a TCP DNS stream where the peer declares a message size > buf.Size: usually because the stream is not DNS-over-TCP at all (desync/wrong port), or a crafted oversized message.
Common situations: Pointing the DNS TCP client at a non-DNS service, leftover bytes after a previous malformed message shifting the framing, or EDNS payloads beyond the internal limit.
Related errors
- failed to parse address and port
- failed to read metadata
- unknown address type: {addrType}
- invalid domain name: {domain}
- Super long domain is not supported: {domain}
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/caf3b3304ec1d7de.
Report an issue: GitHub.