wintun: take mutex first always

This prevents an ABA deadlock with setupapi's internal locks.
This commit is contained in:
Jason A. Donenfeld 2019-09-01 21:32:28 -06:00
parent f3dba4c194
commit 73d3bd9cd5

View File

@ -196,6 +196,15 @@ func (pool Pool) GetInterface(ifname string) (*Interface, error) {
// interesting complications with its usage. This function returns the network
// interface ID and a flag if reboot is required.
func (pool Pool) CreateInterface(ifname string, requestedGUID *windows.GUID) (wintun *Interface, rebootRequired bool, err error) {
mutex, err := pool.takeNameMutex()
if err != nil {
return
}
defer func() {
windows.ReleaseMutex(mutex)
windows.CloseHandle(mutex)
}()
// Create an empty device info set for network adapter device class.
devInfoList, err := setupapi.SetupDiCreateDeviceInfoListEx(&deviceClassNetGUID, 0, "")
if err != nil {
@ -281,15 +290,6 @@ func (pool Pool) CreateInterface(ifname string, requestedGUID *windows.GUID) (wi
return
}
mutex, err := pool.takeNameMutex()
if err != nil {
return
}
defer func() {
windows.ReleaseMutex(mutex)
windows.CloseHandle(mutex)
}()
defer func() {
if err != nil {
// The interface failed to install, or the interface ID was unobtainable. Clean-up.