summaryrefslogtreecommitdiff
path: root/packet.go
diff options
context:
space:
mode:
authorYawning Angel <yawning@schwanenlied.me>2014-05-15 00:52:53 +0000
committerYawning Angel <yawning@schwanenlied.me>2014-05-15 00:52:53 +0000
commit013c3c7c4d94572e96f763421a6b8c68673fdde6 (patch)
treeb7b393b1b5634351720dfcbecb08f9b51cea3175 /packet.go
parent79a7ad7f2b676b7f0cb91c0729b714c699be9d54 (diff)
Fix up how Read() errors were processed where appropriate.
Diffstat (limited to 'packet.go')
-rw-r--r--packet.go18
1 files changed, 8 insertions, 10 deletions
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()
}