We need to check the return value from DeviceIoControl before
calling GetOverlappedResult to avoid potential hangs.

Signed-off-by: Sean Hefty <[email protected]>
---
 trunk/core/winmad/user/wm_provider.cpp |   13 ++++++++-----
 trunk/core/winverbs/user/wv_base.cpp   |   13 +++++++------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/trunk/core/winmad/user/wm_provider.cpp 
b/trunk/core/winmad/user/wm_provider.cpp
index 7b026ea..064b098 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 5ed4e9f..e231ec3 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,

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to