mirror of
https://gitlab.com/yawning/obfs4.git
synced 2024-11-15 12:12:53 +00:00
Fix up how Read() errors were processed where appropriate.
This commit is contained in:
parent
79a7ad7f2b
commit
013c3c7c4d
7
obfs4.go
7
obfs4.go
@ -42,7 +42,6 @@ import (
|
||||
|
||||
const (
|
||||
headerLength = framing.FrameOverhead + packetOverhead
|
||||
defaultReadSize = framing.MaximumSegmentLength
|
||||
connectionTimeout = time.Duration(15) * time.Second
|
||||
|
||||
minCloseThreshold = 0
|
||||
@ -163,6 +162,8 @@ func (c *Obfs4Conn) clientHandshake(nodeID *ntor.NodeID, publicKey *ntor.PublicK
|
||||
var n int
|
||||
n, err = c.conn.Read(hsBuf[:])
|
||||
if err != nil {
|
||||
// Yes, just bail out of handshaking even if the Read could have
|
||||
// returned data, no point in continuing on EOF/etc.
|
||||
return
|
||||
}
|
||||
c.receiveBuffer.Write(hsBuf[:n])
|
||||
@ -215,6 +216,8 @@ func (c *Obfs4Conn) serverHandshake(nodeID *ntor.NodeID, keypair *ntor.Keypair)
|
||||
var n int
|
||||
n, err = c.conn.Read(hsBuf[:])
|
||||
if err != nil {
|
||||
// Yes, just bail out of handshaking even if the Read could have
|
||||
// returned data, no point in continuing on EOF/etc.
|
||||
return
|
||||
}
|
||||
c.receiveBuffer.Write(hsBuf[:n])
|
||||
@ -354,7 +357,7 @@ func (c *Obfs4Conn) Write(b []byte) (n int, err error) {
|
||||
}
|
||||
}()
|
||||
|
||||
// XXX: Change this to write directly to c.conn skipping frameBuf.
|
||||
// TODO: Change this to write directly to c.conn skipping frameBuf.
|
||||
chopBuf := bytes.NewBuffer(b)
|
||||
var payload [maxPacketPayloadLength]byte
|
||||
var frameBuf bytes.Buffer
|
||||
|
18
packet.go
18
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()
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user