From 5ecc7a86e659390fa3c975aca72849dedf1412f6 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sat, 9 Mar 2019 22:35:22 +0100 Subject: tunneltracker: account for windows 7 statemachine bug Windows 7 will transition to stopping after it has already triggered stopped, so keep track of that and filter it out. Signed-off-by: Jason A. Donenfeld --- service/tunneltracker.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'service') diff --git a/service/tunneltracker.go b/service/tunneltracker.go index 96d0f6e3..89de0c38 100644 --- a/service/tunneltracker.go +++ b/service/tunneltracker.go @@ -90,6 +90,10 @@ func trackTunnelService(tunnelName string, svc *mgr.Service) { notifyCallback: serviceTrackerCallbackPtr, } defer svc.Close() + + // This hasStopped ugliness is because Windows 7 will send a STOP_PENDING after it has already sent a STOPPED + hasStopped := false + for { notifier.context = 0 err := notifyServiceStatusChange(svc.Handle, serviceNotifications, uintptr(unsafe.Pointer(notifier))) @@ -105,12 +109,15 @@ func trackTunnelService(tunnelName string, svc *mgr.Service) { state = TunnelDeleting } else if notifier.notificationTriggered&serviceNotify_STOPPED != 0 { state = TunnelStopped - } else if notifier.notificationTriggered&serviceNotify_STOP_PENDING != 0 { + hasStopped = true + } else if notifier.notificationTriggered&serviceNotify_STOP_PENDING != 0 && hasStopped { state = TunnelStopping } else if notifier.notificationTriggered&serviceNotify_RUNNING != 0 { state = TunnelStarted + hasStopped = false } else if notifier.notificationTriggered&serviceNotify_START_PENDING != 0 { state = TunnelStarting + hasStopped = false } IPCServerNotifyTunnelChange(tunnelName, state) if state == TunnelDeleting { -- cgit v1.2.3-59-g8ed1b