When performing synchronous operation, we need to check the return value
of ReadFile/WriteFile before calling GetOverlappedResult.  Otherwise
GetOverlappedResult can hang.

Signed-off-by: Sean Hefty <[email protected]>
---

Index: trunk/core/winmad/user/wm_provider.cpp
===================================================================
--- trunk/core/winmad/user/wm_provider.cpp      (revision 2893)
+++ trunk/core/winmad/user/wm_provider.cpp      (working copy)
@@ -187,8 +187,11 @@
        bytes = (DWORD) sizeof(WM_MAD) + pMad->Length;
        if (pOverlapped == NULL) {
                EnterCriticalSection(&m_CritSecWrite);
-               WriteFile(m_hFile, pMad, bytes, &bytes, &m_OverlapWrite);
-               hr = GetOverlappedResult(&m_OverlapWrite, &bytes, TRUE);
+               if (WriteFile(m_hFile, pMad, bytes, &bytes, &m_OverlapWrite)) {
+                       hr = GetOverlappedResult(&m_OverlapWrite, &bytes, TRUE);
+               } else {
+                       hr = HRESULT_FROM_WIN32(GetLastError());
+               }
                LeaveCriticalSection(&m_CritSecWrite);
        } else {
                if (WriteFile(m_hFile, pMad, bytes, &bytes, pOverlapped)) {
@@ -209,8 +212,11 @@
 
        if (pOverlapped == NULL) {
                EnterCriticalSection(&m_CritSecRead);
-               ReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, 
&m_OverlapRead);
-               hr = GetOverlappedResult(&m_OverlapRead, &bytes, TRUE);
+               if (ReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, 
&m_OverlapRead)) {
+                       hr = GetOverlappedResult(&m_OverlapRead, &bytes, TRUE);
+               } else {
+                       hr = HRESULT_FROM_WIN32(GetLastError());
+               }
                LeaveCriticalSection(&m_CritSecRead);
        } else {
                if (ReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, 
pOverlapped)) {

Attachment: wm.patch
Description: wm.patch

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

Reply via email to