From 0227596f90aca99b1d291a7c6104bdcd5ef0895b Mon Sep 17 00:00:00 2001 From: Wichert Akkerman Date: Fri, 1 Nov 2019 21:57:38 +0100 Subject: [PATCH] Increase size of XML decoder internal buffers Since a transport (and a streamlogger) does not implement io.ByteReader xml.Decoder wraps it using `bufio.NewReader(transport)` so it can easily read bytes one at a time. This has the unfortuante effect of resulting in a panic if we try to parse a stanza that is larger than the default buffer size of 4096 bytes. To fix this we wrap the transport using `bufio.NewReaderSize()` with a much larger buffer size. --- websocket_transport.go | 3 ++- xmpp_transport.go | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/websocket_transport.go b/websocket_transport.go index bf43611..d7b62c4 100644 --- a/websocket_transport.go +++ b/websocket_transport.go @@ -1,6 +1,7 @@ package xmpp import ( + "bufio" "context" "encoding/xml" "errors" @@ -57,7 +58,7 @@ func (t *WebsocketTransport) Connect() (string, error) { t.wsConn = wsConn t.startReader() - t.decoder = xml.NewDecoder(t) + t.decoder = xml.NewDecoder(bufio.NewReaderSize(t, maxPacketSize)) t.decoder.CharsetReader = t.Config.CharsetReader return t.StartStream() diff --git a/xmpp_transport.go b/xmpp_transport.go index a1a11be..a67d5bc 100644 --- a/xmpp_transport.go +++ b/xmpp_transport.go @@ -1,6 +1,7 @@ package xmpp import ( + "bufio" "crypto/tls" "encoding/xml" "errors" @@ -37,7 +38,7 @@ func (t *XMPPTransport) Connect() (string, error) { } t.readWriter = newStreamLogger(t.conn, t.logFile) - t.decoder = xml.NewDecoder(t.readWriter) + t.decoder = xml.NewDecoder(bufio.NewReaderSize(t.readWriter, maxPacketSize)) t.decoder.CharsetReader = t.Config.CharsetReader return t.StartStream() } @@ -90,7 +91,7 @@ func (t *XMPPTransport) StartTLS() error { t.conn = tlsConn t.readWriter = newStreamLogger(tlsConn, t.logFile) - t.decoder = xml.NewDecoder(t.readWriter) + t.decoder = xml.NewDecoder(bufio.NewReaderSize(t.readWriter, maxPacketSize)) t.decoder.CharsetReader = t.Config.CharsetReader if !t.TLSConfig.InsecureSkipVerify {