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