msacm parameter checking patch

Robert Reif reif at earthlink.net
Sun May 2 21:08:57 CDT 2004


This patch replaces my previous patch.

This patch adds better function parameter checking.

The tests will follow in another patch.
-------------- next part --------------
Index: dlls/msacm/driver.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/driver.c,v
retrieving revision 1.23
diff -u -r1.23 driver.c
--- dlls/msacm/driver.c	5 Sep 2003 23:08:36 -0000	1.23
+++ dlls/msacm/driver.c	3 May 2004 01:02:10 -0000
@@ -132,29 +132,38 @@
     MMRESULT mmr;
     ACMDRIVERDETAILSW	addw;
 
+    if (!padd)
+        return MMSYSERR_INVALPARAM;
+
+    if (padd->cbStruct < 4)
+        return MMSYSERR_INVALPARAM;
+
     addw.cbStruct = sizeof(addw);
     mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
     if (mmr == 0) {
-	padd->fccType = addw.fccType;
-	padd->fccComp = addw.fccComp;
-	padd->wMid = addw.wMid;
-	padd->wPid = addw.wPid;
-	padd->vdwACM = addw.vdwACM;
-	padd->vdwDriver = addw.vdwDriver;
-	padd->fdwSupport = addw.fdwSupport;
-	padd->cFormatTags = addw.cFormatTags;
-	padd->cFilterTags = addw.cFilterTags;
-	padd->hicon = addw.hicon;
-        WideCharToMultiByte( CP_ACP, 0, addw.szShortName, -1, padd->szShortName,
-                             sizeof(padd->szShortName), NULL, NULL );
-        WideCharToMultiByte( CP_ACP, 0, addw.szLongName, -1, padd->szLongName,
-                             sizeof(padd->szLongName), NULL, NULL );
-        WideCharToMultiByte( CP_ACP, 0, addw.szCopyright, -1, padd->szCopyright,
-                             sizeof(padd->szCopyright), NULL, NULL );
-        WideCharToMultiByte( CP_ACP, 0, addw.szLicensing, -1, padd->szLicensing,
-                             sizeof(padd->szLicensing), NULL, NULL );
-        WideCharToMultiByte( CP_ACP, 0, addw.szFeatures, -1, padd->szFeatures,
-                             sizeof(padd->szFeatures), NULL, NULL );
+        ACMDRIVERDETAILSA padda;
+
+        padda.fccType = addw.fccType;
+        padda.fccComp = addw.fccComp;
+        padda.wMid = addw.wMid;
+        padda.wPid = addw.wPid;
+        padda.vdwACM = addw.vdwACM;
+        padda.vdwDriver = addw.vdwDriver;
+        padda.fdwSupport = addw.fdwSupport;
+        padda.cFormatTags = addw.cFormatTags;
+        padda.cFilterTags = addw.cFilterTags;
+        padda.hicon = addw.hicon;
+        WideCharToMultiByte( CP_ACP, 0, addw.szShortName, -1, padda.szShortName,
+                             sizeof(padda.szShortName), NULL, NULL );
+        WideCharToMultiByte( CP_ACP, 0, addw.szLongName, -1, padda.szLongName,
+                             sizeof(padda.szLongName), NULL, NULL );
+        WideCharToMultiByte( CP_ACP, 0, addw.szCopyright, -1, padda.szCopyright,
+                             sizeof(padda.szCopyright), NULL, NULL );
+        WideCharToMultiByte( CP_ACP, 0, addw.szLicensing, -1, padda.szLicensing,
+                             sizeof(padda.szLicensing), NULL, NULL );
+        WideCharToMultiByte( CP_ACP, 0, addw.szFeatures, -1, padda.szFeatures,
+                             sizeof(padda.szFeatures), NULL, NULL );
+        memcpy(padd, &padda, min(padd->cbStruct, sizeof(*padd)));
     }
     return mmr;
 }
@@ -167,14 +176,22 @@
     HACMDRIVER acmDrvr;
     MMRESULT mmr;
 
+    if (!padd)
+        return MMSYSERR_INVALPARAM;
+
+    if (padd->cbStruct < 4)
+        return MMSYSERR_INVALPARAM;
+
     if (fdwDetails)
 	return MMSYSERR_INVALFLAG;
 
     mmr = acmDriverOpen(&acmDrvr, hadid, 0);
     if (mmr == MMSYSERR_NOERROR) {
-	mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)padd,  0);
+        ACMDRIVERDETAILSW paddw;
+        mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)&paddw,  0);
 
 	acmDriverClose(acmDrvr, 0);
+        memcpy(padd, &paddw, min(padd->cbStruct, sizeof(*padd)));
     }
 
     return mmr;
@@ -216,15 +233,15 @@
 {
     PWINE_ACMOBJ pao;
 
-    if (!phadid)
-	return MMSYSERR_INVALPARAM;
-
     if (fdwDriverID)
 	return MMSYSERR_INVALFLAG;
 
     pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
     if (!pao)
 	return MMSYSERR_INVALHANDLE;
+
+    if (!phadid)
+        return MMSYSERR_INVALPARAM;
 
     *phadid = (HACMDRIVERID) pao->pACMDriverID;
 
Index: dlls/msacm/format.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/format.c,v
retrieving revision 1.24
diff -u -r1.24 format.c
--- dlls/msacm/format.c	20 Apr 2004 00:34:53 -0000	1.24
+++ dlls/msacm/format.c	3 May 2004 01:02:11 -0000
@@ -411,6 +411,12 @@
     ACMFORMATDETAILSW		afdw;
     struct MSACM_FormatEnumWtoA_Instance afei;
 
+    if (!pafda)
+        return MMSYSERR_INVALPARAM;
+
+    if (pafda->cbStruct < sizeof(*pafda))
+        return MMSYSERR_INVALPARAM;
+
     memset(&afdw, 0, sizeof(afdw));
     afdw.cbStruct = sizeof(afdw);
     afdw.dwFormatIndex = pafda->dwFormatIndex;
@@ -489,7 +495,11 @@
     TRACE("(%p, %p, %p, %ld, %ld)\n",
 	  had, pafd, fnCallback, dwInstance, fdwEnum);
 
-    if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
+    if (!pafd)
+        return MMSYSERR_INVALPARAM;
+
+    if (pafd->cbStruct < sizeof(*pafd))
+        return MMSYSERR_INVALPARAM;
 
     if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS|
 		   ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE|
Index: dlls/msacm/msacm32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/msacm32_main.c,v
retrieving revision 1.17
diff -u -r1.17 msacm32_main.c
--- dlls/msacm/msacm32_main.c	5 Sep 2003 23:08:36 -0000	1.17
+++ dlls/msacm/msacm32_main.c	3 May 2004 01:02:11 -0000
@@ -120,6 +120,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_DRIVERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
 		val++;
@@ -131,6 +132,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_CODECS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
 		(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) &&
@@ -144,6 +146,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
 		 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) &&
@@ -157,6 +160,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_FILTERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
 		(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) &&
@@ -170,6 +174,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_DISABLED:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
 		val++;
@@ -204,10 +209,17 @@
 	} else {
 	    return MMSYSERR_INVALHANDLE;
 	}
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	*(LPDWORD)pMetric = val;
         break;
 
     case ACM_METRIC_COUNT_HARDWARE:
+        if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
+        *(LPDWORD)pMetric = 0;
+        FIXME("ACM_METRIC_COUNT_HARDWARE not implemented\n");
+        break;
+
     case ACM_METRIC_HARDWARE_WAVE_INPUT:
     case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
     case ACM_METRIC_MAX_SIZE_FILTER:


More information about the wine-patches mailing list