winmm: Perform stricter MIDI-related error checking.
authorJörg Höhle <hoehle@users.sourceforge.net>
Wed, 27 Jan 2010 17:18:18 +0000 (18:18 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 1 Feb 2010 14:39:28 +0000 (15:39 +0100)
dlls/winmm/winmm.c

index 4a03209c0929cf22fc071ac4536487797a79c1c9..76c3752fbaf964ea9f1e39fa0792e17aaa6d3a2d 100644 (file)
@@ -130,6 +130,10 @@ const char* WINMM_ErrorToString(MMRESULT error)
     ERR_TO_STR(WAVERR_STILLPLAYING);
     ERR_TO_STR(WAVERR_UNPREPARED);
     ERR_TO_STR(WAVERR_SYNC);
+    ERR_TO_STR(MIDIERR_INVALIDSETUP);
+    ERR_TO_STR(MIDIERR_NODEVICE);
+    ERR_TO_STR(MIDIERR_STILLPLAYING);
+    ERR_TO_STR(MIDIERR_UNPREPARED);
     }
 #undef ERR_TO_STR
     return wine_dbg_sprintf("Unknown(0x%08x)", error);
@@ -882,9 +886,7 @@ static      LPWINE_MIDI     MIDI_OutAlloc(HMIDIOUT* lphMidiOut, DWORD_PTR* lpdwCallback,
 
     lpwm = (LPWINE_MIDI)MMDRV_Alloc(size, MMDRV_MIDIOUT, &hMidiOut, lpdwFlags,
                                    lpdwCallback, lpdwInstance);
-
-    if (lphMidiOut != NULL)
-       *lphMidiOut = hMidiOut;
+    *lphMidiOut = hMidiOut;
 
     if (lpwm) {
         lpwm->mod.hMidi = hMidiOut;
@@ -1777,8 +1779,7 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
        return MMSYSERR_NOMEM;
     }
     lpMidiStrm->hDevice = hMidiOut;
-    if (lphMidiStrm)
-       *lphMidiStrm = (HMIDISTRM)hMidiOut;
+    *lphMidiStrm = (HMIDISTRM)hMidiOut;
 
     lpwm->mld.uDeviceID = *lpuDeviceID;
 
@@ -1820,11 +1821,19 @@ MMRESULT WINAPI midiStreamOut(HMIDISTRM hMidiStrm, LPMIDIHDR lpMidiHdr,
 
     TRACE("(%p, %p, %u)!\n", hMidiStrm, lpMidiHdr, cbMidiHdr);
 
+    if (cbMidiHdr < sizeof(MIDIHDR) || !lpMidiHdr || !lpMidiHdr->lpData)
+       return MMSYSERR_INVALPARAM;
+
+    if (!(lpMidiHdr->dwFlags & MHDR_PREPARED))
+       return MIDIERR_UNPREPARED;
+
+    if (lpMidiHdr->dwFlags & MHDR_INQUEUE)
+       return MIDIERR_STILLPLAYING;
+
     if (!MMSYSTEM_GetMidiStream(hMidiStrm, &lpMidiStrm, NULL)) {
        ret = MMSYSERR_INVALHANDLE;
-    } else if (!lpMidiHdr) {
-        ret = MMSYSERR_INVALPARAM;
     } else {
+       lpMidiHdr->dwFlags |= MHDR_ISSTRM;
        if (!PostThreadMessageA(lpMidiStrm->dwThreadID,
                                 WINE_MSM_HEADER, cbMidiHdr,
                                 (LPARAM)lpMidiHdr)) {