aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorSimon Rozman <simon@rozman.si>2019-08-28 10:47:19 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-08-30 08:47:21 -0600
commit09c9e8ded1d86f299e408d0303e35c00c7e72bed (patch)
treedcbc0016488b6efbeeb1f6d53787218fd1cf500b
parenttunnel: allow disabling deterministic GUIDs for external consumers (diff)
downloadwireguard-windows-09c9e8ded1d86f299e408d0303e35c00c7e72bed.tar.xz
wireguard-windows-09c9e8ded1d86f299e408d0303e35c00c7e72bed.zip
manager: clean stale adapters on startup
Signed-off-by: Simon Rozman <simon@rozman.si>
-rw-r--r--manager/adapters.go69
-rw-r--r--manager/service.go1
2 files changed, 70 insertions, 0 deletions
diff --git a/manager/adapters.go b/manager/adapters.go
new file mode 100644
index 00000000..5ac16465
--- /dev/null
+++ b/manager/adapters.go
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package manager
+
+import (
+ "log"
+
+ "golang.org/x/sys/windows"
+ "golang.org/x/sys/windows/svc"
+ "golang.org/x/sys/windows/svc/mgr"
+
+ "golang.zx2c4.com/wireguard/tun/wintun"
+ "golang.zx2c4.com/wireguard/windows/services"
+)
+
+func cleanStaleAdapters() {
+ defer printPanic()
+
+ m, err := mgr.Connect()
+ if err != nil {
+ log.Printf("Error connecting to Service Control Manager: %v", err)
+ return
+ }
+ defer m.Disconnect()
+
+ wintun.DeleteMatchingInterfaces(func(wintun *wintun.Wintun) bool {
+ interfaceName, err := wintun.InterfaceName()
+ if err != nil {
+ log.Printf("Removing Wintun interface %s because determining interface name failed: %v", wintun.GUID().String(), err)
+ return true
+ }
+ serviceName, err := services.ServiceNameOfTunnel(interfaceName)
+ if err != nil {
+ log.Printf("Removing Wintun interface %s because determining tunnel service name failed: %v", interfaceName, err)
+ return true
+ }
+ service, err := m.OpenService(serviceName)
+ if err == windows.ERROR_SERVICE_DOES_NOT_EXIST {
+ log.Printf("Removing orphaned Wintun interface %s", interfaceName)
+ return true
+ }
+ if err != nil {
+ log.Printf("Error opening service %s: %v", serviceName, err)
+ return false
+ }
+ defer service.Close()
+ config, err := service.Config()
+ if err != nil {
+ log.Printf("Error getting service %s configuration: %v", serviceName, err)
+ return false
+ }
+ if config.StartType == mgr.StartAutomatic {
+ return false
+ }
+ status, err := service.Query()
+ if err != nil {
+ log.Printf("Error getting service %s status: %v", serviceName, err)
+ return false
+ }
+ if status.State == svc.Stopped {
+ log.Printf("Removing unused Wintun interface %s", interfaceName)
+ return true
+ }
+ return false
+ })
+}
diff --git a/manager/service.go b/manager/service.go
index 3b71bbff..7ab3db16 100644
--- a/manager/service.go
+++ b/manager/service.go
@@ -247,6 +247,7 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest
}()
}
+ go cleanStaleAdapters()
go checkForUpdates()
var sessionsPointer *windows.WTS_SESSION_INFO