revised winmm GetDevCaps better pointer check patch

Robert Reif reif at earthlink.net
Wed Jun 9 17:46:37 CDT 2004


Added missing write pointer checks.
Made pointer check quality adjustable (defaults to minimal).
Corrected error return for bad devices for mixer and aux.
Added missing traces.
-------------- next part --------------
Index: dlls/winmm/winmm.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winmm.c,v
retrieving revision 1.36
diff -u -r1.36 winmm.c
--- dlls/winmm/winmm.c	1 Jun 2004 19:40:48 -0000	1.36
+++ dlls/winmm/winmm.c	9 Jun 2004 22:36:28 -0000
@@ -48,6 +48,10 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(winmm);
 
+/* Use the first version for strict compatibility with Microsoft */
+/* #define WINMM_IsBadWritePtr(x,y) IsBadWritePtr((x), (y)) */
+#define WINMM_IsBadWritePtr(x,y) ((x)==NULL)
+
 /******************************************************************
  *		MyUserYield
  *
@@ -263,11 +267,15 @@
 /**************************************************************************
  * 				mixerGetDevCapsA		[WINMM.@]
  */
-UINT WINAPI mixerGetDevCapsA(UINT_PTR uDeviceID, LPMIXERCAPSA lpCaps, UINT uSize)
+UINT WINAPI mixerGetDevCapsA(UINT_PTR uDeviceID, LPMIXERCAPSA lpCaps,
+                             UINT uSize)
 {
-    LPWINE_MLD	wmld;
+    LPWINE_MLD		wmld;
 
-    if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
+
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
     if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_MIXER, TRUE)) == NULL)
 	return MMSYSERR_BADDEVICEID;
@@ -278,11 +286,18 @@
 /**************************************************************************
  * 				mixerGetDevCapsW		[WINMM.@]
  */
-UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize)
+UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps,
+                             UINT uSize)
 {
-    MIXERCAPSA	micA;
-    UINT	ret = mixerGetDevCapsA(uDeviceID, &micA, sizeof(micA));
+    MIXERCAPSA		micA;
+    UINT		ret;
 
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
+
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
+
+    ret = mixerGetDevCapsA(uDeviceID, &micA, sizeof(micA));
     if (ret == MMSYSERR_NOERROR) {
 	MIXERCAPSW micW;
 	micW.wMid           = micA.wMid;
@@ -659,11 +674,18 @@
 /**************************************************************************
  * 				auxGetDevCapsW		[WINMM.@]
  */
-UINT WINAPI auxGetDevCapsW(UINT_PTR uDeviceID, LPAUXCAPSW lpCaps, UINT uSize)
+UINT WINAPI auxGetDevCapsW(UINT_PTR uDeviceID, LPAUXCAPSW lpCaps,
+                           UINT uSize)
 {
-    AUXCAPSA	acA;
-    UINT	ret = auxGetDevCapsA(uDeviceID, &acA, sizeof(acA));
+    AUXCAPSA		acA;
+    UINT		ret;
+
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
 
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
+
+    ret = auxGetDevCapsA(uDeviceID, &acA, sizeof(acA));
     if (ret == MMSYSERR_NOERROR) {
 	AUXCAPSW acW;
 	acW.wMid           = acA.wMid;
@@ -681,16 +703,19 @@
 /**************************************************************************
  * 				auxGetDevCapsA		[WINMM.@]
  */
-UINT WINAPI auxGetDevCapsA(UINT_PTR uDeviceID, LPAUXCAPSA lpCaps, UINT uSize)
+UINT WINAPI auxGetDevCapsA(UINT_PTR uDeviceID, LPAUXCAPSA lpCaps,
+                           UINT uSize)
 {
     LPWINE_MLD		wmld;
 
-    TRACE("(%04X, %p, %d) !\n", uDeviceID, lpCaps, uSize);
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
 
-    if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
     if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_AUX, TRUE)) == NULL)
-	return MMSYSERR_INVALHANDLE;
+        return MMSYSERR_BADDEVICEID;
+
     return MMDRV_Message(wmld, AUXDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE);
 }
 
@@ -1214,8 +1239,14 @@
 			       UINT uSize)
 {
     MIDIOUTCAPSA	mocA;
-    UINT		ret = midiOutGetDevCapsA(uDeviceID, &mocA, sizeof(mocA));
+    UINT		ret;
+
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
+
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
+    ret = midiOutGetDevCapsA(uDeviceID, &mocA, sizeof(mocA));
     if (ret == MMSYSERR_NOERROR) {
 	MIDIOUTCAPSW mocW;
 	mocW.wMid		= mocA.wMid;
@@ -1239,14 +1270,15 @@
 UINT WINAPI midiOutGetDevCapsA(UINT_PTR uDeviceID, LPMIDIOUTCAPSA lpCaps,
 			       UINT uSize)
 {
-    LPWINE_MLD	wmld;
+    LPWINE_MLD		wmld;
 
-    TRACE("(%u, %p, %u);\n", uDeviceID, lpCaps, uSize);
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
 
-    if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
     if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_MIDIOUT, TRUE)) == NULL)
-	return MMSYSERR_INVALHANDLE;
+        return MMSYSERR_BADDEVICEID;
 
     return MMDRV_Message(wmld, MODM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE);
 }
@@ -1588,11 +1620,18 @@
 /**************************************************************************
  * 				midiInGetDevCapsW	[WINMM.@]
  */
-UINT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize)
+UINT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID, LPMIDIINCAPSW lpCaps,
+                              UINT uSize)
 {
     MIDIINCAPSA		micA;
-    UINT		ret = midiInGetDevCapsA(uDeviceID, &micA, sizeof(micA));
+    UINT		ret;
 
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
+
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
+
+    ret = midiInGetDevCapsA(uDeviceID, &micA, sizeof(micA));
     if (ret == MMSYSERR_NOERROR) {
 	MIDIINCAPSW micW;
 	micW.wMid           = micA.wMid;
@@ -1609,18 +1648,20 @@
 /**************************************************************************
  * 				midiInGetDevCapsA	[WINMM.@]
  */
-UINT WINAPI midiInGetDevCapsA(UINT_PTR uDeviceID, LPMIDIINCAPSA lpCaps, UINT uSize)
+UINT WINAPI midiInGetDevCapsA(UINT_PTR uDeviceID, LPMIDIINCAPSA lpCaps,
+                              UINT uSize)
 {
-    LPWINE_MLD	wmld;
+    LPWINE_MLD		wmld;
 
-    TRACE("(%d, %p, %d);\n", uDeviceID, lpCaps, uSize);
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
 
-    if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
     if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_MIDIIN, TRUE)) == NULL)
-	return MMSYSERR_INVALHANDLE;
+        return MMSYSERR_BADDEVICEID;
 
-   return MMDRV_Message(wmld, MIDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE);
+    return MMDRV_Message(wmld, MIDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE);
 }
 
 /**************************************************************************
@@ -2538,15 +2579,15 @@
 {
     LPWINE_MLD		wmld;
 
-    TRACE("(%u %p %u)!\n", uDeviceID, lpCaps, uSize);
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
 
-    if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
     if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_WAVEOUT, TRUE)) == NULL)
         return MMSYSERR_BADDEVICEID;
 
     return MMDRV_Message(wmld, WODM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE);
-
 }
 
 /**************************************************************************
@@ -2556,8 +2597,14 @@
 			       UINT uSize)
 {
     WAVEOUTCAPSA	wocA;
-    UINT 		ret = waveOutGetDevCapsA(uDeviceID, &wocA, sizeof(wocA));
+    UINT 		ret;
+
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
+
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
+    ret = waveOutGetDevCapsA(uDeviceID, &wocA, sizeof(wocA));
     if (ret == MMSYSERR_NOERROR) {
 	WAVEOUTCAPSW wocW;
 	wocW.wMid           = wocA.wMid;
@@ -2923,11 +2970,18 @@
 /**************************************************************************
  * 				waveInGetDevCapsW 		[WINMM.@]
  */
-UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize)
+UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps,
+                              UINT uSize)
 {
     WAVEINCAPSA		wicA;
-    UINT		ret = waveInGetDevCapsA(uDeviceID, &wicA, sizeof(wicA));
+    UINT		ret;
+
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
+
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
+    ret = waveInGetDevCapsA(uDeviceID, &wicA, sizeof(wicA));
     if (ret == MMSYSERR_NOERROR) {
 	WAVEINCAPSW wicW;
 	wicW.wMid           = wicA.wMid;
@@ -2945,13 +2999,15 @@
 /**************************************************************************
  * 				waveInGetDevCapsA 		[WINMM.@]
  */
-UINT WINAPI waveInGetDevCapsA(UINT_PTR uDeviceID, LPWAVEINCAPSA lpCaps, UINT uSize)
+UINT WINAPI waveInGetDevCapsA(UINT_PTR uDeviceID, LPWAVEINCAPSA lpCaps,
+                              UINT uSize)
 {
     LPWINE_MLD		wmld;
 
-    TRACE("(%u %p %u)!\n", uDeviceID, lpCaps, uSize);
+    TRACE("(%u %p %u)\n", uDeviceID, lpCaps, uSize);
 
-    if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
+    if (WINMM_IsBadWritePtr(lpCaps, min(uSize, sizeof(*lpCaps))))
+        return MMSYSERR_INVALPARAM;
 
     if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_WAVEIN, TRUE)) == NULL)
 	return MMSYSERR_BADDEVICEID;


More information about the wine-patches mailing list