]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun: linux: account for interface removal from outside
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 20 May 2021 16:26:01 +0000 (18:26 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 20 May 2021 16:26:01 +0000 (18:26 +0200)
On Linux we can run `ip link del wg0`, in which case the fd becomes
stale, and we should exit. Since this is an intentional action, don't
treat it as an error.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
device/send.go
tun/tun_linux.go

index e07df1baeec5886d3f53613a422a1d3eccf783b9..a4f07e4470f50f8ad718ca244b90f7feb715b1c2 100644 (file)
@@ -8,7 +8,9 @@ package device
 import (
        "bytes"
        "encoding/binary"
+       "errors"
        "net"
+       "os"
        "sync"
        "sync/atomic"
        "time"
@@ -227,7 +229,9 @@ func (device *Device) RoutineReadFromTUN() {
 
                if err != nil {
                        if !device.isClosed() {
-                               device.log.Errorf("Failed to read packet from TUN device: %v", err)
+                               if !errors.Is(err, os.ErrClosed) {
+                                       device.log.Errorf("Failed to read packet from TUN device: %v", err)
+                               }
                                go device.Close()
                        }
                        device.PutMessageBuffer(elem.buffer)
index 46eb171bcd0d38726b589317f98678bb724cc0d0..466a805671c1b6b4b0164299380ef478bb55bcac 100644 (file)
@@ -10,6 +10,7 @@ package tun
 
 import (
        "bytes"
+       "errors"
        "fmt"
        "os"
        "sync"
@@ -329,32 +330,30 @@ func (tun *NativeTun) nameSlow() (string, error) {
        return string(name), nil
 }
 
-func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
-
+func (tun *NativeTun) Write(buf []byte, offset int) (int, error) {
        if tun.nopi {
-               buff = buff[offset:]
+               buf = buf[offset:]
        } else {
                // reserve space for header
-
-               buff = buff[offset-4:]
+               buf = buf[offset-4:]
 
                // add packet information header
-
-               buff[0] = 0x00
-               buff[1] = 0x00
-
-               if buff[4]>>4 == ipv6.Version {
-                       buff[2] = 0x86
-                       buff[3] = 0xdd
+               buf[0] = 0x00
+               buf[1] = 0x00
+               if buf[4]>>4 == ipv6.Version {
+                       buf[2] = 0x86
+                       buf[3] = 0xdd
                } else {
-                       buff[2] = 0x08
-                       buff[3] = 0x00
+                       buf[2] = 0x08
+                       buf[3] = 0x00
                }
        }
 
-       // write
-
-       return tun.tunFile.Write(buff)
+       n, err := tun.tunFile.Write(buf)
+       if errors.Is(err, syscall.EBADFD) {
+               err = os.ErrClosed
+       }
+       return n, err
 }
 
 func (tun *NativeTun) Flush() error {
@@ -362,22 +361,26 @@ func (tun *NativeTun) Flush() error {
        return nil
 }
 
-func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
+func (tun *NativeTun) Read(buf []byte, offset int) (n int, err error) {
        select {
-       case err := <-tun.errors:
-               return 0, err
+       case err = <-tun.errors:
        default:
                if tun.nopi {
-                       return tun.tunFile.Read(buff[offset:])
+                       n, err = tun.tunFile.Read(buf[offset:])
                } else {
-                       buff := buff[offset-4:]
-                       n, err := tun.tunFile.Read(buff[:])
+                       buff := buf[offset-4:]
+                       n, err = tun.tunFile.Read(buff[:])
+                       if errors.Is(err, syscall.EBADFD) {
+                               err = os.ErrClosed
+                       }
                        if n < 4 {
-                               return 0, err
+                               n = 0
+                       } else {
+                               n -= 4
                        }
-                       return n - 4, err
                }
        }
+       return
 }
 
 func (tun *NativeTun) Events() chan Event {