]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
wintun: try multiple names until one isn't a duplicate
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 22 Aug 2019 06:52:59 +0000 (08:52 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 22 Aug 2019 06:52:59 +0000 (08:52 +0200)
tun/wintun/wintun_windows.go

index f6a230a64372271fba464a2df458a299708b4b15..1caa4a10770c49deaf53f17c3347496fb59969a8 100644 (file)
@@ -373,7 +373,7 @@ func CreateInterface(description string, requestedGUID *windows.GUID) (wintun *W
        // Wait for TCP/IP interface registry key to emerge.
        tcpipInterfaceRegKey, err := registryEx.OpenKeyWait(
                registry.LOCAL_MACHINE,
-               tcpipInterfaceRegKeyName, registry.QUERY_VALUE | registry.SET_VALUE,
+               tcpipInterfaceRegKeyName, registry.QUERY_VALUE|registry.SET_VALUE,
                waitForRegistryTimeout)
        if err != nil {
                err = fmt.Errorf("OpenKeyWait(HKLM\\%s) failed: %v", tcpipInterfaceRegKeyName, err)
@@ -522,9 +522,17 @@ func (wintun *Wintun) InterfaceName() (string, error) {
 
 // SetInterfaceName sets name of the Wintun interface.
 func (wintun *Wintun) SetInterfaceName(ifname string) error {
-       err := nci.SetConnectionName(&wintun.cfgInstanceID, ifname)
-       if err != nil {
-               return fmt.Errorf("NciSetConnectionName failed: %v", err)
+       const maxSuffix = 1000
+       availableIfname := ifname
+       for i := 0; ; i++ {
+               err := nci.SetConnectionName(&wintun.cfgInstanceID, availableIfname)
+               if err == nil {
+                       break
+               }
+               if i > maxSuffix || err != windows.ERROR_DUP_NAME {
+                       return fmt.Errorf("NciSetConnectionName failed: %v", err)
+               }
+               availableIfname = fmt.Sprintf("%s %d", ifname, i+1)
        }
 
        // TODO: This should use NetSetup2 so that it doesn't get unset.