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