Jörg Höhle : midimap: Perform stricter error-checking.

Alexandre Julliard julliard at winehq.org
Mon Feb 1 08:56:07 CST 2010


Module: wine
Branch: master
Commit: ed7a3662020a6a7ae553c37985b2ed05ccbc70fe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ed7a3662020a6a7ae553c37985b2ed05ccbc70fe

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Wed Jan 27 18:08:04 2010 +0100

midimap: Perform stricter error-checking.

---

 dlls/midimap/midimap.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/dlls/midimap/midimap.c b/dlls/midimap/midimap.c
index f429497..293465f 100644
--- a/dlls/midimap/midimap.c
+++ b/dlls/midimap/midimap.c
@@ -318,8 +318,14 @@ static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwPara
 
     if (MIDIMAP_IsBadData(mom))
 	return MMSYSERR_ERROR;
+    if (!(lpMidiHdr->dwFlags & MHDR_PREPARED))
+	return MIDIERR_UNPREPARED;
+    if (lpMidiHdr->dwFlags & MHDR_INQUEUE)
+	return MIDIERR_STILLPLAYING;
 
     mh = *lpMidiHdr;
+    lpMidiHdr->dwFlags &= ~MHDR_DONE;
+    lpMidiHdr->dwFlags |= MHDR_INQUEUE;
     for (chn = 0; chn < 16; chn++)
     {
 	if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0)
@@ -327,10 +333,15 @@ static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwPara
 	    mh.dwFlags = 0;
 	    midiOutPrepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh));
 	    ret = midiOutLongMsg(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh));
+	    /* As of 2009, wineXYZ.drv's LongData handlers are synchronous */
+	    if (!ret && !(mh.dwFlags & MHDR_DONE))
+		FIXME("wait until MHDR_DONE\n");
 	    midiOutUnprepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh));
 	    if (ret != MMSYSERR_NOERROR) break;
 	}
     }
+    lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
+    lpMidiHdr->dwFlags |= MHDR_DONE;
     return ret;
 }
 
@@ -397,21 +408,23 @@ static DWORD modData(MIDIMAPDATA* mom, DWORD_PTR dwParam)
     return ret;
 }
 
-static DWORD modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2)
+static DWORD modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwSize)
 {
     if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR;
-    if (lpMidiHdr->dwFlags & (MHDR_ISSTRM|MHDR_PREPARED))
+    if (dwSize < sizeof(MIDIHDR) || lpMidiHdr == 0 ||
+	lpMidiHdr->lpData == 0 || (lpMidiHdr->dwFlags & MHDR_INQUEUE))
 	return MMSYSERR_INVALPARAM;
 
     lpMidiHdr->dwFlags |= MHDR_PREPARED;
+    lpMidiHdr->dwFlags &= ~MHDR_DONE;
     return MMSYSERR_NOERROR;
 }
 
 static DWORD modUnprepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2)
 {
     if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR;
-    if ((lpMidiHdr->dwFlags & MHDR_ISSTRM) || !(lpMidiHdr->dwFlags & MHDR_PREPARED))
-	return MMSYSERR_INVALPARAM;
+    if (!(lpMidiHdr->dwFlags & MHDR_PREPARED)) return MIDIERR_UNPREPARED;
+    if (lpMidiHdr->dwFlags & MHDR_INQUEUE) return MIDIERR_STILLPLAYING;
 
     lpMidiHdr->dwFlags &= ~MHDR_PREPARED;
     return MMSYSERR_NOERROR;




More information about the wine-cvs mailing list