]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun/netstack: cleanup network stack at closing time
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 5 May 2025 13:09:09 +0000 (15:09 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Mon, 5 May 2025 13:09:09 +0000 (15:09 +0200)
Colin's commit went a step further and protected tun.incomingPacket with
a lock on shutdown, but let's see if the tun.stack.Close() call actually
solves that on its own.

Suggested-by: kshangx <hikeshang@hotmail.com>
Suggested-by: Colin Adler <colin1adler@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
tun/netstack/tun.go

index 04f6986f6c2f361ddb072deb8c16f81bc4ac4480..a7aec9e82b36cbe28805e593a203abea84ce27e7 100644 (file)
@@ -43,6 +43,7 @@ type netTun struct {
        ep             *channel.Endpoint
        stack          *stack.Stack
        events         chan tun.Event
+       notifyHandle   *channel.NotificationHandle
        incomingPacket chan *buffer.View
        mtu            int
        dnsServers     []netip.Addr
@@ -70,7 +71,7 @@ func CreateNetTUN(localAddresses, dnsServers []netip.Addr, mtu int) (tun.Device,
        if tcpipErr != nil {
                return nil, nil, fmt.Errorf("could not enable TCP SACK: %v", tcpipErr)
        }
-       dev.ep.AddNotify(dev)
+       dev.notifyHandle = dev.ep.AddNotify(dev)
        tcpipErr = dev.stack.CreateNIC(1, dev.ep)
        if tcpipErr != nil {
                return nil, nil, fmt.Errorf("CreateNIC: %v", tcpipErr)
@@ -167,13 +168,14 @@ func (tun *netTun) WriteNotify() {
 
 func (tun *netTun) Close() error {
        tun.stack.RemoveNIC(1)
+       tun.stack.Close()
+       tun.ep.RemoveNotify(tun.notifyHandle)
+       tun.ep.Close()
 
        if tun.events != nil {
                close(tun.events)
        }
 
-       tun.ep.Close()
-
        if tun.incomingPacket != nil {
                close(tun.incomingPacket)
        }