diff options
author | Yawning Angel <yawning@schwanenlied.me> | 2014-05-15 00:52:53 +0000 |
---|---|---|
committer | Yawning Angel <yawning@schwanenlied.me> | 2014-05-15 00:52:53 +0000 |
commit | 013c3c7c4d94572e96f763421a6b8c68673fdde6 (patch) | |
tree | b7b393b1b5634351720dfcbecb08f9b51cea3175 /packet.go | |
parent | 79a7ad7f2b676b7f0cb91c0729b714c699be9d54 (diff) |
Fix up how Read() errors were processed where appropriate.
Diffstat (limited to 'packet.go')
-rw-r--r-- | packet.go | 18 |
1 files changed, 8 insertions, 10 deletions
@@ -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() } |