From: Sean Hefty Date: Wed, 15 Sep 2010 16:22:45 +0000 (+0000) Subject: winverbs/winmad: check return value of DeviceIoControl X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=d0457bad2eea2492fbc3fb8ee01200fb22e3337c;p=~shefty%2Frdma-win.git winverbs/winmad: check return value of DeviceIoControl We need to check the return value from DeviceIoControl before calling GetOverlappedResult to avoid potential hangs. Signed-off-by: Sean Hefty git-svn-id: svn://openib.tc.cornell.edu/gen1@2928 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/core/winmad/user/wm_provider.cpp b/trunk/core/winmad/user/wm_provider.cpp index 7b026eab..064b0982 100644 --- a/trunk/core/winmad/user/wm_provider.cpp +++ b/trunk/core/winmad/user/wm_provider.cpp @@ -134,11 +134,14 @@ WmDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, if (lpOverlapped == NULL) { EnterCriticalSection(&m_CritSecWrite); - DeviceIoControl(hDevice, dwIoControlCode, - lpInBuffer, nInBufferSize, - lpOutBuffer, nOutBufferSize, - lpBytesReturned, &m_OverlapWrite); - ret = ::GetOverlappedResult(m_hFile, &m_OverlapWrite, lpBytesReturned, TRUE); + ret = DeviceIoControl(hDevice, dwIoControlCode, + lpInBuffer, nInBufferSize, + lpOutBuffer, nOutBufferSize, + lpBytesReturned, &m_OverlapWrite); + if (!ret && GetLastError() == ERROR_IO_PENDING) { + ret = ::GetOverlappedResult(m_hFile, &m_OverlapWrite, + lpBytesReturned, TRUE); + } LeaveCriticalSection(&m_CritSecWrite); } else { ret = DeviceIoControl(hDevice, dwIoControlCode, diff --git a/trunk/core/winverbs/user/wv_base.cpp b/trunk/core/winverbs/user/wv_base.cpp index 5ed4e9f7..e231ec38 100644 --- a/trunk/core/winverbs/user/wv_base.cpp +++ b/trunk/core/winverbs/user/wv_base.cpp @@ -89,12 +89,13 @@ WvDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, if (lpOverlapped == NULL) { EnterCriticalSection(&m_CritSec); - DeviceIoControl(hDevice, dwIoControlCode, - lpInBuffer, nInBufferSize, - lpOutBuffer, nOutBufferSize, - lpBytesReturned, &m_Overlap); - - ret = GetOverlappedResult(hDevice, &m_Overlap, lpBytesReturned, TRUE); + ret = DeviceIoControl(hDevice, dwIoControlCode, + lpInBuffer, nInBufferSize, + lpOutBuffer, nOutBufferSize, + lpBytesReturned, &m_Overlap); + if (!ret && GetLastError() == ERROR_IO_PENDING) { + ret = GetOverlappedResult(hDevice, &m_Overlap, lpBytesReturned, TRUE); + } LeaveCriticalSection(&m_CritSec); } else { ret = DeviceIoControl(hDevice, dwIoControlCode,