5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-10 06:20:26 +00:00

Merge pull request #426 from neilalexander/errorhandle

Don't indefinitely block TUN/TAP reader goroutine after conn error
This commit is contained in:
Neil Alexander 2019-05-30 12:52:35 +01:00 committed by GitHub
commit e430d16018
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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