X-Git-Url: http://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fmingw%2Fdevice.c;h=73da2f1316696dc0bcdbec0e9d5d45a4906a88d5;hb=675142c7d88c9d325c0ca0bc5761072a5d810c75;hp=19719a7a0b4fc808d4924b6a5cfc8b66c5308132;hpb=266afc6c63d3d02584feb24b69063f97057daac8;p=tinc diff --git a/src/mingw/device.c b/src/mingw/device.c index 19719a7a..73da2f13 100644 --- a/src/mingw/device.c +++ b/src/mingw/device.c @@ -210,10 +210,18 @@ static void disable_device(void) { io_del(&device_read_io); CancelIo(device_handle); + + /* According to MSDN, CancelIo() does not necessarily wait for the operation to complete. + To prevent race conditions, make sure the operation is complete + before we close the event it's referencing. */ + + DWORD len; + if(!GetOverlappedResult(device_handle, &device_read_overlapped, &len, TRUE) && GetLastError() != ERROR_OPERATION_ABORTED) + logger(DEBUG_ALWAYS, LOG_ERR, "Could not wait for %s %s read to cancel: %s", device_info, device, winerror(GetLastError())); + CloseHandle(device_read_overlapped.hEvent); ULONG status = 0; - DWORD len; DeviceIoControl(device_handle, TAP_IOCTL_SET_MEDIA_STATUS, &status, sizeof status, &status, sizeof status, &len, NULL); }