From ebd96bf4a98b84514dae44a0c51c899b33579504 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 9 Nov 2020 11:01:21 -0800 Subject: [PATCH] wgengine/router/dns: use OpenKeyWait to set DNS configuration. Fixes tailscale/corp#839. Signed-off-by: David Anderson --- cmd/tailscale/depaware.txt | 2 +- cmd/tailscaled/depaware.txt | 2 +- wgengine/router/dns/manager_windows.go | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index d116cf1fd..c7a593a4a 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -30,7 +30,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep W 💣 github.com/tailscale/wireguard-go/tun/wintun/iphlpapi from github.com/tailscale/wireguard-go/tun/wintun W 💣 github.com/tailscale/wireguard-go/tun/wintun/namespaceapi from github.com/tailscale/wireguard-go/tun/wintun W 💣 github.com/tailscale/wireguard-go/tun/wintun/nci from github.com/tailscale/wireguard-go/tun/wintun - W 💣 github.com/tailscale/wireguard-go/tun/wintun/registry from github.com/tailscale/wireguard-go/tun/wintun + W 💣 github.com/tailscale/wireguard-go/tun/wintun/registry from github.com/tailscale/wireguard-go/tun/wintun+ W 💣 github.com/tailscale/wireguard-go/tun/wintun/setupapi from github.com/tailscale/wireguard-go/tun/wintun github.com/tailscale/wireguard-go/wgcfg from github.com/tailscale/wireguard-go/conn+ github.com/tcnksm/go-httpstat from tailscale.com/net/netcheck diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index e498584ec..7124aec97 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -33,7 +33,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de W 💣 github.com/tailscale/wireguard-go/tun/wintun/iphlpapi from github.com/tailscale/wireguard-go/tun/wintun W 💣 github.com/tailscale/wireguard-go/tun/wintun/namespaceapi from github.com/tailscale/wireguard-go/tun/wintun W 💣 github.com/tailscale/wireguard-go/tun/wintun/nci from github.com/tailscale/wireguard-go/tun/wintun - W 💣 github.com/tailscale/wireguard-go/tun/wintun/registry from github.com/tailscale/wireguard-go/tun/wintun + W 💣 github.com/tailscale/wireguard-go/tun/wintun/registry from github.com/tailscale/wireguard-go/tun/wintun+ W 💣 github.com/tailscale/wireguard-go/tun/wintun/setupapi from github.com/tailscale/wireguard-go/tun/wintun github.com/tailscale/wireguard-go/wgcfg from github.com/tailscale/wireguard-go/conn+ github.com/tcnksm/go-httpstat from tailscale.com/net/netcheck diff --git a/wgengine/router/dns/manager_windows.go b/wgengine/router/dns/manager_windows.go index d1e7a2157..685a471d4 100644 --- a/wgengine/router/dns/manager_windows.go +++ b/wgengine/router/dns/manager_windows.go @@ -12,6 +12,7 @@ import ( "time" "github.com/tailscale/wireguard-go/tun" + wgregistry "github.com/tailscale/wireguard-go/tun/wintun/registry" "golang.org/x/sys/windows/registry" "tailscale.com/types/logger" ) @@ -34,8 +35,14 @@ func newManager(mconfig ManagerConfig) managerImpl { } } +// keyOpenTimeout is how long we wait for a registry key to +// appear. For some reason, registry keys tied to ephemeral interfaces +// can take a long while to appear after interface creation, and we +// can end up racing with that. +const keyOpenTimeout = time.Minute + func setRegistryString(path, name, value string) error { - key, err := registry.OpenKey(registry.LOCAL_MACHINE, path, registry.SET_VALUE) + key, err := wgregistry.OpenKeyWait(registry.LOCAL_MACHINE, path, registry.SET_VALUE, keyOpenTimeout) if err != nil { return fmt.Errorf("opening %s: %w", path, err) }