Don't indefinitely block TUN/TAP reader goroutine when a conn error happens

This commit is contained in:
Neil Alexander 2019-05-30 12:44:47 +01:00
parent 396c879d0f
commit 9e086e70f0
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
2 changed files with 8 additions and 3 deletions

View File

@ -58,13 +58,18 @@ func (s *tunConn) reader() error {
// TODO don't start a new goroutine for every packet read, this is probably a big part of the slowdowns we saw when refactoring
if n, err = s.conn.Read(b); err != nil {
s.tun.log.Errorln(s.conn.String(), "TUN/TAP conn read error:", err)
if e, eok := err.(yggdrasil.ConnError); eok && !e.Temporary() {
close(s.stop)
} else {
read <- false
}
return
}
read <- true
}()
select {
case <-read:
if n > 0 {
case r := <-read:
if r && n > 0 {
bs := append(util.GetBytes(), b[:n]...)
select {
case s.tun.send <- bs:

View File

@ -207,7 +207,7 @@ func (c *Conn) Read(b []byte) (int, error) {
defer close(done)
// If the nonce is bad then drop the packet and return an error
if !sinfo.nonceIsOK(&p.Nonce) {
err = errors.New("packet dropped due to invalid nonce")
err = ConnError{errors.New("packet dropped due to invalid nonce"), false, true, 0}
return
}
// Decrypt the packet