don't have Conn.Read return an error for temorary crypto failures from e.g. out of order packets, just drop the packet and keep blocking until there's usable traffic

This commit is contained in:
Arceliar 2019-05-31 17:51:01 -05:00
parent 7e837e97e9
commit 1addf08ccd

View File

@ -191,6 +191,7 @@ func (c *Conn) Read(b []byte) (int, error) {
return 0, errors.New("search failed")
}
}
for {
// Wait for some traffic to come through from the session
select {
case <-timer.C:
@ -216,7 +217,7 @@ func (c *Conn) Read(b []byte) (int, error) {
// Check if we were unable to decrypt the packet for some reason and
// return an error if we couldn't
if !isOK {
err = errors.New("packet dropped due to decryption failure")
err = ConnError{errors.New("packet dropped due to decryption failure"), false, true, 0}
return
}
// Return the newly decrypted buffer back to the slice we were given
@ -239,12 +240,16 @@ func (c *Conn) Read(b []byte) (int, error) {
<-done // Wait for the worker to finish, failing this can cause memory errors (util.[Get||Put]Bytes stuff)
// Something went wrong in the session worker so abort
if err != nil {
if ce, ok := err.(*ConnError); ok && ce.Temporary() {
continue
}
return 0, err
}
// If we've reached this point then everything went to plan, return the
// number of bytes we populated back into the given slice
return len(b), nil
}
}
}
func (c *Conn) Write(b []byte) (bytesWritten int, err error) {