From 013c3c7c4d94572e96f763421a6b8c68673fdde6 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 15 May 2014 00:52:53 +0000 Subject: Fix up how Read() errors were processed where appropriate. --- packet.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'packet.go') diff --git a/packet.go b/packet.go index 6f9eb03..75179cb 100644 --- a/packet.go +++ b/packet.go @@ -125,21 +125,15 @@ func (c *Obfs4Conn) consumeFramedPackets(w io.Writer) (n int, err error) { } var buf [consumeReadSize]byte - var rdLen int - rdLen, err = c.conn.Read(buf[:]) - if err != nil { - return - } + rdLen, rdErr := c.conn.Read(buf[:]) c.receiveBuffer.Write(buf[:rdLen]) - var decoded [framing.MaximumFramePayloadLength]byte for c.receiveBuffer.Len() > 0 { // Decrypt an AEAD frame. decLen := 0 decLen, err = c.decoder.Decode(decoded[:], &c.receiveBuffer) if err == framing.ErrAgain { - // The accumulated payload does not make up a full frame. - return + break } else if err != nil { break } else if decLen < packetOverhead { @@ -187,8 +181,12 @@ func (c *Obfs4Conn) consumeFramedPackets(w io.Writer) (n int, err error) { } } - // All errors that reach this point are fatal. - if err != nil { + // Read errors and non-framing.ErrAgain errors are all fatal. + if (err != nil && err != framing.ErrAgain) || rdErr != nil { + // Propagate read errors correctly. + if err == nil && rdErr != nil { + err = rdErr + } c.setBroken() } -- cgit v1.2.3