{"record":{"id":"caf3b3304ec1d7de","repo":"XTLS/Xray-core","slug":"message-size-too-large-size","errorCode":null,"errorMessage":"message size too large: {size}","messagePattern":"message size too large: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/protocol/dns/io.go","lineNumber":100,"sourceCode":"type TCPReader struct {\n\treader *buf.BufferedReader\n}\n\nfunc NewTCPReader(reader buf.Reader) *TCPReader {\n\treturn &TCPReader{\n\t\treader: &buf.BufferedReader{\n\t\t\tReader: reader,\n\t\t},\n\t}\n}\n\nfunc (r *TCPReader) ReadMessage() (*buf.Buffer, error) {\n\tsize, err := serial.ReadUint16(r.reader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif size > buf.Size {\n\t\treturn nil, errors.New(\"message size too large: \", size)\n\t}\n\tb := buf.New()\n\tif _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil {\n\t\treturn nil, err\n\t}\n\treturn b, nil\n}\n\nfunc (r *TCPReader) Interrupt() {\n\tcommon.Interrupt(r.reader)\n}\n\nfunc (r *TCPReader) Close() error {\n\treturn common.Close(r.reader)\n}\n\ntype MessageWriter interface {\n\tWriteMessage(msg *buf.Buffer) error","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/common/protocol/dns/io.go#L82-L118","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"msg, err := reader.ReadMessage()\nif err != nil {\n    reader.Interrupt() // framing broken; abort this DNS stream and reopen\n    return nil, err\n}","preventionTips":["Confirm the remote speaks DNS-over-TCP","Treat as fatal for the connection - the framing cannot recover","Prefer UDP+EDNS for large responses"],"tags":["dns","protocol","limits","parsing"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}