]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: improve MTU change handling
authorJosh Bleecher Snyder <josh@tailscale.com>
Thu, 21 Jan 2021 17:23:45 +0000 (09:23 -0800)
committerJosh Bleecher Snyder <josh@tailscale.com>
Mon, 8 Feb 2021 18:32:07 +0000 (10:32 -0800)
The old code silently accepted negative MTUs.
It also set MTUs above the maximum.
It also had hard to follow deeply nested conditionals.

Add more paranoid handling,
and make the code more straight-line.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
device/tun.go

index 9ff6c23b79d220a8223c5d852cb067faa58f0e8f..17c2493e2689e28ef6154d1898956d8965deb7b7 100644 (file)
@@ -6,6 +6,7 @@
 package device
 
 import (
+       "fmt"
        "sync/atomic"
 
        "golang.zx2c4.com/wireguard/tun"
@@ -20,16 +21,22 @@ func (device *Device) RoutineTUNEventReader() {
        for event := range device.tun.device.Events() {
                if event&tun.EventMTUUpdate != 0 {
                        mtu, err := device.tun.device.MTU()
-                       old := atomic.LoadInt32(&device.tun.mtu)
                        if err != nil {
                                device.log.Errorf("Failed to load updated MTU of device: %v", err)
-                       } else if int(old) != mtu {
-                               if mtu+MessageTransportSize > MaxMessageSize {
-                                       device.log.Verbosef("MTU updated: %v (too large)", mtu)
-                               } else {
-                                       device.log.Verbosef("MTU updated: %v", mtu)
-                               }
-                               atomic.StoreInt32(&device.tun.mtu, int32(mtu))
+                               continue
+                       }
+                       if mtu < 0 {
+                               device.log.Errorf("MTU not updated to negative value: %v", mtu)
+                               continue
+                       }
+                       var tooLarge string
+                       if mtu > MaxContentSize {
+                               tooLarge = fmt.Sprintf(" (too large, capped at %v)", MaxContentSize)
+                               mtu = MaxContentSize
+                       }
+                       old := atomic.SwapInt32(&device.tun.mtu, int32(mtu))
+                       if int(old) != mtu {
+                               device.log.Verbosef("MTU updated: %v%s", mtu, tooLarge)
                        }
                }