[WINMM] fix wave test handle use after close bug

Robert Reif reif at earthlink.net
Fri May 19 06:34:08 CDT 2006


-------------- next part --------------
Index: dlls/winmm/tests/wave.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/tests/wave.c,v
retrieving revision 1.57
diff -p -u -r1.57 wave.c
--- dlls/winmm/tests/wave.c	11 May 2006 10:57:49 -0000	1.57
+++ dlls/winmm/tests/wave.c	19 May 2006 11:25:55 -0000
@@ -534,8 +534,13 @@ static DWORD WINAPI callback_thread(LPVO
 {
     MSG msg;
 
-    while (GetMessage(&msg, 0, 0, 0))
-        SetEvent((HANDLE)lpParameter);
+    while (GetMessage(&msg, 0, 0, 0)) {
+        UINT message = msg.message;
+        ok (message == WOM_OPEN || message == WOM_DONE || message == WOM_CLOSE,
+            "GetMessage returned unexpected message: %u\n", message);
+        if (message == WOM_OPEN || message == WOM_DONE || message == WOM_CLOSE)
+            SetEvent((HANDLE)lpParameter);
+    }
 
     return 0;
 }
@@ -579,16 +584,20 @@ static void wave_out_test_deviceOut(int 
             callback_instance = 0;
         } else {
             trace("CreateThread() failed\n");
+            CloseHandle(hevent);
             return;
         }
     } else if ((flags & CALLBACK_TYPEMASK) == CALLBACK_WINDOW) {
         trace("CALLBACK_THREAD not implemented\n");
+        CloseHandle(hevent);
         return;
     } else if (flags && CALLBACK_TYPEMASK) {
         trace("Undefined callback type!\n");
+        CloseHandle(hevent);
         return;
     } else {
         trace("CALLBACK_NULL not implemented\n");
+        CloseHandle(hevent);
         return;
     }
     wout=NULL;
@@ -728,12 +737,12 @@ static void wave_out_test_deviceOut(int 
        wave_out_error(rc));
     free(frag.lpData);
 
-    CloseHandle(hevent);
     rc=waveOutClose(wout);
     ok(rc==MMSYSERR_NOERROR,"waveOutClose(%s): rc=%s\n",dev_name(device),
        wave_out_error(rc));
     if ((flags & CALLBACK_TYPEMASK) == CALLBACK_THREAD)
         TerminateThread(thread, 0);
+    CloseHandle(hevent);
 }
 
 static void wave_out_test_device(int device)


More information about the wine-patches mailing list